proguard hell - ไม่พบคลาสอ้างอิง


125

ดังนั้นฉัน พยายามที่จะออกซอฟต์แวร์บางตัว แต่ Proguard ทำให้ฉันปวดหัว

เมื่อฉันพยายามส่งออกโดยใช้ proguard ฉันได้รับคำเตือนมากมายเช่น "ไม่พบคลาสที่อ้างอิง"

ตัวอย่างเช่น:

[2011-08-07 17:44:37 - GAME] Warning: org.simpleframework.xml.stream.StreamReader: can't find referenced class javax.xml.stream.events.XMLEvent
[2011-08-07 17:44:37 - GAME] Warning: there were 52 unresolved references to classes or interfaces.
[2011-08-07 17:44:37 - GAME]          You may need to specify additional library jars (using '-libraryjars'),
[2011-08-07 17:44:37 - GAME]          or perhaps the '-dontskipnonpubliclibraryclasses' option.
[2011-08-07 17:44:37 - GAME] java.io.IOException: Please correct the above warnings first.
[ 

คำเตือนดูเหมือนจะเกี่ยวข้องกับ simpleframework ดังนั้นในไฟล์กำหนดค่า proguard ของฉันฉันได้เพิ่มสิ่งต่อไปนี้:

-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar

ที่ไหน pathtoprojecttolibsเส้นทางไปยังขวดโหลที่โครงการของฉันอ้างอิง

สิ่งนี้ไม่ทำให้เกิดความแตกต่าง

ถ้า simpleframework อ้างอิง javax ฉันจะบอกให้ proguard ละเว้นสิ่งนี้ด้วยได้ไหม?

ความคิดใด ๆ ?


1
คุณใช้โปรการ์ดเพื่อทำต้นไม้หรือไม่? ถ้าเป็นเช่นนั้นคุณได้ตรวจสอบขนาดไฟล์โดยไม่ใช้งานหรือไม่? คุณจะได้รับข้อบกพร่องที่ยอดเยี่ยมเมื่อ proguard พ่นสิ่งที่เข้าถึงได้โดยใช้การสะท้อนเช่นซึ่งคุณจะไม่พบจนกว่ามันจะหยุดรันไทม์ดังนั้นจงแน่ใจจริงๆว่าคุณต้องการมัน
alun

ฉันแค่ใช้มันเพื่อพยายามปกป้องรหัสที่ถูกเรียกอย่างง่ายดาย? คุณคิดว่าคุ้มไหม?
iasksillyquestions

3
@ListenToRick Proguard นั้นดีอย่างสมบูรณ์แบบหากทำงานด้วยการกำหนดค่าที่เหมาะสมและแอปผลลัพธ์ของคุณได้รับการทดสอบอย่างถูกต้อง ฉันค่อนข้างมั่นใจว่า Google แนะนำให้ใช้ด้วยซ้ำ Google มีคำแนะนำ / ตัวอย่างมากมายสำหรับการใช้ Proguard กับแอพ Android
CrackerJack 9

Proguard เป็นเครื่องมือที่ดี แต่ Google แนะนำให้ใช้อย่างน้อยที่สุดเนื่องจากข้อ จำกัด ขนาดที่ค่อนข้างกว้างในรูปแบบ dex เป็นอย่างอื่น (ดูcode.google.com/p/android/issues/detail?id=7147 )
ลัน

5
@alun นั่นไม่ใช่เหตุผล พวกเราที่ไม่ต้องการให้แอปของเราได้รับการออกแบบทางวิศวกรรมแบบย้อนกลับหรือผู้ที่ใช้การออกใบอนุญาตเพื่อ 'พยายาม' เพื่อป้องกันการละเมิดลิขสิทธิ์ควรใช้เครื่องมือที่ทำให้งงงวยเช่นนี้เพื่อให้ยากขึ้นสำหรับแฮกเกอร์ การทำให้แอปพลิเคชันของคุณใช้พื้นที่น้อยลงยังเป็นประโยชน์สำหรับผู้ใช้และยังมีการเพิ่มประสิทธิภาพโดยเครื่องมือเหล่านี้อีกด้วย ... ประโยชน์อีกอย่าง
Christopher Perry

คำตอบ:


128

org.simpleframework.xml.stream.StreamReaderjavax.xml.stream.events.XMLEventในรหัสของคุณหมายถึง คลาสหลังเป็นส่วนหนึ่งของรันไทม์ Java ( rt.jar) แต่ไม่ได้เป็นส่วนหนึ่งของรันไทม์ Android ( android.jar) ดังนั้น ProGuard จึงเตือนว่ามีบางอย่างเสีย หากคุณแน่ใจว่าแอปพลิเคชันของคุณใช้งานได้จริงคุณสามารถระบุได้

-dontwarn javax.xml.stream.events.**

ProGuard นรก?


15
นั่นไม่ได้แก้ไขให้ฉัน แต่สิ่งนี้-dontwarn javax.xml.**
Jeshurun

8
การเพิ่ม-libraryjars <java.home>/lib/rt.jarแก้ไขปัญหาให้ฉัน
Gautam

3
ฉันได้รับคำเตือนเพิ่มเติมเกี่ยวกับเช่น javax.xml.stream.XMLInputFactory ดังนั้นฉันจึงใช้-dontwarn javax.xml.stream.**
spatialist

1
ฉันจะตั้งค่า-dontwarnGUI ร้องเพลงได้อย่างไร
Tomáš Zato - คืนสถานะ Monica

2
Proguard hell ยังคงดำเนินต่อไปเพียงแค่ถลกฉันและจัดการกับความเจ็บปวดนี้
Josh


5

ข้อผิดพลาดนี้เกิดขึ้นเนื่องจาก libs ที่คุณใช้ขึ้นอยู่กับ libs อื่นซึ่งไม่ได้ใช้จริง แต่ Proguard กำลังมองหาสิ่งเหล่านี้
เพิ่มบรรทัด-dontwarnของคุณลงในไฟล์proguard-rules.proในโปรเจ็กต์ Android ของคุณเพื่อปิดการใช้งานคำเตือนนี้

ใส่คำอธิบายภาพที่นี่

คุณสามารถค้นหาการอ้างอิงที่คุณต้องการเพิ่มใน proguard-rules.pro ของคุณใน stacktrace ของข้อผิดพลาดของคุณ


2

คุณควรรวมสิ่งนี้ไว้ในการกำหนดค่า Proguard ของคุณ:

-dontskipnonpubliclibraryclasses

มันทำกับฉันในตอนนั้น ... ~ 4 ปีที่แล้ว ... สิ่งต่างๆอาจเปลี่ยนไปตั้งแต่นั้นมา :) ดูเหมือนว่าจะทำงานให้กับคนอื่นอย่างน้อย 2 คนอยู่ดี
CrackerJack9

proguard-android.txtเริ่มต้นมีบรรทัดนี้อยู่แล้ว
Cristina De Rito

1
@Ultimecia ที่กระทำมาจากปี 2013 โพสต์นี้สร้างขึ้นในปี 2011
CrackerJack9

2

My Magic key ที่แก้ไขชั่วโมงการค้นหาของฉัน: เพิ่มสิ่งนี้ใน progruard-android.txt

-dontskipnonpubliclibraryclassmembers

0

อืมมม การอ่านคำเตือนนั้นดูเหมือนว่าไลบรารีที่คุณพยายามใช้จะมีการพึ่งพา javax.xml.stream.events ฉันไม่คิดว่าเนมสเปซจะรวมอยู่ในแอนดรอยด์จริงๆ (ดูดัชนีบรรจุภัณฑ์ )

ลองปรับใช้กับอีมูเลเตอร์โดยไม่ต้องใช้ proguard และดูว่าใช้งานได้หรือไม่ การคาดเดาของฉันจะไม่เกิดขึ้นหากคำเตือนนั้นถูกต้อง


สวัสดีถ้ามันทำงานในอีมูเลเตอร์โดยไม่มีโปรการ์ดแสดงว่าคำเตือนไม่ถูกต้อง? ฉันพยายามหาสาเหตุว่าทำไมฉันจึงมีคำเตือนคล้าย ๆ กันนี้ ฉันไม่ต้องการเพียงแค่ระงับคำเตือน
Michelle Shieh

0

ฉันคิดว่านี่เป็นกรณีขอบ แต่ในกรณีของฉันฉันต้องล้างโฟลเดอร์ build ใน Jenkins proguard ของฉันอย่างสมบูรณ์พยายามทำงานกับรหัสเก่าซึ่งไม่มีอีกต่อไป - ในกรณีที่มีใครมีปัญหาเดียวกัน


0

ในกรณีของฉันฉันไม่ได้เปลี่ยนแปลงอะไรเลยและคำเตือนก็เริ่มแสดงขึ้น ปัญหาเกิดจากแคช gradle เสีย ตรวจสอบอื่น ๆ ของฉันคำตอบ ฉันแชร์สิ่งนี้เพราะใช้เวลา 2 ชั่วโมงในการค้นหาปัญหา:]


0

เพิ่มบรรทัดนี้ลงproguard-rules.proในไฟล์ของคุณในไดเร็กทอรี gradle scripts:

-dontwarn package.class.name.**

ที่ไหน package.class.nameเป็นชื่อแพคเกจที่มีชื่อชั้นของไฟล์ขวดต่อท้าย

ตัวอย่างเช่น:

-dontwarn com.myexternalclass.utils.**
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.