Android打包混淆Copy解决方案
程序员文章站
2022-03-23 19:52:24
android打包混淆copy解决方案。
1. 概念
将android项目进行打包之时,将项目里的包名、类名、变量名进行更改,使得代码不容易泄露,类似于对其apk中的文件
2.作用
生成apk包体积...
android打包混淆copy解决方案。
1. 概念
将android项目进行打包之时,将项目里的包名、类名、变量名进行更改,使得代码不容易泄露,类似于对其apk中的文件
2.作用
生成apk包体积变小,减少反编译后泄漏代码的可能性
配置
moudle的build.gradle文件中
minifyenabled true 开启混淆 ,默认false
proguard-rules.pro 一般在moudle目录最下面,里面存放一些代码混淆规则
规则
如今混淆指令已经很完善了,基本上都没有什么变动,在新开发项目中,复制以下代码即可
基本的混淆模版
############################################ # # 对于一些基本指令的添加 # ############################################# # 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 -optimizationpasses 5 # 混合时不使用大小写混合,混合后的类名为小写 -dontusemixedcaseclassnames # 指定不去忽略非公共库的类 -dontskipnonpubliclibraryclasses # 这句话能够使我们的项目混淆后产生映射文件 # 包含有类名->混淆后类名的映射关系 -verbose # 指定不去忽略非公共库的类成员 -dontskipnonpubliclibraryclassmembers # 不做预校验,preverify是proguard的四个步骤之一,android不需要preverify,去掉这一步能够加快混淆速度。 -dontpreverify # 保留annotation不混淆 -keepattributes *annotation*,innerclasses # 避免混淆泛型 -keepattributes signature # 抛出异常时保留代码行号 -keepattributes sourcefile,linenumbertable # 指定混淆是采用的算法,后面的参数是一个过滤器 # 这个过滤器是谷歌推荐的算法,一般不做更改 -optimizations !code/simplification/cast,!field/*,!class/merging/* ############################################# # # android开发中一些需要保留的公共部分 # ############################################# # 保留我们使用的四大组件,自定义的application等等这些类不被混淆 # 因为这些子类都有可能被外部调用 -keep public class * extends android.app.activity -keep public class * extends android.app.appliction -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 # 保留support下的所有类及其内部类 -keep class android.support.** {*;} # 保留继承的 -keep public class * extends android.support.v4.** -keep public class * extends android.support.v7.** -keep public class * extends android.support.annotation.** # 保留r下面的资源 -keep class **.r$* {*;} # 保留本地native方法不被混淆 -keepclasseswithmembernames class * { native ; } # 保留在activity中的方法参数是view的方法, # 这样以来我们在layout中写的onclick就不会被影响 -keepclassmembers class * extends android.app.activity{ public void *(android.view.view); } # 保留枚举类不被混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueof(java.lang.string); } # 保留我们自定义控件(继承自view)不被混淆 -keep public class * extends android.view.view{ *** get*(); void set*(***); public (android.content.context); public (android.content.context, android.util.attributeset); public (android.content.context, android.util.attributeset, int); } # 保留parcelable序列化类不被混淆 -keep class * implements android.os.parcelable { public static final android.os.parcelable$creator *; } # 保留serializable序列化的类不被混淆 -keepclassmembers class * implements java.io.serializable { static final long serialversionuid; private static final java.io.objectstreamfield[] serialpersistentfields; !static !transient ; !private ; !private ; private void writeobject(java.io.objectoutputstream); private void readobject(java.io.objectinputstream); java.lang.object writereplace(); java.lang.object readresolve(); } # 对于带有回调函数的onxxevent、**on*listener的,不能被混淆 -keepclassmembers class * { void *(**on*event); void *(**on*listener); } # webview处理,项目中没有使用到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); }
第三方库模版
根据官方github文档注释进行混淆
实体类混淆
-keep class 你的实体类所在的包.** { *; }
上一篇: PL/SQL写程序时的思路实例讲解
下一篇: oracle数据库如何复制表到新表?