• <td id="ae6ms"><li id="ae6ms"></li></td>
  • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
  • <table id="ae6ms"></table>
  • <td id="ae6ms"></td>
    <td id="ae6ms"></td>
  • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
  • <td id="ae6ms"></td>
  • <table id="ae6ms"><li id="ae6ms"></li></table>
  • <table id="ae6ms"></table>
    西西軟件園多重安全檢測下載網站、值得信賴的軟件下載站!
    軟件
    軟件
    文章
    搜索

    首頁編程開發Android → 用Gradle 插件打包android程序

    用Gradle 插件打包android程序

    相關軟件相關文章發表評論 來源:西西整理時間:2013/5/20 9:42:54字體大?。?em class="fontsize">A-A+

    作者:youxiachai點擊:213次評論:0次標簽: 打包

    • 類型:社交聊天大?。?i>1012KB語言:中文 評分:.0
    • 標簽:
    立即下載

    android gradle 的插件終于把混淆代碼的task集成進去了,加上最近,android studio 用的是gradle 來構建項目, 下定決心把android gralde 構建項目的用戶指南全部看完, 讓不會用gradle 的人也用gradle構建android項目,讓打包(注意,打包和構建是兩碼事)多版本android不再痛苦。最后,題外話:珍惜生命,遠離ant....

    Gradle build android 歷史

    Android Tools 主頁 ,大概是今年2月份發布 adt21.1 的時候,忽然在主頁發現了New Build System 原來是可以用gradle 來構建android項目,至于gradle是什么(既然點擊進來看了應該都知道了吧。) 。然后,又看了一下RoadMap 那時候,還并不支持Proguard 打包,于是就沒看了。。。

    最近,android studio 發布,終于gradle 0.4 也跟著出來了,于是,先把gradle 學了一遍,然后把Gradle Plugin User Guide也認真閱讀了一下,根據我的個人體驗,如果你對gradle 毫無了解就去看Gradle Plugin User Guide 可能很多地方都一頭霧水,但是并不妨礙你用gradle 打包android 應用,只是,出現問題,你就可能很頭疼。不過,本篇博文就是讓不會gradle 也能用上 gradle 打包android 程序,因為,我也不懂gradle,所以,我把我碰到的問題的解決方案都一一列出。

    順便貼上官方為什么使用gradle 的理由

    Domain Specific Language (DSL) to describe and manipulate the build logic

    Build files are Groovy based and allow mixing of declarative elements through the DSL and using code to manipulate the DSL elements to provide custom logic.

    Built-in dependency management through Maven and/or Ivy.

    Very flexible. Allows using best practices but doesn’t force its own way of doing things.

    Plugins can expose their own DSL and their own API for build files to use.

    Good Tooling API allowing IDE integration

    Gradle 基本概念

    首先我們學習幾個gradle 的腳步語法,掌握了這幾個語法,你就能非常簡單的用gradle構建打包android項目了。 首先,我們來看下一個最簡單android build.gradle

    build.gradle

    buildscript {
         
    repositories {
               mavenCentral()
           }

           dependencies {
               classpath 'com.android.tools.build:gradle:0.4'
           }
       }

       apply plugin: 'android'

       android {
           compileSdkVersion 17
       }
    buildscript{}英語的介紹都來自與 gradle官方文檔, 主要后邊的中文不是翻譯,是補充介紹。。

    Configures the build script classpath for this project. 說白了就是設置腳步的運行環境

    repositories{}

    Returns a handler to create repositories which are used for retrieving dependencies and uploading artifacts produced by the project. 大意就是支持java 依賴庫管理(maven/ivy),用于項目的依賴。這也是gradle 強力的地方。。。

    dependencies{}

    The dependency handler of this project. The returned dependency handler instance can be used for adding new dependencies. For accessing already declared dependencies, the configurations can be used. 依賴包的定義。支持maven/ivy,遠程,本地庫,也支持單文件,如果前面定義了repositories{}maven 庫,使用maven的依賴(我沒接觸過ivy。。)的時候只需要按照用類似于com.android.tools.build:gradle:0.4,gradle 就會自動的往遠程庫下載相應的依賴。

    apply plugin:

    聲明構建的項目類型,這里當然是android了。。。

    android{}

    設置編譯android項目的參數,接下來,我們的構建android項目的所有配置都在這里完成。

    Gradle 基本概念

    首先我們學習幾個gradle 的腳步語法,掌握了這幾個語法,你就能非常簡單的用gradle構建打包android項目了。 首先,我們來看下一個最簡單android build.gradle。

    build.gradle

    buildscript {
         
    repositories {
               mavenCentral()
           }

           dependencies {
               classpath 'com.android.tools.build:gradle:0.4'
           }
       }

       apply plugin: 'android'

       android {
           compileSdkVersion 17
       }

    buildscript{}英語的介紹都來自與 gradle官方文檔, 主要后邊的中文不是翻譯,是補充介紹。。

    Configures the build script classpath for this project. 說白了就是設置腳步的運行環境

    repositories{}

    Returns a handler to create repositories which are used for retrieving dependencies and uploading artifacts produced by the project. 大意就是支持java 依賴庫管理(maven/ivy),用于項目的依賴。這也是gradle 強力的地方。。。

    dependencies{}

    The dependency handler of this project. The returned dependency handler instance can be used for adding new dependencies. For accessing already declared dependencies, the configurations can be used. 依賴包的定義。支持maven/ivy,遠程,本地庫,也支持單文件,如果前面定義了repositories{}maven 庫,使用maven的依賴(我沒接觸過ivy。。)的時候只需要按照用類似于com.android.tools.build:gradle:0.4,gradle 就會自動的往遠程庫下載相應的依賴。

    apply plugin:

    聲明構建的項目類型,這里當然是android了。。。

    android{}

    設置編譯android項目的參數,接下來,我們的構建android項目的所有配置都在這里完成。

    構建一個Gradle android項目

    首先,你要安裝Gradle 1.6 并且,寫進系統的環境變量里面,所有的命令都是默認你已經配好了gradle 的環境。而且,已經已經升級了android sdk 22

    要用gradle構建你的有兩種方式:(build.gradle 放到項目目錄下)

    利用adt 22導出 build.gradle.

    復制別人寫好的build.gradle 文件.

    根據gradle 規則,手寫android 的build.gradle 文件。

    個人推薦1,2 方法。。。。

    一個android build.gradle 最基本基本文件

    build.gradle

    buildscript {

       repositories {
           mavenCentral()
       }

       dependencies {
           classpath 'com.android.tools.build:gradle:0.4'
       }
    }

    apply plugin: 'android'

    dependencies {
    }

    android {

       compileSdkVersion 17
       buildToolsVersion "17"

       defaultConfig {
           minSdkVersion 8
           targetSdkVersion 17
       }
       sourceSets {
           main {
               manifest.srcFile 'AndroidManifest.xml'
               java.srcDirs = ['src']
               resources.srcDirs = ['src']
               aidl.srcDirs = ['src']
               renderscript.srcDirs = ['src']
               res.srcDirs = ['res']
               assets.srcDirs = ['assets']
           }

           instrumentTest.setRoot('tests')
       }
    }
    例如: cd e:\workplace\andoridGradle接著在命令行cd 到項目目錄下.

    gradle
    5.0
    類別: 編程控件    大?。?5.3M    語言: 英文
    查看詳細信息 >>

    如果你是第一次使用gradle 構建android項目建議你先使用gradle clean 把android gradle 插件,還有相關依賴包下載下來并且對環境進行初始化,如果出錯了,一般可能是下載超時,試多幾次即可,最后你會看到如下提示:BUILD SUCCESSFUL

    The TaskContainer.add() method has been deprecated and is scheduled to be remove d in Gradle 2.0. Please use the create() method instead.

    :clean UP-TO-DATE

    BUILD SUCCESSFUL

    Total time: 7.847 secs

    完成以上的步驟,就可以正式使用gralde 構建你的android項目了。

    然后使用gradle build 就完成了android 項目的構建了。如果,你是照著以上步驟走的話,你將會想項目目錄里面看到一個build 的目錄,里面就是用gradle 構建android項目的全部例如了,結構目錄看附錄。

    最終打包的apk 就在build/apk 目錄下了。然后,你會發現,兩個apk 一個是 [項目名]-debug-unaligned [項目名]-release-unsigned

    如果以上內容你都掌握的話,接下來就將詳細說說如何利用gralde 打包android apk。

    Gralde 打包參數詳解

    上面說了一大堆東西,其實并不吸引人去使用gradle,如果只是構建項目的話,adt不是更合適嗎?如果,你看完以下內容還是這么覺得的話,你就沒必要折騰gradle了。。。。。。

    打簽名包

    看附錄 默認輸出 release apk 是沒有簽名的,那么我們需要簽名的很簡單,只需要在android{}里面補充加上加上即可。完整build.gradle 請點擊我的gist

    build.gradle

    signingConfigs {
      myConfig{
        storeFile file("gradle.keystore")
        storePassword "gradle"
        keyAlias "gradle"
        keyPassword "gradle"
       }
    }
       
      buildTypes{
        release {
        signingConfig  signingConfigs.myConfig
        }
      }

    然后,運行gradle clean gradle build ,這次在build/apk 你看到了多了一個[項目名]-release-unaligned, 從字面上面我就可以知道,這個只是沒有進行zipAlign 優化的版本而已。而[項目名]-release 就是我們簽名,并且zipAlign 的apk包了. ###打混淆包### 只需要在原來的基礎上加上,完整的proguad.gradle 代碼 build.gradle

    gradle clean

    gradle build

    打多渠道包(Product Flavor)

    現在來解釋一下上一節的問題,apk目錄下的兩個apk 的含義

    為什么產生了兩個apk?

    默認的android gralde 插件定義了兩種apk 的類型debug, release,這兩種類型的詳細對比看附錄。

    這個是android gralde 插件 buildTypes{} 方法產生的,默認配置好了兩個默認模板,當然你也可以修改,前面我們就是在修改默認的release 的配置,讓輸出release類型的的apk,具有簽名和混淆。

    對于多渠道包,android 插件提供了一個名為Product Flavor{} 的配置,用于進行多渠道打包。

    例如,我的android應用有海外版,和國內版本,而且這兩個版本的包名是不一樣的?。。ㄎ揖团e兩個市場的例子安裝這個思路,你要打包100個不同的市場只是幾行代碼的事情。)。

    你只需要在android{} 補充上

    build.gradle

    productFlavors {
    playstore {
    packageName='com.youxiachai.androidgradle.playstore'
    }
    hiapk {
    packageName='com.youxiachai.androidgradle.amazonappstore'
    }
    }
    僅此而已?然后gradle clean,gradle build,在build/apk 下面你會看到一堆的包,命名格式[項目名]-[渠道名]-release

    Product Flavor{} 不只是能改包名那么簡單,還能夠對編譯的源碼目錄進行切換。

    什么意思? 不知道各位有沒有用過友盟做用戶統計,如果,你用的是分發渠道分析,你需要修改AndroidManifest.xml 添加上 

    如果,你很多渠道,,然后你就會很痛苦,現在用gradle 就非常舒服,你只需要在android.sourceSets指定我們的渠道名就行,android gradle 插件,會自動打包?。?!例如

    build.gradle

    sourceSets {
       main {
           manifest.srcFile 'AndroidManifest.xml'
           java.srcDirs = ['src']
           resources.srcDirs = ['src']
           aidl.srcDirs = ['src']
           renderscript.srcDirs = ['src']
           res.srcDirs = ['res']
           assets.srcDirs = ['assets']
       }
           
       hiapk {
          manifest.srcFile 'hiapk/AndroidManifest.xml'
       }    
          playstore {
          manifest.srcFile 'hiapk/AndroidManifest.xml'
       }
         
    instrumentTest.setRoot('tests')
           
    }

    然后運行gradle clean,gradle build,省下的時間去喝杯咖啡,睡個覺什么的都好。。。 ###外部依賴### android gradle 對于外部jar 包的應用支持maven/ivy 管理的包,也支持指定具體文件,前面已經在上文說過。上面演示的完整 build.gradle gist 里面也有寫。你需要加上如下代碼即可: build.gradle

    結語

    至此,對于用android gradle 構建android應用程序,打包android 程序,所需要的所有知識,在以上已經說明,只要你是認真看上面文章的,對于,如何打依賴于android library project 的包,可以看附錄提供的那個德國人寫的例子,而對于build.gradle 里面的代碼你需要把0.2, 改為0.4即可。至于用gradle 運行android test case部分的教程,個人感覺寫了也白寫(我寫過關于andorid 測試相關的文章,也錄制過視頻,所以有這個感覺。),估計不會有人關注,所以,如果你對用gradle 進行android test的話,可以看附錄里面提供的官方gradle手冊。

    擴展閱讀

    對于這部分內容,你讀與不讀,并不影響你使用gradle 打包android 項目。至于讀了的好處就是你能夠更好的使用gradle。。

    完整的Gradle Plugin User Guide 其中里面有個錯誤是compile files('libs/android-support-v4.jar') 不是compile file('libs/android-support-v4.jar') 教程是基于android gradle0.3 ,在0.4中只是多了混淆打包,這塊已經在文中補充了。

    一個德國人寫的Android-Gradle-Examples

    dependencies{} 更多的介紹。

    debug, release,這兩種類型的默認配置如下:

     Property name Default values for debug Default values for release / other
     debuggable true false
     jniDebugBuild false false
     renderscriptDebugBuild false false
     renderscriptOptimLevel 3 3
     packageNameSuffix null null
     versionNameSuffix null null
     signingConfig android.signingConfigs.debug null
     zipAlign false true

    defaultConfig {} 配置參數列表

     Property Name Default value in DSL object Default value
     versionCode -1 value from manifest if present
     versionName null value from manifest if present
     minSdkVersion -1 value from manifest if present
     targetSdkVersion -1 value from manifest if present
     packageName null value from manifest if present
     testPackageName null app package name + “.test”
     testInstrumentationRunner null android.test.InstrumentationTestRunner
     signingConfig null null
     runProguard false false
     proguardFile  'proguard-android.txt' or 'proguard-android-optimize.txt'  'proguard-android.txt' or 'proguard-android-optimize.txt'

    build 結構目錄

    tree

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    build/
    ├── apk
    ├── assets
    │   ├── debug
    │   └── release
    ├── classes
    │   ├── debug
    │   │   └── com
    │   │       └── example
    │   │           └── gradle
    │   └── release
    │       └── com
    │           └── example
    │               └── gradle
    ├── dependency-cache
    │   ├── debug
    │   └── release
    ├── incremental
    │   ├── aidl
    │   │   ├── debug
    │   │   └── release
    │   ├── dex
    │   │   ├── debug
    │   │   └── release
    │   ├── mergeAssets
    │   │   ├── debug
    │   │   └── release
    │   └── mergeResources
    │       ├── debug
    │       └── release
    ├── libs
    ├── manifests
    │   ├── debug
    │   └── release
    ├── res
    │   ├── all
    │   │   ├── debug
    │   │   │   ├── drawable-hdpi
    │   │   │   ├── drawable-mdpi
    │   │   │   ├── drawable-xhdpi
    │   │   │   ├── drawable-xxhdpi
    │   │   │   ├── layout
    │   │   │   ├── menu
    │   │   │   ├── values
    │   │   │   ├── values-sw720dp-land
    │   │   │   ├── values-v11
    │   │   │   └── values-v14
    │   │   └── release
    │   │       ├── drawable-hdpi
    │   │       ├── drawable-mdpi
    │   │       ├── drawable-xhdpi
    │   │       ├── drawable-xxhdpi
    │   │       ├── layout
    │   │       ├── menu
    │   │       ├── values
    │   │       ├── values-sw720dp-land
    │   │       ├── values-v11
    │   │       └── values-v14
    │   └── rs
    │       ├── debug
    │       └── release
    ├── source
    │   ├── aidl
    │   │   ├── debug
    │   │   └── release
    │   ├── buildConfig
    │   │   ├── debug
    │   │   │   └── com
    │   │   │       └── example
    │   │   │           └── gradle
    │   │   └── release
    │   │       └── com
    │   │           └── example
    │   │               └── gradle
    │   ├── r
    │   │   ├── debug
    │   │   │   └── com
    │   │   │       └── example
    │   │   │           └── gradle
    │   │   └── release
    │   │       └── com
    │   │           └── example
    │   │               └── gradle
    │   └── rs
    │       ├── debug
    │       └── release
    └── symbols
        ├── debug
        └── release
    88 directories

      相關評論

      閱讀本文后您有什么感想? 已有人給出評價!

      • 8 喜歡喜歡
      • 3 頂
      • 1 難過難過
      • 5 囧
      • 3 圍觀圍觀
      • 2 無聊無聊

      熱門評論

      最新評論

      發表評論 查看所有評論(0)

      昵稱:
      表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
      字數: 0/500 (您的評論需要經過審核才能顯示)
      女人让男人桶30分钟免费视频,女人张开腿让男人桶个爽,一进一出又大又粗爽视频
    • <td id="ae6ms"><li id="ae6ms"></li></td>
    • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
    • <table id="ae6ms"></table>
    • <td id="ae6ms"></td>
      <td id="ae6ms"></td>
    • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
    • <td id="ae6ms"></td>
    • <table id="ae6ms"><li id="ae6ms"></li></table>
    • <table id="ae6ms"></table>