配置Gradle構建

来源:http://www.cnblogs.com/8hao/archive/2016/04/20/5411985.html
-Advertisement-
Play Games

構建基礎配置 Android Studio包含一個頂級的構建文件和每個模塊的構建文件。構建文件被稱為 build.gradle,它是一個純文本文件,它使用Groovy語法來配置由Android Gradle插件提供的元素。在大多數情況下,你只需要編輯模塊級別的構建文件。例如,BuildSystemE ...


構建基礎配置

Android Studio包含一個頂級的構建文件和每個模塊的構建文件。構建文件被稱為 build.gradle,它是一個純文本文件,它使用Groovy語法來配置由Android Gradle插件提供的元素。在大多數情況下,你只需要編輯模塊級別的構建文件。例如,BuildSystemExample項目的app模塊的構建文件是像這樣的:

apply plugin:'com.android.application'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
        }
    }
}

dependencies {
    compile project(":lib")
    compile 'com.android.support:appcompat-v7:19.0.1'
    compile fileTree(dir:'libs', include:['*.jar'])
}

apply plugin:'com.android.application' 是應用Android Gradle插件來構建。這樣添加Android特定的構建任務到頂級構建任務中,並且使用 android{…}中的元素來指定Android特定的構建項。

android{….} 配置所有的Android特定構建項:

 

compileSdkVersion 項指定編譯的目標。

 

buildToolsVersion 項指定使用什麼版本的構建工具。使用SDK管理器來安裝多個版本的構建工具。

 

註意:請始終使用其主要版本號高於或等於您的編譯目標SDK的版本。

 

defaultConfig 元素動態的配置在AndroidManifest.xml中的設置。在defaultConfig的值將覆蓋manifest文件中的值。配置在defaultConfig的值將應用於所有的構建變種(build variants),除非構建變種的配置覆蓋了這些值。

 

buildType元素控制如何構建和打包你的應用。預設的構建系統定義了兩個構建類型:debug和release。debug構建類型包含debugging符號,並且使用了debug key簽名。release構建類型預設沒有被簽名。在這個例子中構建文件配置了release版本,使用了ProGuard。

 

dependencies元素是在android元素外面的,並且在android元素後面。這個元素聲明瞭這個模塊的依賴。在一下的章節中都有依賴的內容。

 

註:當你在你的項目中改變了構建文件,Android Studio為了導入改變了構建配置而要求項目同步。點擊黃色通知欄中的”Sync Now”按鈕來同步改變的內容。

<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="圖片_x0020_1" o:spid="_x0000_i1027" type="#_x0000_t75" alt="http://developer.android.com/images/tools/as-gradlesync.png" style='width:415.2pt; height:70.2pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\SUNNYA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png" o:title="as-gradlesync"/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

圖一. 同步 Android Studio中的項目。

 

聲明依賴

這個例子的應用模塊聲明瞭3個依賴:

...
  dependencies {
      // Module dependency
      compile project(":lib")
  
      // Remote binary dependency
      compile 'com.android.support:appcompat-v7:19.0.1'
  
      // Local binary dependency
      compile fileTree(dir:'libs', include:['*.jar'])
  }

每個依賴在下麵給出描述。構建系統添加所有類型為”compile”的依賴到編譯路徑中,並且最終將他們打到最終的包中。

 

Module dependencies

app模塊依賴於lib模塊。因為像在”Open an Activity from a Library Module”中描述的,MainActivity登錄LibActivity1.

 

compile project(":lib") 聲明瞭依賴lib模塊。當你構建app模塊的時候,構建系統將會集合lib模塊。

 

運程二進位依賴

app和lib模塊都使用了來自Android支持庫的ActionBarActivity類,所有這些模塊都依賴它。

compile 'com.android.support:appcompat-v7:19.0.1' 通過指定Maven坐標來聲明瞭對Android支持庫19.0.1版本的依賴。在Android SDK的倉庫包中Android的支持庫是可用的。如果你安裝的SDK沒有這個包,通過使用SDK管理工具下載安裝它。

 

Android Studio預設使用了Maven的中央倉庫來配置項目。(這個配置在項目的頂級構建文件中)。

 

本地二進位依賴

一些模塊不使用任何的本地系統二進位依賴。如果你有依賴本地二進位依賴的模塊,拷貝JAR文件到<moduleName>/libs目錄下。

 

compile fileTree(dir: 'libs', include: ['*.jar']) 告訴構建系統將 app/libs目錄下麵的JAR文件依賴包含到編譯路徑,並且最終在最終的包中。

 

有關在Gradle更多的依賴信息,請查看Gradle的用戶指南(Dependency Management Basics )。

 

運行ProGuard

構建系統運行ProGuard,以達到在構建過程中混淆你的代碼的目的。在BuildSystemExample中,為了release構建運行ProGuard修改app模塊的構建文件:

...
  android {
      ...
      buildTypes {
          release {
              minifyEnabled true
              proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
          }
      }
  }
  ...

getDefaultProguardFile('proguard-android.txt') 從安裝的Android SDK中獲取預設的ProGuard設置。你可自定義ProGuard規則,Android Studio 將會加模塊根部的proguard-rules.pro文件添加到模塊特定的規則中。

 

包的標識:Application ID

在Android構建系統中,applicationId屬性是唯一標示發行應用包。Application ID在build.gradle文件的android節點中設置。

apply plugin:'com.android.application'
  
      android {
          compileSdkVersion 19
          buildToolsVersion "19.1"
  
      defaultConfig {
          applicationId "com.example.my.app"
          minSdkVersion 15
          targetSdkVersion 19
          versionCode 1
          versionName "1.0"
      }

註: applicationID只能在build.gradle文件中被指定,不能再AndroidManifest.xml文件中。

 

當使用build variants,構建系統可以讓你為每個product flavors和build types指定包的唯一標示。在build type中的Application ID被添加到product flavors作為尾碼。

 productFlavors {
          pro {
              applicationId ="com.example.my.pkg.pro"
          }
          free {
              applicationId ="com.example.my.pkg.free"
          }
      }
  
      buildTypes {
          debug {
              applicationIdSuffix ".debug"
          }
      }
      ....

包名依然需要在manifest文件中指定。它在你的源碼中用來涉及你的R class和解決相關activity/service註冊問題。

package="com.example.app">

註:如果你有多個manifests(比如,一個product flavor指定的manifest和一個build type的manifest),包名在這些manifests中是可選的。如果它再這些manifests中被指定,那報名必須和src/main目錄下的manifest的包名一致。

 

有關更多的關於構建文件和構建過程信息,請看 Build System Overview。

 

配置簽名設置

debug和release版本的app在是否能在安全設備調試和如何進行簽名是有區別的。構建系統使用一個預設的key來簽名debug版本,並且為了在構建過程中不出現密碼提示,使用了已知的證書。構建系統不會簽名release版本,除非你明確定義了簽名配置。如果你沒有一個release的key,你可以安裝”Signing your Applications”中描述的進行生成。

 

使用build variants工作

這個章節描述構建系統如何幫助你在一個項目中的同一個應用創建不同的版本。當時有一個demo和paid版本的時候,這是有用的,或者是你想在Google Play上為不同配置的設備發佈多個APK。

 

構建系統使用 product flavors為你的應用創建不同的版本。每個版本有可能有不同的特性和設備要求。構建系統也應用 build types到不同的構建中,並且打包配置到每個版本中。 每個product flavor和build type的組合形成了一個build variant。構建系統為每個build variant生成了不同的APK。

 

Build variants

這個項目例子包含了兩個預設的build types(debug 和release),還有兩個product flavors(demo和full)。更多關於使用build variants的高級信息,查看”Build System Overview”。

 

Product flavors

為你的應用創建不同的版本:

<!--[if !supportLists]-->1、<!--[endif]-->在構建文件中定義product flavors

<!--[if !supportLists]-->2、<!--[endif]-->為每個flavor創建附加的源碼路徑

<!--[if !supportLists]-->3、<!--[endif]-->添加flavor特定的源碼到你的項目中

 

接下來的章節帶你瞭解 BuildSystemExample項目中的每個細節。在BuildSystemExample應用中創建兩個Flavor。一個demo flavor和一個full flavor。兩個flavors共用 MainActivity,MainActivity中有一個按鈕跳轉到一個新的activity—SecondActivity.對於兩個flavor來說SecondActivity是不同的,因此你應該模擬這樣的情況:full flavor中的Activity的特性要比demo flavor中的Activity多。在練習的最後,你將得到不同flavor的不同APK。

 

在構建文件中定義product flavors

為app模塊中的構建文件定義兩個product flavors:

...
  android {
      ...
      defaultConfig {...}
      signingConfigs {...}
      buildTypes {...}
      productFlavors {
          demo {
              applicationId "com.buildsystemexample.app.demo"
              versionName "1.0-demo"
          }
          full {
              applicationId "com.buildsystemexample.app.full"
              versionName "1.0-full"
          }
      }
  }
  ...

這個項目的flavor定義支持使用defualtConfig相同的配置。所有flavors相同都配置都定義在defaultConfig中,每個flavor可以覆蓋任何預設的值。上面的構建文件使用了 applicationId屬性來分配給每個flavor:自從每個flavor創建了不同的app,他們應該需要不同的包名。

 

註:在Google Play中,為使你的應用可以擁有多APK支持。給你的所用variants分配相同的包名,並且給每個viant不同的versionCode. 為了再Google Play中區分不同的variants,你應該分配不同的包名給每個variant。

 

為每個flavor添加額外的源碼目錄

現在你應該創建源碼目錄,並且將SecondActivity添加到不同的flavor中。為demo flavor創建源碼目錄結構:

<!--[if !supportLists]-->1、<!--[endif]-->在Project模板中,展開BuildSystemExample,並且展開app目錄

<!--[if !supportLists]-->2、<!--[endif]-->右鍵src目錄,選擇New>Directory

<!--[if !supportLists]-->3、<!--[endif]-->使用”demo”作為目錄的名字

<!--[if !supportLists]-->4、<!--[endif]-->同樣的創建如下目錄:

app/src/demo/java

app/src/demo/res

app/src/demo/res/layout

app/src/demo/res/values

目錄的結構看起來像圖1:

<!--[if gte vml 1]><v:shape id="圖片_x0020_2" o:spid="_x0000_i1026" type="#_x0000_t75" alt="http://developer.android.com/images/tools/as-demoflavordirs.png" style='width:150pt;height:162.6pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\SUNNYA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image003.png" o:title="as-demoflavordirs"/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

圖一:demo flavor的目錄

添加不同的activity到不同的flavor中:

添加SecondActivity到demo flavor中:

<!--[if !supportLists]-->1、<!--[endif]-->在Project模板中,右鍵app模塊,選擇New>Activity。

<!--[if !supportLists]-->2、<!--[endif]-->選擇 Blank Activity,點擊Next

<!--[if !supportLists]-->3、<!--[endif]-->輸入activity名字: SecondActivity

<!--[if !supportLists]-->4、<!--[endif]-->輸入包名”com.buildsystemexample.app”

<!--[if !supportLists]-->5、<!--[endif]-->在app/src/demo目錄中右鍵java目錄選擇New>Package。

<!--[if !supportLists]-->6、<!--[endif]-->輸入com.buildsystemexample.xapp

<!--[if !supportLists]-->7、<!--[endif]-->將SecondActivity拖拽到app/src/demo/java中

<!--[if !supportLists]-->8、<!--[endif]-->接受預設的Refactor

為demo flavor添加SecondActivity的佈局文件和資源文件

<!--[if !supportLists]-->1、<!--[endif]-->從ap/src/main/res/layout中將activity_second.xml文件拖拽到app/src/demo/res/layout中

<!--[if !supportLists]-->2、<!--[endif]-->接受預設的提示

<!--[if !supportLists]-->3、<!--[endif]-->將strings.xml從app/src/main/res中拷貝到app/src/demo/res中

<!--[if !supportLists]-->4、<!--[endif]-->替換string.xml文件中的內容,如下:

<!--[if !supportLists]-->5、<!--[endif]--><?xml version="1.0" encoding="utf-8"?>
  <resources>
      <stringname="hello_world">This is the full version!</string>
  </resources>

註:從現在開始,你可以為每個flavor單獨開發SecondActivity. 比如,你可以為full flavor的activity添加更多的屬性。

為了讓指定的flavor文件工作,點擊IDE視窗郵編的Build Variants,並且選擇你想使用的flavor,就像圖2. Android Studio可能會展示其他flavor的錯誤,但是這並不影響輸出內容的構建。

<!--[if gte vml 1]><v:shape id="圖片_x0020_3" o:spid="_x0000_i1025" type="#_x0000_t75" alt="http://developer.android.com/images/tools/as-buildvariants.png" style='width:210pt;height:113.4pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\SUNNYA~1\AppData\Local\Temp\msohtmlclip1\01\clip_image005.png" o:title="as-buildvariants"/> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

圖2

從MainActivity登入到指定flavor的activity

SecondActivity在所有的flavors中都有相同的包名,你可以同main activity中登入。編輯mainActivity:

<!--[if !supportLists]-->1、<!--[endif]-->編輯 activity_main.xml,添加一個按鈕:

<LinearLayout ...>
      ...
      <Button
          android:id="@+id/button2"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="@string/button2"
          android:onClick="onButton2Clicked"/>
  </LinearLayout>

 

<!--[if !supportLists]-->2、<!--[endif]-->為按鈕添加text標題,和按鈕事件onButton2Clicked

<!--[if !supportLists]-->3、<!--[endif]-->在MainActivity中添加如下代碼:

publicvoid onButton2Clicked(View view){
      Intent intent =newIntent(this,SecondActivity.class);
      startActivity(intent);
  }

<!--[if !supportLists]-->4、<!--[endif]-->編輯manifest文件

<manifest ...>
      <application ...>
          ...
          <activity
              android:name="com.buildsystemexample.app.SecondActivity"
              android:label="@string/title_activity_second">
          </activity>
      </application>
  </manifest>

 

 

Build types

Build types表現為為每個app包構建包版本。預設的debug和release被提供:

...
  android {
      ...
      defaultConfig {...}
      signingConfigs {...}
      buildTypes {...}
      productFlavors {...}
      buildTypes {
          release {
              minifyEnabled false
              proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
          }
           debug {
              debuggable true
          }
      }
  }
  ...

註:儘管在build.gradle文件中預設只有release構建類型,當時release和debug構建類型都被應用的每個構建中。

 

在這個例子中,product flavors和build types創建了一下的build variants:

demoDebug

demoRelease

fullDebug

fullRelease

 

為這個例子構建,可以點擊Android Studio的Build菜單,或者在命令行中執行 assemble命令。

註:Build>Make Project會編譯項目中所有的源碼。Build>Rebuild Project選項重新編譯所有的源碼。

會為不同的build variant創建不同的輸出目錄。

QQ技術交流群290551701  http://cxy.liuzhihengseo.com/558.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這個圖片是我用xmind編輯的。歡迎大家來糾正或添加! 再來說說我對網站開發的理解與碰到的問題。 網站的前端有幾個部分我覺得很重要: 1.優雅的文字提示 2.合理的頁面設計 3.適當的腳本特效 一進入這個網站,就讓人有一種非常舒適的感覺。並且在舒適的基礎上有奪人眼球的特效,再有貼心的提示,我相信肯定 ...
  • do_Http組件就是實現http/https協議的組件. 首先要說明一下,Do平臺只是一個移動端開發的平臺,不涉及任何後臺服務端的技術,你可以使用你自己任何熟悉的語言和技術來實現服務端,do_Http組件就是用來和服務端通信。 http是一個最基礎的應用層的通信協議,開發者應該很熟悉,但是在QQ群 ...
  • 2015 was the year of React with tons of new releases and developer conferences dedicated to the topic all over the world. For a detailed list of the m ...
  • 作者:裡脊串 授權本站轉載。 啟動圖(LaunchImage)的管理其實在iOS開始中算比較簡單的了,尤其是Xcode引入了xcassets之後,完全是傻瓜式的操作。但是有的時候我們還是需要在Launch Image上做文章。 LaunchImage在APP初始化完之後會立即消失並顯示APP的界面 ...
  • - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight 這個UIImage類 實例方法的作用是 圖片實例 被拉伸時 1. 橫向拉伸時 從左邊數 ...
  • 時間就是金錢。編碼效率的提升意味著更多的收入。可是當我們的開發技巧已經到達一定高度時,如何讓開發效率更上一層樓呢?答案就是使用開發工具!在這篇文章中,我會向你介紹一些幫助我提升編碼速度和工作效率的工具。 Xcode插件 幾乎所有開發者都知道Alcatraz是一個開源的包管理工具,可以讓我們更輕鬆地管 ...
  • 當點擊workingCopy時錯誤如下 google了一下,有是有解決的辦法,可是這些都是直接使用sqlite時產生的問題。 sqlite錯誤 The database disk image is malformed database disk image is malformed 可解決 修複SQ ...
  • 課題一:如何計算Cell高度 方案一:直接法(面向對象) 直接法,就是把數據佈局到Cell上,然後拿到Cell最底部控制項的MaxY值。 第一步:創建Cell並正確設置約束,使文字區域高度能夠根據文字內容多少自動調整 添加好約束 第二步:再給這個Cell添加點別的東東,就叫這個東東BottomCub了 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...