您的位置:首页 > 移动开发 > Android开发

Android官方技术文档翻译——Apk 拆分机制

2014-12-03 09:02 471 查看
本文译自androd官方技术文档《Apk Splits》,原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits。

本文地址:http://blog.csdn.net/maosidiaoxian/article/details/41692535。转载请注明出处。翻译如有错讹,敬请指正。


Apk Splits

目录

1简介

2按屏幕密度拆分

3按 ABI 拆分

4 Variant
API &Version Code 支持

简介

拆分机制比起使用 flavors,能让应用程序更有效地构建一些形式的多个apk。
多 apk 只支持以下类型

屏幕密度
ABI

使用新的拆分机制,构建同一个应用程序的hdpi版本和mdpi版本,能够共享很多的任务 (如 javac,dx,proguard)。此外,它会被认为是一个单一的variant,并且同一个测试程序将会被用来测试每​​个多APK。

当在variant 上运行install或connectedCheck 任务时,Gradle 会自动匹配把正确的 APK 输出到每一个连接的设备中。

如果你也想做另一种类型的多 APK (这里有定义: http://developer.android.com/google/play/publishing/multiple-apks.html) 你也可以创建 Flavors (基于 API 级别的多apk的实例),并且每个variant都会有它自己的多个输出。

按屏幕密度拆分

android {
...
splits {
density {
enable true
exclude "ldpi", "tvdpi", "xxxhdpi"
compatibleScreens 'small', 'normal', 'large', 'xlarge'
}
}

enable: 启用屏幕密度拆分机制
exclude: 默认情况下所有屏幕密度都包括在内,你可以移除一些密度。
include: 表示要包括哪些屏幕密度
reset(): 重置屏幕密度列表为只包含一个空字符串 (这能够实现,在与include一起使用时可以表示使用哪一个屏幕密度,而不是要忽略哪一些屏幕密度)
compatibleScreens:表示兼容屏幕的列表。这将会注入到manifest中匹配的 <compatible-screens> <screen> 节点。这个设置是可选的。

请注意这也总是会生成包含所有屏幕密度的通用的 APK。

示例: densitySplit

按 ABI 拆分

android {
...
splits {
abi {
enable true
reset()
include 'x86', 'armeabi-v7a', 'mips'
universalApk true
}
}
}

enable: 启用ABI拆分机制
exclude: 默认情况下所有ABI都包括在内,你可以移除一些ABI。
include:指明要包含哪些ABI
reset():重置ABI列表为只包含一个空字符串(这可以实现,在与include一起使用来可以表示要使用哪一个ABI,而不是要忽略哪一些ABI)
universalApk:指示是否打包一个通用版本(包含所有的ABI)。默认值为 false。

示例: ndkSanAngeles

Variant API &Version Code 支持

关于过时的API的警告: 当前的variant API 中所包含的一些方法,已经被移到它的outputs对象里。该方法仍然存在,但如果有2个以上的output将会构建失败。它们将在1.0版本完全删除
它们是:

get/setOutputFile
getProcessResources
getProcessManifest
getPackageApplication/Library
getZipAlign

在 VariantOutput 上新增的方法

String getAbiFilter()
String getDensityFilter()
Task getAssemble()
String getName()
String getBaseName()
String getDirName
set/getVersionOverride // 可选的 versionCode 重写
int getVersionCode()//返回从output重写的versionCode,或者是variant自己的versioncode

每个生成的 APK 必须具有不同的 versionCode。类似于遍历variants去设置 versionCode,你可以在遍历 variant 的outputs,并设置它的 versionCodeOverride。

// map for the version code
ext.versionCodes = ['armeabi-v7a':1, mips:2, x86:3]

import com.android.build.OutputFile

android.applicationVariants.all { variant ->
// assign different version code for each output
variant.outputs.each { output ->
output.versionCodeOverride =
project.ext.versionCodes.get(output.getFilter(OutputFile.ABI)) * 1000000 + android.defaultConfig.versionCode
}
}

如果你 flavors 和 splits两个都用了,用于输出多apk,你还是应该使用 VariantOutput.setVersionCodeOverride(int),但你应该计算split信息(densityFilter 和abiFilter)
和variant 信息里的versionCode。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: