美文网首页
Android-ViewBinding、第三方库混淆

Android-ViewBinding、第三方库混淆

作者: 唔笛plk | 来源:发表于2021-11-17 09:12 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:Android-ViewBinding、第三方库混淆

          本文链接:https://www.haomeiwen.com/subject/usrialtx.html