Android编译时动态替换Jar包中的类

开发过程中我们可能有修改Jar包的需求,但是Jar源码可能不在我们这边,这个时候我们可以用到JarFilterPlugin这个插件,这个插件可以做到编译时用我们本地类替换Jar包中的类,但是这个用法在这个插件的ReadMe中没有写,我们可以这样操作

引入JarFilterPlugin

在项目顶级目录的build.gradle下添加如下内容

buildscript {
    repositories {
        maven {
            url "https://jitpack.io"
        }
    }
    dependencies {
        classpath 'com.github.nekocode:JarFilterPlugin:1.1'
    }
}

在模块层级build.gradle下添加如下内容,内容与 adnroid闭包同层级

apply plugin: "jar-filter"

jarFilter {
    skipFiles = [
        'android/arch/lifecycle/LiveData.class',
        'android/support/constraint.class'
    ]
}

上面skipFiles中就是我们想要替换的类,我们还要在自己模块的src目录下建立和想要替换的类同路径的包目录,然后将目标类的源码拷贝到我们建立的目录下并做对应的修改,举例为每一个类增加一个打印日志的方法,然后我们再编译就会发现我们的类已经替换了Jar包中原有的类。但是这个插件有个问题,处理大项目时编译会报invalid entry compressed size,这是因为Jar包的拷贝方式有问题,碰到了或者有兴趣的同学可以了解一下这里,报错的路径在JarFilterPlugin/buildSrc/src/main/java/cn/nekocode/jarfilter/JarFilterTransform.kt#copyAndFilterJar()中,链接:JarFilterTransform.kt

注:发现另一个类似的库 ExcludeAar, 在大项目中表现更好(404了 可以根据名字找一下)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容