构建类型

最后更新于:2022-04-01 02:24:59

# 构建类型 默认情况下,Android Plugin 会自动给项目构建 debug 和 release 版本。两个版本的区别在于能否在安全设备上调试,以及 APK 如何签名。 debug 版采用通用的 `name/password` 对来自动创建的密钥证书进行签名(为了防止在构建过程中出现认证请求)。release 版在构建过程中不进行签名,需要稍后再进行签名。 这些配置是通过 **BuildType** 对象来完成的。默认情况下,两个实例都会被创建,分别是 **debug** 和 **release** Android plugin 允许像创建其他*构建类型*一样定制这两个实例。可以在 **buildTypes** 的 DSL 容器中完成: ~~~ android { buildTypes { debug { applicationIdSuffix ".debug" } jnidebug.initWith(buildTypes.debug) jnidebug { packageNameSuffix ".jnidebug" jnidebugBuild true } } } ~~~ 上面的代码片段实现了以下功能: - 配置默认的 **debug** 构建类型: - 设置包名为`<app appliationId>`.debug,以便能够在同一个设备上安装 *debug* 和 *release* 版的 apk - 创建了名为 **jnidebug** 的新 *BuildType*,并且用 **debug** 构建类型的默认配置来初始化自身。 - 继续配置 **jnidebug**,可以构建 JNI 组件,并添加了不一样的包名后缀。 创建一个*新的构建类型*就是简单的在 **buildTypes** 标签下添加一个新的元素,并且通过调用 **initWith()** 或者直接使用闭包来配置它。 以下是一些可能使用到的属性和默认值: | 属性名 | debug 类型的默认值 | release 或其他类型默认值 | |-----|-----|-----| | **debuggable** | true | false | | **jniDebugBuild** | false | false | | **renderscriptDebugBuild** | false | false | | **renderscriptOptimLevel** | 3 | 3 | | **applicationIdSuffix** | null | null | | **versionNameSuffix** | null | null | | **signingConfig** | android.signingConfigs.debug | null | | **zipAlign** | false | true | | **runProguard** | false | false | | **proguardFile** | N/A (set only) | N/A (set only) | | **proguardFiles** | N/A (set only) | N/A (set only) | 除了以上属性外,*Build Types* 还会受项目源码和资源影响。 对于每一个 Build Type 都会自动创建一个匹配的 *sourceSet*。默认的路径为: ~~~ src/<buildtypename>/ ~~~ 这意味着 *BuildType* 名称不能是 *main* 或者 *androidTest*(因为这两个是由 plugin 强制实现的),并且他们都必须是唯一的。 跟其他 sourceSet 设置一样,Build Type 的 source set 路径也可以重新定向: ~~~ android { sourceSets.jnidebug.setRoot('foo/jnidebug') } ~~~ 另外,每一个 *Build Type* 都会创建一个新的 `assemble<BuildTypeName>` 任务。 **assembleDebug** 和 **assembleRelease** 在上面已经提到过,这里要讲的是它们从哪被创建。当 **debug** 和 **release** 构建类型被预创建的时候,它们的 tasks 就会自动创建。 上面提到的 *build.gradle* 代码片段中也会实现 **assembleJnidebug** task,并且 **assemble** 会像依赖于 **assembleDebug** 和 **assembleRelease** 一样依赖于 **assembleJnidebug**。 提示:你可以在终端下输入 `gradle aJ` 去运行 **assembleJnidebug** task。 可能会使用到的情况: - debug 模式下才用到的权限 - 自定义的 debug 实现 - 为 debug 模式使用不同的资源(例如,当资源的值由绑定的证书决定) *BuildType* 的代码和资源通过以下方式被使用: - manifest 将被混合进 app 的 manifest - 代码只是换了一个资源文件夹 - 资源将叠加到 main 的资源中,并替换已存在的资源。
';