混淆器(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. 连接池dbcp pool

    -package cn.gdpe.pool; import java.io.InputStream;import java.sql.Connection;import java.sql.Prepare ...

  2. Create a simple js-ctypes example

    js-ctypes 为Firefox extension访问由C/C++编写的native code提供了一种通用的方法. 从Firefox 4 开始支持js-ctypes,不同版本的之间有极好的兼容 ...

  3. 基于Jquery+Ajax+Json实现分页显示

    1.后台action产生json数据. List blackList = blackService.getBlackInfoList(mobileNum, gatewayid, startDate, ...

  4. PHP Cookie学习

    <?php /* Cookie在计算机中保存的格式 用户名@网站地址[数字].txt Cookie在文件夹下,每个Cookie文件都是一个简单而又普通的文件件而不是程序,Cookie中的内容大多 ...

  5. STM32学习笔记——定时器中断(向原子哥学习)

    定时器中断 STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器.在本章中,我们将利 ...

  6. Top WAF

    http://blog.csdn.net/force_eagle/article/details/9396087

  7. FileUtils

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  8. java学习面向对象之继承

    在我们编写程序的过程当中,会遇到这种情况: 比如现在有一个狗,他的功能有跑,有跳,有吃,有叫,属性有雌雄,大小,颜色等等,同时现在我们也有一个猫,上述功能她也有.这个时候我们写代码的时候,就得分别把上 ...

  9. POJ Countries in War 3114

    题目大意: 给定一些城市,然后再给一些寄信的路信,A,B,H代表把信从A城市寄到B城市需要H小时. 如果没有直接可以寄达的,可以先通过另外一个城市到达,比如A,B可以寄信,B,C可以寄信,那么,A,C ...

  10. 【转】寻找最好的笔记软件:三强篇(EverNote、Mybase、Surfulater) (v1.0) (

    原文网址:http://blog.sina.com.cn/s/blog_46dac66f01000b57.html 寻找最好的笔记软件:三强篇(EverNote.Mybase.Surfulater) ...