`

Eclipse与Android源码中ProGuard工具的使用(代码混淆)

 
阅读更多

由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解。下面将自己的理解和认识简要的做个笔记,有异议或者不解的,可以直接留言。

什么是ProGuard工具?


ProGuard是android提供的一个免费的工具,它能够移除工程中一些没用的代码,或者使用语义上隐晦的名称来重命名代码中的类、字段和函数等,达到压缩、优化和混淆代码的功能。具体来说,使用ProGuard工具,可以达到下面两个目的:

  • 删除了源文件中没有调用的那部分代码,最大化的精简了字节码文件,使得最终生成的apk文件更小。
  • 使用语义混淆的命名替换了代码中的类、字段和函数等,使得其他人无法反编译获取源代码,起到对代码的保护作用。

我看网上有不少人根据ProGuard工具的作用,直接称呼其为“混淆代码工具”,本文也暂时用这个词简称。

更多的理解,可以参考ProGuard工具的官方文档地址:http://developer.android.com/tools/help/proguard.html

ProGuard工具的集成与使用环境


其实,ProGuard工具是已经集成到我们android系统中的,所以不需要用户手动的去集成。但是有一点需要注意,仅在程序处于Release模式时ProGuard才有效,反之在Debug模式是不能通过ProGuard来混淆代码的。

根据ProGuard的具体使用环境,我分在Eclipse工具和android源码两种编译环境浅谈ProGuard的使用方法。

Eclipse环境中ProGuard的使用


以我电脑的android4.0环境为例,当我们在Eclipse中新建一个项目,或者导入一个已存在项目(保证当前项目没有语法错误)后,在工程的根目录,会自动生成两个ProGuard的混淆文件:proguard-project.txt和project.properties(在老版本的ADT中,只会生成一个叫proguard.cfg的文件)。我们先看下文件project.properties :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 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-16

看后面一段注释:To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home) ,意指要让ProGuard 来压缩和混淆代码,把这句注释去掉即可!所以,我们只要把下面一句注释取消即可,如下所示:

1
2
# 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

我们仔细的看下这部分代码:这个地方是通过设置proguard.config属性来指定混淆代码的配置文件为本机SDK目录下面的proguard-android.txt文件,以及制定混淆的个性化配置文件为当前工程(eclipse下)根目录下面的proguard-project.txt文件 ,而后面这个文件,恰是我们刚才看到的原本在根目录下自动生成的另外一个文件!

其实打开了这个地方,我们就已经可以混淆代码了,不过这里要注意:不能试图通过运行eclipse中的Run as 和 Debug as 菜单来生成混淆代码,必须通过如下图所示的方法将apk导出才行,当然你可以选择“签名”或者“不签名”:

图片说明文字

这样一步操作后,算是代码混淆完成了。那么怎么才能检验我们真的混淆了代码了呢?首先,我们能够看到在工程的根目录新生产了一个文件夹proguard,里面有四个文件,其内容如下:

  • dump.txt : 描述了apk中所有类 文件中内部的结构体。( Describes the internal structure of all the class files in the .apk file )
  • mapping.txt : 列出了原始的类、方法和名称与混淆代码见得映射。( Lists the mapping between the original and obfuscated class, method, and field names. )
  • seeds.txt : 列出了没有混淆的类和方法。( Lists the classes and members that are not obfuscated )
  • usage.txt : 列出congapk中删除的代码。( Lists the code that was stripped from the .apk )

同时使用反编译软件对新生成的apk反编译后会发现,里面的类名、方法和变量等,都变成了简单的a、b、c、d等毫无含义的字母,这样就达到了混淆的目的:
图片说明文字

但在实际使用过程中,我们会发现当前apk中的有些方法和类,是要供外部使用的,而此时混淆了名称,外部调用就会报错了,那么怎么解决这个问题?此时就要用到我们刚才提到的混淆的个性化配置文件proguard-project.txt,在其中去配置不需要混淆的类、方法和变量等。关于混淆文件的具体配置方法,请看下面的最后一个标题会有详述。

Android源码环境中ProGuard使用


在Google发布的android源码中,面对那么多代码和文件目录,此时该如何混淆代码与配置混淆文件呢?

android中默认是将代码混淆ProGuard关闭的,在alps/build/core/proguard.flags中有下面一句,意指将默认不混淆,不需要代码删除,我们将这一句注释起来,就起到代码混淆编译的作用。

1
2
# Don't obfuscate. We only need dead code striping.
-dontobfuscate

可以说,这句是android工程中代码混淆的总开关,然而,注释了上面的代码后,整个工程就已经是代码混淆了吗?不是的,这里还要关注一个文件alps/build/core/package.mk,在这个文件中有这么一段:

1
2
3
4
5
6
ifndef LOCAL_PROGUARD_ENABLED
ifneq ($(filter user userdebug, $(TARGET_BUILD_VARIANT)),)
    # turn on Proguard by default for user & userdebug build
    #LOCAL_PROGUARD_ENABLED :=full
endif
endif

切记:当我们需要对整个工程进行代码混淆的时候,就把此处的 #LOCAL_PROGUARD_ENABLED :=full注释去掉,成为有效的宏即可。如果不想对整个工程代码混淆,而只是相对某个模块混淆的话,就先不要动这里的代码。

接着建议将真个工程new一遍,之后就可以针对具体的apk文件进行混淆文件的设置和定制了。下面以alps/packages/apps/Music为例说说该如何对特定模块做到混淆代码:

在Music目录下,我们看到一个平时不太关注,但今天一定很在意的文件名:proguard.flags ,对了,这个文件就是Music的混淆配置文件,可以打开看看(有些地方没有这个文件,用户可以自己手动新建一下,最好名称也叫proguard.flags,android下默认都是这个名字)。当然,设置了配置文件还是不够的,还需要在同目录的Android.mk中如下设置如下两句:

1
2
LOCAL_PROGUARD_ENABLED  := full
LOCAL_PROGUARD_FLAG_FILES := proguard.flags

只有这样才能让混淆代码有效,并且将混淆配置文件关联起来。(有些模块没有这两句句,就自己手动加上)

反之,如果用户已经在alps/build/core/package.mk打开了全工程混淆编译的控制点后,又在针对某个模块时不想混淆编译怎么办?这就简单了,将模块下的Android.mk中设置为**LOCAL_PROGUARD_ENABLED := disabled**即可。

这样,我们通过mm编译后的代码生成的apk,或者new真个工程后生成的烧机代码,都是已经添加相应配置的混淆代码了。

反编译后,除过proguard.flags中定制的不需要混淆的代码外,其他都是被混淆了,如图所示是android中Music模块的混淆后反编译结果:

图片说明文字

混淆文件的配置


在实际使用过程中,我们会发现当前apk中的有些方法和类,是要供外部使用的,而此时混淆了名称,外部调用就会报错了,那么怎么解决这个问题?此时就需要我们配置混淆的个性化文件proguard-project.txt(eclipse环境中)或者proguard.flags(android源码环境),在其中去配置不需要混淆的类、方法和变量等。关于混淆文件的具体配置方法,大家可以去搜索下,我这里提供一段网上有人共享的配置代码,这个配置代码保留了工程文件中的Activity、Application、Service、BroadcastReceiver、ContentProvider、BackupAgentHelper、Preference和ILicensingService的子类,并保留了所有的Native变量名及类名,所有类中部分以设定了固定参数格式的构造函数,枚举等等,用来防止外部调用出错,大家可以借鉴下,以后来配置自己的文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-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

 -keepclasseswithmembernames class * {
     native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {
    public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}
 
分类: Java
分享到:
评论

相关推荐

    Android源码:查询工具源代码

    `proguard.cfg`是ProGuard的配置文件,它是一个代码混淆工具,用于在发布应用时减小APK大小并提高代码安全性。在这个查询工具项目中,ProGuard配置可能包含了针对特定数据库查询类的保留规则,确保混淆过程不会破坏...

    android2.3 eclipse ant混淆

    本文将深入探讨“android2.3 eclipse ant混淆”这一主题,结合标签“源码”和“工具”,我们将关注如何在Android 2.3版本中,使用Eclipse集成开发环境以及Ant构建工具进行Proguard混淆。 首先,让我们了解混淆的...

    安卓Android源码——查询工具源代码.zip

    1. **Proguard.cfg**: ProGuard 是 Android 开发中的一个代码混淆工具,用于优化、缩小和混淆 Java 字节码,以防止反编译。ProGuard 配置文件定义了混淆规则,包括哪些类、方法和变量需要保留,这对于保持代码可读性...

    安卓Android源码——精典源码之查询工具源代码.zip

    ProGuard是Android开发中的一个代码混淆、优化和压缩工具,可以减小APK的大小,保护代码安全,防止反编译。在发布应用时,通常会启用ProGuard以提高应用的安全性和效率。 2. **.classpath**:这是Eclipse或Android ...

    ant proguard 混淆编译 之Eclipse-Idea

    ProGuard是Java的代码混淆、优化和预校验工具,它可以减少代码体积,防止反编译,提高应用安全性。 在Eclipse中设置ProGuard: 1. 首先,确保你的项目包含`proguard.jar`库。这个库通常在Android SDK的`tools\lib`...

    安卓Android源码——捕鱼达人源代码.zip

    【标题】"安卓Android源码——捕鱼达人源代码.zip" 提供的是一个基于Android平台的捕鱼达人的游戏源代码,这是一份对于Android开发者来说非常有价值的参考资料。它可以帮助开发者深入理解游戏开发流程,特别是...

    Android应用源码之查询工具源代码.zip

    《Android应用源码解析——查询工具源代码》 在Android应用开发中,源码学习是提升技术能力的重要途径。本文将深入探讨一个名为"查询工具"的Android应用源码,通过对源码的分析,帮助读者理解Android应用的查询功能...

    高仿微信eclipse源码

    5. `proguard-project.txt`:用于ProGuard工具,对应用进行代码混淆和优化,以提高代码安全性和性能。 6. `AndroidManifest.xml`:这是Android应用的核心配置文件,定义了应用的组件、权限和其他元数据。 7. `res`:...

    精典源码之查询工具源代码.zip

    2. **源码混淆与安全**:如何使用Proguard保护源码,防止逆向工程。 3. **项目构建过程**:Eclipse或类似IDE的项目配置,包括类路径设置、编译步骤等。 4. **Android组件使用**:可能涉及Activity、Service、...

    android 单机斗地主源码

    8. **性能优化**:检查`proguard-project.txt`,了解如何使用ProGuard进行代码混淆和优化。 9. **多线程处理**:如果游戏包含复杂的计算或网络通信,可能会涉及到多线程编程。 总之,这个"android 单机斗地主源码...

    android源码混淆避免反编译定义.pdf

    Android Studio自2.3版本开始,内置了对ProGuard的支持,这是一种常用的代码混淆工具。ProGuard的主要工作包括类、方法和变量的名称重命名,去除未使用的代码,以及优化代码结构。要启用混淆,只需在`project....

    Android应用源码支持单号扫描的快递查询

    5. `proguard-project.txt`:ProGuard是一个代码混淆工具,用于保护应用源码的安全性,减少应用体积并优化性能。此文件包含了ProGuard的配置规则。 6. `AndroidManifest.xml`:这是Android应用的核心配置文件,定义...

    androidapi源码part2

    3. `proguard`:ProGuard 是一个 Java 代码混淆工具,用于减小应用体积,提高安全性。 4. `jdiff`:JDiff 是一个用于生成 API 变更报告的工具,可以比较不同版本间的 API 差异。 5. `dxconvext`:可能与 Dalvik VM ...

    Android 7.0相机源码

    同时,`proguard.flags`和`proguard-project.txt`则涉及代码混淆和优化的相关设置,以保护应用的知识产权并减小APK大小。 二、AndroidManifest.xml 在Android应用中,`AndroidManifest.xml`是至关重要的元数据文件...

    安卓Android源码——testBaiduMap.zip

    5. **proguard-project.txt**:ProGuard是一个Java代码混淆工具,此文件用于配置代码混淆规则,保护应用源代码的安全性,同时减小APK的大小。 6. **AndroidManifest.xml**:这是Android应用的核心文件,定义了应用...

    安卓Android源码——xinxinDemo.zip

    【标题】"安卓Android源码——xinxinDemo.zip" 提供的是一个Android应用程序的源代码,名为"xinxinDemo"。这个项目可能是为了展示或教学Android应用开发的基础知识,或者是一个特定功能的实例。 【描述】"安卓...

    HC_BLE助手_蓝牙透传APK代码_androidble_android_

    6. Eclipse或Android Studio的使用:这两个IDE是Android开发的常用工具,了解它们的项目结构和构建流程。 通过学习和实践这个项目,开发者可以深入理解Android BLE通信机制,为创建自己的蓝牙应用打下坚实基础。

    安卓Android源码——Android ViewPager Fragment.zip

    - `proguard.cfg`:ProGuard的配置文件,用于代码混淆,保护应用安全并减小程序大小。 - `.project`:Eclipse项目的配置文件,描述了项目的结构和属性。 - `lint.xml`:自定义Lint检查的规则文件,用于提高代码...

    安卓Android源码——仿iphone 气泡短信 DEMO.zip

    4. **proguard.cfg**:ProGuard是一个代码混淆工具,用于优化和保护Java代码。在发布应用时,为了提高代码的安全性和减少体积,开发者通常会使用ProGuard来混淆代码,使其更难以逆向工程。 5. **src**:源代码目录...

Global site tag (gtag.js) - Google Analytics