程序员人生 网站导航

Android官方技术文档翻译――新构建系统概述

栏目:综合技术时间:2015-03-11 08:05:22

本文译自Android官方技术文档《New Build System》,原文地址:http://tools.android.com/tech-docs/new-build-system。

这篇文章从去年就开始翻译的了,无奈项目较赶我翻译的速度又慢,翻译期间Google官网又对它不断更新,以致拖到了现在。这1篇文档是对Android新构建系统的概述,列出了与它相干的1些文档,和这个新构建系统的各版本更新日志。这个新的构建系统,其实也就是这个Gradle 上的 Android 插件,如果你的Android Studio项目由于这个插件的版本更新致使没法构建,参阅本篇文档可能会有帮助。

翻译不容易,转载请注明CSDN博客上的出处:

http://blog.csdn.net/maosidiaoxian/article/details/44077737

翻译工作耗时费神,如果你觉得本文翻译得还OK,请点击文末的“顶”支持我;如有错讹,敬请指正。谢谢。


新构建系统

我们正在研究新的编译系统,以取代里面 ADT 里的构建系统和 Ant。
(译者注:有关下面列出的文章的译文可以参见我的专栏:http://blog.csdn.net/column/details/android-tech-transla.html)
  • Gradle 插件用户指南
    • 清单合并(于0.10 中新增)。
    • Apk Splits (new in 0.13)
    • 提示
  • 技术文档
    • aar 格式
    • Resources/Assets 合并机制
    • 从 Eclipse Projects 或 IntelliJ Projects 进行迁移
    • 从旧的 Gradle 项目迁移到 1.0.0 版本
    • 构建工作流
    • 与 Android Studio 的版本兼容
    • ApplicationId 与 PackageName
    • 资源缩减(自动清除没有用到的资源)

2013谷歌 I/O 大会: 新的 Android SDK 构建系统

示例均在页底。

发布说明:

1.1.2 (2015/02/26)
  • 当创建用于单元测试的可摹拟的(mockable) jar 包时路径会统1化处理。
  • 修复了 build.gradle 中的“archivesBaseName”设置被疏忽的问题。
  • 当构建类库的测试利用程序时清单合并工具会有的未处理占位符失败。
1.1.1 (2015/02/24)
  • 现在只有包括了1个Wear 利用程序的变种版本才会触发构建它们。
  • 如果有依赖相干的问题现在将会在构建时期就失败而不是等到调试时期才失败。这将允许运行诊断性的任务 (比如“dependencies”)来帮助解决冲突。
  • 现在又可以调用 android.getBootClasspath() 方法了。
1.1.0 (2015/02/17)
  • 单元测试的支持。单元测试代码运行在在本地 JVM 上,它针对着与经常使用的 mocking 框架 (如 Mockito)相兼容的的专用版本的 android.jar。
    • 新的任务: test,testDebug/testRelease,testMyFlavorDebug (如果使用了 flavors)。
    • 能被辨认为单元测试的新源文件夹:
      src/test/java,src/testDebug/java, src/testMyFlavor/java 等等。
    • 用于添加 test-only 依赖项的新配置,例如 
      testCompile 'junit:junit:4.11' 
      testMyFlavorCompile ' some:library:1.0'
    • 暂时不兼容 Jack 编译器 。
    • 新的选项,用于控制“mockable”android.jar 行动的 android.testOptions.unitTests.returnDefaultValues。
  • 在过去名称中包括了“Test”的任务,现在使用“AndroidTest”,比如“assembleDebugTest”改成“assembleDebugAndroidTest”这是为了把它们从单元测试任务中辨别出来,例如 “assembleDebugUnitTest”。
  • 混淆配置文件不再利用于测试 APK。如果启用了紧缩(译者注:应当是minifyEnable设为true),紧缩主APK 时会生成1个映照文件,测试 APK 将只有在利用这个映照文件时才会被混淆器处理。
  • 依赖管理的问题修复及更改:
    • 正确地处理了“provided”和“package” 的作用范围,以做它们应当做的。
    • “provided”和“package” 不能用于 Android Libraries项目,否则将生成毛病
    • 同步测试和测试依赖树:
      • 如果同1个版本的构件在测试项目本身及测试项目的依赖树中都有,那末它会在测试利用程序中跳过
      • 如果这个构件的版本不同,那末将会生成1个构建毛病。Gradle 提供了机制来解决这个问题。
  • 增加在资源合并工具中对任意Dpi资源的限定符的支持。
  • 有大量 Android 模块的项目将会发现项目评估与 IDE 同步的速度有了提升(各人的情况可能会有不同)

1.0.1 (2014/1/9)
  • 修复81638 : 修复 PermGen 在运行 extractAnnotations 时的问题。
  • 修复当导入targetSdkVersion < 16 的库项目时的1个小的清单合并问题
  • 修复当运行在JD8时的屏幕密度顺序问题。
  • 修复82662:禁用传入参数 --no-optimize 到 dx。

1.0.0-rc4 (2014/12/04)
  • 处理在对启用了 multidex 的库项目进行测试时本地jar包的问题
  • 修复路径只有1个字长时的路径正常化问题(用于解紧缩 aars)
  • 通过dexOptions.javaMaxHeapSize 修复 Jack和Jill 两个编译器的内存设置。
1.0.0-rc3 (2014/12/03)
  • 对未解压 AAR包的目标路径基于包括了无效字符的 groupId/artifactId/version 的情况,能够更好地处理。
1.0.0-rc2 (2014/12/03)
  • 通过指定类库的协作,增强清单合并的日志。
  • 清单占位符可以是任何类型,只要这个类型实现了 tostring() 方法。
  • 修正了1个问题:1个 targetSdk 较低的库会由于1个声明的权限,而在不同的清单中都添加权限。
  • 更好地修正能够在嵌入1个微型利用程序时在main 利用程序清单添加新的权限的问题。
  • 添加对密度分割(density splits)和resConfig 属性的冲突的检查。
  • 测试利用程序现在不会使用multi-dexing,除非它们是在测试1个类库项目。
  • 修复1些 lint 的问题:80872,80834,60416,80837
1.0.0-rc1 (2014/11/24)
(好吧,这是真实的 RC1版本)
  • 修复资源缩减(resources shrinking)的问题
  • 修复在 publishNonDefault 中的问题
  • 运行在版本为 21以上的装备的安装任务现在重新安装1遍。
  • 使用 aapt 21以上版本的密度拆分,现在使用 --preferred-density 将允许1些位图的密度版本缺失。
  • hasProperty() 现在在由variant API 返回的只读的wrapper上又能正常使用了。
  • 现在在类库项目中设置 applicationId(Suffix) 将会直接报错。
  • 修复在嵌入1个微型的利用程序时可以在其中main app的清单中添加新权限的问题。
0.14.4 (2014/11/19)
  • 这应当被视为 1.0-RC 版本 (可以这么说,见前文)
  • 修正 proguardFiles DSL 的问题。
  • 固定Studio 0.9.x 的兼容性问题
  • 兼容 Gradle 2.1, 2.2 和 2.2.1
0.14.3 (2014/11/18)
  • Variant 特定的 BuildConfigField 或 resValue
applicationVariants.all { variant ->
    variant.buildConfigField "int", "VALUE", "1"
    variant.resValue "string", "name", "value"
}
  • Variant (和 multi-flavor)独有的依赖配置
    multi-flavor 是除Build Type以外的所有的flavors。只在有两个以上的flavor时才存在。
    当前限制:需要先手动定义配置(运行 dependencies任务可以看到名称)
configurations {
    fooDebugCompile
}

android {
    productFlavors {
        foo { ... }
    }
}

dependencies {
    fooDebugCompile '...'
}

  • 用于嵌入穿着装备app 的 BuildType/Flavor/Variant 配置(<name>WearApp
  • 升级到 Proguard 5.1
  • 行将到 1.0 版本:移除的过时的属性和方法
    • BuildConfig.PACKAGE_NAME (使用新的字段名称)
    • android.flavorGroups (使用新属性名称)
    • ProductFlavor.packageName/flavorGroup/testPackageName/renderscriptSupportMode (使用新属性名称)
    • BuildType.runProguard/packageNameSuffix/jniDebugBuild/renderscriptDebugBuild/zipAlign (使用新的属性名称)
    • Variant.packageApplication/zipAlign/createZipAlignTask/outputFile/processResources/processManifest (使用 variant output)
0.14.2 (2014/11/10)
  • 修复multi-dex 的潜伏问题:在打包期间,dex 文件可以被重命名,从而致使正在使用的main dex 文件毛病。
  • 修复 versionNameSuffix 支持
  • 修复 BuildType.initWith,使它能够复制 shrinkResources 的标志
  • 如果没有提供混淆规则文件,则设置默许的混淆规则文件(SDK/tools/proguard/proguard-android.txt)
  • 用于在apk中包括假的地域的BuildType.pseudoLocalesEnabled标记。

0.14.1 (2014/11/03)
  • 修复覆盖支持。
  • 修复样式(style)援用的资源缩减
  • 从资源缩减中排除嵌入的 Wear micro-app。

0.14.0 (2014/10/31)
  • 需要 Studio 0.9
  • 代码混淆和代码覆盖率现在可以1起使用
  • 支付从 Android 5.0 的装备中拉取覆盖率数据
  • 环境变量 ANDROID_SERIAL (如果存在) 会限制对序列号匹配的装备的测试的安装或履行
  • Multi-Dex 多持。
    • 需要Build Tools 21.1.0,并且支持库(Support repository)版本为8。
    • 在 defaultConfig,ProductFlavor 或 BuildType上multiDexEnabled = true
    • 支持 minSdkVersion 21+ (原生) 或 <21 (延伸模式,通过 com.android.support:multidex:1.0.0 上的自动依赖)
    • 请参阅multiDex示例。
  • 支持自动删除未使用的资源
    • 目前默许情况下它是关闭的,可以通过在你的发布构建类型(release build types)中设置 shrinkResources 为 true进行启用。它需要 minifyEnabled 也设置为true。
  • DSL 和 API 的变化:
    • 重命名几个属性,以使这些属性更统1。
      • BuildType.runProguard                 ->  minifyEnabled
      • BuildType.zipAlign                    -> zipAlignEnabled
      • BuildType.jniDebugBuild               -> jniDebuggable
      • BuildType.renderscriptDebug           -> renderscriptDebuggable
      • ProductFlavor.renderscriptSupportMode -> renderscriptSupportModeEnabled
      • ProductFlavor.renderscriptNdkMode     -> renderscriptNdkModeEnabled
    • 通过 variant 和 variantFilter API 所查询到的 BuildType/ProductFlavor/SigningConfig 现在都是只读的。
      • 这些对象1直是全局对象,并且改变它们将会在其它的变种(variants)产生副作用
      • 合并后的定制版本(flavor)依然是独立的变种版本(per-variant),且可以被修改
    • Variant 及 VariantOutput API 的变化
      • 获得密度(density)或 ABI 挑选器的值现在可以通过 
        output.getFilter(com.android.build.OutputFile.DENSITY) 
        output.getFilter(com.android.build.OutputFile.ABI) 
        来实现
      • 请参阅densitySplit示例


0.13.3 (2014/10/06)
  • 通过使用tools:overrideLibrary,支持有选择性地允许1些库的依赖可以有不兼容的uses-sdk。http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-tools:overrideLibrary-marker
  • 修复lint 资源文件夹缓存的资源竞争可能会致使构建失败的问题
0.13.2 (2014/09/26)
  • 修复了清单合并工具的问题,这个问题可能会把毛病的uses-sdk 节点放到清单中。
0.13.1 (2014/09/22)
  • 增加从测试中合并 Instrumentation 元素的功能
  • 修复 uninstallAll 任务的问题
  • 修复毛病的配置可能会致使变种版本没有输出,并因此影响项目评估的问题。
  • connectedCheck 任务现在会在没有发现测试时返回失败的结果。
0.13.0 (2014/09/18)
  • 需要 Gradle 2.1
  • 现在可以提供1个清单(src/androidTest/AndroidManifest.xml) 用于测试的利用程序啦
  • Library 项目里的AndroidManifest 文件现在可以包括占位符。如果它们不能在库项目中被处理,它们将会在使用这个库的项目(原文为consuming project)中被处理。
  • AndroidManifest 占位符现在可以在Product Flavors 和 Build Types上设置。
  • Variant.getMappingFile() API 现在允许查询混淆映照文件。
  • 用于由Density 和 ABI 而产生的多APK的新分割机制。文档见这里。
  • Bug 修复:
    • 修复被使用的混淆文件(原文为consumer proguard file)(来自 aar 文件)会在第1次构建时被疏忽的问题。
    • 修复 aar 输出名称的问题,现在变种版本(variants)不会再相互改写这个名称
    • 正确合并 declare-styleable,以包括所有的 attrs。
    • 修复在资源合并进程中资源字符串的空格问题。

0.12.2 (2014/07/16)
  • 修复穿着利用程序的打包问题
  • 修复 build.gradle 中 ${applicationId} 占位符不起作用的问题。
  • 自定义 Java 代码生成的步骤现在是源代码生成步骤的1部份 (修复 IDE 集成)。
  • 为解决可能存在资源竞争的情况,把未解压的aar 移回每一个项目里面作为临时的解决方法。
0.12.1 (2014/07/01)
  • 修复在清单中合并的package属性的问题。
0.12.0 (2014/06/25)
  • 新的 IDE 模型,需要Studio Beta 0.8
  • 修复清单合并里的问题。
0.11.1
  • 修复当构件(artifact) 依赖于Maven中央仓上的android.jar 构件时的问题。
  • 修复在生成的清单中自定义的命名空间声明丢失的问题。
  • 修复在清单合并工具中权限组验证的问题。

0.11.0
  • 更新 IDE 模型,需要Studio 0.6
  • 支持 Gradle 1.10,1.11,1.12。
  • 新的清单合并工具现在作为默许的合并工具。
    • 大量的问题修复。
    • 新增能够在flavor对象上添加用于清单文件的自定义占位符
      defaultConfig {
      manifestPlaceholders = [activityName:"defaultName"] 
      }
  • 将文件及文件夹移到构建目录(buildDir)中以便更好地进行IDE集成。
  • 现在可以发布生成的 APK。发布的配置和库1样,使用 defaultPublishConfig 和 publishNonDefault 标志。
  • API及DSL 上的重大更改:
    • ProductFlavor.packageName 现在是 applicationIdpackageName 的setters 暂时仍保存,但会在 1.0版本时移除
    • ProductFlavor.testPackageName 现在是 testApplicationId。 testPackageName 的setters暂时仍保存,但会在1.0版本时移除
    • ProductFlavor 上的 minSdkVersion/targetSdkVersion 现在是1个ApiVersion 实例,而不再是1个整数。
      • DSL 的影响
        • 不能在 DSL 中使用setter,请使用方法来代替。基本上,不要使用“=”
          flavor {minSdkVersion = 9 }
          替换为:
          flavor { minSdkVersion 9 }
        • 这是由于 groovy 的限制,避免过量的setters。
      • interface ApiVersion {
            int getApiLevel();
            int getCodename();
        }

0.10.4
  • 修复清单合并的 bug(包括 application 节点在生成的清单中的正确位置)
  • 修复在库项目中的产品定制(flavors)如果使用不同的饭锅,将没法正确地生成 R 类的问题。
  • 修复有关 XML 文件解码时解析UTF8的BOM 的问题。
  • Lint 问题修复。
0.10.3
  • 由于推送期间的1个问题,没有发布该版本。
0.10.2
  • 更多关于清单合并的问题修复,包括更好地处理 minSdkVersion。
  • 更多的lint 问题修复。
  • 修复增量编译dex 的支持(依然需要被启用)
0.10.1
  • 修复关于新清单合并工具的几个问题。欢迎继续向我们反馈问题。
  • 修复卸载任务的问题。
  • 大量的 lint 修复及新的检查。例如,你可以在你的库中使用lint 强迫让资源有前缀。
0.10.0
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐