在我的Android项目中,我有一些图像存储在res/drawable/中,这些图像 仅 只被从Webview加载的HTML文件访问。例如(HTML代码):
<img src="file:///android_res/drawable/myfriend.png">
这些图片在Proguard优化期间从apk中删除。
有没有人知道一种方法可以保留这些文件(即使它们在Java代码中没有被直接使用)?
在我的Android项目中,我有一些图像存储在res/drawable/中,这些图像 仅 只被从Webview加载的HTML文件访问。例如(HTML代码):
<img src="file:///android_res/drawable/myfriend.png">
这些图片在Proguard优化期间从apk中删除。
有没有人知道一种方法可以保留这些文件(即使它们在Java代码中没有被直接使用)?
我遇到了类似的问题,想要补充一些内容。
ProGuard并不会剥夺资源。 如果你简单地解压你的apk文件,你会看到图像文件仍然存在。
问题在于Webkit FileLoader将尝试使用反射加载你的R$drawable类。如果你没有在proguard.cfg文件中添加任何keep规则,那么这个类将被重命名,因此Webkit将无法加载你的资源。
将文件放置在assets文件夹中就可以绕过R类系统,一切都能正常工作。
但是,如果你想为不同的密度使用不同的资源,这并不是一个解决方案。
我建议你只需添加一个非常基本的keep规则来保留R内部类和字段:
-keepclassmembers class **.R$* {
public static <fields>;
}
-keep class **.R$*
**.R$Drawable*
代替,但它没有起作用。为什么**.R$*
可以工作,而先前提到的方法不行呢? - Matt Strom我将图片移动到了“assets”文件夹中,这解决了我的问题:
<img src="file:///android_asset/myfriend.png">
针对本地化的简单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