虽然混淆的作用不是特别大,反编译也能看见代码,但是为了增加被人的反编译成本,还是最好混淆了,一般人也不会去看你混淆的代码,当然最好在加固下、监听下渠道也就差不多了。如果C语言很好的话,还是可以考虑把核心算法放到C语言里完成打包成so库等方式更为安全。下面就总结下混淆的配置。
proguard 配置
· -keepclasseswithmembers 指定的类和类成员被保留,假如指定的类成员存在的话。
· -dontwarn 缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。
· -keep 指定的类和类成员被保留作为 入口 。
· -keepclassmembers 指定的类成员被保留。
不能混淆的代码
· Android系统组件,系统组件有固定的方法被系统调用。
· 被Android Resource 文件引用到的。名字已经固定,也不能混淆,比如自定义的View
· Android Parcelable ,需要使用android 序列化的。
· Java序列化方法,系统序列化需要固定的方法。
· 枚举 ,系统需要处理枚举的固定方法
· 本地方法,不能修改本地方法名
· annotations 注释
· 数据库驱动
· 有些resource 文件
· 用到反射的地方
· 其他Anroid 官方建议 不混淆的,如
android.app.backup.BackupAgentHelper
android.preference.Preference
com.android.vending.licensing.ILicensingService
混淆配置
proguard 参数
· -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} 设置源文件中给定的字符串常量
proguard.cfg配置项模板
[代码]java代码:
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 |
|