Android 上线前的代码混淆之(二)混淆

前一篇文章,分享了反编译的简单流程,那么现在我继续接着上一篇分享,我的混淆历程!

刚开始的时候觉得混淆是很高级的东西,没那么容易学会,就像屌丝没见过美女一样,总觉的美女高冷!呵呵……例子或许不恰当!瞎侃了,接下来我们看些正经的。刚学混淆,不免会在度娘哪里取经,那我们搜一把试试!


同样是有很多的帖子和文章,我也就是这样学习的,打开一个看看,再打开一个看看!我发先有两种

一种是说有一个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类被混淆了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值