2012-08-24 12 views
6

Tengo una vista web en mi actividad, y el uso de Proguard para ofuscación parece romper mi WebView y no entiendo por qué.Proguard rompe Android WebView, ¿por qué?

El código es bastante simple, tengo el archivo HTML en mi directorio res/raw, aquí está el código que lo carga bien cuando se depura.

WebView mv = (WebView)findViewById(R.id.webView1); 
mv.loadUrl("file:///android_res/raw/wesite.html"); 

Tan pronto como se crea el apk para la liberación, la ejecución a través Proguard no funciona, acabo de recibir la página no se puede cargar.

No he agregado nada al archivo de configuración de proguard todavía.

Respuesta

9

Proguard ofusca directorios por lo que si usted está buscando android_res/bruto, es probable que ya no llamaba así!

Puede agregar reglas al archivo proguard.cfg en su proyecto que lo hará omitir ciertos archivos. Pero en este caso, mover su recurso en bruto a la carpeta de activos hará el truco.

El problema es que Webkit FileLoader intentará cargar su clase R $ dibujable mediante reflexión. Si no agrega ninguna regla de mantenimiento a su archivo proguard.cfg, se cambiará el nombre de esa clase, por lo tanto, Webkit no podrá cargar su recurso. (tomado de Prevent Proguard to remove specific drawables).

Esta es la razón por Android utiliza el sistema de nombres de clase I para los recursos - un identificador de búsqueda uniquie lugar de hacer referencia a los archivos por su ubicación

Al colocar el archivo en los activos de la carpeta están pasando por alto el sistema de I referenciación clase y todo debería funcionar bien

que debe mover los archivos en la carpeta website.html activos y llamar:

mv.loadUrl("file:///android_asset/wesite.html"); 

Como se sugiere en el enlace anterior, debería ser posible para añadir la regla siguiente para su archivo a Proguard.cfg detener la localización recursos que se obfucated lugar:

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

-keep class **.R$* 

desnudo en cuenta la ofuscación funciona de la manera que lo hace por una razón!

Esperanza esto ayuda

+1

Lo anterior funciona para Proguard.cnf y mueve el sitio web a la carpeta de activos. Sin embargo, el código debería ser 'mv.loadUrl (" file: ///android_asset/wesite.html ");' ** Nota: ** 'android_asset' not' android_assets'. Gracias por su explicación. – Ne0

+0

No necesita mantener todas las clases R y sus campos, debería ser posible seleccionar algunos nombres de recursos que realmente desea conservar y dejar que el resto (por ejemplo, diseño | xml | valores) se ofusque. – TWiStErRob

-1

para cargar una carpeta de archivos de crudo en una vista web:

myWebView.loadUrl("file:///android_assets/myfile.html"); 
+0

Eso carga archivos desde el directorio de activos, no desde el directorio sin formato. Por favor, lea la publicación. El problema es con la ofuscación de Proguards, no con el código. – Ne0

1

Solo para aclarar el activo vs activos debate. La carpeta en el directorio del proyecto debería llamarse "activos" de acuerdo con google docs (véase más adelante), mientras que para acceder a ellos debe usar "file: /// android_asset /"

activos/ Esto está vacía. Puede usarlo para almacenar archivos de activos sin procesar. Los archivos que guarde aquí se compilan en un archivo .apk tal como está, y se conserva el nombre del archivo original. Puede navegar por este directorio de la misma manera que un sistema de archivos típico usando URI y leer archivos como una secuencia de bytes usando AssetManager. Por ejemplo, esta es una buena ubicación para texturas y datos de juegos.

Tenga en cuenta que no puedo agregar ningún comentario, es por eso que publiqué esto como respuesta.

0

Solo para actualizar después de haber sido llevado a esta publicación por una pregunta más reciente.

En Android Studio (1.0.1 como mínimo) no hay diferencia en el nivel de ofuscación predeterminado provisto en una compilación de versión si usa activos o res para sus medios. android_res/raw o android_asset. Y los dos seguían siendo llamados así.

Ejecuté apktool en ambas compilaciones, sobresaltado por lo último, usando android_res/raw, siendo más grande. El tamaño fue causado únicamente por mis medios. Ambos apenas se ofuscaron, en línea con otros apks en la tienda de aplicaciones. Los recursos y xml no se ofuscaron en ninguna ocasión. La única dificultad que uno tendría para la ingeniería inversa es convertir los baksmali a Java. He visto otros apk mejor ofuscados pero los míos conservaron los nombres de clase originales que les di, aunque divididos en varias partes.

Soy nuevo en pro-guardia, prefiero C++ pero, según tengo entendido, se aplica de forma predeterminada para compilaciones de versiones.

+0

set 'minifyEnabled true' (necrocomment mucho) – n00b