1.参考资料 https://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html 官方文档及网上博客 最近的项目总结
2. Android Studio(以后简称AS) 下默认有proguard-project.txt ,为混淆的配置文件 配置路径在该工程下的gradel中。实际为一个 proguard
3混淆对象 proguard默认是所有文件均进行混淆
在下列情况一般不进行混淆 :
a 四大组件、support包(一般v4、v7)
b 资源文件、r文件
c js调用
d 反射和调用反射的类
e jni调用
f so库、jar包(一般来说已经进行了混淆)
4.基本语法 由于网上资料均 省略这一部分 本文给出重要部分:
a. 通配符 与Java类似 *-》代表匹配所有字符 **表示该包类所有类及其子路径的类
b. 如果保持一个类不混淆-keep class 类名 {*;} 类名是全名(包含包名)
c. 保持一个类的子类不被混淆 -keep * extends 类名 { *;} 跟java很像是不是?
e. 保持一个类的单个方法不变 -keepclassmembers class 类名 {可含有通配符的方法名}
f. 保持含有某个方法的类不被混淆 -keepclasseswithmembers class 类名 {可含有通配符的方法名}
5 其他
a.optimize是否采用算法进行压缩
b. shrink是否删除unused(未使用文件)这个要小心如反射等
c-libraryjars为导入的jar包、so库 (只是导入) gradel有些已经配置 就会报一个 ....twice 的错
d 关闭混淆 dontobfuscate
ps :开启混淆 在build.gradel 中开启:buildTypes --》release--》 minifyEnabled true
Android Studio实现代码混淆
1,在build.grandle添加,其中规则写在proguard-rules.pro中,也可以自定义一个文件,将其代替,比如eclipse常用的 proguard-project.txt
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
}
}
2,在proguard-rules.pro中加入以下代码,基本可以涵盖所有
-optimizationpasses 5 # 指定代码的压缩级别
-dontusemixedcaseclassnames # 是否使用大小写混合
-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 # 保持哪些类不被混淆
-keep public class com.android.vending.licensing.ILicensingService # 保持哪些类不被混淆
-keepclasseswithmembernames class * { # 保持 native 方法不被混淆
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 * { # 保持枚举 enum 类不被混淆
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
public static final android.os.Parcelable$Creator *;
}
3,通过 Android Studio进行 混淆代码时,默认已经将 lib目录中的 jar 都已经添加到打包脚本中,所以不需要再次手动添加,否则会出现“ java.io.IOException: The same input jar is specified twice” 错误。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/bjstyle/article/details/47001277