Buck - 使用多个Gradle风格/构建类型和清单文件构建Android应用程序

4
我正在处理一个项目,其中有多个模块,每个模块都依赖于其他模块,以此类推。我们不久前将项目迁移到Gradle上(并更改了结构以适应Gradle的默认值),因为我们需要在构建不同版本的应用程序时具有灵活性:免费版与付费版、调试版(无proguard)与发行版(proguard)等。完成迁移后,我们非常兴奋,但当构建时间开始变得痛苦时,这种快乐很快就被淡化了。简单更改代码并在手机上部署应用程序需要花费90-120秒左右,这是完全不能接受的。

所以我们决定尝试Buck,因为我们听到其他开发者对它的评价都很好。经过很短的时间(比使用Gradle少得多),我们成功地构建了我们的应用程序(不幸的是,这并不意味着“正确生成APK”,但至少已经构建)。问题在于,通常情况下,每种风味都有一个清单文件,除非我忽略了某些基本内容,否则只有在使用规则android_binary时Buck才能让您指定清单文件。其结果是生成的APK清单文件仅包含Gradle构建链开始的第一级模块的样板代码。

main -> debug -> free/paid -> common

也就是说,清单文件只包含主清单。此规则位于顶级BUCK文件中,该文件包含在.buckconfig中指定的别名。
我相信我做错了什么。Buck 不允许没有多个清单,这是没有道理的。
有什么想法吗?
2个回答

3

Francis Toth (https://stackoverflow.com/users/1873643/francis-toth) 在Buck讨论组中提供了一个非常全面的解释:

只是为了给您提供上下文,我的应用程序由不同的库模块组成,每个模块都有一个Android-Manifest、一些资源、资产等,以及一个BUCK文件,其外观几乎如下所示:

android_library(
  name = 'src',
  srcs = glob(['src/main/java/**/*.java']),
  deps = DEPENDENCIES + [':res'],
  visibility = [ 'PUBLIC' ],
  exported_deps = DEPENDENCIES
)

android_resource(
  name = 'manifest',
  manifest = 'src/main/AndroidManifest.xml',
  deps = ['//othermodule:manifest'],
  visibility = [ 'PUBLIC' ],
)

android_resource(
  name = 'assets',
  assets = 'src/main/assets',
  visibility = [ 'PUBLIC' ],
)

android_resource(
  name = 'res',
  res = 'src/main/res',
  package = 'com.sherpa.android',
  visibility = [ 'PUBLIC' ],
)

project_config(
  src_target = ':src',
  src_roots = ['src/main/java']
)

我的应用BUCK文件长这样:
android_binary (
  name = 'bin',
  manifest = ':manifest', # Here I make a reference on the android_manifest build rule described below
  target = 'Google Inc.:Google APIs:19',
  keystore = ':debug_keystore',
  deps = BINARY_DEPENDENCIES
)

MANIFEST_DEPENDENCIES = ['//module1:manifest', '//module2:manifest']
android_manifest (
  name = 'manifest',
  skeleton = 'AndroidManifest.xml', # The app's base manifest
  deps = MANIFEST_DEPENDENCIES # App's manifest will be merged with all its dependencies (module1 and module2's manifest)
)

您的问题,据我了解,似乎非常相似。为了合并清单,您必须创建一个android_resource构建规则,告诉它您的模块库在哪里以及需要与其合并的清单文件位置。
这解决了我的问题 :-)

0
在Buck中,清单合并永远不会覆盖清单标记中的任何内容。这包括软件包属性、debuggable属性等。
Android_binary中具有manifest_entries功能,它没有被文档记录,但它是OKBuck构建风格的一种方式。在打包清单之前,manifest_entries中的任何占位符都将替换为AndroidManifest.xml中的任何表达式。
因此,如果您的清单标记看起来像这样:
<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占位符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接