前言
大家可能會有類似這樣的需求:同一個APP釋出不同的版本,修改裡面的主題、icon、applicationId。這應該怎麼弄呢?很多同學都是重新check一份工程直接修改的。但其實是不必要的,android studio 的gradle就可以幫我們做到。
1、Build Variants(建構變量)
讓我們從一般的概念入手,建構變量。
gradle允許您定義多個建構變量定義的建構變體由一個特定的所有屬性生成類型加入到一個特定的所有屬性的 product flavors 裡面。
Build variants, build types, product flavors?雖然有點陌生,讓我們接下來一一了解一下。
a、build types
你已經在你的項目中使用了不同的建構類型。檢查您的應用程式的build.gradle檔案。一個名為:defaultConfig,當你建立一個新的項目自動設定了兩個build types (建構類型)debug和release。如圖所示:

image.png
是以這裡咱們是可以切換debug和release類型的。
2、Product Flavors(産品偏好)
對于每一個調試類型(debug/release),可以指定不同的内容,也就是product favours,例如,如果你希望你的程式有付費版本和免費版本,這個兩個(免費、付費)代表你應用程式的product flavors。
是以回到建構變量,這裡我們生成4個建構變量:
a、freeDebug
b、paidDebug
c、freeRelease
d、paidRelease
例子
現在我們看看如果實作product flavors。
首先你需要一個product flavors在你的項目的build.gradle檔案裡面。
app-gradle-and-product-flavors.png
如果“同步工程與gradle檔案”,
sync-project.png
那麼你就會看到新的 build variants(建構變體)。
all-build-variants.png
在這裡你可以添加特定于每個變體的屬性。
例如,如果你希望能在同一個裝置上安裝應用程式的兩種版本(免費、付費),或者你想在應用商店釋出他們2個,那麼你需要做的第一件事情就是來區分他們的包名。為此,你需要使用applicationId屬性。
productFlavors {
free{
applicationId "antoniocappiello.com.buildvariantsexample.free"
}
paid{
applicationId "antoniocappiello.com.buildvariantsexample.paid"
}
}
複制
Sync/Rebuild項目,以便使更改生效。
現在,你可以選擇freeDebug和paidDebug在建構變量面闆和裝置上運作他們。
之後,你就會在裝置上看到應用程式的兩種變體,但你仍無法辨認他們,因為缺少了相關屬性設定。
apps.png
一個快速的發放來區分是什麼呢?就是改變啟動圖示。建立新的src目錄,我們要區分product favours的名稱,例如“免費”,這個新的目錄也建立了"res/drawable"。而内繪制了一個新的圖示,在這個例子中我們使用了預設的啟動印有文字的“自由”。
launcher-free.png
通過重建,并再次運作這兩個變體,你将會看到裝置上有2個不同的應用程式。
launcher-2.png
在這裡,你可以設定更多的樣式屬性,例如“主題”、“部分文本的顔色”
更改顔色.png
更換文本.png
通過再次運作freeDebug變體和paidDebug變體,你就可以清楚的看到他們之間的差別。
對比.png
除了這些審美的變化,你可能還希望有不同的功能,以适于每種變體。一個簡單的方法來實作這一目标是通過将在運作時被讀取的product flavors配置中定義的變量。例如用EXTRA_FEATURE變量做如下補充,你可以在你的應用程式中使用if-else來做簡單的判斷。
productFlavors {
free{
applicationId "antoniocappiello.com.buildvariantsexample.free"
buildConfigField 'boolean', 'EXTRA_FEATURES', "false"
}
paid{
applicationId "antoniocappiello.com.buildvariantsexample.paid"
buildConfigField 'boolean', 'EXTRA_FEATURES', "true"
}
}
public class MainActivity extends AppCompatActivity {
private Toast basicToast;
private Toast coolToast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
basicToast = Toast.makeText(this, "This is just a free app",Toast.LENGTH_SHORT);
coolToast = Toast.makeText(this, "This is the paid app", Toast.LENGTH_SHORT);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
if(BuildConfig.EXTRA_FEATURES) {
executeCoolMethod();
}else {
executeBasicMethod();
}
}
});
}
private void executeBasicMethod() {
basicToast.show();
}
private void executeCoolMethod() {
coolToast.show();
}
}
複制
screen-shot-2015-10-21-at-23-48-34.png
當然你的代碼應該還會需要其他類型變量,如“字元串”,比如“BaseUrl”
android {
...
defaultConfig {
...
}
productFlavors {
free {
applicationId "yourpackagename.free"
buildConfigField 'boolean', 'EXTRA_FEATURES', "false"
buildConfigField 'String', 'BaseUrl', '"www.baidu.com"';
}
paid {
applicationId "yourpackagename.paid"
buildConfigField 'boolean', 'EXTRA_FEATURES', "true"
buildConfigField 'String', 'BaseUrl', '"www.google.com"';
}
}
}
複制
product flavors 有更多的屬性,這通常是結合defaultConfig的。你可能已經看到上面的gradle檔案裡面的元素了,當你建立一個新的項目時,這裡是自動建立的。
當你在productFlavors使用這些屬性時,他們将自動覆寫相同屬性的值defaultConfig元素。
你已經看到了applicationId屬性,它實際上市屬于defaultConfig的元素,但在上面的例子中,我們已經在我們的productFlavors覆寫它。
如果你有興趣了解更多的有關可用屬性的defaultConfig,那麼你可以在這裡閱讀官方文檔:
https://developer.android.com/studio/build/index.html .
總結到目前為止,你所學到的現在可以:
- 添加productFlavor配置您的gradle這個檔案;
- 覆寫現有的建構屬性,如的applicationID
- 像添加字元串和布爾自定義屬性;
- 安裝在一個裝置上相同的應用程式的兩個不同的建構變體;
- 自動改變的行為和你的應用程式從該是建立根據變種的外觀和感覺。