Proguard破坏Android WebView,为什么?

Proguard破坏Android WebView,为什么?,android,webview,proguard,Android,Webview,Proguard,我的活动中有一个WebView,使用Proguard进行模糊处理似乎会破坏我的WebView,我不明白为什么 代码非常简单,我的res/raw目录中有HTML文件,下面是调试时加载它的代码 WebView mv = (WebView)findViewById(R.id.webView1); mv.loadUrl("file:///android_res/raw/wesite.html"); 一旦我创建了用于发布的apk,通过proguard运行它,它就不起作用了,我只是得到了无法加载页面 我尚

我的活动中有一个WebView,使用Proguard进行模糊处理似乎会破坏我的WebView,我不明白为什么

代码非常简单,我的res/raw目录中有HTML文件,下面是调试时加载它的代码

WebView mv = (WebView)findViewById(R.id.webView1);
mv.loadUrl("file:///android_res/raw/wesite.html");
一旦我创建了用于发布的apk,通过proguard运行它,它就不起作用了,我只是得到了无法加载页面


我尚未向proguard配置文件添加任何内容。

要在webview中加载原始文件夹的文件,请执行以下操作:

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

Proguard会混淆目录,因此,如果您正在寻找android_res/raw,它可能不再被称为android_res/raw

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

问题是Webkit文件加载器将尝试使用反射加载R$drawable类。如果不向proguard.cfg文件添加任何保留规则,则该类将被重命名,因此Webkit将无法加载资源。 (摘自)

这就是为什么Android对资源使用R类命名系统——一个uniquie查找id,而不是按文件位置引用文件

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

您应该将您的website.html文件移动到assets文件夹中,然后调用:

mv.loadUrl("file:///android_asset/wesite.html");
正如上面链接中所建议的,应该可以将以下规则添加到Proguard.cfg文件中,以停止资源位置被对象化:

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

-keep class **.R$*
-keepclassmembers类**.R$*{
公共静态;
}
-继续上课**$*
请记住,混淆的工作方式是有原因的


希望这有助于澄清资产与资产之争。根据谷歌文档(见下文),项目目录中的文件夹应称为“资产”,而要访问它们,您必须使用file:///android_asset/"

资产/ 这是空的。您可以使用它来存储原始资产文件。保存在此处的文件将按原样编译为.apk文件,并保留原始文件名。您可以使用与使用URI的典型文件系统相同的方式导航此目录,并使用AssetManager以字节流的形式读取文件。例如,这是纹理和游戏数据的好位置


请注意,我不能添加任何评论,这就是我将此作为答案发布的原因。

只是在最近的一个问题引导到这篇文章之后进行更新

在Android Studio(至少1.0.1)中,如果您在媒体上使用资产或资源,则发布版本中提供的默认模糊级别没有区别
android\u res/raw
android\u资产
。他们两人仍然被这样称呼

我在两个版本上都运行了apktool,最新版本让我大吃一惊,使用的是更大的
android\u res/raw
。大小完全是由我的媒体造成的。与应用商店上的其他APK一样,这两个应用程序几乎没有被混淆。资源和xml在这两种情况下都没有混淆。逆向工程的唯一困难是将baksmali转换为Java。我见过其他的apk更容易混淆,但我的apk保留了我给它们的原始类名,尽管它被分成了几个部分


< P>我是Pro Gueor的新手,喜欢C++,但我知道它默认是用于发布版本。

从资产目录加载文件,而不是原始目录。请看这篇文章。问题在于Proguard的模糊处理,而不是代码。上面的内容确实适用于Proguard.cnf并将网站移动到assets文件夹。但是,代码应该是,
mv.loadUrl(“file:///android_asset/wesite.html");注意:
android\u资产
android\u资产
。感谢您的解释。您不需要保留所有的R类及其字段,应该可以选择一些您真正想要保留的资源名称,并让其余的(例如布局| xml |值)变得模糊。set
minifyEnabled true
(注释太多)