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

Pet*_*rdk 13 java android proguard embedded-resource

我成功地将proguard用于我的Android应用程序.

但是,有一个应用程序我遇到了麻烦.

此应用程序使用一个java库,该库具有.xml存储在包中的文件.

InputStream istream = Library.class.getResourceAsStream("resource.xml");
Run Code Online (Sandbox Code Playgroud)

禁用proguard时,此库非常有用.但是,运行proguard,似乎xml文件完全被剥离了.

相关proguard.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/*
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*rdk 9

首先,事实证明使用ant和我的build.xml脚本根本不处理.xml资源文件.您需要手动将复制操作添加到build.xml,以便将资源文件复制到输出目录.

仍然,解决了这个问题后,proguard搞砸了我的工作.解决方案是:

 -keeppackagenames the.package.where.the.file.is.kept
Run Code Online (Sandbox Code Playgroud)

这确保可以通过调用Library.class.getResource.找到.xml文件.


Mer*_*iam 7

您应该在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" />
Run Code Online (Sandbox Code Playgroud)

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

tools:keep="@drawable/ico_android_home_infosperso"
Run Code Online (Sandbox Code Playgroud)

我更喜欢添加,tools:shrinkMode="strict"这样我就不会浪费任何资源,除非不能肯定地使用它。您可能需要查看此链接缩小您的代码。不要忘记将以下行添加到您的proguard规则中:

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