Android 多渠道打包:使用Gradle和Android Studio
Gradle,這個東西好複雜,不過在Android中,我們知道它大概怎麼用,它的依據何來,就夠了。
build.gradle的基本形式
Android Studio 建立project,可在其下建立多個moudle。
一個project自動產生一個build.gradle,每個module下也自動產生一個build.gradle (本文主要討論module中的build.gradle構建)
module/build.gradle:
apply plugin: 'com.android.application' //啟用android 應用外掛程式android { compileSdkVersion 22 buildToolsVersion 22.0.1 defaultConfig { applicationId com.stone.testbuild minSdkVersion 8 targetSdkVersion 22 versionCode 1 versionName 1.0 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.0.0'}
Android-Gradle DSL 簡介上面樣本中的android{ },就是我們需要主瞭解的,在android{}塊中可以包含以下直接配置項:
defaultConfig{} 預設配置,是ProductFlavor類型。它共用給其他ProductFlavor使用
sourceSets{ } 源檔案目錄設定,是AndroidSourceSet類型。
buildTypes{ } BuildType類型
signingConfigs{ } 簽名配置,SigningConfig類型
productFlavors{ } 產品風格配置,ProductFlavor類型
testOptions{ } 測試組態,TestOptions類型
aaptOptions{ } aapt配置,AaptOptions類型
lintOptions{ } lint配置,LintOptions類型
dexOptions{ } dex配置,DexOptions類型
compileOptions{ } 編譯配置,CompileOptions類型
packagingOptions{ } PackagingOptions類型
jacoco{ } JacocoExtension類型。 用於設定 jacoco版本
splits{ } Splits類型。在DSL文檔中,以上每個類型都有它的詳細配置選項
多渠道打包自動簽名、混淆、打包、注入多個渠道。
例,module>build.gradle:
apply plugin: 'com.android.application'/*定義一個方法,僅def聲明時,傳回型別任意(自動判斷) 可以將傳回值直接寫成String 或def Stringgradle支援groovy語言,groovy預設引入的包有: java.io.* java.lang.* java.math.BigDecimal java.math.BigInteger java.net.* java.util.* groovy.lang.* groovy.util.* */def String computeVersionName() { return 8.8.8}android { compileSdkVersion 22 buildToolsVersion 22.0.1 defaultConfig { applicationId com.stone.myapplication minSdkVersion 8 targetSdkVersion 22 versionCode 1 versionName computeVersionName() //使用外部定義的方法 /* manifestPlaceholders manifest中使用預留位置,如:<... android:name=${YOUR_APP_KEY} > 以[key-value]形式替換:[YOUR_APP_KEY:value] */ manifestPlaceholders = [YOUR_APP_KEY: 友盟背景appkey] } signingConfigs { //gradle assembleRelease /* 可以定義多個簽名配置項,如下面的myConfig */ myConfig { storeFile file(stone.keystore) storePassword mypasswd//storePassword System.console().readLine(Keystore password: ) keyAlias stone keyPassword mypasswd//keyPassword System.console().readLine(Key password: ) } } buildTypes { /* 可以配置多個buildType項,如下面的release,debug,aabbcc */ release { minifyEnabled true //譯:使變小enabled。 即啟用混淆器 //混淆檔案:sdk/tools/proguard/proguard-android.txt 和 當前module下的proguard-rules.pro// proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro' //getDefaultProguardFile('proguard-android.txt'), //getDefaultProguardFile('proguard-android-optimize.txt'), signingConfig signingConfigs.myConfig zipAlignEnabled true //混淆後的zip最佳化,預設為true,可不寫。當不顯示配置為true時,不會產生unaligned.apk } debug { debuggable true //啟用debug的buildType配置 } aabbcc {//自訂配置,未配置簽名項,所以會產生未簽名apk multiDexEnabled true } } productFlavors { /* productFlavors-產品風格: 即不同產品的配置,它會基於上面的公用配置項defaultConfig 下面的配置項與buildTypes{}中的配置項,成類似sql中的全聯(full join)關係 當執行 $gradle build 命令後,會產生: module-flavor1-release-unaligned.apk module-flavor1-release.apk module-flavor1-debug-unaligned.apk module-flavor1-debug.apk module-flavor1-aabbcc.apk ...flavor2...apk applicationId 用於標識 在GooglePlay商店上的唯一標識 預設不配置,則與app的AndroidManifest.xml中的package一致 僅替換中的package屬性值,其它不受影響 */ flavor1 { proguardFiles 'proguard-rules.pro' applicationId com.stone.myapplication.pro //比如 專業版 manifestPlaceholders = [channelID: 百度應用平台] } flavor2 { proguardFile 'proguard-rules.pro' applicationId com.stone.myapplication.free //比如 免費版 manifestPlaceholders = [channelID: 豌豆夾] } }}dependencies { //Local binary dependency 本地jar包 compile fileTree(dir: 'libs', include: ['*.jar']) // Module dependency 引用android-library項目 compile project(':eventbuslib') /* Remote binary dependency download to local group:name:version 配置遠程倉庫中的jar包,打包時,檢查本地有沒有,若沒有則下載到本地。 */ compile 'com.android.support:appcompat-v7:22.0.0' compile 'com.android.support:support-v4:22.0.0' compile 'com.android.support:cardview-v7:22.0.0' compile 'com.android.support:recyclerview-v7:22.0.0'}關於多渠道,其實就是定義了多個flavor。用manifestPlaceholders配置,替換manifest中的預留位置${}。
manifest.xml:
最後,執行 $gradle build 命令 , 就ok了
補充一個引用遠程jar包的操作,見: