android 代码混淆,android混淆
android 代码混淆,android混淆
android 代码混淆
原理:
Java是一种跨平台的、解释型语言,Java源代码编译成中间”字节码”存储于
class文件中。由于跨平台的需要,Java字节码中包括了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成 Java源代码。为了防止这种现象,我们可以使用
Java混淆器对Java
字节码进行混淆。
混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读。同时混淆是不可逆的,在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。
混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因,编译后 jar文件体积大约能减少25%,这对当前费用较贵的无线网络传输是有一定意义的。
代码混淆的方法:
每一个Eclipse项目生成都会生成两个文件,如果要混淆必须配置这两个:
proguard-project.txt(proguard.cfg)
project.properties
根据 SDK 的版本不同有 2种不同的代码混淆方式,以上的 proguard.cfg 参数详解中所涉及到的信息是在较低版本 SDK 下的混淆脚本,事实上在高版本的 SDK 下混淆的原理和参数也与低版本的相差无几,只是在不同 SDK 版本的环境下引入混淆脚本的方式有所不同。具体方法如下:
低版本 SDK 下,项目中同时包含 proguard.cfg 和 project.properties 文件,则只需在 project.properties 文件末尾添加 proguard.config=proguard.cfg 再将项目 Export即可。
高版本 SDK 下,项目中同时包含 proguard-project.txt 和 project.properties 文件,这时需要在 proguard.project.txt 文件中进行如下信息的配置,然后再将项目Export 即可。下面以真实的文件进行演示说明。红色部分为修改部分
proguard.project.txt
# This file is automatically generated byAndroid Tools.
# Do not modify this file -- YOUR CHANGES WILLBE ERASED!
#
# This file must be checked in Version ControlSystems.
#
# To customize properties used by the Ant buildsystem edit
# "ant.properties", and overridevalues to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscateyour code, uncomment this (available properties: sdk.dir, user.home):
#上面注释说明:使混淆器缩小和混淆代码,取消这个(可用属性:sdk。dir,user.home)我们将取消下面的“#”就是说明我们要进行代码混淆
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-16
在proguard-project.txt中进行主要配置 以下是proguard-project.txt中的基本语法
基本语法:
#指定代码压缩的次数 一般10次就已经不能在压缩了
-optimizationpasses 5
#混淆时不会产生形形色色的类名
-dontusemixedcaseclassnames
#指定不去忽略的非公共的库类 是否混淆第三方类库
指定不忽略非公有制库类。从版本4.5开始,这是默认设置。
-dontskipnonpubliclibraryclasses
#不预效验
-dontpreverify
#混淆时是否记录日志
-verbose
#优化 混淆是采用的算法
-optimizations!code/simplification/arithmetic,!field/*,!class/merging/*
#引入jar包 此处是已v4.jar为列
-libraryjars libs/com.support.v4.jar
#不提示警告
-dontwarn com.support.v4.**
#保持不混淆的类
-keepclass com.support.v4.**{*;}
#常见的不能混淆的androidCode
-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
# 保持 native 方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
#过滤R文件
-keepclassmembers class **.R$*{
public static <fields>
}
#过滤自定义控件
-keepclassmembers class *extends android.app.Activity{
public viid *(android.view.View);
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context,android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context,android.util.AttributeSet, int);
}
# 保持枚举 enum 类不被混淆
-keepclassmembers enum * {
public static **[] values();
public static **valueOf(java.lang.String);
}
# 保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator*;
}
@filename “包括文件名”的缩写。
-include filename 从给定的文件读取配置选项。递归地读取配置选项从给定的文件文件名。
-basedirectory driectoryname 为后续的相对文件名指定基目录。指定的基目录所有后续相对文件名在这些配置参数或配置文件。
-injars class-path 指定程序jars(orwars, ears, zips, or directories)的应用程序来处理。这些jar中的类文件将被处理和写入输出jars。默认情况下,任何其他类型的文件将被复制没有变化。请注意任何临时文件(如由ide),特别是如果你正在阅读您的输入文件直接从目录。类路径中的条目可以过滤,过滤部分解释。为了提高可读性,可以使用多个指定类路径条目-injars选项。
-outjars class-path 指定的名称输出jars(or wars, ears, zips, or directories)。处理输入前-injars选项将写入指定jar。这允许您收集的内容组输入jars子到相应组输出jars。此外,输出条目可以过滤,过滤部分的解释。每个处理类文件或资源文件然后写入第一个输出条目匹配滤波器,在群内输出jars。
你必须避免让输出文件覆盖任何输入文件。为了提高可读性,可以使用多个指定类路径条目-outjars选项。没有任何-outjars选项,不会写jar。
-libraryjars class_path 指定库(or wars, ears, zips, or directories)的应用程序来处理。在这些jar文件将不会被包括在jars的输出。指定的库jar至少应该包含类文件扩展的应用程序类文件。库类文件,只是叫不需要礼物,尽管他们的存在可以提高优化结果的步骤。类路径中的条目可以过滤,过滤部分解释。为了提高可读性,可以使用多个指定类路径条目-libraryjars选项。
请注意,引导路径和类路径设置为运行时混淆器不考虑找库类。这意味着您显式地指定运行时jar,您的代码将使用。虽然这看起来可能很繁琐,它允许您流程应用程序针对不同的运行时环境。例如,您可以处理J2SE应用程序以及期刊midlet,仅仅通过指定适当的运行
-skipnonpubliclibraryclasses
忽略非公有制库类。指定跳过非公有制类在阅读库jar,加快处理和减少混淆器的内存使用情况。默认情况下,混淆器读取非公开和公共库类。然而,非公有制类通常是不相关的,如果他们不影响实际的程序代码输入jar。忽视他们然后加速混淆器,而不影响输出。不幸的是,一些库,包括最近的市场运行时库,包含非公有制延长公共图书馆类库类。你不能使用这个选项。混淆器将打印警告如果找不到类由于这个选项被设置。
-dontskipnonpubliclibraryclasses
不要忽视非公有制库类。从版本4.5开始,这是默认设置。
-dontskipnonpubliclibraryclassmembers
不要忽略包库类成员可见。
指定不忽略包可见库类成员(属性和方法)。默认情况下,混淆器跳过这些类成员在解析库类,项目类通常都不会引用它们。然而,有时程序类位于同一个包库类,和他们做参考包可见的类成员。在这些情况下,它可能是有用的实际阅读类成员,为了确保加工代码保持一致。
-keepdirectories
[directory_filter] 保持指定的目录在输出jars(or
wars, ears, zips, or directories)。
指定的目录保存在输出jars(或战争,耳朵,或目录)。默认情况下,目录条目被删除。这减少了jar大小,但它可能是不可取的,如果程序代码试图找到他们的构造,如“MyClass.class.getResource(" ")"。如果没有指定的选项是一个过滤器,所有目录。一个过滤器,只有匹配的目录。
-target
version
设置版本号在处理类。指定版本号的处理类文件。版本号是1.0,1.1,1.2,1.3,1.4,1.5(或5),1.6(或6),或1.7(或7)。默认情况下,类文件的版本号是不变的。例如,您可能想要升级到Java类文件,通过改变他们的版本号和预先验证
-forceprocessing
过程的输入,即使输出是最新的。指定过程的输入,即使输出是最新的。现代化程度测试是基于比较的日期戳指定的输入,输出,和配置文件或目录
-keep
[,modifier,...]class_specification 保存指定的类和类成员。
指定的类和类成员(属性和方法)保存作为您的代码的入口点。例如,为了让一个应用程序中,您可以指定主类以及它的主要方法。为了处理一个库,你应该指定所有可以公开访问的元素。
-keepclassmembers
[,modifier,...]class_specification 保存指定的类成员,如果他们的类也是受保护的。保留指定类成员,如果他们的类也是受保护的。例如,您可能想要保留所有序列化的类的字段和方法实现Serializable接口。
-keepclasseswithmembers
[,modifier,...]class_specification 保存指定的类和类成员,如果指定的所有类成员。保留指定的类和类成员,在指定的条件是所有的类成员。例如,您可能想要保留所有的应用程序有一个主方法,而无需显式地列出它们。
-keepnames
class_specification
保存指定的类和类成员的名字(如果他们不删除在萎缩的步骤)
。指定的类和类成员的名字被保留下来,如果他们不是在萎缩阶段。例如,您可能想要保留所有的类的类名实现Serializable接口,以便处理代码仍兼容任何最初序列化的类。类,不习惯仍然可以被删除。只适用混淆。
-keepclassmembernames
class_specification 保存指定的类成员的名字。指定类成员的名字被保留下来,如果他们不是在萎缩阶段。例如,您可能想要保存的名字合成类元方法在处理库编制的JDK
1.2或以上,所以面对可以检测一遍当处理一个应用程序,该应用程序使用处理库(尽管混淆器本身不需要这个)。只适用混淆。
-keepclasseswithmembernames
class_specification 指定的类和类成员的名字都被保留了,条件是所有指定的类成员存在萎缩后阶段。例如,您可能想要保留所有本地方法名称和类的名称,以便处理代码仍然可以与本地库代码。不使用的本地方法仍然可以被删除。如果使用一个类文件,但没有它的本地方法,它的名字仍然是混淆视听。只适用混淆。
-printseeds
[filename] 由各种类和类成员列表匹配
指定详尽的列表类和类成员各种近些年也选项。打印到标准输出列表或给定的文件。可能是有用的列表来验证如果真的发现预定的类成员,特别是如果你使用通配符。例如,您可能想要列出所有的应用程序或applet你保持。
-dontshrink
不要缩小输入类文件。指定不缩小输入类文件。默认情况下,减少应用;所有类和类成员,除了列出的各种近些年也选项,和他们所依赖的,直接或间接地。萎缩的一步也是应用每个优化步骤后,因为一些优化可能可能将更多的类和类成员。
-printusage
[filename] 死代码列表的输入类文件,标准输出或给定的文件。指定列死代码输入的类文件。打印到标准输出列表或给定的文件。例如,您可以列出未使用的应用程序的代码。只适用在萎缩。
-optimizationpasses
n 优化过的次数。指定数量的优化执行。默认情况下,一个单一的执行。多个传递可能导致进一步的改善。如果没有发现改进后的优化,优化是结束了。优化时只适用。
-optimizations
optimization_filter
启用和禁用的优化。指定要启用和禁用的优化,更细粒度的水平。优化时只适用。
-allowaccessmodification
允许类和类成员的访问修饰符被修改,而优化。
指定类和类成员的访问修饰符在加工过程可能会扩大。这可以提高优化结果的步骤。例如,当内联公共getter,可能有必要公开访问的字段。尽管Java二进制兼容性规范正式不需要这个(病死率。Java语言规范,第二版,13.4.6),一些虚拟机将问题处理代码。只适用于当优化(当混淆-repackageclasses选项)。
Counter-indication:你可能不应该使用这个选项在处理代码用作图书馆,因为类和类成员并没有设计成公共的API可能成为公众。
-assumenosideeffects
class_specification 假设指定的方法没有任何副作用,同时优化。
指定的方法没有副作用(除了可能返回一个值)。在优化步骤中,混淆器将删除调用这些方法,如果它能确定返回值不习惯。请注意,混淆器将自动分析程序代码以发现这样的方法。它不会分析库代码,这个选项可以是有用的。例如,您可以指定方法System.currentTimeMillis(),以便任何空闲的调用将被删除。注意,混淆器的选项适用于整个层次结构的指定方法。优化时只适用。一般来说,假设可以是危险的,你可以很容易地打破处理代码。只使用这个选项如果你知道你在做什么!
-dontobfuscate
不要混淆输入类文件。指定了输入类文件不混淆。默认情况下,应用模糊,类和类成员接收新短随机名字,除了列出的各种近些年也选项。内部属性用于调试,如源文件名称,变量名和行号删除。
-printmapping
[filename] 打印从旧名称映射到新类和类成员的名字重新命名,标准输出或给定的文件。指定打印从旧名称映射到新类和类成员的名字重命名。打印到标准输出的映射或给定的文件。例如,它需要后续增量模糊,或者如果你想要有意义又混淆过的堆栈跟踪。只适用混淆。
-applymapping
filename
重用给定的映射,为增量模糊。
指定重用打印出来的名字映射在之前的困惑混淆器的运行。类和类成员,在映射文件中列出收到指定的名称。类和类成员不提到接收新名称。映射可以参考输入类以及库类。这个选项可以用于增量模糊,即加工附件或小片的现有的代码。在这种情况下,你应该考虑你是否还需要选择-useuniqueclassmembernames。只允许一个映射文件。只适用混淆。
-obfuscationdictionary
filename 使用给定的文本文件中的单词混淆过的字段名和方法名。
指定一个文本文件从所有有效词用作混淆过的字段和方法名称。默认情况下,短名字像'a ',' b '等被用作混淆过的名字。模糊的字典,您可以指定一个保留关键字列表,或与外国字符标识符,例如。空格、标点符号、重复单词,和评论#签署后将被忽略。请注意,一个模糊的字典几乎提高了困惑。像样的编译器可以自动替换他们,效果相当简单地可以被混淆与简单的名字。最有用的应用程序指定的字符串通常已经出现在类文件(如“代码”),从而减少类文件的大小只是多一点点。只适用于当混淆
-classobfuscationdictionary
filename 使用给定的文本文件中的单词混淆过的类名。
指定一个文本文件从所有有效词用作混淆过的类名。模糊字典-obfuscationdictionary类似于其中的一个选项。只适用混淆。
-overloadaggressively
应用积极的重载,而模糊。
指定应用积极的重载,而模糊。多个字段和方法可以得到相同的名字,只要它们的参数和返回类型不同(不只是他们的论点)。这个选项可以使加工代码更小(不理解)。只适用混淆。
Counter-indication:生成的类文件的Java字节码规范(cfr。Java虚拟机规范,第二版,第一个段落4.5节和4.6节),即使这类重载在Java语言中是不允许的(cfr。Java语言规范,第二版,8.3节和节8.4.7)。尽管如此,一些工具有问题。值得注意的是:
Sun的JDK 1.2.2 javac编译器编译时产生一个异常与这样一个库(cfr。错误#
4216736)。你可能不应该使用这个选项来处理库。
Sun JRE 1.4及以后无法序列化对象与重载原始字段。
据报道,SunJRE 1.5 pack200工具与重载类成员的问题。
谷歌的DalvikVM不能处理重载的静态字段。
-packageobfuscationdictionary
filename 使用给定的文本文件中的单词混淆过的包名。
指定一个文本文件从所有有效词用作混淆过的包名。模糊字典-obfuscationdictionary类似于其中的一个选项。只适用混淆。
-useuniqueclassmembernames
确保统一为后续增量模糊混淆过的类成员的名字。
指定分配相同的名称很古怪,类成员具有相同的名称,类成员和不同的名称很古怪,有不同的名称(对于每一个给定的类成员签名)。没有选择,更多的类成员可以被映射到相同的短名称像'
a ',' b ',等。选择因此略有增加的大小产生的代码,但它确保保存的模糊的名字映射可以在后续增量模糊的步骤被尊重。
例如,考虑两个不同的接口包含方法具有相同名称和签名。没有这个选项,这些方法可能得到不同的混淆过的名字在一个模糊的第一步。如果一个补丁然后添加包含一个类,实现接口,混淆器必须执行两种方法的方法名相同增量模糊处理步骤。最初的混淆代码发生变化时,为了保持结果代码一致。等这个选项在最初的模糊处理步骤,重命名永远是必要的。
此选项只适用混淆。事实上,如果你计划执行增量模糊,你可能想要完全避免萎缩和优化,因为这些步骤可以删除或修改部分代码,供以后添加至关重要。
-dontusemixedcaseclassnames
不产生大小写混合类名而模糊。
指定生成大小写混合类名而模糊。默认情况下,混淆过的类名称可以包含大写字符和小写字符。这将创建完全可以接受的和可用的坛子。只有一罐打开在一个平台上与一个不区分大小写的文件系统(Windows),解包工具可以让彼此同样命名的类文件覆盖。代码的自毁的时候打开!开发人员真正想解压缩他们的罐子在Windows上可以使用这个选项来关闭此行为。注意,混淆过的罐子将变得更大。只适用混淆。
-keeppackagenames
[package_filter] 防止指定包名是混淆视听。指定生成大小写混合类名而模糊。默认情况下,混淆过的类名称指定不混淆给定的包名。可选的过滤器是一个以逗号分隔的包名。包名称可以包含吗?、**
*通配符,可之前!非元件。只适用混淆。
-flattenpackagehierarchy
[package_name] 重新包装的所有包重命名到父类给出的单包中。指定重新打包所有包重命名,移动他们到父母给出的单包中。没有参数或空字符串(”),包进入根包。这个选项是进一步模糊包名的一个例子。它可以使规模较小、不那么理解的处理代码。只适用混淆。
-repackageclasses
[package_name] 重新包装的所有类文件重命名为单一包。指定重新打包的所有类文件重命名,移动到独立的包。没有参数或空字符串(”),包是完全移除。这个选项选择覆盖-flattenpackagehierarchy选项。这是另一个例子进一步模糊包名称。它可以使处理过的代码更小和不理解。弃用的名字是-defaultpackage。只适用混淆。
Counter-indication:类,寻找资源文件包目录将不再正常工作如果他们搬到其他地方。有疑问时,就把包装没有被不使用此选项。
-keepattributes
[attribute_filter] 保持给定的可选属性,一般例外:,InnerClasses,签名,弃用,SourceFile,SourceDir,LineNumberTable,LocalVariableTable,LocalVariableTypeTable,合成,EnclosingMethod,*注释*。
-keepparameternames
保持参数名称和类型的方法。
指定任何可选属性被保留下来。属性可以与一个或多个指定-keepattributes指令。可选的过滤器是一个以逗号分隔的属性名称。属性名称可以包含吗?、** *通配符,可之前!非元件。典型的可选属性是例外,签名,弃用,SourceFile,SourceDir,LineNumberTable,LocalVariableTable,LocalVariableTypeTable,合成,EnclosingMethod,RuntimeVisibleAnnotations,RuntimeInvisibleAnnotations,RuntimeVisibleParameterAnnotationsRuntimeInvisibleParameterAnnotations,AnnotationDefault。InnerClasses属性也可以指定名称,指的是源名称这个属性的一部分。例如,您至少应该保持异常,InnerClasses和签名属性在处理一个图书馆。你也应该保持SourceFile和LineNumberTable属性生产有用的混淆过的堆栈跟踪。最后,您可能想要保留注释如果代码取决于他们。只适用混淆。
-renamesourcefileattribute
[string] 把给定的常数字符串SourceFile属性。
指定一个常数字符串放在SourceFile属性类文件的文件夹(SourceDir属性)。注意,属性必须出现,所以它也必须显式地使用-keepattributes保存指令。例如,您可能想要处理库和应用程序产生有用的混淆过的堆栈跟踪。只适用于当混淆
-adaptclassstrings
[class_filter] 适应字符串常量在指定的类,基于混淆过的任何相应的类的名称。指定字符串常量,对应于类名应该混淆过的。没有一个过滤器,所有字符串常量,对应于类名是改编。过滤,只在类相匹配的字符串常量过滤改编。例如,如果您的代码包含大量的硬编码的字符串引用类,你不愿意把他们的名字,你可能想要使用这个选项。主要适用于模糊时,尽管相应类自动保存在萎缩的步骤。
-adaptresourcefilenames
[file_filter] 将指定的资源文件,根据相应的类文件的名称很古怪。
指定资源文件重命名,名称很古怪的基础上相应的类文件(如果有的话)。没有一个过滤器,所有资源文件,对应于类文件重命名。与一个过滤器,只有匹配文件重命名。例如,看到处理资源文件。只适用混淆。
-adaptresourcefilecontents
[file_filter] 更新指定的资源文件的内容,基于模糊处理的类的名称。指定要更新的资源文件内容。任何类名称的资源文件重命名,名称很古怪的基础上相应的类(如果有的话)。没有一个过滤器,所有资源文件更新的内容。与一个过滤器,只有匹配文件更新。资源文件解析和使用平台的默认字符集。你可以改变这种默认字符集朗通过设置环境变量或Java系统属性file.encoding。例如,查看处理资源文件。只适用混淆。
-dontpreverify
不要预先验证处理类文件。指定不预先验证处理类文件。默认情况下,类文件预先验证如果他们是针对Java微型版或在Java
6或更高。对于Java微型版,预校验是必需的,所以您将需要处理的代码上运行外部预先验证如果指定此选项。Java
6,不需要预校验(还),但它提高了效率类加载的Java虚拟机。
-microedition
目标Java微型版的处理类文件。指定处理类文件是针对Java微型版。预先验证将添加适当的StackMap属性,它不同于默认StackMapTable属性Java标准版。例如,您需要这个选项如果你处理midlet。
-verbose
写出一些更多的信息在处理过程。指定期间写了一些更多的信息处理。如果程序异常终止,此选项将打印出整个堆栈跟踪,而不是异常消息。
-dontnote
[class_filter] 不打印指出潜在的错误或遗漏的配置。指定不打印指出潜在的错误或遗漏的配置,如在类名输入错误,或像缺少的选项,可能是有用的。可选的过滤器是一个正则表达式,混淆器不打印笔记类与匹配的名称。
-dontwarn
[class_filter] 不警告未解析的引用。
指定不警告引用和其他重要问题尚未解决。可选的过滤器是一个正则表达式,混淆器不打印警告类与匹配的名称。忽视警告可能是危险的。例如,如果未定义的类或类成员确实是需要加工,加工代码将不会正常工作。只使用这个选项如果你知道你在做什么!
-ignorewarnings
打印警告未解决的引用,但无论如何继续处理。
指定打印任何警告引用和其他重要问题尚未解决,但在任何情况下继续处理。忽视警告可能是危险的。例如,如果未定义的类或类成员确实是需要加工,加工代码将不会正常工作。只使用这个选项如果你知道你在做什么!
-printconfiguration
[filename] 写出处理类文件的内部结构,标准输出或给定的文件。
指定写出整个配置解析,包括文件和替换变量。结构是打印到标准输出或给定的文件。这有时是有用的调试配置,或转换XML配置成一个更可读的格式。
-dump
[filename] 写出整个配置在传统混淆器风格,到标准输出或给定的文件。
指定写类文件的内部结构,经过任何处理。结构是打印到标准输出或给定的文件。例如,您可能想要写出一个给定的jar文件的内容,没有处理。
proguard问题和风险
代码混淆后虽然有混淆优化的好处,但是它往往也会带来如下的几点问题
1,混淆错误,用到第三方库的时候,必须告诉 proguard不要检查,否则proguard会报错。
2,运行错误,当code不能混淆的时候,我们必须要正确配置,否则程序会运行出错,这种情况问题最多。
3,调试苦难,出错了,错误堆栈是混淆后的代码,自己也看不懂。
常见的不能混淆的androidCode
为了防止混淆出问题,你需要熟悉你所有的code,系统的架构,以及系统和你code的集成的接口,并细心分析。同时你必须需要一轮全面的测试。所以混淆也还是有一定风险的。为了避免风险,你可以只是混淆部分关键的代码,但是这样你的混淆的效果也会有所降低。
Android 程序,下面这样代码混淆的时候要注意保留。
Android系统组件,系统组件有固定的方法被系统调用。
被Android Resource文件引用到的。名字已经固定,也不能混淆,比如自定义的View。
Android Parcelable ,需要使用android序列化的。
其他Anroid官方建议不混淆的,如
android.app.backup.BackupAgentHelper
android.preference.Preference
com.android.vending.licensing.ILicensingService
Java序列化方法,系统序列化需要固定的方法。
枚举,系统需要处理枚举的固定方法。
本地方法,不能修改本地方法名
annotations 注释
数据库驱动
有些resource文件
用到反射的地方
如何实施
现在的系统已经配置为混淆时候会保留
Android系统组件
自定义View
Android Parcelable
Android R 文件
Android Parcelable
枚举
各个开发人员必须检查自己的code是否用到反射,和其他不能混淆的地方。告诉我来修改配置文件(已经保留的就不需要了)
当你在发布模式下,或者通过运行ant release,或者通过使用Eclipse中的Export Wizard构建你的应用程序的时候,构建系统都会自动地去检查proguard.config属性是否被设置了。如果被设置了,混淆器在把所有东西打包成.apk文件之前,自动地对应用程序字节码进行混淆处理。而在调试模式中构建则不会调用混淆器,因为那样调试会更加繁重。
运行混淆器之后输出的文件有:
dump.txt
描述.apk包中所有class文件的内部结构。
mapping.txt
列出了源代码与混淆后的类,方法和属性名字之间的映射。这个文件对于在构建之后得到的bug报告是有用的,因为它把混淆的堆栈跟踪信息反翻译为源代码中的类,方法和成员名字。更多信息,查看解码混淆过的堆栈跟踪信息。
seeds.txt
列出那些未混淆的类和成员。
usage.txt
列出从.apk中剥离的代码。
这些文件放在以下目录中:
<project_root>/bin/proguard 当你使用Ant时
<project_root>/proguard 当你使用Eclipse时
注意:每次在发布模式下构建时,这些文件都会被最新的文件覆盖。所以每次发布程序时候,为了反混淆来自构建时产生的bug报告,请保存这些文件的一个拷贝。对于为什么要保存这些文件的重要性的更多信息
相关文章
- 暂无相关文章
用户点评