android之代码混淆
来源:互联网 发布:13是什么意思网络语言 编辑:程序博客网 时间:2024/06/08 10:48
项目发布之前混淆是必不可少的工作,混淆可以增加别人反编译阅读代码的难度,还可以缩小APK包。
Android 中通过ProGuard 来混淆Java代码,仅仅是混淆java代码。它是无法混淆Native代码,资源文件drawable、xml等文件。
ProGuard作用
- 压缩: 移除无效的类、属性、方法等
- 优化: 优化字节码,并删除未使用的结构
- 混淆: 将类名、属性名、方法名混淆为难以读懂的字母,比如a,b,c;
不能混淆
- 在AndroidManifest中配置的类,比如四大组件
- JNI调用的方法
- 反射用到的类
- WebView中JavaScript调用的方法
- Layout文件引用到的自定义View
- 一些引入的第三方库(一般都会有混淆说明的)
要做混淆,首先在build.gradle文件中把 minfyEnabled false 改成 true
buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}
之后打开 proguard-rules.pro 文件 加以下代码:
1:基本指令区
-optimizationpasses 5 # 指定代码的压缩级别-dontusemixedcaseclassnames # 是否使用大小写混合-dontskipnonpubliclibraryclassmembers #指定不去忽略非公共的库的类-dontpreverify # 混淆时是否做预校验-verbose # 混淆时是否记录日志-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法
2:通用混淆配置
-keep public class * extends android.app.Activity-keep public class * extends android.support.v7.app.AppCompatActivity-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 * extends android.view.View-keep public class com.android.vending.licensing.ILicensingService-keep class android.support.** {*;}-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 public class * extends android.view.View{ *** get*(); void set*(***); public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int);}-keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int);}-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *;}-keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve();}-keep class **.R$* { *;}-keepclassmembers class * { void *(**On*Event);}#---------------------------------webview-------------------------------------keepclassmembers class fqcn.of.javascript.interface.for.Webview { public *;}-keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap); public boolean *(android.webkit.WebView, java.lang.String);}-keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, jav.lang.String);}
3:实体类
-keep class com.demo.login.bean.** { *; }-keep class com.demo.main.bean.** { *; }
4:第三方包 以 glide和 butterknife 为例 一般官网都会有混淆代码,去把他们官网的混淆代码Copy下来就可以了
-keep public class * implements com.bumptech.glide.module.GlideModule-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {**[] $VALUES;public *;}-keep class butterknife.** { *; }-dontwarn butterknife.internal.**-keep class **$$ViewBinder { *; }-keep class **$$ViewInjector { *; }-keepclasseswithmembernames class * { @butterknife.* <fields>;}-keepclasseswithmembernames class * { @butterknife.* <methods>;}
5:与js互相调用的类
-keepclasseswithmembers class com.demo.login.bean.ui.MainActivity$JSInterface { <methods>; }
当然也还有其他的 反射相关的类和方法 具体情况根据自己的项目而定。
现在可以混淆打包 ,在用反编译工具看看Java代码是不是反编译了;其他需求可以留言讨论
阅读全文
1 0
- Android之代码混淆
- Android之代码混淆
- android之代码混淆
- Android代码混淆之混淆规则
- Android代码混淆之混淆规则
- Android代码混淆之混淆规则
- Android代码混淆之混淆规则
- Android代码混淆之混淆规则
- Android代码混淆之混淆规则
- Android代码混淆之混淆规则
- Android代码混淆之混淆规则
- Android代码混淆之混淆规则
- Android代码混淆之混淆规则
- Android开发之代码混淆
- Android Studio之代码混淆
- Android之混淆代码总结
- android 代码混淆之proguard
- android 笔记之代码混淆
- 多年iOS开发经验总结(二)
- Springmvc 处理数据模型(三)
- ftpClient = new FtpClient(ip) 报错 cannot instantiate the type FtpClient
- 大型网站架构系列:负载均衡详解(1)
- bootscrap+angular+ssm整合(中)
- android之代码混淆
- git diff操作
- 跨域请求设置
- Android 开源库获取途径整理
- JavaScript/VBScript脚本程序调试(Wscript篇)
- Java 序列化-Serializable接口(包括单例的实现)
- C++常用的文件操作路径函数
- visio随笔
- websphere服务六:命令行创建服务集群