在proguard-project.txt文件中添加proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt。
我们是不准备混淆第三方jar包,在proguard_project.txt加入了下面的这句代码
-dontskipnonpubliclibraryclasses
但事实证明并没有什么用,第三方包照样混淆。于是有将第三方包加入声明。
-libraryjars libs/picasso-2.4.0.jar
-libraryjars libs/universal-image-loader-1.9.4-with-sources.jar
运行后依然还是找不到类,经过各种搜索又开始将每个jar包中的所有的包遍历保留。如下:
-keep class com.nostra13.universalimageloader.** {*;}
依然不行,我的内心已经崩溃了,后来在网上各种搜索看到有一种方法说在上面代码上加上dontwarn这句话,于是又在上面代码前面加入了下面这句话:
-dontwarn com.nostra13.universalimageloader.**
然后再次 打包运行,程序终于可以跑了,然而在执行上传图片的时候又出现了错误,刚开始以为是有包忘了keep了,按照上面的程序把那个包加入,结果还是不行,这时我都要放弃混淆了,另一个同事说这一个包并不是放在libs中的,是在liib文件夹中,并将lib这个文件夹use as source folder的形式加入编译后的jar包的。最后我们在打包前在java build path中的order and export中将该jar包勾上,然后在打包,运行,我去,这次终于好了。
总结这次的混淆,经验如下,
首先加入android内部相关的:
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
然后下面是关于第三方的:
-dontskipnonpubliclibraryclasses
-libraryjars libs/picasso-2.4.0.jar
-libraryjars libs/universal-image-loader-1.9.4-with-sources.jar
-dontwarn com.nostra13.universalimageloader.**
-keep class com.nostra13.universalimageloader.** {*;}
-dontwarn com.squareup.picasso.**
-keep class com.squareup.picasso.** {*;}
最后如果有use as a source folder 的情况,要在java build path 中的order and export中将该jar包前面的勾号勾上。
原理什么的还不知道怎么回事,但是上述方法总算可行了。我也总算松了口气。。。。由此可见,我不是一个追求“知其所以然”的好程序员。