Proguard破坏了Android WebView,为什么?

8

我在我的活动中有一个 WebView,在使用 Proguard 进行混淆时似乎会破坏我的 WebView,我不明白为什么。

代码非常简单,我在我的 res/raw 目录中有 HTML 文件,以下是加载该文件的代码,调试时可以正常工作。

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

当我为发布创建apk时,通过proguard运行它时,它无法工作,我只能得到“无法加载页面”的提示。

目前我还没有在proguard配置文件中添加任何内容。

4个回答

11

Proguard会混淆目录,因此如果您正在寻找android_res/raw文件夹,则该文件夹可能已更改名称!

您可以在项目中的proguard.cfg文件中添加规则,使其跳过某些文件。但在这种情况下,将原始资源移动到assets文件夹中即可解决问题。

问题在于Webkit FileLoader将尝试使用反射加载R $ drawable类。如果您没有向proguard.cfg文件添加任何保留规则,该类将被重命名,因此Webkit将无法加载您的资源。 (摘自Prevent Proguard to remove specific drawables)。

这就是为什么Android使用R类命名系统来引用资源-一个独特的查找ID,而不是通过其位置引用文件的原因。

通过将文件放入assets文件夹中,您可以绕过R类引用系统,一切都应该正常工作。

您应该将website.html文件移动到assets文件夹中并调用:

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

如上面的链接所建议的那样,您应该可以将以下规则添加到Proguard.cfg文件中,以防止资源位置被混淆:

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

-keep class **.R$*

请记住,混淆工作原理有其原因!

希望这能帮到您。


1
以上方法对于Proguard.cnf文件和将网站移动到assets文件夹中是有效的。然而代码应该是:mv.loadUrl("file:///android_asset/wesite.html"); 注意: android_asset 而不是 android_assets。感谢您的解释。 - Ne0
不需要保留所有的R类及其字段,可以选择部分你真正想要保留的资源名称,并让其他内容(例如layout | xml | values)被混淆。 - TWiStErRob

1
为了澄清资产与资产之间的争议。项目目录中的文件夹应该被称为“assets”,如谷歌文档所述(见下文),而要访问它们,必须使用“file:///android_asset/”。
资产/ 这是空的。您可以使用它来存储原始资产文件。在此保存的文件会原样编译为.apk文件,并保留原始文件名。您可以使用URI以及AssetManager将其作为典型文件系统一样浏览此目录并读取文件作为字节流。例如,这是纹理和游戏数据的好位置。
请注意,我无法添加任何评论,这就是为什么我将其发布为答案的原因。

0

仅仅是为了更新一下,因为我被一个更近期的问题引导到了这篇文章。

在Android Studio(至少是1.0.1版本)中,如果您在媒体方面使用assets或res,那么在发布版本中提供的默认混淆级别没有任何区别。android_res/rawandroid_asset。它们仍然都叫这个名字。

我对两个版本都运行了apktool,最新版本使用了android_res/raw,让我感到惊讶的是它更大。大小仅仅是由我的媒体引起的。两者都几乎没有被混淆,与应用商店上的其他apk相一致。在两种情况下,资源和xml都没有被混淆。唯一困难的是将baksmali转换为Java来进行逆向工程。我见过其他更好的apk被混淆,但我的保留了我给它们的原始类名,尽管被分成了几个部分。

我是pro-guard的新手,更喜欢C++,但据我所知,它会默认应用于发布版本。


设置 minifyEnabled true(不要太多无用注释) - n00b

-1

在Webview中加载raw文件夹中的文件:

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

它从资产目录而不是原始目录加载文件。请阅读帖子。问题出在Proguards混淆上,而不是代码上。 - Ne0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接