混淆器(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. 『重构--改善既有代码的设计』读书笔记----Self Encapsulate Field

    如果你直接访问一个字段,你就会和这个字段直接的耦合关系变得笨拙.也就是说当这个字段权限更改,或者名称更改之后你的客户端代码都需要做相应的改变,此时你可以为这个字段建立设值和取值函数并且只以这些函数来访 ...

  2. 【C#枚举】根据EnumName获取Value

    public static int GetEnumValue(Type enumType, string enumName) { try { if (!enumType.IsEnum) throw n ...

  3. 简单概述 .NET Framework 各版本区别

    目前已发行的版本有1.0.1.1.2.0.3.0.3.5.4.0.4.5(及4.5.1.4.5.2).4.6(及4.6.1). 1.0版本:最初的.net framework版本,作为一个独立的工具包 ...

  4. Chrome 中的彩蛋——T-Rex

    今天,从网页上看到chrome的T-Rex的彩蛋,眨眼间完了10分钟.分享出来,只是好玩. 当 Chrome 无法连接到互联网时,或者上着网突然掉线,刷新页面时报错,我们都会看到T-Rex的身影,没错 ...

  5. 理解Python的*args, **kwargs

    1 # coding=utf-8 2 def speak(*args, **kwargs): 3 print args, kwargs 4 5 6 a = 1 7 b = 2 8 c = 3 9 sp ...

  6. 谈谈Parser --王垠

    一直很了解人们对于parser的误解,可是一直都提不起兴趣来阐述对它的观点.然而我觉得是有必要解释一下这个问题的时候了.我感觉得到大部分人对于parser的误解之深,再不澄清一下,恐怕这些谬误就要写进 ...

  7. (org.hibernate.LazyInitializationException:19) - could not initialize proxy错误

    (org.hibernate.LazyInitializationException:19) - could not initialize proxy错误 在刚插入数据后,马上使用dao进行query ...

  8. java 内存 垃圾回收调优

    要了解Java垃圾收集机制,先理解JVM内存模式是非常重要的.今天我们将会了解JVM内存的各个部分.如何监控以及垃圾收集调优. Java(JVM)内存模型 正如你从上面的图片看到的,JVM内存被分成多 ...

  9. vsphere 出现“在主机的当前连接状况下不允许执行该操作”

    问题: 登录vsphere client启动虚拟机出现“在主机的当前连接状况下不允许执行该操作” 解决方法: 1.选择主机->右键->断开 2.选择主机->右键->连接 3.在 ...

  10. 为什么PCI-e比SATA快这么多?

    PCIe协议和SATA协议都是分层协议,分为物理层,数据链路层,传输层,命令层和应用层. 硬件工程师主要关注物理层.数据链路层和传输层.所有CMD/data由应用层和命令层打下来,每向下走一层,多一层 ...