将一下脚本放置于对应application的build.gradle文件中
import java.util.zip.ZipFile
import java.util.zip.ZipEntry
import org.gradle.api.artifacts.transform.TransformParameters
// 自定义 TransformAction,用于从 AAR 文件中提取 .so 文件
abstract class ExtractSoFiles implements TransformAction<TransformParameters.None> {
// 输入 AAR 文件
@InputArtifact
abstract Provider<FileSystemLocation> getInputArtifact()
// 转换方法,从 AAR 文件中提取 .so 文件
@Override
void transform(TransformOutputs outputs) {
// 创建输出目录
def outputDir = outputs.dir("libs")
// 获取输入 AAR 文件
File inputAar = getInputArtifact().get().asFile
// 使用 ZipFile 读取 AAR 文件
ZipFile zipFile = new ZipFile(inputAar)
// 遍历 AAR 文件中的所有条目
zipFile.entries().each { ZipEntry entry ->
// 如果条目是一个 .so 文件
if (entry.name.endsWith(".so")) {
// 创建输出文件
File outputFile = new File(outputDir, entry.name)
// 确保输出文件的父目录存在
outputFile.parentFile.mkdirs()
// 将 .so 文件内容写入输出文件
outputFile.withOutputStream { outputStream ->
zipFile.getInputStream(entry).withStream { inputStream ->
inputStream.bytes.each { byte[] buffer ->
outputStream.write(buffer)
}
}
}
}
}
}
}
// 定义 artifactType 属性
def artifactType = Attribute.of('artifactType', String)
// 注册自定义的 ExtractSoFiles 转换
dependencies {
registerTransform(ExtractSoFiles) {
from.attribute(artifactType, 'aar')
to.attribute(artifactType, 'so-directory')
}
}
// 为每个应用变体创建一个任务,用于打印所有 .so 文件及其来源库
android.applicationVariants.all { variant ->
task("print${variant.name.capitalize()}NativeLibs") {
doLast {
// 获取变体的运行时配置
def configuration = variant.runtimeConfiguration
// 创建一个包含所有 .so 文件的 artifactView
configuration.incoming.artifactView {
attributes { it.attribute(artifactType, 'so-directory') }
}.artifacts.each { artifact ->
// 遍历所有 .so 文件
project.fileTree(artifact.file).matching {
include '**/*.so'
}.each { file ->
// 打印 .so 文件及其来源库
println "Library: ${artifact.id.componentIdentifier.displayName}"
println "File: ${file}"
println "-----------------------------------"
}
}
}
}
}
然后再命令行中执行 ./gradlew printDebugNativeLibs即可看到结果