2012-08-24 13 views
6

Ho una visualizzazione Web nella mia attività e l'utilizzo di Proguard per l'offuscamento sembra interrompere la mia WebView e non capisco perché.Proguard interrompe Android WebView, perché?

Il codice è piuttosto semplice, ho il file HTML nella mia directory res/raw, qui è il codice che lo carica bene durante il debug.

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

Appena creo l'apk per il rilascio, esecuzione attraverso Proguard non funziona, ottengo solo la pagina non può caricare.

Non ho ancora aggiunto nulla al file di configurazione proguard.

risposta

9

Proguard offusca le directory, quindi se siete alla ricerca di android_res/grezzo è probabilmente non è più chiamato così!

È possibile aggiungere regole al file proguard.cfg nel progetto in modo che salti determinati file. Ma in questo caso, lo spostamento della risorsa non elaborata nella cartella delle risorse farà la differenza.

Il problema è che il FileLoader Webkit tenterà di caricare la classe R $ drawable utilizzando il reflection. Se non si aggiunge nessuna regola di mantenimento al file proguard.cfg, tale classe verrà rinominata, quindi Webkit non sarà in grado di caricare la risorsa. (Tratto da Prevent Proguard to remove specific drawables).

Questo è il motivo per cui Android utilizza il sistema di denominazione della classe R per le risorse - un'uniquie ricerca id invece che fare riferimento i file dalla loro posizione

Inserendo il file nel patrimonio cartella sono bypassando il sistema di classe R Informazioni e tutto dovrebbe funzionare bene.

si dovrebbe spostare il file nella cartella website.html beni e chiamare:

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

Come suggerito al link qui sopra, dovrebbe essere possibile per aggiungere la regola di seguito al file Proguard.cfg a fermare la posizione delle risorse in fase di obfucated invece:

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

-keep class **.R$* 

Bare in mente l'offuscamento funziona il modo in cui funziona per una ragione!

Spero che questo aiuti

+1

Quanto sopra funziona per Proguard.cnf e sposta il sito Web nella cartella delle risorse. Comunque il codice dovrebbe essere, 'mv.loadUrl (" file: ///android_asset/wesite.html ");' ** Nota: ** 'android_asset' not' android_assets'. Grazie per la tua spiegazione. – Ne0

+0

Non è necessario mantenere tutte le classi R e i relativi campi, dovrebbe essere possibile selezionare i nomi di alcune risorse che si desidera conservare e lasciare che il resto (ad esempio layout | xml | valori) venga offuscato. – TWiStErRob

-1

per caricare un file di cartelle prime in un WebView:

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

Carica file dalla directory degli asset, non dalla directory raw. Si prega di leggere il post. Il problema è con l'oscuramento di Proguards, non con il codice. – Ne0

1

Giusto per chiarire bene vs beni dibattito. La cartella nella directory del progetto dovrebbe essere chiamato "beni" come da google docs (vedi sotto), mentre per accedervi è necessario utilizzare "file: /// android_asset /"

attività/ Questa è vuoto. Puoi usarlo per memorizzare file di risorse non elaborate. I file che vengono salvati qui vengono compilati in un file .apk così com'è e il nome file originale viene mantenuto. Puoi navigare questa directory nello stesso modo di un file system tipico usando gli URI e leggi i file come un flusso di byte usando AssetManager. Ad esempio, questa è una buona posizione per trame e dati di gioco.

Si prega di notare che non posso aggiungere alcun commento, è per questo che ho postato questo come risposta.

0

Solo per aggiornare dopo essere stato portato a questo post da una domanda più recente.

In Android Studio (almeno 1.0.1) non è presente alcuna differenza nel livello predefinito di offuscamento fornito in una build di rilascio se si utilizzano risorse o res per il proprio media. android_res/raw o android_asset. Ed entrambi lo chiamavano ancora così.

Ho eseguito apktool su entrambe le build, sorpreso dall'ultima versione, utilizzando android_res/raw, essendo più grande. La dimensione è stata causata esclusivamente dai miei media. Entrambe sono state a malapena offuscate, in linea con altri apk sull'app store. Risorse e xml non sono mai state occultate. L'unica difficoltà che si potrebbe fare con il reverse engineering è la conversione di baksmali in Java. Ho visto altri apk meglio offuscati ma i miei hanno mantenuto i nomi di classe originali che ho dato loro, anche se suddivisi in più parti.

Sono nuovo di pro-guard, preferendo C++ ma da quello che capisco è applicato di default per le build di rilascio.

+0

imposta 'minifyEnabled true' (necrocomment molto) – n00b