背景
最近国内各大应用市场集体要求开发者提供64位的apk,这就需要我们为项目里的各个so库,提供armV8-64位的native库,但是很多so库光看名字,不知道是哪个第三方引入的,导致无法去找对应的v8库,或者是在输出的apk包中,发现未知来源的Native库,让人抓狂,通过以下操作迅速定位他,或者根据其所在的aar包,分析他是哪家的native库。
实战
apk通过gradle生成,gradle参与了apk形成的所有细节,所以从gradle中我们可以探查apk的一切。
一、查找Gradle Task名字
gradle在构建Apk时,使用了一组task去实现最终的构建,那么首先要在你的项目里找到,你的gradle用的是那个task去把native库打入apk的。一般来说这个task的名字一定含有“NativeLibs”这样的关键字。
以下代码粘贴到app的build.gradle尾部即可
tasks.whenTaskAdded { task ->
println(">>>"+task.name)
}
复制代码
这样就可以把所有你的项目里参与gradle构建的任务的名字都打出来,你一定可以找到那个task,一般来说这个task名字叫做“mergeDebugNativeLibs”或者merge“Flavor”DebugNativeLibs等形式。
当然这个名字也可以不精确的方式拿到,比如task.name.contains(NativeLibs)
二、根据这个名字把so库的来源打印出来
以下代码粘贴到app的build.gradle尾部即可
tasks.whenTaskAdded { task ->
if (task.name == 'mergeDebugNativeLibs') {
task.doFirst {
println("------------------- find so files start -------------------")
it.inputs.files.each { file ->
printDir(new File(file.absolutePath))
}
println("------------------- find so files end -------------------")
}
}
}
def printDir(File file) {
if (file != null) {
if (file.isDirectory()) {
file.listFiles().each {
printDir(it)
}
} else if (file.absolutePath.endsWith(".so")) {
println "find so file: $file.absolutePath"
}
}
}
复制代码
三、分析来源
经过上面的操作,项目里用到的so库的来源都会被打印出来,他们一般位于gradle的缓存里,往往还带着AndroidManifest、jar包等等,通过打开以上这些东西,获得包名,类名等信息,可以帮你定位这个so库属于哪个第三方。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END