以下为我此期项目中的关于混淆打包的总结: (本人第一次混淆打包,呵呵,错误很多!列了一些比较头疼的) 一、项目混淆过程中注意事项: 由于我的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 [您的应用程序名].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文件里面的内容: # This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system edit # "ant.properties", and override values to adapt the script to your # project structure. # # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. 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) 经过一番搜索:此译文说的是我的实体对象类中有重名的变量名,后面发觉是不是我此对象有太多嵌套的原因,
试了下将父类对象的变量全部移植到子类中,再重新混淆打包编译,发现解决了!哈哈!哎!同样苦逼的问题!
看来以后实体对象还是不要有太多的嵌套了!
================================下面是自己的体会==================================
gson-2.2.2.jar包混淆后,仍然会报错如下。
项目中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)
解决方法:
例如:
important com.info;
userInfo{
public String userid;
public String time;
}
UserInfo userinfo = gson.fromJson(jsonStr,Userinfo.class);
我的问题是:gson解析的代码混淆后,出问题。原因是,UserInfo.class类是自己写在java文件中的,
所以他会混淆,然后,这个类中的变量会变成啊,a,b,c等,
但是服务器翻回来的还是原来的userid,time等变量名,他们不一致,所以不能解析,
所以包含UserInfo.class的包也不应该混淆。
在
UserInfo userinfo = gson.fromJson(jsonStr,Userinfo.class);
important com.info;
public class UserInfo{
public String userid;
pulblic String time;
}
混淆后或许会变成:
public class UserInfo{
public String a;
pulblic String b;
}
但是服务器返回的还是UserInfo中的变量名还是userid和time,
但是本地混淆后已经变成a,b,类中变量的名称不一致,所以Gson不能解析,
所以我就把包含Userinfo类的包没有混淆。
proguard.cfg或者proguard-project.txt中加入
-keep class com.info.** { *; }
本文详细记录了一位开发者在进行Android项目混淆打包过程中的经验,包括注意事项、第三方库的混淆配置以及遇到的错误及解决方法。重点介绍了如何处理友盟SDK、Gson、support-v4包和NineOldAndroids库的混淆规则,并分享了混淆后数据库表找不到、Gson解析错误等问题的解决方案。

403

被折叠的 条评论
为什么被折叠?



