输出项目中,引用的so包是来自哪个aar

431 阅读1分钟

将一下脚本放置于对应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即可看到结果