Android官方技術文檔翻譯——Apk 拆分機制,androidapk
本文譯自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 只支援以下類型
使用新的拆分機制,構建同一個應用程式的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(): 重設螢幕密度列表為只包含一個Null 字元串 (這能夠實現,在與
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列表為只包含一個Null 字元串(這可以實現,在與
include一起使用來可以表示要使用哪一個ABI,而不是要忽略哪一些ABI)
universalApk:指示是否打包一個通用版本(包含所有的ABI)。預設值為 false。
樣本: ndkSanAngelesVariant 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 codeext.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。