`
rensanning
  • 浏览: 3553479 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38247
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607654
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682870
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89578
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:402165
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69772
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91866
社区版块
存档分类
最新评论

Android代码混淆之ProGuard

 
阅读更多
Android应用的Java代码,通过反编译apk文件(dex2jar、apktool)很容易得到源代码,所以在release版本的apk中一定要混淆一下一些关键的Java源码。

ProGuard是一个开源的Java代码混淆器(obfuscation)。ADT r8开始它被默认集成到了Android SDK中。

官网:http://proguard.sourceforge.net/

它具有以下功能:
  • 压缩 - 移除无效的类、属性、方法等
  • 优化 - 优化bytecode移除没用的结构
  • 混淆 - 把类名、属性名、方法名替换为晦涩难懂的1到2个字母的名字
当然它也只能混淆Java代码,Android工程中Native代码,资源文件(图片、xml),它是无法混淆的。而且对于Java的常量值也是无法混淆的,所以不要使用常量定义平文的密码等重要信息。

不是所有的Java类都可以被混淆的,比如:
  • (1) AndroidManifest.xml引用的类Activity/Service
  • (2) JNI调用的方法
  • (3) 动态调用的方法或者成员变量
  • (4) WebView中JavaScript调用的方法
  • (5) Layout布局使用的View构造函数、android:onClick等
如果不确定哪些需要手动配置,可以以默认的配置build,当运行中发现ClassNotFoundException异常时,即可找到哪个类不该被混淆。

(一)开启ProGuard
使用Android Studio新建Android工程之后,在工程的根目录下(<project_root>\app)自动生成了以下两个文件:
引用
build.gradle
proguard-rules.pro


默认build.gradle文件里关于proguard的配置是关闭的(minifyEnabled)。
引用
  android {
   ...

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
            'proguard-rules.pro'
        }
    }
  }


方法getDefaultProguardFile('proguard-android.txt')获取Android SDK默认的ProGuard 设置:%SDK_HOME%\tools\proguard\proguard-android.txt

系统默认的配置已经涵盖了许多通用的细节,如果需要额外的配置,可以添加在 proguard-rules.pro 文件中。

对于基于Ant的Eclipse ADT稍有不同!
  • ADT r13之前:default.properties、proguard.cfg
  • ADT r14 ~ r16 :「project.properties、proguard.cfg
  • ADT r17之后:project.properties、proguard-project.txt

(二)配置ProGuard规则

1)类

不混淆某个类
引用
-keep public class com.rensanning.example.Test

不混淆某个包所有的类
引用
-keep class com.rensanning.example.*

不混淆某个类的子类
引用
-keep public class * extends com.rensanning.example.Test

不混淆某个接口的实现
引用
-keep class * implementscom.rensanning.example.TestInterface {
    public static final com.rensanning.example.TestInterface$Creator *;
}


2)方法

不混淆某个类的构造方法
引用
-keepclassmembers class
com.rensanning.example.Test {
    public <init>(int,int);
}

不混淆某个类的特定的方法
引用
-keepclassmembers class
com.rensanning.example.Test {
    public void setTestString(java.lang.String);
}


3)第三方包
-libraryjars ./libs/android-support-v4.jar  #声明lib文件
-dontwarn android.support.v4.**{*;}         #不提示警告
-keep class android.support.v4.**{*;}       #不进行混淆
-keep interface android.support.v4.**{*;}

(三)ProGuard命令一览
  • optimizationpasses
  • dontoptimize
  • dontusemixedcaseclassnames
  • dontskipnonpubliclibraryclasses
  • dontpreverify
  • dontwarn
  • verbose
  • optimizations
  • keep
  • keepnames
  • keepclassmembers
  • keepclassmembernames
  • keepclasseswithmembers
  • keepclasseswithmembernames

(四)ProGuard中间文件
开启ProGuard,Android工程被Build后,会生成以下文件:<project_root>\app\build\outputs\mapping\release

1)dump.txt
  apk文件中所有类的构成一览
2)mapping.txt
  记录了混淆后的名字与混淆前的名字的对应关系,每一次混淆结果和映射关系都不一样。
  当遇到Bug是,查看到的堆信息,要和混淆前的源码关联起来,所以管理这个文件很重要。
  retrace.bat -verbose mapping.txt stacktrace.txt
引用
com.rensanning.example.androidsample.User -> com.rensanning.example.androidsample.g:
    java.lang.String name -> a
    java.lang.String hometown -> b
    java.util.ArrayList getUsers() -> a

3)seeds.txt 
  未被混淆的类和方法一览
4)usage.txt
  记录了从apk文件中删掉的代码。这个文件一定要认真确认,是否这些代码真的是多余的。

(五)不要混淆的内容

1)四大组件
引用
-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
-keep public class com.android.vending.licensing.ILicensingService


2)自定义组件
引用
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Dialog
-keep public class * extends android.view


3)第三方库
引用
-libraryjars libs/roboguice-2.0.jar
-dontwarn roboguice.**


参考:
http://developer.android.com/tools/help/proguard.html
http://segmentfault.com/a/1190000002910305
http://www.andr0o0id.com/?p=5340
分享到:
评论

相关推荐

    java代码混淆器proGuard

    - 对于Android应用,ProGuard是默认的代码混淆工具,防止恶意用户分析和篡改代码。 - 对于服务器端的Java应用,混淆可以增强代码的保密性,减少知识产权泄露的风险。 - 对于开源项目,混淆可以保护作者的劳动成果...

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

    Java代码混淆工具ProGuard是Java开发者在发布应用时常常使用的一种工具,它的主要目的是保护代码知识产权,防止未经授权的反编译和抄袭。在本压缩包文件"proguard-7.0.0.zip"中,包含了ProGuard的最新版本7.0.0,这...

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

    ### Android 4.0 及以上版本 ProGuard 代码混淆详解 #### 一、ProGuard 简介 ProGuard 是一款广泛应用于 Android 开发中的代码混淆工具,它能够通过删除未使用的类、字段、方法等,从而缩小 APK 的体积,并提高...

    Android代码混淆 proguard语法及常用

    新写的proguard代码混淆的文档 大家可以看看

    java 代码混淆 proguard

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

    Android 2_3 代码混淆proguard技术介绍 - Zy的技术心

    Android 2_3 代码混淆proguard技术介绍 - Zy的技术心

    Android混淆 各个版本proguard文件

    从Android Gradle插件3.4.0版本开始,R8成为默认的代码混淆工具,它是Google推出的下一代代码混淆工具,比Proguard更快更强大,同时兼容Proguard的配置文件。 6. **混淆与 DexGuard:** DexGuard是Eclipse ADT...

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

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

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

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

    java代码混淆器proguard3.2下载(内有实例,教你怎么用)

    Java代码混淆器ProGuard是Java开发中用于保护和优化应用程序的重要工具。ProGuard 3.2版本是一个较早的发行版,但其基本功能和重要性依然不可忽视。本文将详细介绍ProGuard及其在Java开发中的应用,同时提供使用实例...

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

    在Android应用开发中,为了提高应用的安全性和优化代码体积,开发者常常会进行代码混淆和打包。ProGuard是一款强大的Java字节码混淆、优化、预校验和分析工具,它可以为我们的Android项目提供必要的保护,防止恶意...

    Android代码混淆前后分析

    本文将深入探讨Android代码混淆的前因后果、原理以及如何实施。 首先,我们来理解什么是代码混淆。代码混淆是将源代码转换成一种难以理解和阅读的形式,通常通过重命名变量、方法和类名,以及压缩和优化代码结构来...

    代码混淆工具-proguard7.2.2

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

    ProGuard工具包,Java代码混淆

    ProGuard是Android和Java平台上的一个强大的开源工具,它能实现代码混淆、优化、压缩以及预校验等功能。本文将深入探讨ProGuard的工作原理、配置与应用。 ### 1. ProGuard概述 ProGuard是一款免费的Java字节码混淆...

    Java代码混淆工具(proguard4.5.1)

    Java代码混淆工具ProGuard是Java开发中用于保护和优化应用程序的重要工具。它的主要功能是对Java字节码进行混淆、优化、缩小和预校验,从而提高应用的安全性和性能。ProGuard 4.5.1是该工具的一个版本,发布于2010年...

    Android代码混淆配置

    本篇文章将深入探讨Android代码混淆配置的细节,帮助开发者理解如何有效地使用这一技术。 混淆是通过重命名类、方法和变量,使得原始代码变得难以理解的过程。在Android中,我们通常使用ProGuard工具进行代码混淆,...

    java 混淆工具proguard5.3.3

    Java混淆工具ProGuard是Java开发中的一个重要组件,主要用于保护应用程序的源代码,防止逆向工程分析,同时也可优化代码,减小程序体积。在Android开发中,它被广泛应用于APK的发布过程,确保代码安全并提高运行效率...

    Android Java混淆(ProGuard)

    ProGuard是一个SourceForge上非常知名的开源项目。...为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。ProGuard的主要作用就是混淆。当然它还能对字节码进行缩减体积、优化等。

    proguard,代码混淆

    在Java和Android开发中,代码混淆是一个至关重要的环节,它能够保护应用程序的源代码,防止未经授权的逆向工程。ProGuard是一款功能强大的开源混淆工具,由Eric Lafortune开发,它不仅提供代码混淆功能,还包含了...

    混淆加密 proguard 5.3.3

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

Global site tag (gtag.js) - Google Analytics