1.構(gòu)建Android應(yīng)用程序的Gradle。
1.1 使用Gradle Android應(yīng)用程序。
默認(rèn)情況下,Android項(xiàng)目由Gradle構(gòu)建系統(tǒng)處理。如果你在Android studio中創(chuàng)建一個(gè)新項(xiàng)目,則會(huì)自動(dòng)創(chuàng)建Gradle構(gòu)建腳本。Android Studio提供了Gradle運(yùn)行時(shí),因此不需要額外的安裝。
如果你按下Android Studio中的run
按鈕,則會(huì)觸發(fā)相應(yīng)的Gradle任務(wù)并啟動(dòng)應(yīng)用程序。
你也可以通過命令行運(yùn)行Gradle。為了避免不必要的本地安裝,Gradle提供了一個(gè)包裝器腳本,允許您在沒有任何本地安裝的情況下運(yùn)行Gradle。
1.2 從源代碼到Android應(yīng)用程序的轉(zhuǎn)換過程。
Java源代碼文件由Java編譯器轉(zhuǎn)換為Java類文件。Android SDK包含一個(gè)名為dx的工具,它將Java類文件轉(zhuǎn)換為.dex(Dalvik Executable)文件。應(yīng)用程序的所有類文件都放在此.dex
文件中。在此轉(zhuǎn)換過程中,類文件中的冗余信息在.dex文件中進(jìn)行優(yōu)化。例如,如果String在不同的類文件中找到相同的文件,則.dex文件只包含一個(gè)引用String。
因此,這些.dex
文件的大小要比相應(yīng)的類文件小得多。
該.DEX文件和其他資源,例如圖像和XML文件,被打包成一個(gè)apk文件(Android Package的)文件。程序aapt
(Android資產(chǎn)打包工具)執(zhí)行此步驟。
所得的.apk
文件包含運(yùn)行Android應(yīng)用程序的所有必要數(shù)據(jù),并可通過adb工具部署到Android設(shè)備。
從Android 5.0起,Android RunTime(ART)被用作所有Android應(yīng)用的運(yùn)行時(shí)。ART采用“時(shí)尚之都”和“時(shí)尚_匯編”的組合。在Android設(shè)備上安裝應(yīng)用程序期間,將應(yīng)用程序代碼轉(zhuǎn)換為機(jī)器代碼。
該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)用程序時(shí)的復(fù)雜場(chǎng)景:
1)多分銷:同一應(yīng)用程序必須為幾個(gè)客戶或公司定制
2)Multi-apk:支持為不同設(shè)備類型創(chuàng)建多個(gè)apk,同時(shí)重用部分代碼
你可以通過命令行啟動(dòng)Gradle構(gòu)建。以下是Android Gradle重要任務(wù)的概述:
表1. Android Gradle構(gòu)建目標(biāo)
命令 描述
./gradlew build
構(gòu)建項(xiàng)目,運(yùn)行組合和檢查任務(wù)
./gradlew clean build
從零開始構(gòu)建項(xiàng)目
./gradlew clean build
從零開始構(gòu)建項(xiàng)目
./gradlew test
運(yùn)行測(cè)試
./gradlew connectedAndroidTest
運(yùn)行儀器測(cè)試
要查看所有可用任務(wù),請(qǐng)使用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)建兩個(gè).apk文件。
要在JVM上構(gòu)建和啟動(dòng)單元測(cè)試,請(qǐng)使用以下命令。
gradle test
此命令將創(chuàng)建構(gòu)建文件夾中的搖籃構(gòu)建的輸出。默認(rèn)情況下,Gradle構(gòu)建在build / outputs / apk文件夾中創(chuàng)建兩個(gè).apk文件。
要在JVM上構(gòu)建和啟動(dòng)單元測(cè)試,請(qǐng)使用以下命令。
gradle connectedCheck
要在Android設(shè)備上構(gòu)建和啟動(dòng)儀器化測(cè)試,請(qǐng)使用以下命令。
gradle connectedCheck
1.4 通過資源縮小來刪除未使用的資源和Java類。
用于Android的Gradle構(gòu)建系統(tǒng)支持在構(gòu)建時(shí)縮小資源。這將自動(dòng)從打包的應(yīng)用程序中刪除未使用的資源。除此之外,還可以從你所依賴的庫(kù)中刪除不必要的資源。這可以大大減少你的應(yīng)用程序的大小。
要使資源縮小,請(qǐng)更新你的構(gòu)建文件,類似于以下代碼段。
android {
...
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
1.5 定義依賴關(guān)系并保留外部版本。
一個(gè)很好的做法是在依賴關(guān)系之外定義庫(kù)依賴的版本,以便更好的維護(hù)。
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)試和釋放。對(duì)于這些構(gòu)建類型,你可以在Gradle構(gòu)建中創(chuàng)建不同的風(fēng)格。
Gradle構(gòu)建系統(tǒng)還能夠管理不同風(fēng)格的應(yīng)用程序。產(chǎn)品風(fēng)味定義了應(yīng)用程序的定制版本。這允許代碼庫(kù)的某些部分或資源對(duì)于應(yīng)用程序的變體而有所不同。
例如,你可以為某些設(shè)備類別(如手機(jī)或平板電腦)定義不同的構(gòu)建版本。另一個(gè)用例可能是您的應(yīng)用的付費(fèi)或免費(fèi)版本。或者您想在測(cè)試運(yùn)行期間使用不同的資源或類。
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"
}
}
整個(gè)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)味特定資源將覆蓋主要資源。例如,如果您在一個(gè)風(fēng)味中提供了不同的應(yīng)用程序圖標(biāo),Android構(gòu)建系統(tǒng)就會(huì)獲得特定的風(fēng)格。
2.4 為 app的flavor提供不同的來源集。
src /文件夾中的目錄稱為源集。每個(gè)產(chǎn)品的味道都可以定義自己的源集。
代碼文件不被替換為資源,它們被組合。例如,你不能com.example.MainActivity
在你的app / main / java /
文件夾中有一個(gè) 活動(dòng),另外一個(gè)不同的實(shí)現(xiàn)是另外一種。如果您嘗試這樣做,您將收到有關(guān)重復(fù)類定義的錯(cuò)誤消息。
您仍然可以通過避免在主源文件夾中創(chuàng)建類來提供不同的實(shí)現(xiàn),而在每種風(fēng)格中創(chuàng)建一個(gè)類。
3.可選練習(xí):為應(yīng)用程序使用不同的產(chǎn)品風(fēng)格。
在本練習(xí)中,您將創(chuàng)建一個(gè)具有兩種不同項(xiàng)目風(fēng)格的Android應(yīng)用程序,稱為prod和mock。
模擬版本定義與prod版本不同的資源。在第一個(gè)示例中, folder/project的strings.xml
文件被覆蓋。構(gòu)建變體是通過Build Variants view定義的。
3.1 創(chuàng)建一個(gè)新的Android應(yīng)用程序。
使用Empty Activity模板和頂級(jí)包創(chuàng)建一個(gè)新項(xiàng)目com.vogella.android.gradlebuildflavors
。
在app / build.gradle
文件中定義兩個(gè)額外的產(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 驗(yàn)證
在Android Studio 的Build Variants view中選擇mockDebug“ 構(gòu)建變體”,并運(yùn)行你的應(yīng)用程序。
如果你啟動(dòng)應(yīng)用程序,你應(yīng)該看到從模擬的flavor的string。現(xiàn)在選擇你的flavor 啟動(dòng)它,你應(yīng)該看到另一個(gè)string。
3.3 通過Gradle命令行構(gòu)建
使用該./gradlew build
命令構(gòu)建您的所有產(chǎn)品flavor。
3.4 準(zhǔn)備您的應(yīng)用程序測(cè)試與Gradle flavor。
ShareIntentBuilder
通過使用以下代碼的靜態(tài)方法創(chuàng)建一個(gè)通過“share intent”啟動(dòng)活動(dòng)的類。
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 為您的口味實(shí)現(xiàn)不同的MainActivity版本。
允許觸發(fā)此意圖的活動(dòng)在您的“mock” flavor中被替換。如果選擇了“mock”,則在應(yīng)用程序中啟動(dòng)顯示發(fā)送數(shù)據(jù)的第二個(gè)活動(dòng)。如果選擇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)試版本指定不同的密鑰庫(kù)。
您可以在build.gradle文件中定義密鑰庫(kù)。
例如,您可以重新定義調(diào)試變量的密鑰庫(kù):
android {
signingConfigs {
debug {
storeFile file("your.keystore")
}
}
}
- 將使用Eclipse創(chuàng)建的Android項(xiàng)目遷移到Gradle
5.1 將基于Eclipse的Android項(xiàng)目導(dǎo)入到Android Studio中。
Android項(xiàng)目有兩種不同的配置。第一套項(xiàng)目使用Eclipse ADT工具使用的遺留項(xiàng)目結(jié)構(gòu),直到2013年使用。第二套項(xiàng)目使用新的Gradle構(gòu)建結(jié)構(gòu)。Gradle可以配置為支持兩種格式,Eclipse項(xiàng)目結(jié)構(gòu)和Gradle項(xiàng)目結(jié)構(gòu)。
一旦你添加一個(gè)有效的Gradle 文件到你的基于Eclipse的Android項(xiàng)目,你可以將其導(dǎo)入到Android Studio中,通過File Import Project,并通過與Gradle 中選擇項(xiàng)目文件夾中建立文件。
5.2 為您的基于Eclipse的Android項(xiàng)目添加一個(gè)Gradle文件。
要啟用基于Eclipse的Android項(xiàng)目的Gradle構(gòu)建,將以下build.gradle添加到項(xiàng)目的根目錄中。
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項(xiàng)目由Gradle構(gòu)建系統(tǒng)處理。如果你在Android studio中創(chuàng)建一個(gè)新項(xiàng)目,則會(huì)自動(dòng)創(chuàng)建Gradle構(gòu)建腳本。Android Studio提供了Gradle運(yùn)行時(shí),因此不需要額外的安裝。
如果你按下Android Studio中的run
按鈕,則會(huì)觸發(fā)相應(yīng)的Gradle任務(wù)并啟動(dòng)應(yīng)用程序。
你也可以通過命令行運(yùn)行Gradle。為了避免不必要的本地安裝,Gradle提供了一個(gè)包裝器腳本,允許您在沒有任何本地安裝的情況下運(yùn)行Gradle。
1.2 從源代碼到Android應(yīng)用程序的轉(zhuǎn)換過程。
Java源代碼文件由Java編譯器轉(zhuǎn)換為Java類文件。Android SDK包含一個(gè)名為dx的工具,它將Java類文件轉(zhuǎn)換為.dex(Dalvik Executable)文件。應(yīng)用程序的所有類文件都放在此.dex
文件中。在此轉(zhuǎn)換過程中,類文件中的冗余信息在.dex文件中進(jìn)行優(yōu)化。例如,如果String在不同的類文件中找到相同的文件,則.dex文件只包含一個(gè)引用String。
因此,這些.dex
文件的大小要比相應(yīng)的類文件小得多。
該.DEX文件和其他資源,例如圖像和XML文件,被打包成一個(gè)apk文件(Android Package的)文件。程序aapt
(Android資產(chǎn)打包工具)執(zhí)行此步驟。
所得的```.apk````文件包含運(yùn)行Android應(yīng)用程序的所有必要數(shù)據(jù),并可通過adb工具部署到Android設(shè)備。
從Android 5.0起,Android RunTime(ART)被用作所有Android應(yīng)用的運(yùn)行時(shí)。ART采用“時(shí)尚之都”和“時(shí)尚_匯編”的組合。在Android設(shè)備上安裝應(yīng)用程序期間,將應(yīng)用程序代碼轉(zhuǎn)換為機(jī)器代碼。
該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)用程序時(shí)的復(fù)雜場(chǎng)景:
1)多分銷:同一應(yīng)用程序必須為幾個(gè)客戶或公司定制
2)Multi-apk:支持為不同設(shè)備類型創(chuàng)建多個(gè)apk,同時(shí)重用部分代碼
你可以通過命令行啟動(dòng)Gradle構(gòu)建。以下是Android Gradle重要任務(wù)的概述:
表1. Android Gradle構(gòu)建目標(biāo)
命令 描述
./gradlew build
構(gòu)建項(xiàng)目,運(yùn)行組合和檢查任務(wù)
./gradlew clean build
從零開始構(gòu)建項(xiàng)目
./gradlew clean build
從零開始構(gòu)建項(xiàng)目
./gradlew test
運(yùn)行測(cè)試
./gradlew connectedAndroidTest
運(yùn)行儀器測(cè)試
要查看所有可用任務(wù),請(qǐng)使用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)建兩個(gè).apk文件。
要在JVM上構(gòu)建和啟動(dòng)單元測(cè)試,請(qǐng)使用以下命令。
gradle test
此命令將創(chuàng)建構(gòu)建文件夾中的搖籃構(gòu)建的輸出。默認(rèn)情況下,Gradle構(gòu)建在build / outputs / apk文件夾中創(chuàng)建兩個(gè).apk文件。
要在JVM上構(gòu)建和啟動(dòng)單元測(cè)試,請(qǐng)使用以下命令。
gradle connectedCheck
要在Android設(shè)備上構(gòu)建和啟動(dòng)儀器化測(cè)試,請(qǐng)使用以下命令。
gradle connectedCheck
1.4 通過資源縮小來刪除未使用的資源和Java類。
用于Android的Gradle構(gòu)建系統(tǒng)支持在構(gòu)建時(shí)縮小資源。這將自動(dòng)從打包的應(yīng)用程序中刪除未使用的資源。除此之外,還可以從你所依賴的庫(kù)中刪除不必要的資源。這可以大大減少你的應(yīng)用程序的大小。
要使資源縮小,請(qǐng)更新你的構(gòu)建文件,類似于以下代碼段。
android {
...
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
1.5 定義依賴關(guān)系并保留外部版本。
一個(gè)很好的做法是在依賴關(guān)系之外定義庫(kù)依賴的版本,以便更好的維護(hù)。
ext {
// App 依賴
junitVersion = '4.12'
mockitoVersion = '1.10.19'
powerMockito = '1.6.2'
hamcrestVersion = '1.3'
}
dependencies {
// 單元測(cè)試依靠
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)試和釋放。對(duì)于這些構(gòu)建類型,你可以在Gradle構(gòu)建中創(chuàng)建不同的風(fēng)格。
Gradle構(gòu)建系統(tǒng)還能夠管理不同風(fēng)格的應(yīng)用程序。產(chǎn)品風(fēng)味定義了應(yīng)用程序的定制版本。這允許代碼庫(kù)的某些部分或資源對(duì)于應(yīng)用程序的變體而有所不同。
例如,你可以為某些設(shè)備類別(如手機(jī)或平板電腦)定義不同的構(gòu)建版本。另一個(gè)用例可能是您的應(yīng)用的付費(fèi)或免費(fèi)版本。或者您想在測(cè)試運(yùn)行期間使用不同的資源或類。
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"
}
}
整個(gè)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特定資源將覆蓋主要資源。例如,如果你在一個(gè)風(fēng)味中提供了不同的應(yīng)用程序圖標(biāo),Android構(gòu)建系統(tǒng)就會(huì)獲得特定的風(fēng)格。
2.4 為 app的flavor提供不同的來源集。
src /文件夾中的目錄稱為源集。每個(gè)產(chǎn)品的flavor都可以定義自己的源集。
代碼文件不被替換為資源,它們被組合。例如,你不能com.example.MainActivity
在你的app / main / java /
文件夾中有一個(gè) 活動(dòng),另外一個(gè)不同的實(shí)現(xiàn)是另外一種。如果您嘗試這樣做,你將收到有關(guān)重復(fù)類定義的錯(cuò)誤消息。
你仍然可以通過避免在主源文件夾中創(chuàng)建類來提供不同的實(shí)現(xiàn),而在每種風(fēng)格中創(chuàng)建一個(gè)類。
3.可選練習(xí):為應(yīng)用程序使用不同的產(chǎn)品風(fēng)格。
在本練習(xí)中,您將創(chuàng)建一個(gè)具有兩種不同項(xiàng)目風(fēng)格的Android應(yīng)用程序,稱為prod和mock。
模擬版本定義與prod版本不同的資源。在第一個(gè)示例中, folder/project的strings.xml
文件被覆蓋。構(gòu)建變體是通過Build Variants view定義的。
3.1 創(chuàng)建一個(gè)新的Android應(yīng)用程序。
使用Empty Activity模板和頂級(jí)包創(chuàng)建一個(gè)新項(xiàng)目com.sangmsen.android.gradlebuildflavors
。
在app / build.gradle
文件中定義兩個(gè)額外的產(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 驗(yàn)證
在Android Studio 的Build Variants view中選擇mockDebug“ 構(gòu)建變體”,并運(yùn)行你的應(yīng)用程序。
如果你啟動(dòng)應(yīng)用程序,你應(yīng)該看到從模擬的flavor的string。現(xiàn)在選擇你的flavor 啟動(dòng)它,你應(yīng)該看到另一個(gè)字符串。
3.3 通過Gradle命令行構(gòu)建
使用該./gradlew build
命令構(gòu)建您的所有產(chǎn)品口味。
3.4 準(zhǔn)備您的應(yīng)用程序測(cè)試與Gradle flavor。
ShareIntentBuilder
通過使用以下代碼的靜態(tài)方法創(chuàng)建一個(gè)通過“share intent”啟動(dòng)活動(dòng)的類。
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 為您的口味實(shí)現(xiàn)不同的MainActivity版本。
允許觸發(fā)此意圖的活動(dòng)在您的“mock” flavor中被替換。如果選擇了“mock”,則在應(yīng)用程序中啟動(dòng)顯示發(fā)送數(shù)據(jù)的第二個(gè)活動(dòng)。如果選擇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)試版本指定不同的密鑰庫(kù)。
您可以在build.gradle文件中定義密鑰庫(kù)。
例如,您可以重新定義調(diào)試變量的密鑰庫(kù):
android {
signingConfigs {
debug {
storeFile file("your.keystore")
}
}
}
- 將使用Eclipse創(chuàng)建的Android項(xiàng)目遷移到Gradle
5.1 將基于Eclipse的Android項(xiàng)目導(dǎo)入到Android Studio中。
Android項(xiàng)目有兩種不同的配置。第一套項(xiàng)目使用Eclipse ADT工具使用的遺留項(xiàng)目結(jié)構(gòu),直到2013年使用。第二套項(xiàng)目使用新的Gradle構(gòu)建結(jié)構(gòu)。Gradle可以配置為支持兩種格式,Eclipse項(xiàng)目結(jié)構(gòu)和Gradle項(xiàng)目結(jié)構(gòu)。
一旦你添加一個(gè)有效的Gradle 文件到你的基于Eclipse的Android項(xiàng)目,你可以將其導(dǎo)入到Android Studio中,通過File Import Project,并通過與Gradle 中選擇項(xiàng)目文件夾中建立文件。
5.2 為您的基于Eclipse的Android項(xiàng)目添加一個(gè)Gradle文件。
要啟用基于Eclipse的Android項(xiàng)目的Gradle構(gòu)建,將以下build.gradle添加到項(xiàng)目的根目錄中。
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')
}
}