Android-ViewBinding、第三方库混淆

一、什么是混淆与混淆的作用

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
    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  create(modelClass: Class): 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 (...);
}

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.** {*;}

你可能感兴趣的:(Android-ViewBinding、第三方库混淆)