本文译自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. 1简介
  2. 2按屏幕密度拆分
  3. 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中匹配的 节点。这个设置是可选的。
请注意这也总是会生成包含所有屏幕密度的通用的 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。

更多相关文章

  1. android中dip、dp、px、sp和屏幕密度
  2. Android(安卓)视觉规范
  3. Android(安卓)webview加载富文本 屏幕简单适配
  4. 使用ccache机制加快Android重新编译速度
  5. Android消息机制2-Handler(Native层)
  6. 【Android】 触摸事件分发机制
  7. 面试篇--android下网络通讯机制(三种网络通讯方式)
  8. android 事件分发机制源码解析
  9. android之全屏沉浸模式(强制屏幕为全面屏)

随机推荐

  1. android webview处理下载内容
  2. 转 :android gmail 添加附件
  3. Android(安卓)Handler学习笔记
  4. android 在程序中开启GPS功能
  5. Activity背景全透明
  6. android之PopUpWindow显示Listview(文件列
  7. Android:短信发送器
  8. android QRCode
  9. Android的版本(Version)和API-level的对应
  10. android 加载已经安装的apk方式