时间:2021-05-21
Android 实现代码混淆的实例
1、简介
代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。
混淆的目的是为了加大反编译的成本,但是并不能彻底防止反编译。
2、如何开启混淆
通常我们需要找到项目路径下app目录下的build.gradle文件,找到minifyEnabled这个配置,然后设置为true即可,如下:
release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}3、proguard又是什么呢
这是java官网给出的定义:
ProGuard is a free Java Class file shrinker, optimizer, obfuscator, and preverifier. It detects and removes unused classes, fields, methods, and attributes. It optimizes bytecode and removes unused instructions. It renames the remaining classes, fields, and methods using short meaningless names. Finally, it preverifies the processed code for Java 6 or higher, or for Java Micro Edition.作用:
4、常见语句
-optimizationpasses 5代码混淆压缩笔记,在0~7之间
-dontusemixedcaseclassnames混淆后类名都小写
-dontskipnonpubliclibraryclasses不去忽略非公共的库的类
-dontskipnonpubliclibraryclassmembers不去忽略非公共的库的类的成员
-dontpreverify不做预校验的操作
-verbose-printmapping proguardMapping.txt生成原类名和混淆后的类名的映射文件
-optimizations !code/simplification/cast,!field/*,!class/merging/*指定混淆时采用的算法
-keepattributes *Annotation*,InnerClasses注解不混淆
-keepattributes Signature泛型不混淆
-keepattributes SourceFile,LineNumberTable抛出异常时保留代码行号
用的最多的指令
-keep class XXXX保留类名不变,也就是类名不混淆,而类中的成员名不保证。当然也可以是继承XXX类的所有类名不混淆
-keepclasseswithmembers class XXXX保留类名和成员名,当然也可以是类中特定方法
5、哪些不混淆
6、混淆文件编写
按照以上的规则和基本语句,我们将混淆文件分为两个区域:
定制化区域:分为实体类、第三方、js相关、反射相关,应按项目真实情况进行编写,具体会在稍后提到;
基本不动区直接复制即可。
#-------------------------------------------定制化区域----------------------------------------------#---------------------------------1.实体类---------------------------------#---------------------------------2.第三方包------------------------------- #---------------------------------3.与js互相调用的类------------------------ #---------------------------------4.反射相关的类和方法----------------------- #-------------------------------------------基本不用动区域--------------------------------------------#---------------------------------基本指令区-----------------------------------optimizationpasses 5-dontskipnonpubliclibraryclassmembers-printmapping proguardMapping.txt-optimizations !code/simplification/cast,!field/*,!class/merging/*-keepattributes *Annotation*,InnerClasses-keepattributes Signature-keepattributes SourceFile,LineNumberTable#----------------------------------------------------------------------------#---------------------------------默认保留区----------------------------------keep public class * extends android.app.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 * 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.** {*;}-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);}-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);}#------------------------------------------------------------------------------------实体类:
-keep class 你的实体类所在的包.* { ; }实体类由于涉及到与服务端的交互,各种gson的交互如此等等,是要保留的。将你项目中实体类都挑出来,用以上语法进行保留。
如果实体类都在同一一个包下,就和上面一样,很简单;如果实体类分布在各个包下,不好意思,挨个添加。
第三方包
需到项目的build.gradle文件中找到所有添的依赖,然后去官网或者github找到对应的混淆代码,添加到我们自己的混淆文件中。
如果是添的jar包的话,就像如下来写
#log4j-libraryjars log4j-1.2.17.jar-dontwarn org.apache.log4j.**-keep class org.apache.log4j.** { *;}大致意思就是不混淆,不报warn。如果gradle报错的话,可以考虑注释掉-libraryjars log4j-1.2.17.jar这句。
与JS交互相关
如果没有可跳过
-keep class 你的类所在的包.** { *; }如果是内部类的话这样写:
-keepclasseswithmembers class 你的类所在的包.父类$子类 { <methods>; }反射相关
没有可跳过
-keep class 你的类所在的包.** { *; }ok,这样就可以了,其实混淆很简单!
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Android获取屏幕尺寸实例代码实现代码:/*****使Android程序支持了多种分辨率*/intmWidthScreen,mHeightScreen;Di
Android实现获取手机里面的所有图片详解及实例实现代码:publicclassMainActivityextendsActivity{//查看图片按钮pri
Android实现截屏功能的实例实现代码:publicclassScreenShot{//获取指定Activity的截屏,保存到png文件privatestat
Android代码写控件代替XML简单实例简单的一个Button控件的练习。实现代码:Buttonbtn=newButton(HandlerToActivity
本文实例讲述了Android实现Flip翻转动画效果的方法,分享给大家供大家学习借鉴。具体实现代码如下:LinearLayoutlocationLL=(Line