Android轻松实现代码混淆

原创 2017年09月15日 14:14:51

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.

作用:

  1. proguard是一个集文件压缩,优化,混淆校验等功能的工具
  2. 检测并删除无用的类,变量,方法和属性
  3. 优化字节码并删除无用的指令
  4. 通过将类名,变量名和方法名重命名为无意义的名称实现混淆效果
  5. 还校验处理后的代码

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打包上架之预防反编译(花指令)

花指令是程序中有一些指令,由设计者特别构思,希望使反汇编的时候出错,让破解者无法清楚正确地反汇编程序的内容,迷失方向。【花指令】这个词来源于汇编语言,它的思想是非常不错的。。【花指令】另外个目的就是利...
  • qinzhuoheng
  • qinzhuoheng
  • 2015年07月22日 14:20
  • 659

Android开发笔记(七十三)代码混淆与反破解

代码混淆 ProGuard是ADT自带的apk混淆器,它的用途有: 1、压缩apk包的大小,能删除无用的代码,并简化部分类名和方法名。 2、加大破解源码的难度,因为部分类名和方法名被重命名,使得程序逻...
  • aqi00
  • aqi00
  • 2016年03月01日 16:26
  • 2758

代码混淆的实现原理与方法

由于java和.net这类高层抽象语言,具有 天生的易反汇编 特性,其编译后的程序包包含了大量的源代码变量、函数名、数据结构等信息 根据其编译后的程序包,可以非常容易的得到 近乎源代码质量 的反汇编代...
  • fulinwsuafcie
  • fulinwsuafcie
  • 2013年09月02日 19:52
  • 14289

android 实现代码混淆

对于使用签名的apk,常用的反编译之后还是能查看class文件的代码实现,对于反编译可查看个人的博客点击打开链接 使用代码混淆就能是这种常规反编译失效 1,在build.grandle添加,其中规则写...
  • banana1006034246
  • banana1006034246
  • 2015年07月21日 14:21
  • 4590

Android 代码混淆实战

本文已授权微信公众号《鸿洋》原创首发,转载请务必注明出处。什么是代码混淆?Java 是一种跨平台的、解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中。由于跨平台的需要,Jav...
  • qq_17250009
  • qq_17250009
  • 2016年04月25日 17:40
  • 2974

Android 代码混淆机制

Android 代码混淆机制 由于Android项目大部分用的java语言,而java属于高层抽象语言,易于反编译、反汇编,其编译后的程序包包含了大量的源代码变量、函数名、数据结构等信息,根据其编译打...
  • zerooneBader
  • zerooneBader
  • 2016年07月29日 12:37
  • 992

android在线浏览图片

MainActivity.java package com.example.internetimageview; import java.io.IOException; import java.io...
  • peijunrong2015
  • peijunrong2015
  • 2015年07月01日 15:31
  • 197

Android 项目如何添加代码混淆

在网上搜“代码混淆”关键词,可以看到n多教程。包括本篇博客,大部分重要内容也是从网上各位大神的博客里面看到然后摘取和总结出来的。虽然网上都有,但是对于我个人来说,很难找到一篇博客概括完全的,所以还是总...
  • qq_31712553
  • qq_31712553
  • 2017年04月25日 11:13
  • 707

Android Studio实现代码混淆

对于使用签名的apk,常用的反编译之后还是能查看class文件的代码实现,对于反编译可查看个人的博客点击打开链接 使用代码混淆就能是这种常规反编译失效 1,在build.grandle添加,其中规...
  • bjstyle
  • bjstyle
  • 2015年07月22日 11:52
  • 7441

AndroidStudio中代码混淆以及打包操作

摸索了两天,大概了解了在AndroidStudio中代码混淆和打包发布的过程,在此记录下。代码混淆:关于代码混淆的作用,就不多解释了,整个过程大致如下: 在app下的build.gradle文件中添加...
  • TTCCAAA
  • TTCCAAA
  • 2015年08月15日 22:37
  • 16284
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android轻松实现代码混淆
举报原因:
原因补充:

(最多只允许输入30个字)