混淆器(ProGuard)

---



混淆器通过删除从未用过的代码和使用晦涩名字重命名类、字段和方法,对代码进行压缩,优化和混淆。结果是一个比較小的.apk文件,该文件比較难进行逆向project。因此,当你的应用程序对安全敏感(要求高),比如当你授权应用程序的时候,混淆器是一种重要的保护手段。    

混淆器被集成在android 构建系统中,所以你不必手动调用它。同一时候混淆器仅在公布模式下进行构建应用程序的时候才会执行起来,所以在调试模式下构建程序时,你不必处理混淆代码。让混淆器执行起来是可选择的,可是推荐选上。



Android项目中的混淆很easy,之所以写这篇总结是由于近期发现公司的代码居然没有混淆,反编译后代码随手可得。很震惊。



1. 改动project.properties

```xml

    # This file is automatically generated by Android Tools.

    # Do not modify this file -- YOUR CHANGES WILL BE ERASED!

    #

    # This file must be checked in Version Control Systems.

    #

    # To customize properties used by the Ant build system edit

    # "ant.properties", and override values to adapt the script to your

    # project structure.

    #

    # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):

    #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt



    # Project target.

    target=android-19

```

    将proguard.config前面的凝视去掉



2. 改动proguard-project.txt

```xml

    # To enable ProGuard in your project, edit project.properties

    # to define the proguard.config property as described in that file.

    #

    # Add project specific ProGuard rules here.

    # By default, the flags in this file are appended to flags specified

    # in ${sdk.dir}/tools/proguard/proguard-android.txt

    # You can edit the include path and order by changing the ProGuard

    # include property in project.properties.

    #

    # For more details, see

    #   http://developer.android.com/guide/developing/tools/proguard.html



    # Add any project specific keep options here:



    # If your project uses WebView with JS, uncomment the following

    # and specify the fully qualified class name to the JavaScript interface

    # class:

    #-keepclassmembers class fqcn.of.javascript.interface.for.webview {

    #   public *;

    #}

```

    假设在程序中使用了第三方的`jar`包,在混淆后导致出错,这时我们须要在proguard-project.txt中去进行对应的配置,来让其在混淆时不要混淆对应的jar包。对改配置文件里的相关配置解释例如以下:

```java

    -keep public class * extends android.app.Activity  【不进行混淆类名的类,保持其原类名和包名】



    -keep public abstract interface com.asqw.android.Listener{

    public protected <methods>;  【全部public protected的方法名不进行混淆】

    }

    -keep public class com.asqw.android{

    public void Start(java.lang.String); 【对该方法不进行混淆】

    }

    -keepclasseswithmembernames class * { 【对全部类的native方法名不进行混淆】

    native <methods>;

    }

    -keepclasseswithmembers class * { 【对全部类的指定方法的方法名不进行混淆】

    public <init>(android.content.Context, android.util.AttributeSet);

    }

    -keepclassmembers class * extends android.app.Activity {【对全部类的指定方法的方法名不进行混淆】

    public void *(android.view.View);

    }

    -keepclassmembers enum * {【对枚举类型enum的全部类的下面指定方法的方法名不进行混淆】

    public static **[] values();

    public static ** valueOf(java.lang.String);

    }

    -keep class * implements android.os.Parcelable {【对实现了Parcelable接口的全部类的类名不进行混淆,对其成员变量为Parcelable$Creator类型的成员变量的变量名不进行混淆】

    public static final android.os.Parcelable$Creator *;

    }

    -keepclasseswithmembers class org.jboss.netty.util.internal.LinkedTransferQueue {【对指定类的指定变量的变量名不进行混淆】

        volatile transient org.jboss.netty.util.internal.LinkedTransferQueue$Node head;

        volatile transient org.jboss.netty.util.internal.LinkedTransferQueue$Node tail;

        volatile transient int sweepVotes;



    }

    -keep public class com.unionpay.** {*; }【对com.unionpay包下全部的类都不进行混淆,即不混淆类名,也不混淆方法名和变量名】

```        



经过上面这两部之后反编译后就能混淆了,可是四大组件还在,为什么四大组件还在呢,由于四大组件是在清单文件里进行配置的,假设混淆后就不能依据清单文件的配置去寻找了。     

假设对于一些自己的代码中要想提供出来让别人通过反射调用的方法时,我们不想让部分代码被混淆,或者是我们使用别人提供的第三方jar包,由于第三方的jar包一般都是已经混淆过的,我们要是再混淆就会报错了,所以我们要保证这些内容不用混淆,这里我们仅仅需改动这个文件,然后加上后面的一句话,他就不会混淆我们给出的内容    

```xml

-keepattributes *Annotation*          

-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.BackupAgent

-keep public class * extends android.preference.Preference

-keep public class * extends android.support.v4.app.Fragment

-keep public class * extends android.app.Fragment

-keep public class com.android.vending.licensing.ILicensingService

-keep class com.itheima.mobilesafe.engine.AppInfoProvider

-keep class net.youmi.android.** {

*;

}

Android代码混淆的更多相关文章

  1. Android代码混淆官方实现方法

    首先查看一下 “project.properties” 这个文件: # This file is automatically generated by Android Tools.# Do not m ...

  2. Android代码混淆和项目宣布步骤记录器

    原本放在一起Android项目与发布的文件相混淆.我突然想到,为什么不写博客,分享.有这篇文章的情况下,. Android代码混淆及项目公布步骤记录 一.清理代码中的调试信息,如Log.System. ...

  3. Android 代码混淆 混淆方案

    本篇文章:自己在混淆的时候整理出比较全面的混淆方法,比较实用,自己走过的坑,淌出来的路.请大家不要再走回头路,可能只要我们代码加混淆,一点不对就会导致项目运行崩溃等后果,有许多人发现没有打包运行好好地 ...

  4. Android代码混淆及项目发布方法记录

     Android代码混淆及项目发布步骤记录 本来整理了一份Android项目混淆与发布的文档,突然想到何不写篇博客,分享一下呢,如是便有了本文. Android代码混淆及项目发布步骤记录 一.清理 ...

  5. Android 代码混淆规则

    1. Proguard介绍 Android SDK自带了混淆工具Proguard.它位于SDK根目录toolsproguard下面.ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器 ...

  6. Android 代码混淆、第三方平台加固加密、渠道分发 完整教程(图文)

    第一步:代码混淆(注意引入的第三方jar) 在新版本的ADT创建项目时,混码的文件不再是proguard.cfg,而是project.properties和proguard-project.txt. ...

  7. Android 代码混淆 防止反编译

    为了防止代码被反编译,因此需要加入混淆.混淆也可以通过第三方进行apk混淆,也可以用android中的proguard进行混淆. 混淆步骤: 1.配置混淆文件,名字可以随意,在这里使用proguard ...

  8. android 代码混淆及问题大集锦

    最近在需要对所开发的项目进行了代码混淆,在android studio中开启代码混淆其实还是挺方便的,不过因为代码混淆产生的问题非常多,特别是对于一些涉及到反射的第三方库经常因为名称的变化导致无法使用 ...

  9. Android 代码混淆

    什么是代码混淆 Java 是一种跨平台的.解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中.由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名.方法名,并且通 ...

  10. android代码混淆笔记

    混淆处理的apk被反编译后代码中包名类名等都变成abcd之类.非常难看懂. 使用代码混淆.启用混淆器,对相关文件进行编辑,然后打包签名就能够了: ------------ 在2.3的版本号中,项目中有 ...

随机推荐

  1. asp.net Handler中的IsReusable属性及在Handler中使用Session

    大家在用HttpHandler的时候,一般都会有两个大的疑问(当然,前提是你有钻研精神的话,呵呵) 1. IsReusable到底什么意思? 老实说,这个属性很多人都感兴趣,但搞懂的人确实不多.MSD ...

  2. Linux下安装SVN服务(CentOS7下)

    1. 安装 centos(我这里使用的是CentOS7)下yum命令即可方便的完成安装 测试安装是否成功: 2. 建立版本库 创建svn数据目录(subversion默认是把/var/svn作为数据根 ...

  3. 【转】 C语言自增自减运算符深入剖析

    转自:http://bbs.csdn.net/topics/330189207 C语言的自增++,自减--运算符对于初学者来说一直都是个难题,甚至很多老手也会产生困惑,最近我在网上看到一个问题:#in ...

  4. CentOS 6.5 IP 设置

    DEVICE=eth0TYPE=EthernetUUID=7d6d54e0-054d-472b-8cc1-080f16ef36c1ONBOOT=yesNM_CONTROLLED=yesBOOTPROT ...

  5. chromedriver release note

    ----------ChromeDriver v2.25 (2016-10-25)---------- Supports Chrome v53-55 Resolved issue 1547: Chro ...

  6. 80端口被占用 PID = 4解决办法

    请按照下面的步骤来运行命令:1. sc config http stat = demand2. reboot3. run the command(netsh http show servicestat ...

  7. CreateJS第0章- Canvas基础

    最近网页游戏比较火,以前做过一些小游戏,但是过段时间就都忘了,今天在这里记录一下学习过程,以备后用.做网页游戏有很多种框架,我是flash程序用Adobe出品的CreateJS最容易.基本上继承了fl ...

  8. [前端笔记]第三篇:JavaScript

    JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 一.代码存放位置 J ...

  9. iPad和iPhone开发的比较

    一.iPad简介 1.什么是iPad 一款苹果公司于2010年发布的平板电脑 定位介于苹果的智能手机iPhone和笔记本电脑产品之间 跟iPhone一样,搭载的是iOS操作系统 2.iPad的市场情况 ...

  10. Ruby自学笔记(一)— 基本概况

    之前一直想要多看看RESTful Service相关的东西,找到一本相关的书,但是里面的代码都是用Ruby写的,虽然知道编程语言都是类似的,但是看到一些陌生的语法,还是有些摸不着头脑,所以最近终于下定 ...