Android應用配置構建詳解

raul892 8年前發布 | 6K 次閱讀 安卓開發 Android開發 移動開發

Android應用配置構建詳解

構建過程

Paste_Image.png

Paste_Image.png

  • 1.編譯器將源碼編譯為DEX文件(Dalvik虛擬機可執行文件)

  • 2.APK打包工具將DEX文件和編譯過的資源文件打包到一個APK文件中

  • 3.APK打包工具使用debug或release密鑰給APK文件簽名(AS默認使用debug密鑰配置新項目)

  • 打包工具在生成最終的APK文件之前,使用 zipalign 工具優化應用文件占用的內存

自定義構建配置

Build Types

Build types define certain properties that Gradle uses when building and packaging your app, and are typically configured for different stages of your development lifecycle.

構建類型(Build Types)定義了Gradle在構建和打包app時使用的確切屬性。AS默認設置了debug和release兩種build type。

build type 特點
debug 開啟debug選項,使用debug keystore簽名
release 壓縮,混淆,使用release keystore簽名

Q:如何添加自定義類型的構建類型?

A:在模塊級別的 build.gradle 文件, android 代碼塊中有一個 buildTypes 代碼塊。在其中添加自定義類型的即可。具體屬性設置可參考 BuildType文檔

//模塊級別的build.gradle文件
android {
    ...
    defaultConfig {...}
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

    debug {
        applicationIdSuffix ".debug"
    }
    //自定義的構建類型:jnidebug
    jnidebug {
        initWith debug
        applicationIdSuffix ".jnidebug"
        jniDebuggable true
    }
}

}</code></pre>

Product Flavors

Product flavors represent different versions of your app that you may release to users

Product flavors表示發布給用戶的不同版本的app。例如免費版和收費版。Product flavors是可選項,必須我們手動去創建。

Q:如何添加Product Flavors?

A:和添加build types類似,在 productFlavors 代碼塊中添加即可。</code></pre>

defaultConfig 實際上屬于 ProductFlavor 類,因此可在 defaultConfig 代碼塊中配置所有flavor共同的屬性。每個flavor都能覆蓋之前的默認值。如 applicationId 。

android {
    ...
    defaultConfig {...}
    buildTypes {...}
    productFlavors {
        demo {
            applicationId "com.example.myapp.demo"
            versionName "1.0-demo"
        }
        full {
            applicationId "com.example.myapp.full"
            versionName "1.0-full"
        }
    }
}

Build Variants

A build variant is a cross product of a build type and product flavor, and is the configuration Gradle uses to build your app.

build variant是build type和product flavor共同作用的產物,是Gradle構建app的配置。

//模塊級別的build.gradle

android{ ... buildTypes{ //默認有debug和release兩種build types ... } productFlavors{ //不同開發環境設置不同的productFlavor //開發 dev{ ... } //生產 prd{ ... } //測試 tst{ ... } //定制 cus{ ... } } }</code></pre>

如上所示,我們配置了四種不同的product flavors和兩種build types,在Android Studio中能看到如下所示的選擇界面。供我們切換不同的Build Variants。

Paste_Image.png

Manifest Entries

我們可在build variant的配置中指定Manifest文件屬性的值(將覆蓋Manifest文件已存在的值)。這有助于我們的項目生成多個APK文件,且每個APK文件有不同的應用名,最小SDK版本,編譯SDK版本。

合并多個Manifest文件,可能會有沖突。如何解決沖突請參考 Merge Multiple Manifest Files

Dependencies

構建系統管理項目依賴,包括來自本地文件系統的和來自遠端倉庫的依賴。

android {...}
...
dependencies {
    //依賴本項目的"mylibrary"模塊 
    compile project(":mylibrary")

//依賴遠端庫文件
compile 'com.android.support:appcompat-v7:23.4.0'

//依賴本地庫文件
compile fileTree(dir: 'libs', include: ['*.jar'])

}</code></pre>

聲明幾種依賴的方式:

  • 依賴本項目的某模塊

compile project(":模塊名")
  • 依賴遠端庫文件

compile '庫名:版本'
  • 依賴本地庫文件

compile fileTree(dir: 'libs', include: ['*.jar'])

Signing

我們能在構建配置中設置簽名的屬性值,構建系統會在構建的過程中自動給我們的應用簽名。具體細節請參考 Sign Your App

生成jks密鑰文件:

在Android Studio中依次打開
   Build->Generate Signed APK->Next
   ->Create new->New Key Store(分別填寫每一項,如下圖所示)

Paste_Image.png

Q:為什么我之前看到的是.keystore文件,而現在卻是.jks文件?

A:Eclipse用到的簽名文件是以.keystore結尾,而Android Studio中則是.jks文件。</code></pre>

維護密鑰的安全性:

  • 1.如果我們直接在build.gradle文件中設置簽名相關的配置,容易導致密鑰的密碼等信息通過版本控制工具(如SVN,Git等)被泄漏。

//模塊級別的build.gradle
 android {
    signingConfigs {
        config {
            keyAlias 'YourKeyAlias'
            keyPassword 'YourKeyPassword'
            storeFile file('Your StoreFile location')
            storePassword 'Your store Password'
        }
    }
    ...
   }
  • 2.我們可以將簽名相關的配置的值寫在gradle.properties屬性文件中。如下所示,能有效避免將簽名相關信息提交到版本控制工具中。

//gradle.properties屬性文件
RELEASE_KEY_ALIAS=test
RELEASE_KEY_PASSWORD=123456
RELEASE_STORE_PASSWORD=123456
RELEASE_STORE_FILE=../XX.jks

//模塊級別的build.gradle android { signingConfigs { config { keyAlias RELEASE_KEY_ALIAS keyPassword RELEASE_KEY_PASSWORD storeFile file(RELEASE_STORE_FILE) storePassword RELEASE_STORE_PASSWORD } } ... }</code></pre>

 

 

來自:http://www.jianshu.com/p/b0b9a3383afa

 

 本文由用戶 raul892 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!