2012-08-24 37 views
6

我在我的活動中有一個WebView,並且使用Proguard進行混淆似乎破壞了我的WebView,我不明白爲什麼。Proguard打破Android WebView,爲什麼?

的代碼非常簡單,我在我的RES/raw目錄的HTML文件,這裏是調試時加載它精細的代碼。

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

一旦我創建apk版本,通過proguard運行它不起作用,我只是得到無法加載頁面。

我還沒有添加任何內容到proguard配置文件。

回答

9

Proguard的混淆目錄,因此,如果您正在尋找android_res /原料很可能是不再叫的!

您可以添加規則,在項目中proguard.cfg文件,這將使它跳過某些文件。但在這種情況下,將您的原始資源移動到資產文件夾將會有所斬獲。

的問題是,Webkit的FileLoader會嘗試使用反射加載R $繪製類。如果您沒有將任何keep規則添加到您的proguard.cfg文件中,該類將被重命名,因此Webkit將無法加載您的資源。 (取自Prevent Proguard to remove specific drawables)。

這就是爲什麼Android使用資源R類命名系統 - 一個各式獨特的查找ID,而不是通過他們的位置

引用文件,通過將文件注入資產的文件夾被繞過R類參照系統和一切都應該正常工作。至於建議在上面的鏈接

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

,應該可以到下面的規則添加到您的Proguard.cfg文件:

你應該將你的website.html文件到Assets文件夾,並調用停止資源位置被obfucated,而不是:

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

-keep class **.R$* 

不知道困惑的工作方式,因爲它的原因!

希望這有助於

+1

上述工作適用於Proguard.cnf並將網站移至資產文件夾。但是代碼應該是'mv.loadUrl(「file:///android_asset/wesite.html」);'**注意:**'android_asset'不是'android_assets'。謝謝你的解釋。 – Ne0

+0

您不需要保留所有R類及其字段,應該可以選擇一些您真正想要保留的資源名稱,並讓其餘的(例如layout | xml | values)模糊處理。 – TWiStErRob

-1

要在網頁視圖加載原始文件夾中的文件:

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

加載資產目錄中的文件,而不是原始目錄。請閱讀帖子。問題在於Proguards混淆,而不是代碼。 – Ne0

1

只是爲了澄清資產VS資產辯論。在項目目錄的文件夾應該被稱爲「資產」按照谷歌文檔(見下文),而訪問他們,你必須使用「文件:/// android_asset /」

資產/ 這是空的。您可以使用它來存儲原始資產文件。這裏保存的文件按原樣編譯爲.apk文件,並保留原始文件名。您可以像使用URI的典型文件系統一樣瀏覽此目錄,並使用AssetManager將文件作爲字節流讀取。例如,這對於紋理和遊戲數據來說是一個很好的位置。

請注意,我不能添加任何評論,這就是爲什麼我張貼了這個答案的。

0

只是在更新的問題導致這篇文章後更新。

在Android Studio(至少1.0.1)中,如果您爲媒體使用資產或資源,則發佈版本中提供的默認模糊級別沒有區別。 android_res/rawandroid_asset。他們都是這樣稱呼的。

我在兩個版本上都運行了apktool,最新版本使用android_res/raw,這個版本更大。大小完全是由我的媒體造成的。根據應用商店中的其他應用,兩者幾乎都沒有被模糊處理。資源和XML都不會被混淆。唯一難以逆轉工程的是將baksmali轉換爲Java。我看到其他apk更好地混淆了,但我保留了我給他們的原始類名,儘管分成了幾個部分。

我是新來的親衛隊員,寧願選擇C++,但據我瞭解,它是默認應用於發佈版本的。

+0

設置'minifyEnabled true'(壞評價多) – n00b