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

Posted

技术标签:

【中文标题】防止 Proguard 删除特定的可绘制对象【英文标题】:Prevent Proguard to remove specific drawables 【发布时间】:2011-09-10 22:22:47 【问题描述】:

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

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

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

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

【问题讨论】:

您应该将这些类型的文件放入您的资产文件夹并像 mWebView.loadUrl("file:///android_asset/myfriend.png"); 一样加载; 你是对的。我将图像移动到解决了我的问题的“资产”文件夹。上面的行变成: 【参考方案1】:

我遇到了类似的问题,只想添加一些内容。

ProGuard 不会剥夺资源。 如果您只是解压缩您的 apk,您会看到图像文件仍然存在。

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

通过将文件放入 assets 文件夹,您将绕过 R 类系统,一切都会正常工作。

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

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

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


-keep class **.R$*

【讨论】:

生成签名apk时在proguard cfg中出现异常 @ninniuz 我尝试了上面的代码 spippet,除了**.R$Drawable*,它没有用。为什么**.R$* 有效,而前面提到的方法无效?【参考方案2】:

我将图像移动到解决了我的问题的“资产”文件夹:

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

【讨论】:

【参考方案3】:

对于本地化的简单 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

【讨论】:

以上是关于防止 Proguard 删除特定的可绘制对象的主要内容,如果未能解决你的问题,请参考以下文章

防止 Proguard 删除片段的空构造函数

用渐变(或纯色)填充特定的可绘制矢量

如何为我在 Android 中用作背景的可绘制对象添加圆角?

使用 proguard 删除日志调用

如何防止proguard完全混淆方法

proguard生成的pro怎么载入