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);
- android混淆打包经验分享!+自己体会
- android混淆打包经验分享!
- Android 混淆jar的经验分享
- Android应用程序的混淆打包分享
- 我自己的android studio代码混淆打包参考
- Android 代码混淆,混淆打包
- Android 混淆打包编译
- Android 混淆打包
- android 签名、混淆打包
- Android 混淆打包
- Android混淆打包
- Android混淆打包
- Android 混淆打包
- android中混淆打包
- android proguard混淆打包
- Android 之混淆打包
- Android混淆打包
- android 的混淆打包
- android 镜像制作方法
- HDU4708
- 日复一日
- Apache中的进程剖析(1)
- 科普帖:线程与进程
- android混淆打包经验分享!+自己体会
- 从store中获取数据
- LeetCode Sqrt(x)
- 《Thinking In Algorithm》02.Stacks,Queues,Linked Lists
- Python学习第二天
- CodeIngniter form_open()的一个问题
- Apache中的进程剖析(2)
- ThreadLocal
- sql根据出生日期算年龄