I am succesfully using proguard for my Android apps.
However, with one app I am having trouble.
This app uses a java library that has a .xml
file that is stored in the package.
InputStream istream = Library.class.getResourceAsStream("resource.xml");
This library works great when proguard is disabled. However, running proguard, it seems that the xml file is just completely stripped away.
Relevant 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/*
Any ideas on how to force keep this xml file?
First of all, It turned out that using ant and my build.xml script didn't process the .xml resource file at all. You'll need to manually add a copy action to the build.xml for the resource files to be copied to the output dir.
Still, having solved that, proguard messed up my work. Solution was:
-keeppackagenames the.package.where.the.file.is.kept
This made sure that the .xml file could be found by calling the Library.class.getResource
.
You shoud add a new file keep.xml under res/raw.
<?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" />
In tools:keep, you list the layouts you want to keep. You can even keep specefic drawables if you use reflection in your code to get your drawable
tools:keep="@drawable/ico_android_home_infosperso"
I prefer to add tools:shrinkMode="strict"
so that i make sur no resource is eliminated unless it is not used for sure. You may want to have a look at this link Shrink your code.
Don't Forget to add these lines to your proguard rules:
-keepattributes InnerClasses
-keep class **.R
-keep class **.R$* {
<fields>;
}
You should store files in the appropriate /res/xml
, /res/assets
, or /res/raw
folder and access them through the resource management system or the asset manager correspondingly. You can read more about providing resources in Android Developer's Guide.