一、什么是混淆与混淆的作用
https://developer.android.com/studio/build/shrink-code?hl=zh-cn
官方文档详细的说明,这里不在赘述
二、如何开启混淆
在项目build.gradle的Android 目录下
buildTypes {
release {
// 不显示LOG
buildConfigField "boolean", "LOG_DEBUG", "true"
// Zipalign优化,资源对齐
zipAlignEnabled true
// 混淆
minifyEnabled true
// 移除无用的resource文件 必须和minifyEnabled同时打开
shrinkResources true
// 默认的混淆文件以及我们指定的混淆文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
// 引用正式版签名
signingConfig signingConfigs.release
}
}
- 其中 proguardFiles getDefaultProguardFile('proguard-android.txt')包含一份 Android 默认的混淆规则,比如四大组件的混淆等,其他的混淆则从proguard-rules.pro中增加
- 根据项目架构不同可以集中式在主项目工程混淆或者各个lib 项目工程混淆,建议较大的项目在各个lib项目添加各自的混淆,方便各项目引用。
release {
minifyEnabled false
consumerProguardFiles 'proguard-rules.pro'
}
三、ViewBinding添加混淆规则
- ViewBinding 使用反射调用 inflate 实现基类,需要 keep ViewBinging
private fun initViewBinding(inflater: LayoutInflater, container: ViewGroup?): View {
val type = javaClass.genericSuperclass
val clazz = (type as ParameterizedType).actualTypeArguments[0] as Class<VB>
val method = clazz.getMethod(
"inflate",
LayoutInflater::class.java,
ViewGroup::class.java,
Boolean::class.java
)
viewBinding = method.invoke(null, inflater, container, false) as VB
return viewBinding.root
}
-keep class * implements androidx.viewbinding.ViewBinding {
*;
}
- 自定义 ViewModelProvider.Factory,会反射调用构造方法,也需要 keep
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val examSite = intent.getSerializableExtra(KEY_EXAM_SITE) as ExamSite
return modelClass.getConstructor(ExamSite::class.java).newInstance(examSite)
}
-keepclassmembers public class * extends androidx.lifecycle.ViewModel {
public <init>(...);
}
kotlin 写的这个 ViewModelProvider.Factory 在添加混淆之后,依然报错
kotlin.jvm.KotlinReflectionNotSupportedError: Kotlin reflection implementation is not found at runtime. Make sure you have kotlin-reflect.jar in the classpath.
解决方法便是添加 kotlin-reflect.jar
implementation "org.jetbrains.kotlin:kotlin-reflect:$project.thirdparty.kotlinVersion"
四、第三方库中,应用需要添相应报名混淆
-keep class com.xxx.xxxxx.** {*;}
网友评论