`

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 *;
}

 原文地址: http://my.eoe.cn/viver120/archive/5304.html

注:附件反编译工具

分享到:
评论

相关推荐

    Android Java代码混淆工具:ProGuard简介及使用.docx

    在Android开发中,ProGuard是最广泛使用的Java代码混淆工具之一,它不仅能够混淆代码,还能够对代码进行优化,减少APK的大小,提高运行效率。 #### ProGuard的工作原理 ProGuard通过对类、方法和字段的名称进行...

    Android 4.0及以上版本 ProGuard 代码混淆

    ProGuard 是一款广泛应用于 Android 开发中的代码混淆工具,它能够通过删除未使用的类、字段、方法等,从而缩小 APK 的体积,并提高应用运行速度。此外,ProGuard 还能为类、字段、方法等命名,使得反编译后的代码...

    Android混淆 各个版本proguard文件

    本篇将详细介绍Android混淆以及各个版本的Proguard文件,帮助开发者理解其工作原理和使用方法。 混淆(Proguard)是一种Java字节码混淆工具,它能对应用的类、方法和变量进行重命名,使其变得难以理解和逆向工程,...

    最好用的JAVA代码混淆工具proguard-7.0.0.zip

    总的来说,"proguard-7.0.0.zip"提供的ProGuard工具是Java和Android开发中保护知识产权,提升代码安全性和性能的重要助手。通过合理配置和使用,开发者可以有效地保护自己的劳动成果,同时提高应用的运行效率。

    ProGuard工具包,Java代码混淆

    **ProGuard工具包详解——Java代码混淆** 在Java开发中,为了提高应用程序的安全性和保护知识产权,开发者常常会使用一种称为“代码混淆”的技术。ProGuard是Android和Java平台上的一个强大的开源工具,它能实现...

    java 代码混淆 proguard

    ProGuard是一款广泛使用的Java代码混淆工具,它能有效地压缩、优化和混淆Java字节码,使其难以阅读和理解。 ProGuard的主要功能包括: 1. **压缩**:删除未使用的类、字段和方法,减小最终的APK或JAR文件大小,...

    proguard混淆器

    ProGuard是一款强大的Java类文件混淆、优化、压缩和预校验工具,广泛应用于Android应用开发中,用于保护代码安全、减小程序体积并提高运行效率。它通过对类名、方法名和变量名进行重命名,使得代码变得难以阅读,...

    java 混淆工具proguard5.3.3

    DexGuard是GuardSquare公司为Android开发的高级混淆工具,它在ProGuard的基础上增加了对Dalvik虚拟机和Android特定功能的支持,如资源混淆、字符串加密等,提供更强大的安全防护。 7. **使用注意事项**: - 混淆...

    java代码混淆器proGuard

    - 首先,下载并配置ProGuard工具,通常在Android Studio或Eclipse等集成开发环境中已经集成了ProGuard。 - 编写混淆规则:ProGuard允许开发者自定义混淆规则,例如保留某些类或方法不被混淆,防止混淆后导致程序...

    【android开发】混淆打包proguard模板

    ProGuard是一款强大的Java字节码混淆、优化、预校验和分析工具,它可以为我们的Android项目提供必要的保护,防止恶意逆向工程分析。本文将深入探讨"【android开发】混淆打包proguard模板"的相关知识点。 一、...

    代码混淆工具-proguard7.2.2

    代码混淆工具ProGuard是Java平台上的一个强大工具,主要用于优化、缩小和混淆Java字节码。在Android开发中,它通常被用来保护应用程序的源代码,防止未经授权的反编译和逆向工程。ProGuard 7.2.2是该工具的一个版本...

    混淆加密 proguard 5.3.3

    ProGuard 是 Android 和 Java 开发中最广泛使用的混淆工具之一,它能对代码进行优化、混淆、shrinking 和预校验。ProGuard 5.3.3 版本是官方在2017-04-02通过sourceforge发布的最新版,旨在提供更稳定和高效的服务。...

    android library文件混淆

    二、使用 Android SDK 提供的 ProGuard 工具混淆 jar 文件 Android SDK 提供了 ProGuard 工具,可以对 jar 文件进行混淆。ProGuard 是一个 Java 类文件混淆和优化工具,可以减小代码的大小,提高代码的安全性。 ...

    android 混淆工具

    本篇将详细介绍Android混淆工具,尤其是其中的经典工具ProGuard。 Android混淆工具的主要功能是对APK中的Java字节码进行混淆,通过重命名类、方法和变量,使其变得难以理解和调试。这种混淆过程通常包括四个主要...

    Android proguard.cfg

    在Android开发过程中,为了保护应用的安全性和优化代码大小,开发者通常会使用ProGuard工具进行代码混淆、优化和压缩。ProGuard是Android Studio内置的一个强大的工具,它可以将Java字节码转换为更难理解的形式,...

    proguard4.11 混淆工具

    ProGuard是一款广泛使用的Java字节码混淆、优化和压缩工具,尤其在Android开发中起着至关重要的作用。它能够帮助开发者保护应用程序代码,减少代码体积,提高应用性能,并且为发布版本提供更好的安全性。 混淆是...

    最新的加密混淆工具proguard6.0.3

    **ProGuard**是一款广泛使用的Java代码混淆、优化和压缩工具,尤其在Android开发中起着至关重要的作用。它能够帮助开发者保护应用程序的源代码,防止反编译和篡改,同时也能减小程序体积,提高运行效率。ProGuard ...

    proguard4.8混淆工具

    ProGuard是一款广泛使用的Java字节码混淆、优化、压缩和预检查工具,主要应用于Android开发领域,用于保护应用程序代码安全,减小APK体积,并提高运行效率。在Android开发过程中,ProGuard是默认集成在构建流程中的...

    如何混淆Android项目代码(ProGuard)防止反编译.rar

    为了对抗这种威胁,开发者通常会采用代码混淆技术,其中ProGuard是Android官方推荐的混淆工具。本教程将深入探讨如何使用ProGuard来混淆Android项目代码,以防止反编译。 一、ProGuard介绍 ProGuard是一款免费的...

    java 代码混淆 proguard5.3.3

    3. 运行混淆:使用命令行或者IDE(如Android Studio)调用ProGuard工具进行混淆操作。命令行示例:`java -jar proguard.jar @proguard-project.txt` 4. 检查混淆结果:混淆完成后,会生成mapping.txt文件,记录原始...

Global site tag (gtag.js) - Google Analytics