虽然混淆的作用不是特别大,反编译也能看见代码,但是为了增加被人的反编译成本,还是最好混淆了,一般人也不会去看你混淆的代码,当然最好在加固下、监听下渠道也就差不多了。如果C语言很好的话,还是可以考虑把核心算法放到C语言里完成打包成so库等方式更为安全。下面就总结下混淆的配置。
被Android Resource 文件引用到的。名字已经固定,也不能混淆,比如自定义的View
Android Parcelable ,需要使用android 序列化的。
Java序列化方法,系统序列化需要固定的方法。
枚举 ,系统需要处理枚举的固定方法
本地方法,不能修改本地方法名
annotations 注释
数据库驱动
有些resource 文件
用到反射的地方
其他Anroid 官方建议 不混淆的,如
android.app.backup.BackupAgentHelper
android.preference.Preference
com.android.vending.licensing.ILicensingService
-include {filename} 从给定的文件中读取配置参数
-basedirectory {directoryname} 指定基础目录为以后相对的档案名称
-injars {class_path} 指定要处理的应用程序jar,war,ear和目录
-outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称
-libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件
-dontskipnonpubliclibraryclasses 指定不去忽略非公共的库类。
-dontskipnonpubliclibraryclassmembers 指定不去忽略包可见的库类的成员。
-keep {Modifier} {class_specification} 保护指定的类文件和类的成员
-keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好
-keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。
-keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)
-keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)
-keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)
-printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件
-dontshrink 不压缩输入的类文件
-printusage {filename}
-whyareyoukeeping {class_specification}
-dontoptimize 不优化输入的类文件
-assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用
-allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员
-dontobfuscate 不混淆输入的类文件
-printmapping {filename}
-applymapping {filename} 重用映射增加混淆
-obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称
-overloadaggressively 混淆时应用侵入式重载
-useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆
-flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中
-repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中
-dontusemixedcaseclassnames 混淆时不会产生形形色色的类名
-keepattributes {attribute_name,…} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.
-renamesourcefileattribute {string} 设置源文件中给定的字符串常量
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
#指定代码的压缩级别
-optimizationpasses
5
#包明不混合大小写
-dontusemixedcaseclassnames
#不去忽略非公共的库类
-dontskipnonpubliclibraryclasses
#优化 不优化输入的类文件
-dontoptimize
#预校验
-dontpreverify
#混淆时是否记录日志
-verbose
# 混淆时所采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!
class
/merging/*
#保护注解
-keepattributes *Annotation*
# 保持哪些类不被混淆
-keep
public
class
*
extends
android.app.Fragment
-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
#如果有引用v4包可以添加下面这行
-keep
public
class
*
extends
android.support.v4.app.Fragment
#忽略警告
-ignorewarning
##记录生成的日志数据,gradle build时在本项目根目录输出##
#apk 包内所有
class
的内部结构
-dump class_files.txt
#未混淆的类和成员
-printseeds seeds.txt
#列出从 apk 中删除的代码
-printusage unused.txt
#混淆前后的映射
-printmapping mapping.txt
########记录生成的日志数据,gradle build时 在本项目根目录输出-end######
#####混淆保护自己项目的部分代码以及引用的第三方jar包library#######
#-libraryjars libs/umeng-analytics-v5.
2.4
.jar
#三星应用市场需要添加:sdk-v1.
0.0
.jar,look-v1.
0.1
.jar
#-libraryjars libs/sdk-v1.
0.0
.jar
#-libraryjars libs/look-v1.
0.1
.jar
#如果不想混淆 keep 掉
-keep
class
com.lippi.recorder.iirfilterdesigner.** {*; }
#友盟
-keep
class
com.umeng.**{*;}
#项目特殊处理代码
#忽略警告
-dontwarn com.lippi.recorder.utils**
#保留一个完整的包
-keep
class
com.lippi.recorder.utils.** {
*;
}
-keep
class
com.lippi.recorder.utils.AudioRecorder{*;}
#如果引用了v4或者v7包
-dontwarn android.support.**
####混淆保护自己项目的部分代码以及引用的第三方jar包library-end####
-keep
public
class
*
extends
android.view.View {
public
public
public
int
);
public
void
set*(...);
}
#保持
native
方法不被混淆
-keepclasseswithmembernames
class
* {
native
}
#保持自定义控件类不被混淆
-keepclasseswithmembers
class
* {
public
}
#保持自定义控件类不被混淆
-keepclassmembers
class
*
extends
android.app.Activity {
public
void
*(android.view.View);
}
#保持 Parcelable 不被混淆
-keep
class
*
implements
android.os.Parcelable {
public
static
final
android.os.Parcelable$Creator *;
}
#保持 Serializable 不被混淆
-keepnames
class
*
implements
java.io.Serializable
#保持 Serializable 不被混淆并且
enum
类也不被混淆
-keepclassmembers
class
*
implements
java.io.Serializable {
static
final
long
serialVersionUID;
private
static
final
java.io.ObjectStreamField[] serialPersistentFields;
!
static
!
transient
!
private
!
private
private
void
writeObject(java.io.ObjectOutputStream);
private
void
readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
#保持枚举
enum
类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers
class
*
implements
java.io.Serializable即可
#-keepclassmembers
enum
* {
#
public
static
**[] values();
#
public
static
** valueOf(java.lang.String);
#}
-keepclassmembers
class
* {
public
void
*ButtonClicked(android.view.View);
}
#不混淆资源类
-keepclassmembers
class
**.R$* {
public
static
}
#避免混淆泛型 如果混淆报错建议关掉
#–keepattributes Signature
#移除log 测试了下没有用还是建议自己定义一个开关控制是否输出日志
#-assumenosideeffects
class
android.util.Log {
#
public
static
boolean
isLoggable(java.lang.String,
int
);
#
public
static
int
v(...);
#
public
static
int
i(...);
#
public
static
int
w(...);
#
public
static
int
d(...);
#
public
static
int
e(...);
#}
#如果用用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。
#gson
#-libraryjars libs/gson-
2.2
.
2
.jar
-keepattributes Signature
# Gson specific classes
-keep
class
sun.misc.Unsafe { *; }
# Application classes that will be serialized/deserialized over Gson
-keep
class
com.google.gson.examples.android.model.** { *; }
|