有一点背景知识,我有一个名为“ prebuilt”的自定义android构建类型,旨在将其部署到android系统映像中。我需要自定义gradle任务来修改资产和jniLibs文件夹,以便它们与apk分开交付(例如,my-app-prebuilt.apk,my-app-prebuilt-assets.zip,my-app-rebuilt-libs。压缩)。我不想为正常部署修改调试或发布buildType。
一旦偶然发现正确的任务mergeAssets
进行修改,剥离资产的步骤就相当容易了
buildTypes {
applicationVariants.all { variant ->
if (variant.buildType.name == 'prebuilt') {
variant.mergeAssets.doLast {
// Delete from prebuilt build type. It will be delivered in parallel.
delete(fileTree(dir: variant.mergeAssets.outputDir, includes: ['**/somestuff/*']))
}
// I want mergeJniLibFolders but this doesn't seem to exist?
variant.mergeJniLibFolders.doLast {
delete(fileTree(dir: variant.mergeJniLibs.outputDir, includes: ['**/*.so']))
}
}
}
mergeJniLibFolders属性出现错误:
无法获取类型为com.android.build.gradle.internal.api.ApplicationVariantImpl的对象的未知属性'mergeJniLibFolders'。
我期望mergeJniLibFolders
或mergePrebuiltJniLibFolders
可以被修改以执行删除库的第二步。我开始通过gradle ApplicationVariantImpl感到不满意。
此外,还需要variant
对象才能知道outputDir。一段时间以来,我一直在考虑可以制作一个task stripPrebuiltAssets << { dependsOn: mergePrebuiltMergeAssets, ...}
,但是我没有变体对象。这也让我感到困惑。
我在黑暗中摸索,对使用Android Plugin DSL可以做什么没有很好的认识。我已经通读了几次参考书,并对AppExtension和可以修改的属性有相当的了解,但是这如何转化为Gradle树中的一百个任务呢?我似乎缺少资源以更好地理解这一点。
我的Android Studio糟糕的Gradle自动完成功能也令人沮丧。似乎只有我已经使用过的情况下,它才能确定一个自动完成选项。我正在使用
奖金问题是将我要在两个规则中剥离的资产和jniLib压缩在一起,以便与my-app-prebuilt.apk
一起使用。我大致了解我需要一个Zip类型的任务,该任务将压缩文件夹/build/intermediates/transforms/mergeJniLibs/prebuilt/0/lib/
,然后删除该文件夹。我也希望variant.mergeJniLibs.outputDir
存在,但这似乎也没有。
为任何见识加油。