[android] 使用Build Flavors - 正確構建源文件夾和build.gradle


2 Answers

Android上的“產品風味”

我有時被問及如何處理不同的主機,圖標甚至軟件包名稱,並在同一應用程序的不同版本上取消。

有很多原因可以做到這一點,還有一個簡單的方法:產品風味。

你可以在你的build.gradle腳本中定義我之前描述過的這些東西。

產品口味本文的一部分是關於產品口味的書面思考,那麼它們是什麼? 關於Android文檔:

產品口味定義了項目構建的應用程序的定製版本。 一個項目可以有不同的風格來改變生成的應用程序。

你怎麼定義它們? 你必須在你想要定義的風格上編寫你的build.gradle:

productFlavors {  
        ...
        devel {
            ...
        }

        prod {
            ...
        }
    }

現在,我們將有兩種不同的應用程序。 您也可以在Build Variants選項卡中的Android Studio上查看它

構建變體

多個包名稱

如果你想在你的手機上安裝一個開發狀態的應用程序和一個用於生產狀態的應用程序,該怎麼辦 正如你可能知道的那樣,你只能安裝一個具有相同包名的應用程序(如果你嘗試安裝一些與你手機上安裝的APK相同的新APK,它會嘗試更新它)。

您唯一需要做的就是在每種產品口味上定義它:

android {  
    productFlavors {
        devel {
            applicationId "zuul.com.android.devel"
        }
        prod {
            applicationId "zuul.com.android"
        }
    }
}

根據風味發送請求到多個主機像以前一樣,您必須在產品風格配置字段中包含一些參數。

android {  
    productFlavors {
        devel {
            applicationId "zuul.com.android.devel"
            buildConfigField 'String', 'HOST', '"http://192.168.1.34:3000"'

        }

        prod {
            applicationId "zuul.com.android"
               buildConfigField 'String', 'HOST', '"http://api.zuul.com"'

        }
    }
}

作為一個例子,我們將嘗試向您展示如何將此與Retrofit集成,以將請求發送到合適的服務器,而無需處理您指定的服務器以及基於風格。 在這種情況下,這是Zuul android應用的摘錄:

public class RetrofitModule {

    public ZuulService getRestAdapter() {
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(BuildConfig.HOST)
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .build();
        return restAdapter.create(ZuulService.class);
    }

}

正如你所看到的,你只需要使用BuildConfigclass來訪問你剛定義的變量。

通過代碼提供的任何變量HOST變量不是您可以在代碼中公開的唯一變量。 你可以用你想做的任何事情做到這一點:

prod {  
    applicationId "zuul.com.android"
    buildConfigField 'String', 'HOST', '"http://api.zuul.com"'
    buildConfigField 'String', 'FLAVOR', '"prod"'
    buildConfigField "boolean", "REPORT_CRASHES", "true"
}

你可以如下訪問它們:

BuildConfig.HOST  
BuildConfig.FLAVOR  
BuildConfig.REPORT_CRASHES  

每種風味的不同圖標如果你想每種風味有不同的圖標,所以你可以直觀地檢測到你打開的是哪一個(你可以用名字來做它......但它不適合這個空間!),你只需要為每種風味定義新的目錄結構。

在我剛剛使用的例子中,有兩種​​口味:devel和prod。 然後,我們可以定義兩個新的目錄結構,以便我們可以定義我們想要的資源:

結構體

這適用於其他類型的資源,如strings.xml, integers.xml, arrays.xml等。

配置簽名設置

使用Gradle構建配置為您的發布構建類型手動配置簽名配置:

1.創建一個密鑰庫。 密鑰庫是一個包含一組私鑰的二進製文件。 您必須將您的密鑰庫保存在安全可靠的地方。 2.創建一個私鑰。 私鑰表示要與應用標識的實體,例如個人或公司。 3.將簽名配置添加到模塊級build.gradle文件中:

android {
...
defaultConfig {...}
signingConfigs {
    release {
        storeFile file("myreleasekey.keystore")
        storePassword "password"
        keyAlias "MyReleaseKey"
        keyPassword "password"
    }
}
buildTypes {
    release {
        ...
        signingConfig signingConfigs.release
    }
}

}

生成已簽名的APK:

要生成已簽名的APK,請從主菜單中選擇“生成”>“生成已簽名的APK”。 app / build / apk / app-release.apk中的包現在使用您的發行版密鑰進行簽名。

ref: https://developer.android.com/studio/build/build-variants.html#signing,http://blog.brainattica.com/how-to-work-with-flavours-on-android/https://developer.android.com/studio/build/build-variants.html#signing,http://blog.brainattica.com/how-to-work-with-flavours-on-android/https://developer.android.com/studio/build/build-variants.html#signing,http://blog.brainattica.com/how-to-work-with-flavours-on-android/

Question

請注意:在Xavier的答案後編輯的答案

我正嘗試在Android Studio中為一個相同的應用程序項目使用不同的Build Flavors 。 但是,我似乎有一個可怕的時間配置它適當地工作。

腳步:

  1. 創建一個名為'Test'的新的Android Studio項目。
  2. 打開build.gradle *並添加以下幾行:

    productFlavors {
    flavor1 {
        packageName 'com.android.studio.test.flavor1'
        }
    flavor2 {
        packageName 'com.android.studio.test.flavor2'
        }
    }
    
  3. 重新啟動Android Studio後,我現在可以在Build Variants部分下看到4個構建變體。 這意味著我們迄今為止在產品口味方面取得了成功。 **
  4. flavor1創建一個新的Source文件夾; 然而,我不確定我是否以正確的方式進行。 以下是我的做法:

    • 請記住,我的這個項目的包名是: com.foo.test
    • 右鍵單擊src文件夾,對於flavor1,我實際上在explorer中創建了單個文件夾,結構為src/flavor1/java/com/foo/test/MainActivity.java
    • 以上運行良好,因為'java'文件夾是藍色的 ,這意味著IDE知道它是一個活動的源目錄。 此外,該包已自動創建。 儘管如此,我還是發現了重複類的警告。 在這裡查看截圖。
    • 對於flavor2,我嘗試手動創建軟件包,但flavor2的'src'文件夾似乎不是藍色的,因此右擊時選項不同,並且'New Package'不可用於我。 在這裡看到圖片。
    • 請注意,對於flavor1,我還創建了一個'res'目錄,該目錄確實變成藍色,但是儘管如此,如果我想使用不同的方法,則無法創建Android資源文件或Andorid資源目錄為不同的口味提供餘地。

難道我做錯了什麼? 或者我錯過了什麼? 讓我知道你是否需要更多信息。

*我的項目似乎有兩個 build.gradle文件。 一個位於項目文件夾(\ GradleTest)的根目錄下,它是空的。 第二個位於\ GradleTest的子文件夾的根目錄,也標記為“GradleTest”(GradleTest-GradleTest),這是打開時已經有代碼的那個; 因此,那是我編輯的那個。

**我檢查了gradle設置,顯然使用自動導入 已經啟用。 儘管如此,修改build.gradle文件並不會自動更新構建變體。 注意:我也嘗試過使用Build - Rebuild Project和/或Build - Make Project,不使用。 我仍然必須關閉該項目,然後重新打開更改才能生效。




當我將項目遷移到Gradle時,我遇到了同樣的問題。 問題是,構建沒有找到適當的資源文件夾。 我通過在build.gradle中的android元素下添加它來修復它:

sourceSets {
        main {
            res.srcDirs = ['myProject/res']
        }
    }



在gradle中:

對於構建類型,您只需要:

buildTypes {
   release{
    //proguard, signing etc.
   }
   debug {
    //development
   }
  }
}

然後為口味添加你需要的口味

productFlavors {
    pro {
        applicationIdSuffix '.paid'
        buildConfigField 'boolean', 'PRO', 'true'
    }
    free {
        applicationIdSuffix '.free'
        buildConfigField 'boolean', 'PRO', 'false'
    }
}



Related