如何强制 Proguard 保留我的.xml资源文件?

2022-09-02 20:56:53

我正在成功地为我的Android应用程序使用proguard。

但是,使用一个应用程序,我遇到了麻烦。

此应用使用 Java 库,该库具有存储在包中的文件。.xml

InputStream istream = Library.class.getResourceAsStream("resource.xml");

当 proguard 被禁用时,此库可以很好地工作。但是,运行proguard,似乎xml文件只是完全剥离了。

相关护卫.cfg

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
#-dontobfuscate
#-repackageclasses '' //THIS IS DISABLED
-keepattributes *Annotation*
-keepattributes Signature
-verbose
-dontwarn roboguice.activity.RoboMapActivity
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

关于如何强制保留此xml文件的任何想法?


答案 1

您应该在 res/raw 下添加一个新的文件 keep.xml。

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
    tools:discard="@layout/unused2" />

在 tools:keep 中,列出要保留的布局。如果您在代码中使用反射来获得可绘制性,您甚至可以保留特定的可绘制对象

tools:keep="@drawable/ico_android_home_infosperso"

我更喜欢添加,这样我就可以确保没有资源被消除,除非它不能被肯定地使用。您可能想看看这个链接 收缩你的代码.不要忘记将这些行添加到您的护卫规则中:tools:shrinkMode="strict"

-keepattributes InnerClasses -keep class **.R -keep class **.R$* { <fields>; }


答案 2

首先,事实证明,使用 ant 和我的 build.xml 脚本根本没有处理.xml资源文件。需要手动将复制操作添加到生成.xml才能将资源文件复制到输出目录。

尽管如此,在解决了这个问题之后,proguard搞砸了我的工作。解决方案是:

 -keeppackagenames the.package.where.the.file.is.kept

这可确保通过调用 .xml .Library.class.getResource


推荐