Android 多渠道打包:使用Gradle和Android Studio,androidgradle

來源:互聯網
上載者:User

Android 多渠道打包:使用Gradle和Android Studio,androidgradle

轉載請註明出處:

   http://blog.csdn.net/jjwwmlp456/article/details/45057067  ----------------- 匆忙擁擠repeat


Gradle,這個東西好複雜,不過在Android中,我們知道它大概怎麼用,它的依據何來,就夠了。

Gradle的DSL,領特定領域語言(domain-specific languages,簡稱DSL),地址:http://gradle.org/docs/2.3/dsl/

Gradle的使用者指南,地址:http://gradle.org/docs/2.3/userguide/userguide.html

Android-Gradle-DSL    Android結合Gradle的DSL

   :https://developer.android.com/shareables/sdk-tools/android-gradle-plugin-dsl.zip

簡單介紹Android-Gradle構建外掛程式的官方地址:https://developer.android.com/tools/building/plugin-for-gradle.html

詳細介紹Android-Gradle構建外掛程式的官方地址:http://tools.android.com/tech-docs/new-build-system


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("\nKeystore password: ")            keyAlias "stone"            keyPassword "mypasswd"//keyPassword System.console().readLine("\nKey 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一致          僅替換<manifest>中的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:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.stone.myapplication">    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme">        <activity            android:name=".MainActivity"            android:label="@string/app_name">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>            <meta-data                android:name="UMENG_APPKEY"                android:value="${YOUR_APP_KEY}" />            <meta-data                android:name="channelName"                android:value="${channelID}" />        </activity>    </application></manifest>

最後,執行 $gradle build 命令 , 就ok了


補充一個引用遠程jar包的操作,見:





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.