Android代码混淆的写法总结
Apk文件被反编译出来能被获取到里面的代码。对于这种情况,我们可以对项目代码进行混淆,随机生成难理解的类名,方法名,让代码难以阅读,加大功能被盗取的难度。混淆可以起到压缩Apk,混淆文件,预检,优化的作用。
1. 使用方式,在gradle文件中设置minifyEnabled为true即可开启混淆
buildTypes { release { minifyEnabled ture //是否开启代码混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
混淆内容在proguard-android.txt文件中写。
2. 混淆设置参数
-optimizationpasses 4 代码混淆的压缩比例,值介于0-7
-dontusemixedcaseclassnames 混淆后类型都为小写
-dontskipnonpubliclibraryclasses 不去忽略非公共的库类
-dontoptimize 不优化输入的类文件
-dontpreverify 不做预校验的操作
-ignorewarnings 忽略警告
-verbose 混淆时是否记录日志
-keepattributes Annotation 保护注解
-printmapping proguardMapping.txt 生成原类名和混淆后的类名的映射文件
-optimizations !code/simplification/cast,!field/ ,!class/merging/ 指定混淆是采用的算法
3. 保持不被混淆的设置
保持实体类不混淆
-keep class 你的实体类所在的包.** { *; }
保持四大组件,Application,Fragment不混淆
-keep public class * extends android.app.Application -keep public class * extends android.app.Activity -keep public class * extends android.app.Fragment -keep public class * extends android.support.v4.app.Fragment -keep public class * extends android.app.Fragment -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.preference.Preference
保持 native 方法不被混淆
-keepclasseswithmembernames class * { native <methods>; }
保持枚举enum类不被混淆
-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }
保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }
保持第三方包不混淆,比如这里用到微信、支付宝支付第三方
#支付宝混淆 -keep class com.alipay.android.app.IAlixPay{*;} -keep class com.alipay.android.app.IAlixPay$Stub{*;} -keep class com.alipay.android.app.IRemoteServiceCallback{*;} -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;} -keep class com.alipay.sdk.app.PayTask{ public *;} -keep class com.alipay.sdk.app.AuthTask{ public *;} #微信支付混淆 -keep class com.tencent.mm.opensdk.** {*;} -keep class com.tencent.wxop.** {*;} -keep class com.tencent.mm.sdk.** {*;}
4. 完整混淆示例:
#指定代码的压缩级别 -optimizationpasses 5 #包名不混合大小写 -dontusemixedcaseclassnames #不去忽略非公共的库类 -dontskipnonpubliclibraryclasses #优化 不优化输入的类文件 -dontoptimize #预校验 -dontpreverify #混淆时是否记录日志 -verbose #忽略警告 -ignorewarning #保护注解 -keepattributes *Annotation* -keep public class * extends android.app.Application -keep public class * extends android.app.Activity -keep public class * extends android.app.Fragment -keep public class * extends android.support.v4.app.Fragment -keep public class * extends android.app.Fragment -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.preference.Preference -keepclasseswithmembernames class * { native <methods>; } -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 *; } -keepclassmembers class **.R$* { *; } -keep class * extends android.view.View{*;} -keep class * extends android.app.Dialog{*;} -keep class * implements java.io.Serializable{*;} #butterknife -keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewBinder { *; } #volley -dontwarn com.android.volley.** -keep class com.android.volley.**{*;} #fastjson -dontwarn com.alibaba.fastjson.** -keep class com.alibaba.fastjson.**{*;} #happy-dns -dontwarn com.qiniu.android.dns.** -keep class com.qiniu.android.dns.**{*;} #okhttp -dontwarn com.squareup.okhttp.** -keep class com.squareup.okhttp.**{*;} -keep class okio.**{*;} -keep class android.net.**{*;} -keep class com.android.internal.http.multipart.**{*;} -keep class org.apache.**{*;} -keep class com.qiniu.android.**{*;} -keep class android.support.annotation.**{*;} -keep class com.squareup.wire.**{*;} -keep class com.ant.liao.**{*;} #腾讯 -keep class com.tencent.**{*;} -keep class u.aly.**{*;} #ImageLoader -keep class com.nostra13.universalimageloader.**{*;} #友盟 -dontwarn com.umeng.** -keep class com.umeng.**{*;} #pulltorefresh -keep class com.handmark.pulltorefresh.** { *; } -keep class android.support.v4.** { *;} -keep public class * extends android.support.v4.**{ public protected *;} -keep class android.support.v7.** {*;}
自己试着用一个简单的项目加入混淆,打个包试试效果吧。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- 使用OQL“语言”构造ORM实体类的复杂查询条件
- AdoHelper使用MySQL存储过程示例
- 使用8位字节的编码格式将字节流安全的转换成String
- 同样的SQL语句在查询分析器执行很快,但是网站上执行超时的诡异问题
- PDF.NET数据开发框架操作MySQL实体类操作实例
- 使用PDF.NET数据开发框架的实体操作语言OQL构造复杂查询条件
- 鲶鱼CMS存储XSS漏洞披露
- 【分享】 纯 js 表单控件 —— 让 “增改查” 更轻松!
- K-近邻算法(KNN)概述
- 不使用DalFactory和IDAL,支持多种数据库应用
- MVC和三层,我的一个不成熟的看法,大家批批
- 实体类的二进制序列化
- 多任务验证码识别
- 一加手机系统预装APP被曝存在后门
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Python基于Twilio及腾讯云实现国际国内短信接口
- PHP __call()方法实现委托示例
- PHP中rename()函数的妙用讲解
- php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
- php实现小程序支付完整版
- Yii2框架视图(View)操作及Layout的使用方法分析
- php实现单笔转账到支付宝功能
- PHP使用Redis实现Session共享的实现示例
- windows10在visual studio2019下配置使用openCV4.3.0
- PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
- Python爬虫爬取新闻资讯案例详解
- Python代码需要缩进吗
- 解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
- Python计算信息熵实例
- 详解python logging日志传输