在android插件化开发,需要在打包宿主APK的过程中删减特定的so库
这个时候就需要在 gradle 中进行配置:
afterEvaluate {
print("deleteSoLibrary task start")
def customer = tasks.findByName("deleteSoLibrary") // 自定义的 Task
def merge = tasks.findByName("mergeReleaseNativeLibs") // gradle Task:收集项目所有的 native 库
def strip = tasks.findByName("stripReleaseDebugSymbols")
if (merge != null) {
customer.mustRunAfter(merge)
strip.dependsOn(customer)
}
}
task(deleteSoLibrary) {}.doLast {
println("deleteSoLibrary insert")
println(getRootProject().findAll())
def file = new File("${projectDir}/build/intermediates/merged_native_libs/release/out/lib")
if (file.exists()) {
file.listFiles().each { jiagou ->
if (jiagou.isDirectory()) {
jiagou.listFiles().each { target ->
// 可对文件名进行检索,以删除特定的so文件
target.delete()
println("delete ${jiagou.name} ${target.name}")
}
}
}
} else {
println("There is no so library")
}
}
以上的示例代码是以打Release包过程中删除所有的so库,若需要删除特定的so库,在检索文件中进行相应的判断即可
原理就是在 gradle 进行完一个 Task(mergeReleaseNativeLibs:收集项目所有的 native 库)后,插入一个自定义的 Task 来对 so 库进行操作
扩展:单独执行 mergeReleaseNativeLibs 后能在build目录下找到所有的 so 库