Android軟件中g(shù)radle的配置

gradle.png

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)建變體”視圖中選擇它們。

1.PNG

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)。


2.PNG

將strings.xml從主文件夾復(fù)制到flavor的相應(yīng)文件夾。

hello_worldstrings.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>
...1.PNG

3.2 驗(yàn)證
在Android Studio 的Build Variants view中選擇mockDebug“ 構(gòu)建變體”,并運(yùn)行你的應(yīng)用程序。

....PNG

如果你啟動(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。

  1. 自定義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")
        }
    }
}
  1. 將使用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)建變體”視圖中選擇它們。

1.PNG

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)。


2.PNG

將strings.xml從主文件夾復(fù)制到flavor的相應(yīng)文件夾。

hello_worldstrings.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>
...1.PNG

3.2 驗(yàn)證
在Android Studio 的Build Variants view中選擇mockDebug“ 構(gòu)建變體”,并運(yùn)行你的應(yīng)用程序。

....PNG

如果你啟動(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。

  1. 自定義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")
        }
    }
}
  1. 將使用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')
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容