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