前一篇文章,分享了反编译的简单流程,那么现在我继续接着上一篇分享,我的混淆历程!
刚开始的时候觉得混淆是很高级的东西,没那么容易学会,就像屌丝没见过美女一样,总觉的美女高冷!呵呵……例子或许不恰当!瞎侃了,接下来我们看些正经的。刚学混淆,不免会在度娘哪里取经,那我们搜一把试试!
同样是有很多的帖子和文章,我也就是这样学习的,打开一个看看,再打开一个看看!我发先有两种
一种是说有一个proguard.cfg文件 ,一个是说的proguard-project.txt
我刚开始各种找proguard.cfg ,最后都没有找到!心中各种草泥马啊,最后又是各种搜才发现在新版本的ADT已经不用proguard.cfg了!当时都晕菜了,为嘛不多看看呢!接着来看proguard-project.txt的方案吧
很简单,只需一步:
将project.properties的中
“# proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”的“#”去掉就可以了。
这样做是不是有点太简单了,是不是很吃惊!确实,我当时就兴奋了!赶紧编译一个版本试试 吧!一起动就闪退了,于是从新编译!总觉得是代码问题吗!后来才发现编译后才会出错!于是我反编译了我的代码,看看到底又某有混淆,一看确实混淆成功了!不幸的是我的model类也被混淆了,各种get,set都变成了abcd!于是我发现了问题!那么该如何处理呢!我们打开proguard-project.txt来看看
-keep public class com.kfb.** {*;} // com.kfb.包下无需混淆
-optimizationpasses 5 //表示proguard对你的代码进行迭代优化的次数,首先要明白optimization 会对代码进行各种优化,每次优化后的代码还可以再次优化,所以就产生了 优化次数的问题,这里面的 passes 应该翻译成 ‘次数’ 而不是 ‘通道’。楼上默认写 5 ,应该是做Android的,关于Android里面为什么写 5 ,因为作者本来写 99 ,但是每次迭代时间都很长团队成员天天抱怨,就改成 5 了,迭代会在最后一次无法优化的时候停止,也就是虽然你写着 99 ,但是可能就优化了 几次,一般情况下迭代10次左右的时候代码已经不能再次优化了
-dontusemixedcaseclassnames //混淆时不会产生形形色色的类名
-dontskipnonpubliclibraryclasses //指定不去忽略非公共的库类
-dontpreverify //不预校验
-verbose //记录信息
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* //混淆时所采用的算法
-keep public class * extends android.app.Activity //不混淆继承 自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 com.android.vending.licensing.ILicensingService //同上
-keepclasseswithmembers class * { //含有native 方法的类类和成员方法和属性都不混淆
native <methods>;
}
-keepclasseswithmembers class * { //不混淆含有 类似 (android.content.Context, android.util.AttributeSet)
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * { //不混淆含有类似 构造方法的(android.content.Context, android.util.AttributeSet, int); 方法的
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers enum * { //保持枚举 enum
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { //不混淆实现parcelable 接口的类
public static final android.os.Parcelable$Creator *;
}
看了一遍,才发现我的model类都没有被排除,于是修改后添加
-keep class * implements java.io.Serializable{
}
-libraryjars libs/nbs.newlens.agent.jar //指明 -libraryjar 为类库
# ProGuard configurations for NetworkBench Lens
-keep class com.networkbench.** { *; } //指明com.networkbench.包下的不混淆 类名
-dontwarn com.networkbench.** //指明com.networkbench.包下的不混淆 类名
-keepattributes Exceptions, Signature, InnerClasses //应该是 exception,singnature innerclasses 的属性不混淆
# End NetworkBench Lens
另外送上一篇文章供参考:
http://blog.csdn.net/lovexjyong/article/details/24652085
总体就这些了!大家可以试试,学习一下!如果不成功的时候你可以将编译好的apk反编译回来打开看看,是不是你的model类被混淆了