Android代码混淆的写法总结
Apk文件被反编译出来能被获取到里面的代码。对于这种情况,我们可以对项目代码进行混淆,随机生成难理解的类名,方法名,让代码难以阅读,加大功能被盗取的难度。混淆可以起到压缩Apk,混淆文件,预检,优化的作用。
1.使用方式,在gradle文件中设置minifyEnabled为true即可开启混淆
buildTypes{ release{ minifyEnabledture//是否开启代码混淆 proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro' } }
混淆内容在proguard-android.txt文件中写。
2.混淆设置参数
-optimizationpasses4代码混淆的压缩比例,值介于0-7
-dontusemixedcaseclassnames混淆后类型都为小写
-dontskipnonpubliclibraryclasses不去忽略非公共的库类
-dontoptimize不优化输入的类文件
-dontpreverify不做预校验的操作
-ignorewarnings忽略警告
-verbose混淆时是否记录日志
-keepattributesAnnotation保护注解
-printmappingproguardMapping.txt生成原类名和混淆后的类名的映射文件
-optimizations!code/simplification/cast,!field/,!class/merging/指定混淆是采用的算法
3.保持不被混淆的设置
保持实体类不混淆
-keepclass你的实体类所在的包.**{*;}
保持四大组件,Application,Fragment不混淆
-keeppublicclass*extendsandroid.app.Application -keeppublicclass*extendsandroid.app.Activity -keeppublicclass*extendsandroid.app.Fragment -keeppublicclass*extendsandroid.support.v4.app.Fragment -keeppublicclass*extendsandroid.app.Fragment -keeppublicclass*extendsandroid.app.Service -keeppublicclass*extendsandroid.content.BroadcastReceiver -keeppublicclass*extendsandroid.content.ContentProvider -keeppublicclass*extendsandroid.preference.Preference
保持native方法不被混淆
-keepclasseswithmembernamesclass*{ native; }
保持枚举enum类不被混淆
-keepclassmembersenum*{ publicstatic**[]values(); publicstatic**valueOf(java.lang.String); }
保持Parcelable不被混淆
-keepclass*implementsandroid.os.Parcelable{ publicstaticfinalandroid.os.Parcelable$Creator*; }
保持第三方包不混淆,比如这里用到微信、支付宝支付第三方
#支付宝混淆 -keepclasscom.alipay.android.app.IAlixPay{*;} -keepclasscom.alipay.android.app.IAlixPay$Stub{*;} -keepclasscom.alipay.android.app.IRemoteServiceCallback{*;} -keepclasscom.alipay.android.app.IRemoteServiceCallback$Stub{*;} -keepclasscom.alipay.sdk.app.PayTask{public*;} -keepclasscom.alipay.sdk.app.AuthTask{public*;} #微信支付混淆 -keepclasscom.tencent.mm.opensdk.**{*;} -keepclasscom.tencent.wxop.**{*;} -keepclasscom.tencent.mm.sdk.**{*;}
4.完整混淆示例:
#指定代码的压缩级别 -optimizationpasses5 #包名不混合大小写 -dontusemixedcaseclassnames #不去忽略非公共的库类 -dontskipnonpubliclibraryclasses #优化不优化输入的类文件 -dontoptimize #预校验 -dontpreverify #混淆时是否记录日志 -verbose #忽略警告 -ignorewarning #保护注解 -keepattributes*Annotation* -keeppublicclass*extendsandroid.app.Application -keeppublicclass*extendsandroid.app.Activity -keeppublicclass*extendsandroid.app.Fragment -keeppublicclass*extendsandroid.support.v4.app.Fragment -keeppublicclass*extendsandroid.app.Fragment -keeppublicclass*extendsandroid.app.Service -keeppublicclass*extendsandroid.content.BroadcastReceiver -keeppublicclass*extendsandroid.content.ContentProvider -keeppublicclass*extendsandroid.preference.Preference -keepclasseswithmembernamesclass*{ native; } -keepclassmembersclass*extendsandroid.app.Activity{ publicvoid*(android.view.View); } -keepclassmembersenum*{ publicstatic**[]values(); publicstatic**valueOf(java.lang.String); } -keepclass*implementsandroid.os.Parcelable{ publicstaticfinalandroid.os.Parcelable$Creator*; } -keepclassmembersclass**.R$*{ *; } -keepclass*extendsandroid.view.View{*;} -keepclass*extendsandroid.app.Dialog{*;} -keepclass*implementsjava.io.Serializable{*;} #butterknife -keepclassbutterknife.**{*;} -dontwarnbutterknife.internal.** -keepclass**$$ViewBinder{*;} #volley -dontwarncom.android.volley.** -keepclasscom.android.volley.**{*;} #fastjson -dontwarncom.alibaba.fastjson.** -keepclasscom.alibaba.fastjson.**{*;} #happy-dns -dontwarncom.qiniu.android.dns.** -keepclasscom.qiniu.android.dns.**{*;} #okhttp -dontwarncom.squareup.okhttp.** -keepclasscom.squareup.okhttp.**{*;} -keepclassokio.**{*;} -keepclassandroid.net.**{*;} -keepclasscom.android.internal.http.multipart.**{*;} -keepclassorg.apache.**{*;} -keepclasscom.qiniu.android.**{*;} -keepclassandroid.support.annotation.**{*;} -keepclasscom.squareup.wire.**{*;} -keepclasscom.ant.liao.**{*;} #腾讯 -keepclasscom.tencent.**{*;} -keepclassu.aly.**{*;} #ImageLoader -keepclasscom.nostra13.universalimageloader.**{*;} #友盟 -dontwarncom.umeng.** -keepclasscom.umeng.**{*;} #pulltorefresh -keepclasscom.handmark.pulltorefresh.**{*;} -keepclassandroid.support.v4.**{*;} -keeppublicclass*extendsandroid.support.v4.**{ publicprotected*;} -keepclassandroid.support.v7.**{*;}
自己试着用一个简单的项目加入混淆,打个包试试效果吧。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。