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

问题描述 投票:15回答:3

在我的Android项目中,我将一些图像存储在res / drawable /中,这些图像可以从Webview中加载的HTML文件中通过only访问。例如(HTML代码):

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

[这些图像在优化过程中被Proguard从apk中删除。

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

android optimization proguard drawable
3个回答
29
投票

我有一个类似的问题,只想补充一点。

ProGuard不会剥离资源。如果您仅解压缩apk,您将看到图像文件仍然存在。

问题是,Webkit FileLoader将尝试使用反射来加载R $ drawable类。如果您没有在proguard.cfg文件中添加任何保留规则,则该类将被重命名,因此Webkit将无法加载您的资源。

通过将文件放入资产文件夹,您将绕过R类系统,一切正常。

例如,如果您想为不同的密度使用不同的资源,这不是解决方案。

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

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

-keep class **.R$*

2
投票

我将图像移到解决了我的问题的'assets'文件夹:

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

0
投票

对于本地化的简单html(无链接的本地化本地文件/图像)

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

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

WebView示例网址:

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

示例文件夹结构:

res / raw / filename.html

res / raw-en / filename.html

res / raw-hu / filename.html

© www.soinside.com 2019 - 2024. All rights reserved.