软件编程
位置:首页>> 软件编程>> Android编程>> Android 实现代码混淆的实例

Android 实现代码混淆的实例

作者:lqh  发布时间:2023-06-01 22:13:48 

标签:Android,代码混淆

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.

作用:

  • proguard是一个集文件压缩,优化,混淆和校验等功能的工具

  • 检测并删除无用的类,变量,方法和属性

  • 优化字节码并删除无用的指令

  • 通过将类名,变量名和方法名重命名为无意义的名称实现混淆效果

  • 还校验处理后的代码

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、哪些不混淆

  • 反射中使用的元素

  • 与网络请求相关实体类

  • 使用注解的元素

  • 四大组件

  • WebView中与JS交互的类

  • 枚举 等

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,这样就可以了,其实混淆很简单!

 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

来源:http://blog.csdn.net/jiashuai94/article/details/77991077

0
投稿

猜你喜欢

  • 1.工作原理(算法思路)给定一个待排序数组,找到数组中最小的那个元素如果最小元素不是待排序数组的第一个元素,则将其和第一个元素互换在剩下的元
  • 1. 概述为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。2. 模式中的角色2.1 外
  • Android Studio 是谷歌基于IntelliJ IDEA开发的安卓开发工具,有点类似 EcliPSe ADT,Android St
  • 前言本文将模块化地介绍如何实现一个动态开辟空间的通讯录,其有以下九个功能:打印主菜单添加联系人删除联系人打印通讯录查找联系人修改联系人置顶联
  • 匿名内部类:先举个例子吧,给大家看一下什么是匿名内部类,Endeavor刚刚接触的时候,觉得哇哦,好奇怪的样子,这也太别扭了吧,不知道大家是
  • 首先我们都知道java中的比较都是同一类对象与对象之间的比较,就好像现实生活中比较人和人的年龄一样,你不会去把人的年龄和人的身高来比较,这显
  • 网络通信协议中的UDP通信是无连接通信,客户端在发送数据前无需与服务器端建立连接,即使服务器端不在线也可以发送,但是不能保证服务器端可以收到
  • 本文实例为大家分享了C语言实现顺序表的顺序查找和折半查找的具体代码,供大家参考,具体内容如下顺序查找:#include <iostre
  • 在IntelliJ IDEA 中这个查看一个类也就是当前类的所有继承关系,包括实现的所有的接口和继承的类,这个继承,不仅仅是一级的继承关系,
  • 我的电脑环境win10vscode 1.36.1vscode安装插件安装完这个插件后会提示你安装 platformIOCore,按照提示安装
  • java -version 命令大家都用过,大部分就是看下jdk版本或检查下环境变量的设置,但最后一行的信息也挺重要,如下图所示:Serve
  • 本文实例讲述了C#中datatable序列化与反序列化,分享给大家供大家参考。具体方法如下:一、datatable序列化public str
  • 在微服务架构下,我们在完成一个订单流程时经常遇到下面的场景:一个订单创建接口,第一次调用超时了,然后调用方重试了一次在订单创建时,我们需要去
  • 本文实例为大家分享了java实现邮箱群发的具体代码,供大家参考,具体内容如下近来无事,在网上看了一些大牛文章,其中看到一篇比较好的,分享给大
  • JSON.toJSONString格式化成json字符串时保留null属性使用阿里的com.alibaba.fastjson.JSON格式化
  • 1、打开侧面的maven,点击图中箭头指向的图标。2、出现如下弹窗,在Command line在中输入执行的指令。指令格式:install:
  • 看到软二的群里,某童鞋发了个自己的java大作业的截图,类似于一个图片,处理后,根据不同的灰度值,填充不同的字符。故,我也用C#来写个玩玩~
  • 在开发中,可能会遇到一对多的关系,这个时候,一条sql语句就难以胜任这个任务了。只能先执行一条sql,然后根据返回的结果,再做一次sql关联
  • C# 中同样支持多维数组(也可称为矩形数组),它可以是二维的,也可以是三维的,多维数组中的数据以类似表格(行、列)的形式存储,因此也被称为矩
  • 递归生成一个如图的菜单,编写两个类数据模型Menu、和创建树形的MenuTree。通过以下过程实现:1.首先从菜单数据中获取所有根节点。2.
手机版 软件编程 asp之家 www.aspxhome.com