Android打包利器Gradle之三板斧

來源:互聯網
上載者:User

標籤:gradle打包   proguard混淆   多渠道apk   多包名apk   eclipse gradle打包   

    當傳統的手工打包方式遇上同一應用,多渠道/多包名及多種引導頁/icon等等差異時,就變成了苦不堪言的純體力活了。 但有了Gradle這一切不再是問題了,Gradle使得這一切變的so easy。

    本遍主要介紹eclipse中使用Gradle打包解決多渠道問題,其它的問題基本差不多。在eclipse中使用Gradle只需要以下三板斧:

第一斧、產生Gradle相應檔案

1.1 選中相應的項目,滑鼠右鍵Export-GenerateGradle build files,然後一路next下去。


1.2 一路next下去後,finish後,即可產生以下目錄及檔案



 在產生的檔案中,有兩個需要後續配置修改gradle-wrapper.properties及build.gradle檔案,其它檔案可以不動即可。

第二斧、下載gradle及配置相應的環境變數

 2.1 雙擊開啟gradle-wrapper.properties,複製出http://services.gradle.org/distributions的地址,訪問此網站


2.2 下載相應的gradle版本,個人下載了2.1版本,找到且下載gradle-2.1-all.zip,修改上面的distributionUrl為

      distributionUrl=http\://services.gradle.org/distributions/gradle-2.1-all.zip


2.3 配置gradle環境變化,將剛下載的zip包解壓出gradle-2.1,分別配置GRADLE_HOME及在Path後追加路徑

    GRADLE_HOME配,指到gradle-2.1目錄即可,這裡為D:\Program Files\Android\gradle-2.1

    Path指到bin目錄中,這裡為D:\Program Files\Android\gradle-2.1\bin


   另外還需要配置ANDROID_HOME環境,在eclipse-preferences-Android中,找到SDK LOCATION

  在環境配置中添加ANDROID_HOME的變數名,並指向與eclipse中的SDK LOCATION的路徑一樣即可.


配置好了,cmd檢查下grade是否配置成了,輸入gradle -w命令檢查下。

 

第三斧、Gradle配置及打包命令產生

 3.1 Gradle打包過程是比較慢,且比較耗記憶體特別是多版本多N渠道一起打包時也許可能出現OOM。可以通過在gradle-wrapper.properties檔案中,添加org.gradle.jvmargs=-Xmx2048m-XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError

  3.2 修改build.gradle------比較關鍵的設定檔,對多渠道/多包名及各種差異下的配置都在build.gradle檔案下配置。

   這裡先上下個人demo項目中的配置,最後再對關鍵的地方進行解釋。

  ----------------------------------------build.gradle檔案開始-----------------------------------------

buildscript {

    repositories {

        mavenCentral()

    }

    dependencies {

        classpath‘com.android.tools.build:gradle:0.14.+‘

    }

   

    tasks.withType(JavaCompile){ options.encoding = "UTF-8" }

}

apply plugin: ‘android‘

 

dependencies {

    compile fileTree(dir:‘libs‘, include: ‘*.jar‘)

}

 

android {

    compileSdkVersion 21

    buildToolsVersion"21.1.2"

 

   

    defaultConfig {

        applicationId"com.test.drawdemo"

        minSdkVersion10

       targetSdkVersion 12

        versionCode200

        versionName"v2.0.5"

 

       testApplicationId "com.test.drawdemo"

       testInstrumentationRunner "android.test.InstrumentationTestRunner"

       

        // 預設是offical的渠道,即官方的版本

       manifestPlaceholders = [UMENG_CHANNEL_VALUE: "offical"]

    }

    //app 簽名檔案

    signingConfigs {

        release {

           storeFile file("demo.keystore")

           storePassword "123456"

           keyAlias "demo.keystore"

           keyPassword "123456"

        }

    }

   

    buildTypes {

     release {

      signingConfigsigningConfigs.release

     

           // 不顯示Log

          buildConfigField "boolean", "LOG_DEBUG","false"

     

           minifyEnabled true

           proguardFiles ‘proguard-project.txt‘

        }

    }

   

    // 移除lint檢查的error

    lintOptions {

      abortOnError false

      ignoreWarnings true

    }

    // 友盟多渠道打包

    productFlavors {

        offical {}

        appchina {}

        anzhi {}

        mumayi {}

        lenovo {}

        qq {}

        huawei {}

        xiaomi {}

        baidu {}

        meizu {}

        taobao {}

        huijia360 {}

        hiapk {}

    }

 

    productFlavors.all { flavor->

       flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]

    }

   

    //------------載入 so庫開始------------

    task copyNativeLibs(type:Copy) {

     from(new File(‘libs‘)){ include ‘**/*.so‘ }

     into newFile(buildDir, ‘native-libs‘)

 }

 

 tasks.withType(JavaCompile) {compileTask -> compileTask.dependsOn copyNativeLibs }

 

 clean.dependsOn‘cleanCopyNativeLibs‘

 

 tasks.withType(com.android.build.gradle.tasks.PackageApplication){

  pkgTask -> pkgTask.jniFolders =new HashSet<File>()

  pkgTask.jniFolders.add(newFile(buildDir,‘native-libs‘))

 }

    //---------------載入 so庫結束---------

    sourceSets {

        main {

           manifest.srcFile ‘AndroidManifest.xml‘

           java.srcDirs = [‘src‘]

           resources.srcDirs = [‘src‘]

           aidl.srcDirs = [‘src‘]

           renderscript.srcDirs = [‘src‘]

           res.srcDirs = [‘res‘]

           assets.srcDirs = [‘assets‘]

        }     

    }

}

----------------------------------------build.gradle檔案結束-----------------------------------------

3.3 執行gradlewclean。開啟cmd,cd到項目目錄中,先輸入gradlew clean。 這裡的gradlew 是對gradle命令的封裝,gradlew clean後可以使gradle會自成同步下載Gradle相應的依賴,並可以把上次打包的清掉重新打,會刪除掉build目錄及build目錄下所有檔案。

3.4 執行gradlew build命令,即可完成整個打包過程了。

 接下來可以看到項目下產生了build目錄,在這裡的build-->outputs-->apk裡就產生了各渠道的包了.

 

可以看到產生了一堆的包,有release及debug版本,簽名版的及未簽名。若不想要debugt版本的apk,可以在打包時輸入 gradlew aR命令即可。aR是assembleRelease的簡寫。當然也可以只產生debug版本的(gradlew assembleDebug)

 

 大功造成,怎麼樣是不是很easy啊,呵呵了。。。下面對build.gradle簡單的介紹下。

 

補充說明--關於build.gradle配置

 

1. buildscript元素

    除了dependencies-classpath中的gradle版本需要改下,基本上不需要修改。

  1.1 dependencies { 

        classpath‘com.android.tools.build:gradle:0.12.+‘

    }

   gradle:0.12.+修改成gradle:0.14.+,對應的gradle 2.1 採用新的gradle版本,比較關鍵。

 1.2 tasks.withType(JavaCompile) { options.encoding = "UTF-8" } ,這裡老版本gradle是Compile,需要修改成JavaCompile

2、applyplugin: ‘android‘

        -----不做修改

3、dependencies元素

 dependencies{

    compilefileTree(dir: ‘libs‘, include: ‘*.jar‘)

} 指定項目中相應的jar包依賴,注意 :

 3.1 這裡配置指令了,會和proguard混淆配置中-libraryjars libs/xxxx.jar衝突重新設定了依賴jar包。可以將proguard混淆檔案中的-libraryjars 配置注釋掉 加#-libraryjars ...

 3.2 dependencies只指令了jar包依賴了,並沒有指令so庫依賴,so庫的依賴得單獨配置...,後面有介紹。。但有個變態的方法就是可以把所的so庫檔案,全部用zip壓縮到一個檔案中比如so.zip,再把so.zip改名成so.jar這樣就不需要指令so庫了,比較變態吧。呵呵....

4. android元素

 這裡是重重之重,配置比較繁瑣,

 4.1 defaultConfig元素 

       applicationId 指令包名,老版本是packageName指令

       其它可配置版本資訊

4.2 signingConfigs 元素

       可以配置簽名檔案資訊,檔案位置別名命令等

4.3 buildTypes 元素

       產生的apk有兩種type類型,debug與release版本,可以分別對其配置,配置使用哪個簽名配置(signingConfigs)、是否混淆等等

       minifyEnabled 是新版本的元素,老版本runProguard已經廢棄了。

       proguardFiles ‘proguard-project.txt‘ 指令使用與build.gradle同一目錄中的proguard-project.txt混淆檔案.

4.4 lintOptions元素

       配置下,忽略lint相應的警告...

4.5 Flavors機制,,

    主要是靠,這個機制進行 多渠道,多包名的打包....,

剩下的載入 so庫,直接複製下,不用改,拿好,不謝。


 

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Android打包利器Gradle之三板斧

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.