Proguard Hell - No puedo encontrar la clase referenciada

125

Por lo tanto, estoy INTENTANDO para liberar algo de software, pero Proguard me está dando un dolor de cabeza.

Cuando intento exportar usando proguard, recibo muchas advertencias, es decir, "no puedo encontrar la clase referenciada"

Por ejemplo:

[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.
[ 

Las advertencias parecen estar relacionadas con el marco simple, por lo que en mi archivo de configuración de protección he agregado lo siguiente:

-libraryjars pathtoprojecttolibs\simple-xml-2.4.jar

¿Dónde pathtoprojecttolibsestá el camino a los frascos a los que hace referencia mi proyecto?

Esto no hace ninguna diferencia.

Si el marco simple hace referencia a Java, ¿puedo decirle a Proguard que ignore esto también?

¿Algunas ideas?

iasksillyquestions
fuente
1
¿Estás usando proguard solo para sacudir árboles? Si es así, ¿ha verificado el tamaño de su archivo sin usarlo? Puede obtener errores súper extraños cuando Proguard arroja algo a lo que se accede utilizando la reflexión, por ejemplo, que no encontrará hasta que rompa el tiempo de ejecución, así que esté realmente seguro de que lo necesita.
alun
¿Realmente solo lo estaba usando para tratar de proteger el código que estaba siendo cortado tan fácilmente? ¿Crees que vale la pena?
iasksillyquestions
3
@ListenToRick Proguard está perfectamente bien, si se ejecuta con las configuraciones adecuadas y la aplicación resultante se prueba correctamente. Estoy bastante seguro de que Google incluso recomienda su uso. Google proporciona muchas guías / ejemplos para usar Proguard con aplicaciones de Android.
CrackerJack9
Proguard es una buena herramienta, pero Google lo recomienda probablemente al menos tanto debido a una limitación de tamaño bastante extraña en el formato dex como cualquier otra cosa. (Ver code.google.com/p/android/issues/detail?id=7147 )
alun
55
@alun, esa no es la razón. Aquellos de nosotros que no queremos que nuestras aplicaciones realicen ingeniería inversa, o que estamos usando licencias para 'intentar' evitar la piratería, debemos usar una herramienta de ofuscación como esta para que sea más difícil que sean piratas informáticos. Hacer que su aplicación ocupe menos espacio también es un beneficio para el usuario final, y también hay optimizaciones hechas por estas herramientas ... otro beneficio más.
Christopher Perry

Respuestas:

128

org.simpleframework.xml.stream.StreamReaderen su código se refiere a javax.xml.stream.events.XMLEvent. La última clase es parte del tiempo de ejecución de Java ( rt.jar) pero no del tiempo de ejecución de Android ( android.jar), por lo que ProGuard advierte que algo podría estar roto. Si está seguro de que su aplicación funciona de todos modos, puede especificar

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

ProGuard infierno?

Eric Lafortune
fuente
15
Eso no me lo solucionó, sin embargo esto sí lo hizo-dontwarn javax.xml.**
Jeshurun
8
Agregar -libraryjars <java.home>/lib/rt.jarsolucionó el problema para mí.
Gautam
3
Recibí advertencias adicionales sobre, por ejemplo, javax.xml.stream.XMLInputFactory, así que utilicé-dontwarn javax.xml.stream.**
espacialista
1
¿Cómo puedo configurar -dontwarncantar la GUI?
Tomáš Zato - Restablece a Monica
2
Procurar el infierno continúa, solo desollarme y terminar con este dolor.
Josh
5

Este error se produce porque las bibliotecas que utiliza dependen de otras bibliotecas que realmente no se utilizan, pero Proguard las está buscando.
Agregue sus líneas -dontwarn a su archivo proguard-rules.pro en su proyecto de Android para deshabilitar estas advertencias.

ingrese la descripción de la imagen aquí

Puede encontrar qué dependencias necesita agregar a su proguard-rules.pro en el stacktrace de su error.

Yuliia Ashomok
fuente
2

Debe incluir esto en su configuración de Proguard:

-dontskipnonpubliclibraryclasses
CrackerJack9
fuente
Bueno, lo hizo para mí en ese momento ... ~ hace 4 años ... las cosas pueden haber cambiado desde entonces :) Parecía haber trabajado para al menos otras 2 personas de todos modos.
CrackerJack9
El proguard-android.txt predeterminado ya tiene esta línea.
Cristina De Rito
1
@Ultimecia que se compromete es de 2013, esta publicación se realizó en 2011
CrackerJack9
2

Mi llave mágica que resolvió mis horas de búsqueda: agregue esto a progruard-android.txt

-dontskipnonpubliclibraryclassmembers
Ashraf Alshahawy
fuente
0

Hmm Al leer esa advertencia, parecería que la biblioteca que está tratando de usar depende de javax.xml.stream.events. No creo que el espacio de nombres esté realmente incluido en Android en absoluto. (Ver índice del paquete ).

Intente implementarlo en el emulador sin usar proguard y vea si funciona. Mi suposición sería no si esa advertencia es precisa.

alun
fuente
Hola, si está funcionando en el emulador sin el protector, ¿significa que las advertencias son inexactas? Estoy tratando de entender por qué tuve este tipo de advertencias similares. No quiero simplemente suprimir las advertencias.
Michelle Shieh
0

Creo que este es un caso extremo, pero en mi caso tuve que borrar por completo la carpeta de compilación en mi protector Jenkins, traté de trabajar con código antiguo que ya no estaba allí, por si alguien tiene el mismo problema.

Luckyhandler
fuente
0

En mi caso no he cambiado nada y la advertencia comenzó a aparecer. El problema era con los cachés de gradle rotos. Mira mi otra respuesta . Comparto esto porque me tomó 2 horas encontrar el problema:]

AppiDevo
fuente
0

Agregue esta línea a su proguard-rules.proarchivo en el directorio de scripts de gradle:

-dontwarn package.class.name.**

donde package.class.nameestá el nombre del paquete con el nombre de la clase del archivo jar adjunto.

Por ejemplo:

-dontwarn com.myexternalclass.utils.**
Pedro Marthon
fuente