我的活动中有一个WebView,使用Proguard进行混淆似乎打破了我的WebView,我不明白为什么。
代码非常简单,我的res / raw目录中有HTML文件,这里是调试时加载它的代码。
WebView mv = (WebView)findViewById(R.id.webView1);
mv.loadUrl("file:///android_res/raw/wesite.html");
一旦我创建了apk用于发布,通过proguard运行它就不起作用,我只是得到了无法加载的页面。
我还没有在proguard配置文件中添加任何内容。
答案 0 :(得分:10)
Proguard模糊了目录,所以如果你正在寻找android_res / raw,它可能不再被称为!
您可以将规则添加到项目中的proguard.cfg文件中,以使其跳过某些文件。但在这种情况下,将原始资源移动到assets文件夹就可以了。
问题是Webkit FileLoader将尝试使用反射加载您的R $ drawable类。如果您没有向proguard.cfg文件添加任何保留规则,那么将重命名该类,因此Webkit将无法加载您的资源。 (摘自Prevent Proguard to remove specific drawables)。
这就是Android为资源使用R类命名系统的原因 - 一个单一的查找ID,而不是按位置引用文件
通过将文件放入资产文件夹,您绕过R类引用系统,一切都应该正常。
您应将您的website.html文件移至资源文件夹并致电:
mv.loadUrl("file:///android_asset/wesite.html");
正如上面的链接所示,应该可以将以下规则添加到Proguard.cfg文件中,以阻止资源位置被取代:
-keepclassmembers class **.R$* {
public static <fields>;
}
-keep class **.R$*
请记住混淆的方式是有原因的!
希望这有帮助
答案 1 :(得分:1)
只是为了澄清资产与资产的争论。根据谷歌文档(见下文),项目目录中的文件夹应称为“资产”,而要访问它们,您必须使用“file:/// android_asset /”
资产/ 这是空的。您可以使用它来存储原始资产文件。您在此处保存的文件将按原样编译为.apk文件,并保留原始文件名。您可以使用URI以与典型文件系统相同的方式导航此目录,并使用AssetManager将文件作为字节流读取。例如,这是纹理和游戏数据的好位置。
请注意,我无法添加任何评论,这就是我将此作为答案发布的原因。
答案 2 :(得分:0)
在更近期的问题导致这篇文章之后更新。
在Android Studio(至少1.0.1)中,如果您为媒体使用资产或资源,则发布版本中提供的默认混淆级别没有区别。 android_res/raw
或android_asset
。而且他们都被称为。
我在两个版本上都运行了apktool,使用android_res/raw
使用{{1}},更大。尺寸完全由我的媒体引起。两者都没有被混淆,与app store上的其他apks一致。资源和xml都没有被混淆。对这些进行逆向工程的唯一困难是将baksmali转换为Java。我已经看到其他apk更好的混淆,但我保留了我给他们的原始类名,虽然分为几个部分。
我是初学者,更喜欢使用C ++,但据我所知,它默认适用于发布版本。
答案 3 :(得分:-1)
在webview中加载原始文件夹的文件:
myWebView.loadUrl("file:///android_assets/myfile.html");