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

4 回答 4

11

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

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

问题是 Webkit FileLoader 将尝试使用反射加载您的 R$drawable 类。如果您不向 proguard.cfg 文件添加任何保留规则,该类将被重命名,因此 Webkit 将无法加载您的资源。(取自Prevent Proguard 以删除特定的可绘制对象)。

这就是为什么 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$*

请记住,混淆的工作方式是有原因的!

希望这可以帮助

于 2012-08-24T15:31:15.330 回答
1

只是为了澄清资产与资产的辩论。根据谷歌文档(见下文),项目目录中的文件夹应称为“assets”,而要访问它们,您必须使用“file:///android_asset/”

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

请注意,我无法添加任何评论,这就是我将其发布为答案的原因。

于 2014-08-24T09:24:37.253 回答
0

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

在 Android Studio(至少 1.0.1)中,如果您将资产或资源用于媒体,则发布版本中提供的默认混淆级别没有区别。android_res/rawandroid_asset。他们仍然被称为那个。

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

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

于 2015-02-27T19:26:21.997 回答
-1

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

myWebView.loadUrl("file:///android_assets/myfile.html");
于 2012-08-24T15:20:54.933 回答