防止Proguard移除特定的可绘制对象。

18

在我的Android项目中,我有一些图像存储在res/drawable/中,这些图像 只被从Webview加载的HTML文件访问。例如(HTML代码):

<img src="file:///android_res/drawable/myfriend.png">

这些图片在Proguard优化期间从apk中删除。

有没有人知道一种方法可以保留这些文件(即使它们在Java代码中没有被直接使用)?


1
你应该将这种文件放入你的资产文件夹中,并像 mWebView.loadUrl("file:///android_asset/myfriend.png"); 这样进行加载。 - Robby Pond
你说得对。我把图片移动到了“assets”文件夹中,这解决了我的问题。上面的那行变成了:<img src="file:///android_asset/myfriend.png">。 - Gilbou
3个回答

40

我遇到了类似的问题,想要补充一些内容。

ProGuard并不会剥夺资源。 如果你简单地解压你的apk文件,你会看到图像文件仍然存在。

问题在于Webkit FileLoader将尝试使用反射加载你的R$drawable类。如果你没有在proguard.cfg文件中添加任何keep规则,那么这个类将被重命名,因此Webkit将无法加载你的资源。

将文件放置在assets文件夹中就可以绕过R类系统,一切都能正常工作。

但是,如果你想为不同的密度使用不同的资源,这并不是一个解决方案。

我建议你只需添加一个非常基本的keep规则来保留R内部类和字段:

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

-keep class **.R$*

生成签名 APK 时,在 Proguard 配置中出现异常。 - Ashish Agrawal
@ninniuz,我尝试了上面的代码片段,只是用**.R$Drawable*代替,但它没有起作用。为什么**.R$*可以工作,而先前提到的方法不行呢? - Matt Strom

3

我将图片移动到了“assets”文件夹中,这解决了我的问题:

<img src="file:///android_asset/myfriend.png">

0

针对本地化的简单HTML(没有链接到本地化的本地文件/图像)

使用此Proguard规则用于原始文件夹:

-keep class com.example.appname.R$raw { *; }

WebView 的示例 Url:

file:///android_res/raw/filename.html

示例文件夹结构:

res/raw/filename.html

res/raw-en/filename.html

res/raw-hu/filename.html


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