Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 多渠道打包:使用Gradle和Android Studio

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

編輯:關於Android編程

 

 

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 String
    gradle支持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 用於標識 在谷歌Play商店上的唯一標識 默認不配置,則與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包的操作,見下圖:

    \

     

     

     

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved