合并多个JAR和AAR包

2,170 阅读1分钟

项目开发时遇到的问题,找同事咨询了下,发现了三种方法。今天介绍第一种,后续继续完善。 新建一个module,在该module的build.gradle中添加如下代码,注意在最外层添加,与android{}同级。

//把所有依赖的 jar 包拷贝至 build/outputs/aar/libs
task syncAllJars() {
    // 使用了绝对路径,需要根据实际情况调整
    // 将指定路径下的所有 jar 包,打包至被打包的路径下
    def dir = new File('/Users/dashifuguye/project/***/***/libs/')
    files(dir.listFiles()).each { file ->
        if (file.name.endsWith('.jar')) {
            copy {
                into buildDir.getPath() + "/outputs/aar/libs"
                from file.absolutePath
            }
        }
    }
}

// 把所有依赖的 aar 包中包含的 classes.jar
// 都拷贝到 build/outputs/aar/libs下,并重命名以不被覆盖
task syncAllAars() {
    def jarName
    def aarPath
    def destDir = buildDir.getPath()+"/outputs/aar"
    // 使用了绝对路径,需要根据实际情况调整
    def dir = new File('/Users/dashifuguye/project/***/***/libs/kx11/')
    files(dir.listFiles()).each { file ->
        aarPath = file.absolutePath

        if (file.name.endsWith('.aar')) {
            jarName = "libs/" + file.name.replace(".aar",".jar")
            copy {
                from zipTree(aarPath)
                into destDir
                include "**/*"
                rename 'classes.jar', jarName
            }
        }
    }
}

// 将多个 jar 包打包成一个 classes.jar
task makeJar(type: Jar) {
    archiveName = 'classes.jar'
    def dir = new File(buildDir.getPath()+"/outputs/aar/libs")
    files(dir.listFiles()).each { file ->

        if (file.name.endsWith('.jar')) {
            from (project.zipTree(file.absolutePath))
        }
    }
    destinationDirectory = file(buildDir.getPath()+"/outputs/aar")
}

task fataar(dependsOn:[syncAllAars, makeJar]) {
}

//生成最终 aar 包,libs 目录需要被排除
task genAar(dependsOn:[fataar], type: Zip) {
    def destDir = buildDir.getPath()+"/outputs/aar"
    baseName "Bep-SDK"
    extension "aar"
    version '1.1'
    destinationDirectory = file('libs/')
    from destDir
    exclude "libs"
}

文章暂时写到这里,后面继续完善。