我正在做一个项目,其中我们有几个模块,每个模块都有许多对其他模块的依赖,依此类推。一段时间前,我们将项目迁移到了Gradle (也改变了结构以适应Gradle的默认设置),因为在构建不同版本的应用程序时,我们需要多功能性:免费与付费、调试(无proguard)与发布(proguard)等等。当我们完成迁移时,我们真的很兴奋,但当构建时间开始变得痛苦时,这种快乐很快就被冲淡了。在代码中做一个相当简单的更改并在手机上部署应用程序需要90-120秒,这是完全不能接受的。
因此,我们决定尝试一下Buck,因为我们从其他开发人员那里听到的都是好话。只用了很短的时间(比Gradle少得多),我们就成功地构建了我们的应用程序(不幸的是,这并不意味着“正确生成APK”,但至少它已经构建好了)。问题是,作为一般规则,我们每种口味都有一个清单文件,除非我忽略了一些基本的东西,否则Buck只允许您在使用规则android_binary
时指定清单文件。这样做的结果是,生成的APK清单文件只包含Gradle构建链开始的第一级模块的样板代码:
main -> debug -> free/paid -> common
也就是说,清单文件只包含main的清单。此规则位于顶级BUCK文件中,该文件包含在.buckconfig中指定的别名。
我很确定我做错了什么。Buck不允许你没有多个清单是没有道理的。
有什么想法吗?
发布于 2018-06-18 01:53:05
在buck中,清单合并永远不会覆盖清单标签中的任何内容。这包括包属性、可调试属性等。
android_binary中的manifest_entries有一个没有文档记录的特性,但这就是OKBuck构建风格的方式。在打包清单之前,将用AndroidManifest.xml中的任何表达式替换manifest_entries中的任何占位符
因此,如果您的清单标记看起来像这样:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package = "com.whatever${flavor}"
android:debuggable = "${debuggable}"
>
android_binary中的manifest_entries如下所示:
manifest_entries = {
'placeholders': {
'flavor': '.test',
'debuggable': 'true',
},
},
生成的清单将如下所示:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package = "com.whatever.test"
android:debuggable = "true"
>
然后,您可以使用字典操作和flatten_dicts()构建manifest_entries占位符
https://stackoverflow.com/questions/26339100
复制相似问题