【Gradle实战】利用Gradle查找项目里的so库来源

背景

最近国内各大应用市场集体要求开发者提供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
喜欢就支持一下吧
点赞0 分享