本文共 3636 字,大约阅读时间需要 12 分钟。
作为一名开发者,我最近在一个项目中遇到了一个棘手的问题:测试手机运行的应用功能正常,但在发布正式包后,上传功能失效。经过一番调试,发现问题出在混淆文件上。原来项目中使用的是开源项目带的混淆文件,而新增的上传功能使用了Gson进行处理,但未对混淆文件进行相应调整。Gson在使用时需要处理混淆文件,这让我深刻认识到混淆文件的重要性。今天就来一探究竟,搞懂混淆文件的配置与使用。
在Android Studio中启用混淆文件非常简单。Android Studio内置了ProGuard,这是一个强大的代码优化和混淆工具,支持通过Gradle构建工具轻松配置。具体步骤如下:
build.gradle文件。buildTypes配置,确保release类型的minifyEnabled属性设置为true。proguard-rules.pro文件中添加混淆规则。buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }} ProGuard主要有以下三个功能:
默认情况下,这三项功能都启用。
在完成混淆后,ProGuard会在build/outputs/mapping/release目录下生成四个重要文件:
dump.txt:列出混淆后的APK中所有class文件的内部结构。mapping.txt:详细记录混淆前的java源码与混淆后的命名映射关系。seeds.txt:列出被混淆的类和成员。usage.txt:记录剥离的代码。特别注意mapping.txt文件,它包含了混淆规则的详细记录。如有心人可据此反推原始代码,因此务必妥善保护这个文件。
混淆文件的配置可以分为几个方面:
-optimizationpasses 5。-dontusemixedcaseclassnames。-dontskipnonpubliclibraryclasses。-dontpreverify。-ignorewarnings。-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*。-keepattributes *Annotation*。-keepattributes Signature。-keepattributes SourceFile,LineNumberTable。Activity、Application、Service、BroadcastReceiver等类,设置-keep public class * extends android.app.Activity等。-keepclasseswithmembernames class * { native <methods>; }。许多库和框架在使用时需要进行混淆配置。常见的有:
-keepattributes Butterknife, InnerClasses。-keepclasseswithmembernames class com.slidingmenu.**。注意:这些配置不是随意复制的,而需根据文档调整路径名和包名。
对于第三方SDK,如支付宝、友盟等,需遵循提供的文档配置混淆文件。例如,支付宝支付保留关键类,设置-keep public class com.alibaba支付.**。
在项目中使用了自定义功能,如自定义View,需在混淆文件中保留这些类。例如:
-keep public class com.example.CustomView extends android.view.View { *** get*(); void set*(***); public (android.content.Context); public (android.content.Context, android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int);} 以下是一个通用的混淆文件模板:
# 代码混淆压缩比-optimizationpasses 5# 不使用大小写混合类名-dontusemixedcaseclassnames# 保留非公共库类-dontskipnonpubliclibraryclasses# 不进行预校验-dontpreverify# 忽略预警信息-ignorewarnings# 谷歌推荐算法-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*# 保护注解-keepattributes *Annotation*# 保留泛型-keepattributes Signature# 保留代码行号-keepattributes SourceFile,LineNumberTable# 允许访问有修饰符的类和成员-allowaccessmodification# 不进行类成员重包装# 保留四大组件及其子类-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.preference.Preference# 保留支持包下的所有类-keep class android.support.** {*}# 保留自定义接口实现-keep public class * implements com.example.Interface# 保留native方法-keepclasseswithmembernames class * { native ; } -keepclasseswithmembernames class * { native <methods>; }。Parcelable实现类的CREATOR字段。values()和valueOf()方法,设置-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }。通过以上配置和实践技巧,你可以有效管理混淆文件,确保应用在反编译时的安全性和性能。记住,混淆文件的配置需要根据项目需求进行调整,不能一味照搬模板。
转载地址:http://uqjg.baihongyu.com/