android混淆打包经验分享!+自己体会

来源:互联网 发布:mac远程控制 编辑:程序博客网 时间:2024/06/06 02:55
本文章一部分转载,最后是自己真正解决问题的方法。

以下为我此期项目中的关于混淆打包的总结:

(本人第一次混淆打包,呵呵,错误很多!列了一些比较头疼的)

一、项目混淆过程中注意事项:

由于我的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.** { *; }  





UserInfo userinfo = gson.fromJson(jsonStr,Userinfo.class); 

0 0
原创粉丝点击