我使用以下Gradle脚本在编译时对AndroidManifest.xml进行一些修改.在这个例子中,我想注入一个元素.代码基于这个答案.
android {
// ...
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.processManifest.doLast {
def manifestOutFile = output.processManifest.manifestOutputFile
def newFileContents = manifestOutFile.getText('UTF-8').replace("", "")
manifestOutFile.write(newFileContents, 'UTF-8')
}
}
}
}
当我在Android Studio中执行Gradle同步或从命令行进行干净构建时,这可以正常工作:可以从应用程序中访问元数据.
但是当我从Android Studio运行▶应用程序时,修改后的清单似乎被忽略了,因为插入的元数据不是APK中编译清单的一部分,而且应用程序本身也无法在运行时找到它,元数据根本就不存在.
在所有的情况下,合并后的中间AndroidManifest.xml中(在/构建/中间体/舱单/)不包含的变化,但由于某种原因它看起来像它,如果我运行的应用程序被忽略.
为了使它更加明显,我尝试插入一些无效的XML:在这种情况下,由于清单中的语法错误,Gradle同步和干净构建按预期失败.但我仍然可以从Android Studio运行该应用程序,因此有效地修改了修改.
重现这一点的最简单方法是首先清理项目(在Android Studio中),这会导致清单被重新处理(如果出现语法错误,我会按预期失败),然后运行应用程序,即使使用无效的清单.
请注意,doLast每次都会执行println()任务:打印任务中的A ,中间清单包含更改.
就好像在我的任务执行之前将清单编译到APK中一样.
这里的问题在哪里?
我正在使用Android Studio 2.0和Android Gradle Plugin 2.0.0.