全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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


# Android  # 代码混淆  # 代码混淆的实现方法  # 代码混淆如何实现  # 详解Android代码混淆实战  # Android代码混淆的写法总结  # 详解Android的反编译和代码混淆  # Android Studio多渠道批量打包及代码混淆  # android app进行代码混淆实例详解  # Android实用图文教程之代码混淆、第三方平台加固加密、渠道分发  # Android应用开发之代码混淆  # Android使用插件实现代码混淆  # 实体类  # 第三方  # 不去  # 很简单  # 行号  # 跳过  # 官网  # 自己的  # 类中  # 是一个  # 这是  # 反编译  # 就像  # 又是  # 子类  # 最多  # 如有  # 会在  # 希望能  # 不动 


相关文章: 建站主机选购指南:核心配置与性价比推荐解析  如何在Windows环境下新建FTP站点并设置权限?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  在线制作视频网站免费,都有哪些好的动漫网站?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  常州自助建站工具推荐:低成本搭建与模板选择技巧  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  再谈Python中的字符串与字符编码(推荐)  c# 服务器GC和工作站GC的区别和设置  移民网站制作流程,怎么看加拿大移民官网?  网站企业制作流程,用什么语言做企业网站比较好?  如何通过cPanel快速搭建网站?  建站之星如何实现网站加密操作?  金*站制作公司有哪些,金华教育集团官网?  ,交易猫的商品怎么发布到网站上去?  建站之星如何实现五合一智能建站与营销推广?  如何通过智能用户系统一键生成高效建站方案?  建站之星展会模版如何一键下载生成?  大连网站制作公司哪家好一点,大连买房网站哪个好?  小型网站制作HTML,*游戏网站怎么搭建?  建站之星多图banner生成与模板自定义指南  如何破解联通资金短缺导致的基站建设难题?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  开源网站制作软件,开源网站什么意思?  如何选择服务器才能高效搭建专属网站?  建站主机服务器选型指南与性能优化方案解析  建站之星后台密码遗忘或太弱?如何重置与强化?  黑客如何利用漏洞与弱口令入侵网站服务器?  宝塔新建站点为何无法访问?如何排查?  如何快速生成高效建站系统源代码?  婚礼视频制作网站,学习*后期制作的网站有哪些?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  Android使用GridView实现日历的简单功能  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  如何选择CMS系统实现快速建站与SEO优化?  如何设置并定期更换建站之星安全管理员密码?  网站app免费制作软件,能免费看各大网站视频的手机app?  建站之星如何配置系统实现高效建站?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  如何在Windows 2008云服务器安全搭建网站?  赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?  建站VPS能否同时实现高效与安全翻墙?  济南企业网站制作公司,济南社保单位网上缴费步骤?  制作证书网站有哪些,全国城建培训中心证书查询官网?  如何在建站之星网店版论坛获取技术支持?  ,石家庄四十八中学官网? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。