以下为我此期项目中的关于混淆打包的总结:
(本人第一次混淆打包,呵呵,错误很多!列了一些比较头疼的)
一、项目混淆过程中注意事项:
由于我的sdk版本较高,因此新建android项目下只有proguard-project.txt和project.properties这两个文件夹,而网上一些所谓混淆的方法我均试验了下,都有或多或少的问题,以下是一些混淆总结:
1、如果你的项目没有其他第三方包的话,那么进行混淆很简单,只需要将project.properties文件夹下面的注释解开就行,一点区别在于:如果您是2.3之前的sdk版本,那么就用这个proguard.config=proguard.cfg
如果是之后的则为:proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt(当然视您生成项目时候该文件具体生成情况所定)。
2、如果有第三方lib包的话,则混淆时需要注意了,以下是常用的一些lib包的混淆配置:
1)、友盟sdk:
-libraryjars libs/umeng_sdk.jar
-keepclassmembers class * {
public (org.json.JSONObject);
}
-keep public class com.smile.android.R$*{
public static final int ;
}
2)、gson
-ibraryjars libs/gson-2.2.2.jar
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.* { ; }
-keep class com.google.gson.examples.android.model.* { ; }
-keep class com.google.gson.* { *;}
3)、support-v4包
-libraryjars libs/android-support-v4.jar
-dontwarn android.support.v4.**
-keep class android.support.v4.** { ; }
4)、nineoldandroids动画lib包
-libraryjars libs/nineoldandroids-2.4.0.jar
-dontwarn com.nineoldandroids.*
-keep class com.nineoldandroids.** { *;}
注解:
-braryjars libs/nineoldandroids-2.4.0.jar----指明lib包的在工程中的路径
而-dontwarn com.xx.bbb.**和-keep class com.xx.bbb.** { ;}
这两个参数用来保持第三方库中的类而不乱,将-dontwarn和-keep 结合使用,意思是保持com.xx.bbb.*这个包里面的所有类和所有方法而不混淆,接着还叫ProGuard不要警告找不到com.xx.bbb.**这个包里面的类的相关引用。
具体介绍参考:http://blog.sina.com.cn/s/blog_644c92c90101o3f8.html
3、本人采用的方式为:直接将项目生成的proguard-project.txt删掉,然后直接找原来2.3版本生成的proguard.cfg复制到项目中来,以下为我两个混淆文件的配置:(为了让大家看的更加清楚,原文粘贴)
1)project.properties文件里面的内容:
proguard.config=proguard.cfg
target=android-11
2)proguard.cfg 文件的内容:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-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 ;
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public (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 *;
}
-libraryjars libs/umeng_sdk.jar
-keepclassmembers class * {
public (org.json.JSONObject);
}
-keep public class com.smile.android.R$*{
public static final int *;
}
-libraryjars libs/gson-2.2.2.jar
-keep class sun.misc.Unsafe { ; }
-keep class com.google.gson.stream.* { ; }
-keep class com.google.gson.examples.android.model.* { ; }
-keep class com.google.gson.* { *;}
-libraryjars libs/android-support-v4.jar
-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-libraryjars /libs/nineoldandroids-2.4.0.jar
-dontwarn com.nineoldandroids.**
-keep class com.nineoldandroids.** { *;}
注:(对呀lib包的混淆配置,一般放到此文件的最后面!)
二、混淆打包后的错误收集:
1、如果项目中含有数据库并且数据库的创建方式为通过实现BaseColumns类来依次创建数据库表的话,那么在混淆之后会出现no such table这类的错误,这个错误困扰我一晚上了,实在想不通,后面觉得应该是混淆过程中将包名混淆了导致编译器找不到该表。
解决办法:换数据库的创建方式:直接在继承自SQLiteOpenHelper中执行表格创建即:db.execSQL(DB_CREAT);这样一来就不会出错了!很奇葩的解决方法,还是回归原始比较好!
2、项目中libs包中有gson的话,混淆后出现java.lang.IllegalArgumentException: class com.smile.android.open.c.a declares multiple JSON fields named a
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(Unknown Source)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(Unknown Source)
经过一番搜索:此译文说的是我的实体对象类中有重名的变量名,后面发觉是不是我此对象有太多嵌套的原因,试了下将父类对象的变量全部移植到子类中,再重新混淆打包编译,发现解决了!哈哈!哎!同样苦逼的问题!
看来以后实体对象还是不要有太多的嵌套了!
这篇文章有3条评论