1.構(gòu)建Android應(yīng)用程序的Gradle挚躯。
1.1 使用Gradle Android應(yīng)用程序。
默認(rèn)情況下,Android項目由Gradle構(gòu)建系統(tǒng)處理。如果你在Android studio中創(chuàng)建一個新項目应闯,則會自動創(chuàng)建Gradle構(gòu)建腳本。Android Studio提供了Gradle運行時挂捻,因此不需要額外的安裝碉纺。
如果你按下Android Studio中的run
按鈕,則會觸發(fā)相應(yīng)的Gradle任務(wù)并啟動應(yīng)用程序刻撒。
你也可以通過命令行運行Gradle骨田。為了避免不必要的本地安裝,Gradle提供了一個包裝器腳本疫赎,允許您在沒有任何本地安裝的情況下運行Gradle。
1.2 從源代碼到Android應(yīng)用程序的轉(zhuǎn)換過程碎节。
Java源代碼文件由Java編譯器轉(zhuǎn)換為Java類文件捧搞。Android SDK包含一個名為dx的工具,它將Java類文件轉(zhuǎn)換為.dex(Dalvik Executable)文件狮荔。應(yīng)用程序的所有類文件都放在此.dex
文件中胎撇。在此轉(zhuǎn)換過程中,類文件中的冗余信息在.dex文件中進行優(yōu)化殖氏。例如晚树,如果String在不同的類文件中找到相同的文件,則.dex文件只包含一個引用String雅采。
因此爵憎,這些.dex
文件的大小要比相應(yīng)的類文件小得多。
該.DEX文件和其他資源婚瓜,例如圖像和XML文件宝鼓,被打包成一個apk文件(Android Package的)文件。程序aapt
(Android資產(chǎn)打包工具)執(zhí)行此步驟巴刻。
所得的.apk
文件包含運行Android應(yīng)用程序的所有必要數(shù)據(jù)愚铡,并可通過adb工具部署到Android設(shè)備。
從Android 5.0起胡陪,Android RunTime(ART)被用作所有Android應(yīng)用的運行時沥寥。ART采用“時尚之都”和“時尚_匯編”的組合。在Android設(shè)備上安裝應(yīng)用程序期間柠座,將應(yīng)用程序代碼轉(zhuǎn)換為機器代碼邑雅。
該dex2oat工具使用Android工具鏈創(chuàng)建的.dex
文件,并將其編譯為可執(zhí)行和可鏈接格式(ELF文件)妈经。該文件包含dex代碼蒂阱,編譯的本地代碼和元數(shù)據(jù)锻全。保持.dex
代碼允許現(xiàn)有的工具仍然可以工作。
1.3 在命令行中使用Gradle录煤。
Gradle構(gòu)建系統(tǒng)旨在支持創(chuàng)建Android應(yīng)用程序時的復(fù)雜場景:
1)多分銷:同一應(yīng)用程序必須為幾個客戶或公司定制
2)Multi-apk:支持為不同設(shè)備類型創(chuàng)建多個apk鳄厌,同時重用部分代碼
你可以通過命令行啟動Gradle構(gòu)建。以下是Android Gradle重要任務(wù)的概述:
表1. Android Gradle構(gòu)建目標(biāo)
命令 描述
./gradlew build
構(gòu)建項目妈踊,運行組合和檢查任務(wù)
./gradlew clean build
從零開始構(gòu)建項目
./gradlew clean build
從零開始構(gòu)建項目
./gradlew test
運行測試
./gradlew connectedAndroidTest
運行儀器測試
要查看所有可用任務(wù)了嚎,請使用gradlew wrapper命令。
gradle build
# alternatively speedup second grandle build by holding it in memory
# gradle build --daemon
此命令將創(chuàng)建構(gòu)建文件夾中的搖籃構(gòu)建的輸出廊营。默認(rèn)情況下歪泳,Gradle構(gòu)建在build / outputs / apk文件夾中創(chuàng)建兩個.apk文件。
要在JVM上構(gòu)建和啟動單元測試露筒,請使用以下命令呐伞。
gradle test
此命令將創(chuàng)建構(gòu)建文件夾中的搖籃構(gòu)建的輸出。默認(rèn)情況下慎式,Gradle構(gòu)建在build / outputs / apk文件夾中創(chuàng)建兩個.apk文件伶氢。
要在JVM上構(gòu)建和啟動單元測試,請使用以下命令瘪吏。
gradle connectedCheck
要在Android設(shè)備上構(gòu)建和啟動儀器化測試癣防,請使用以下命令。
gradle connectedCheck
1.4 通過資源縮小來刪除未使用的資源和Java類掌眠。
用于Android的Gradle構(gòu)建系統(tǒng)支持在構(gòu)建時縮小資源蕾盯。這將自動從打包的應(yīng)用程序中刪除未使用的資源。除此之外蓝丙,還可以從你所依賴的庫中刪除不必要的資源级遭。這可以大大減少你的應(yīng)用程序的大小。
要使資源縮小渺尘,請更新你的構(gòu)建文件装畅,類似于以下代碼段。
android {
...
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
1.5 定義依賴關(guān)系并保留外部版本沧烈。
一個很好的做法是在依賴關(guān)系之外定義庫依賴的版本掠兄,以便更好的維護。
ext {
// App dependencies
junitVersion = '4.12'
mockitoVersion = '1.10.19'
powerMockito = '1.6.2'
hamcrestVersion = '1.3'
}
dependencies {
// Dependencies for local unit tests
testCompile "junit:junit:$junitVersion"
testCompile "org.mockito:mockito-all:$mockitoVersion"
testCompile "org.hamcrest:hamcrest-all:$hamcrestVersion"
testCompile "org.powermock:powermock-module-junit4:$powerMockito"
testCompile "org.powermock:powermock-api-mockito:$ext.powerMockito"
}
2.1 構(gòu)建類型并構(gòu)建風(fēng)格锌雀。
Android默認(rèn)使用兩種構(gòu)建類型:調(diào)試和釋放蚂夕。對于這些構(gòu)建類型腋逆,你可以在Gradle構(gòu)建中創(chuàng)建不同的風(fēng)格婿牍。
Gradle構(gòu)建系統(tǒng)還能夠管理不同風(fēng)格的應(yīng)用程序。產(chǎn)品風(fēng)味定義了應(yīng)用程序的定制版本惩歉。這允許代碼庫的某些部分或資源對于應(yīng)用程序的變體而有所不同等脂。
例如俏蛮,你可以為某些設(shè)備類別(如手機或平板電腦)定義不同的構(gòu)建版本。另一個用例可能是您的應(yīng)用的付費或免費版本上遥〔迹或者您想在測試運行期間使用不同的資源或類。
2.2 在你的Gradle構(gòu)建文件中定義產(chǎn)品風(fēng)格粉楚。
你可以使用 productFlavors關(guān)閉app / build.gradle文件來定義產(chǎn)品的不同變體辣恋。
productFlavors {
prod {
applicationId = "com.vogella.android.gradlebuildflavors.prod"
versionName = "1.0-paid"
}
mock {
applicationId = "com.vogella.android.gradlebuildflavors.mock"
versionName = "1.0-free"
}
}
整個build.gradle文件可能如下所示:
apply plugin: 'com.android.application'
android {
// ....
productFlavors {
prod {
applicationId = "com.vogella.android.gradlebuildflavors.prod"
versionName = "1.0-paid"
}
mock {
applicationId = "com.vogella.android.gradlebuildflavors.mock"
versionName = "1.0-free"
}
}
}
// ...
定義這些flavor之后,您可以在Android Studio 的“ 構(gòu)建變體”視圖中選擇它們模软。
2.3 為flavor提供不同的資源
為了為某種風(fēng)格定義不同的行為伟骨,您需要為app / src /
下定義的風(fēng)格創(chuàng)建合適的文件夾。
風(fēng)味特定資源將覆蓋主要資源燃异。例如携狭,如果您在一個風(fēng)味中提供了不同的應(yīng)用程序圖標(biāo),Android構(gòu)建系統(tǒng)就會獲得特定的風(fēng)格回俐。
2.4 為 app的flavor提供不同的來源集逛腿。
src /文件夾中的目錄稱為源集。每個產(chǎn)品的味道都可以定義自己的源集鲫剿。
代碼文件不被替換為資源鳄逾,它們被組合稻轨。例如灵莲,你不能com.example.MainActivity
在你的app / main / java /
文件夾中有一個 活動,另外一個不同的實現(xiàn)是另外一種殴俱。如果您嘗試這樣做政冻,您將收到有關(guān)重復(fù)類定義的錯誤消息。
您仍然可以通過避免在主源文件夾中創(chuàng)建類來提供不同的實現(xiàn)线欲,而在每種風(fēng)格中創(chuàng)建一個類明场。
3.可選練習(xí):為應(yīng)用程序使用不同的產(chǎn)品風(fēng)格。
在本練習(xí)中李丰,您將創(chuàng)建一個具有兩種不同項目風(fēng)格的Android應(yīng)用程序苦锨,稱為prod和mock。
模擬版本定義與prod版本不同的資源趴泌。在第一個示例中舟舒, folder/project的strings.xml
文件被覆蓋。構(gòu)建變體是通過Build Variants view定義的嗜憔。
3.1 創(chuàng)建一個新的Android應(yīng)用程序秃励。
使用Empty Activity模板和頂級包創(chuàng)建一個新項目com.vogella.android.gradlebuildflavors
。
在app / build.gradle
文件中定義兩個額外的產(chǎn)品flavor吉捶,稱為“prod”和“mock”夺鲜。
apply plugin: 'com.android.application'
android {
//...
productFlavors {
prod {
applicationId = "com.vogella.android.gradlebuildflavors.prod"
versionName = "1.0-paid"
}
mock {
applicationId = "com.vogella.android.gradlebuildflavors.mock"
versionName = "1.0-free"
}
}
}
為產(chǎn)品和模擬flavors創(chuàng)建所需的文件夾結(jié)構(gòu)皆尔。
將strings.xml從主文件夾復(fù)制到flavor的相應(yīng)文件夾。
hello_world
將strings.xml
的字符串更改為Mock World币励!和產(chǎn)世界慷蠕!So....
<resources>
<string name="app_name">Flavor</string>
<string name="hello_world">Mock World! </string>
</resources>
<resources>
<string name="app_name">Flavor</string>
<string name="hello_world">Prod World! </string>
</resources>
3.2 驗證
在Android Studio 的Build Variants view中選擇mockDebug“ 構(gòu)建變體”,并運行你的應(yīng)用程序榄审。
如果你啟動應(yīng)用程序砌们,你應(yīng)該看到從模擬的flavor的string。現(xiàn)在選擇你的flavor 啟動它搁进,你應(yīng)該看到另一個string浪感。
3.3 通過Gradle命令行構(gòu)建
使用該./gradlew build
命令構(gòu)建您的所有產(chǎn)品flavor。
3.4 準(zhǔn)備您的應(yīng)用程序測試與Gradle flavor饼问。
ShareIntentBuilder
通過使用以下代碼的靜態(tài)方法創(chuàng)建一個通過“share intent”啟動活動的類影兽。
import android.content.Context;
import android.content.Intent;
public class ShareIntentBuilder {
public static void startSendActivity(Context context, String title, String body) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TITLE, title);
intent.putExtra(Intent.EXTRA_TEXT, body);
intent.setType("text/plain");
Intent chooserIntent = Intent.createChooser(intent, context.getResources().getText(R.string.share));
chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(chooserIntent);
}
3.5 為您的口味實現(xiàn)不同的MainActivity版本。
允許觸發(fā)此意圖的活動在您的“mock” flavor中被替換莱革。如果選擇了“mock”峻堰,則在應(yīng)用程序中啟動顯示發(fā)送數(shù)據(jù)的第二個活動。如果選擇flavor “prod”盅视,則發(fā)送shared intent捐名。
- 自定義Gradle構(gòu)建
4.1 重命名輸出apk。
apply plugin: 'com.android.application'
android {
// more
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
def file = output.outputFile
def filename = file.name.replace("app", "lars")
output.outputFile = new File(file.parent, filename)
}
}
// more
}
4.2 為調(diào)試版本指定不同的密鑰庫闹击。
您可以在build.gradle文件中定義密鑰庫镶蹋。
例如,您可以重新定義調(diào)試變量的密鑰庫:
android {
signingConfigs {
debug {
storeFile file("your.keystore")
}
}
}
- 將使用Eclipse創(chuàng)建的Android項目遷移到Gradle
5.1 將基于Eclipse的Android項目導(dǎo)入到Android Studio中赏半。
Android項目有兩種不同的配置贺归。第一套項目使用Eclipse ADT工具使用的遺留項目結(jié)構(gòu),直到2013年使用断箫。第二套項目使用新的Gradle構(gòu)建結(jié)構(gòu)拂酣。Gradle可以配置為支持兩種格式,Eclipse項目結(jié)構(gòu)和Gradle項目結(jié)構(gòu)仲义。
一旦你添加一個有效的Gradle 文件到你的基于Eclipse的Android項目婶熬,你可以將其導(dǎo)入到Android Studio中,通過File Import Project埃撵,并通過與Gradle 中選擇項目文件夾中建立文件赵颅。
5.2 為您的基于Eclipse的Android項目添加一個Gradle文件。
要啟用基于Eclipse的Android項目的Gradle構(gòu)建盯另,將以下build.gradle添加到項目的根目錄中性含。
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0-beta3'
}
}
apply plugin: 'com.android.application'
android {
lintOptions {
abortOnError false
}
compileSdkVersion 22
buildToolsVersion "21.1.2"
defaultConfig {
targetSdkVersion 22
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
}
1.構(gòu)建Android應(yīng)用程序的Gradle。
1.1 使用Gradle Android應(yīng)用程序鸳惯。
默認(rèn)情況下商蕴,Android項目由Gradle構(gòu)建系統(tǒng)處理叠萍。如果你在Android studio中創(chuàng)建一個新項目,則會自動創(chuàng)建Gradle構(gòu)建腳本绪商。Android Studio提供了Gradle運行時苛谷,因此不需要額外的安裝。
如果你按下Android Studio中的run
按鈕格郁,則會觸發(fā)相應(yīng)的Gradle任務(wù)并啟動應(yīng)用程序腹殿。
你也可以通過命令行運行Gradle。為了避免不必要的本地安裝例书,Gradle提供了一個包裝器腳本锣尉,允許您在沒有任何本地安裝的情況下運行Gradle。
1.2 從源代碼到Android應(yīng)用程序的轉(zhuǎn)換過程决采。
Java源代碼文件由Java編譯器轉(zhuǎn)換為Java類文件自沧。Android SDK包含一個名為dx的工具,它將Java類文件轉(zhuǎn)換為.dex(Dalvik Executable)文件树瞭。應(yīng)用程序的所有類文件都放在此.dex
文件中拇厢。在此轉(zhuǎn)換過程中,類文件中的冗余信息在.dex文件中進行優(yōu)化晒喷。例如孝偎,如果String在不同的類文件中找到相同的文件,則.dex文件只包含一個引用String凉敲。
因此衣盾,這些.dex
文件的大小要比相應(yīng)的類文件小得多。
該.DEX文件和其他資源荡陷,例如圖像和XML文件雨效,被打包成一個apk文件(Android Package的)文件迅涮。程序aapt
(Android資產(chǎn)打包工具)執(zhí)行此步驟废赞。
所得的```.apk````文件包含運行Android應(yīng)用程序的所有必要數(shù)據(jù),并可通過adb工具部署到Android設(shè)備叮姑。
從Android 5.0起唉地,Android RunTime(ART)被用作所有Android應(yīng)用的運行時。ART采用“時尚之都”和“時尚_匯編”的組合传透。在Android設(shè)備上安裝應(yīng)用程序期間耘沼,將應(yīng)用程序代碼轉(zhuǎn)換為機器代碼。
該dex2oat工具使用Android工具鏈創(chuàng)建的.dex
文件朱盐,并將其編譯為可執(zhí)行和可鏈接格式(ELF文件)群嗤。該文件包含dex代碼,編譯的本地代碼和元數(shù)據(jù)兵琳。保持.dex
代碼允許現(xiàn)有的工具仍然可以工作狂秘。
1.3 在命令行中使用Gradle骇径。
Gradle構(gòu)建系統(tǒng)旨在支持創(chuàng)建Android應(yīng)用程序時的復(fù)雜場景:
1)多分銷:同一應(yīng)用程序必須為幾個客戶或公司定制
2)Multi-apk:支持為不同設(shè)備類型創(chuàng)建多個apk,同時重用部分代碼
你可以通過命令行啟動Gradle構(gòu)建者春。以下是Android Gradle重要任務(wù)的概述:
表1. Android Gradle構(gòu)建目標(biāo)
命令 描述
./gradlew build
構(gòu)建項目破衔,運行組合和檢查任務(wù)
./gradlew clean build
從零開始構(gòu)建項目
./gradlew clean build
從零開始構(gòu)建項目
./gradlew test
運行測試
./gradlew connectedAndroidTest
運行儀器測試
要查看所有可用任務(wù),請使用gradlew wrapper命令钱烟。
gradle build
# alternatively speedup second grandle build by holding it in memory
# gradle build --daemon
此命令將創(chuàng)建構(gòu)建文件夾中的搖籃構(gòu)建的輸出晰筛。默認(rèn)情況下,Gradle構(gòu)建在build / outputs / apk文件夾中創(chuàng)建兩個.apk文件拴袭。
要在JVM上構(gòu)建和啟動單元測試读第,請使用以下命令。
gradle test
此命令將創(chuàng)建構(gòu)建文件夾中的搖籃構(gòu)建的輸出拥刻。默認(rèn)情況下卦方,Gradle構(gòu)建在build / outputs / apk文件夾中創(chuàng)建兩個.apk文件。
要在JVM上構(gòu)建和啟動單元測試泰佳,請使用以下命令盼砍。
gradle connectedCheck
要在Android設(shè)備上構(gòu)建和啟動儀器化測試,請使用以下命令逝她。
gradle connectedCheck
1.4 通過資源縮小來刪除未使用的資源和Java類浇坐。
用于Android的Gradle構(gòu)建系統(tǒng)支持在構(gòu)建時縮小資源。這將自動從打包的應(yīng)用程序中刪除未使用的資源黔宛。除此之外近刘,還可以從你所依賴的庫中刪除不必要的資源。這可以大大減少你的應(yīng)用程序的大小臀晃。
要使資源縮小觉渴,請更新你的構(gòu)建文件,類似于以下代碼段徽惋。
android {
...
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
1.5 定義依賴關(guān)系并保留外部版本案淋。
一個很好的做法是在依賴關(guān)系之外定義庫依賴的版本,以便更好的維護险绘。
ext {
// App 依賴
junitVersion = '4.12'
mockitoVersion = '1.10.19'
powerMockito = '1.6.2'
hamcrestVersion = '1.3'
}
dependencies {
// 單元測試依靠
testCompile "junit:junit:$junitVersion"
testCompile "org.mockito:mockito-all:$mockitoVersion"
testCompile "org.hamcrest:hamcrest-all:$hamcrestVersion"
testCompile "org.powermock:powermock-module-junit4:$powerMockito"
testCompile "org.powermock:powermock-api-mockito:$ext.powerMockito"
}
2.1 構(gòu)建類型并構(gòu)建風(fēng)格踢京。
Android默認(rèn)使用兩種構(gòu)建類型:調(diào)試和釋放。對于這些構(gòu)建類型宦棺,你可以在Gradle構(gòu)建中創(chuàng)建不同的風(fēng)格瓣距。
Gradle構(gòu)建系統(tǒng)還能夠管理不同風(fēng)格的應(yīng)用程序。產(chǎn)品風(fēng)味定義了應(yīng)用程序的定制版本代咸。這允許代碼庫的某些部分或資源對于應(yīng)用程序的變體而有所不同蹈丸。
例如,你可以為某些設(shè)備類別(如手機或平板電腦)定義不同的構(gòu)建版本。另一個用例可能是您的應(yīng)用的付費或免費版本逻杖】或者您想在測試運行期間使用不同的資源或類。
2.2 在你的Gradle構(gòu)建文件中定義產(chǎn)品風(fēng)格弧腥。
你可以使用 productFlavors關(guān)閉app / build.gradle文件來定義產(chǎn)品的不同變體厦取。
productFlavors {
prod {
applicationId = "com.vogella.android.gradlebuildflavors.prod"
versionName = "1.0-paid"
}
mock {
applicationId = "com.vogella.android.gradlebuildflavors.mock"
versionName = "1.0-free"
}
}
整個build.gradle文件可能如下所示:
apply plugin: 'com.android.application'
android {
// ....
productFlavors {
prod {
applicationId = "com.sangmsen.android.gradlebuildflavors.prod"
versionName = "1.0-paid"
}
mock {
applicationId = "com.sangmesen.android.gradlebuildflavors.mock"
versionName = "1.0-free"
}
}
}
// ...
定義這些flavor之后,您可以在Android Studio 的“ 構(gòu)建變體”視圖中選擇它們管搪。
2.3 為flavor提供不同的資源
為了為某種風(fēng)格定義不同的行為虾攻,您需要為app / src /
下定義的風(fēng)格創(chuàng)建合適的文件夾。
flavor特定資源將覆蓋主要資源更鲁。例如霎箍,如果你在一個風(fēng)味中提供了不同的應(yīng)用程序圖標(biāo),Android構(gòu)建系統(tǒng)就會獲得特定的風(fēng)格。
2.4 為 app的flavor提供不同的來源集。
src /文件夾中的目錄稱為源集诸典。每個產(chǎn)品的flavor都可以定義自己的源集。
代碼文件不被替換為資源顶别,它們被組合。例如拒啰,你不能com.example.MainActivity
在你的app / main / java /
文件夾中有一個 活動驯绎,另外一個不同的實現(xiàn)是另外一種。如果您嘗試這樣做谋旦,你將收到有關(guān)重復(fù)類定義的錯誤消息剩失。
你仍然可以通過避免在主源文件夾中創(chuàng)建類來提供不同的實現(xiàn),而在每種風(fēng)格中創(chuàng)建一個類册着。
3.可選練習(xí):為應(yīng)用程序使用不同的產(chǎn)品風(fēng)格拴孤。
在本練習(xí)中,您將創(chuàng)建一個具有兩種不同項目風(fēng)格的Android應(yīng)用程序甲捏,稱為prod和mock演熟。
模擬版本定義與prod版本不同的資源。在第一個示例中摊鸡, folder/project的strings.xml
文件被覆蓋绽媒。構(gòu)建變體是通過Build Variants view定義的蚕冬。
3.1 創(chuàng)建一個新的Android應(yīng)用程序免猾。
使用Empty Activity模板和頂級包創(chuàng)建一個新項目com.sangmsen.android.gradlebuildflavors
。
在app / build.gradle
文件中定義兩個額外的產(chǎn)品flavor囤热,稱為“prod”和“mock”猎提。
apply plugin: 'com.android.application'
android {
//...
productFlavors {
prod {
applicationId = "com.sangmsen.android.gradlebuildflavors.prod"
versionName = "1.0-paid"
}
mock {
applicationId = "com.sangmsen.android.gradlebuildflavors.mock"
versionName = "1.0-free"
}
}
}
為產(chǎn)品和模擬flavors創(chuàng)建所需的文件夾結(jié)構(gòu)。
將strings.xml從主文件夾復(fù)制到flavor的相應(yīng)文件夾。
hello_world
將strings.xml
的字符串更改為Mock World锨苏!和產(chǎn)世界疙教!So....
<resources>
<string name="app_name">Flavor</string>
<string name="hello_world">Mock World! </string>
</resources>
<resources>
<string name="app_name">Flavor</string>
<string name="hello_world">Prod World! </string>
</resources>
3.2 驗證
在Android Studio 的Build Variants view中選擇mockDebug“ 構(gòu)建變體”,并運行你的應(yīng)用程序伞租。
如果你啟動應(yīng)用程序贞谓,你應(yīng)該看到從模擬的flavor的string。現(xiàn)在選擇你的flavor 啟動它葵诈,你應(yīng)該看到另一個字符串裸弦。
3.3 通過Gradle命令行構(gòu)建
使用該./gradlew build
命令構(gòu)建您的所有產(chǎn)品口味。
3.4 準(zhǔn)備您的應(yīng)用程序測試與Gradle flavor作喘。
ShareIntentBuilder
通過使用以下代碼的靜態(tài)方法創(chuàng)建一個通過“share intent”啟動活動的類理疙。
import android.content.Context;
import android.content.Intent;
public class ShareIntentBuilder {
public static void startSendActivity(Context context, String title, String body) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TITLE, title);
intent.putExtra(Intent.EXTRA_TEXT, body);
intent.setType("text/plain");
Intent chooserIntent = Intent.createChooser(intent, context.getResources().getText(R.string.share));
chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(chooserIntent);
}
3.5 為您的口味實現(xiàn)不同的MainActivity版本。
允許觸發(fā)此意圖的活動在您的“mock” flavor中被替換泞坦。如果選擇了“mock”窖贤,則在應(yīng)用程序中啟動顯示發(fā)送數(shù)據(jù)的第二個活動。如果選擇flavor “prod”贰锁,則發(fā)送shared intent赃梧。
- 自定義Gradle構(gòu)建
4.1 重命名輸出apk。
apply plugin: 'com.android.application'
android {
// more
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
def file = output.outputFile
def filename = file.name.replace("app", "lars")
output.outputFile = new File(file.parent, filename)
}
}
// more
}
4.2 為調(diào)試版本指定不同的密鑰庫豌熄。
您可以在build.gradle文件中定義密鑰庫槽奕。
例如,您可以重新定義調(diào)試變量的密鑰庫:
android {
signingConfigs {
debug {
storeFile file("your.keystore")
}
}
}
- 將使用Eclipse創(chuàng)建的Android項目遷移到Gradle
5.1 將基于Eclipse的Android項目導(dǎo)入到Android Studio中房轿。
Android項目有兩種不同的配置粤攒。第一套項目使用Eclipse ADT工具使用的遺留項目結(jié)構(gòu),直到2013年使用囱持。第二套項目使用新的Gradle構(gòu)建結(jié)構(gòu)夯接。Gradle可以配置為支持兩種格式,Eclipse項目結(jié)構(gòu)和Gradle項目結(jié)構(gòu)纷妆。
一旦你添加一個有效的Gradle 文件到你的基于Eclipse的Android項目盔几,你可以將其導(dǎo)入到Android Studio中,通過File Import Project掩幢,并通過與Gradle 中選擇項目文件夾中建立文件逊拍。
5.2 為您的基于Eclipse的Android項目添加一個Gradle文件。
要啟用基于Eclipse的Android項目的Gradle構(gòu)建际邻,將以下build.gradle添加到項目的根目錄中芯丧。
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0-beta3'
}
}
apply plugin: 'com.android.application'
android {
lintOptions {
abortOnError false
}
compileSdkVersion 22
buildToolsVersion "21.1.2"
defaultConfig {
targetSdkVersion 22
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
}