Android官方技术文档翻译——Apk 拆分机制
16lz
2021-01-24
本文译自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
当在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中匹配的
请注意这也总是会生成包含所有屏幕密度的通用的 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
- 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。
更多相关文章
- android中dip、dp、px、sp和屏幕密度
- Android(安卓)视觉规范
- Android(安卓)webview加载富文本 屏幕简单适配
- 使用ccache机制加快Android重新编译速度
- Android消息机制2-Handler(Native层)
- 【Android】 触摸事件分发机制
- 面试篇--android下网络通讯机制(三种网络通讯方式)
- android 事件分发机制源码解析
- android之全屏沉浸模式(强制屏幕为全面屏)