gradle:编译过程中修改第三方jar包

编译过程中修改第三方jar包

背景

Android项目过程中要引入第三方开源的jar,根据需求又要对其进行破坏性的定制,不修改源码不行。然而种种规范和要求又不能让我们将第三方源码全部拿过来再修改。
奇葩的需求和奇葩的硬性规范,导致如下难题:

工程依赖要用原始未修改的jar
jar里面某几个class要修改
开发不能将所有源码引入

解决思路

工程依赖使用原始jar
工程内引入需要修改的源码(包路径、类名称等需要和源码相同)
编译时用我们修改后代码生成的class覆盖原jar中同名class

gradle脚本如下

apply plugin: 'java'

sourceCompatibility = 1.7
targetCompatibility = 1.7

// 解压缩第三方jar包到某目录,拷贝过程中去掉我们要修改的class
task unzip(type: Copy) {

    // 原始jar包文件
    def zipFile = file('xxxxx/xxx/abcdef.jar')

    // 解压缩目标目录
    def outputDir = file("unpacked/dist")

    // 文件过滤,去除部分class。这里建议写精确点,因为可能存在名称相同或相近的文件。
    FileTree jarTree = zipTree(zipFile).matching {
        exclude '**/com/my/aaa.class',
                '**/com/my/util/bbb*.class'
    }

    // 从jar的目录树中输出到目标目录
    from jarTree
    into outputDir
}

sourceSets {
    main {
        // 这个目录是我们修改的少数几个java源码文件
        java.srcDirs = ['src/main/java']
        // jar包中所有解压缩出来的文件作为resource
        resources.srcDirs = ['unpacked/dist']
    }
}

// compileJava是这个plugin的默认编译任务,我们要在编译任务执行前,进行解压缩的操作
compileJava.dependsOn unzip

dependencies {

    // com.android.library这个插件不支持依赖中写class path
    // 相反的,java这个插件也不支持依赖aar或android module
    compile files('unpacked/dist')

    // 如果引入的源码还有其他的依赖,也加进来
    compile files('../../android.jar')
}

你可能感兴趣的:(杂项)