Android Gradle使用詳解(一)--設置applicationId

前言:在讀完Android Gradle使用技巧-gradle使用詳細介紹後,大家對Android Gradle已經有了整體的瞭解,接下來,我們開始詳細的瞭解gradle的每一個部分;

每個 Android 應用均有一個唯一的應用 ID,像 Java 軟件包名稱一樣,例如 com.example.myapp。此 ID 可以在設備上和 Google Play 商店中對您的應用進行唯一標識。如果您要上傳新版本的應用,應用 ID(以及用於爲其簽名的證書)必須與原始 APK 相同。如果您更改了應用 ID,Google Play 商店會將該 APK 視爲完全不同的應用。因此,發佈您的應用後,絕不應更改應用 ID。

您的應用 ID 通過模塊的 build.gradle 文件中的 applicationId 屬性定義,如下所示:

android {
        defaultConfig {
            applicationId "com.example.myapp"
            minSdkVersion 15
            targetSdkVersion 24
            versionCode 1
            versionName "1.0"
        }
        ...
    }
    

當您在 Android Studio 中創建新項目時,applicationId 與您在設置期間選擇的 Java 樣式軟件包名稱完全一致。不過,除了這一點,應用 ID 和軟件包名稱彼此無關。您可以更改代碼的軟件包名稱(代碼命名空間),這不會影響應用 ID,反之亦然。不過,更改軟件包名稱會產生其他影響,您應瞭解這一點,詳情參考下文;
雖然應用 ID 看起來就像傳統的 Java 軟件包名稱一樣,但應用 ID 的命名規則限制性更強一些:

  • 必須至少包含兩段(一個或多個圓點)。
  • 每段必須以字母開頭。
  • 所有字符必須爲字母、數字或下劃線 [a-zA-Z0-9_]。

注意:應用 ID 過去直接關聯到代碼的軟件包名稱;所以,有些 Android API 會在其方法名稱和參數名稱中使用“package name”一詞,但這實際上是您的應用 ID。例如,Context.getPackageName() 方法會返回您的應用 ID。無論何時都不需要在應用代碼以外分享代碼的真實軟件包名稱。

更改用於構建變體的應用 ID

當您爲應用構建 APK 時,構建工具會使用 build.gradle 文件的 defaultConfig 塊中定義的應用 ID 標記 APK(如下所示)。不過,如果您要創建不同版本的應用,讓其在 Google Play 商店中顯示爲單獨的詳情(如“free”和“pro”版本),則需要創建單獨的構建變體,這些變體各自具有不同的應用 ID。

在這種情況下,每個構建變體應定義爲單獨的產品變種。對於 productFlavors 塊中的每個變種,您可以重新定義 applicationId 屬性,也可以使用 applicationIdSuffix 在默認的應用 ID 上追加一段,如下所示:

android {
        defaultConfig {
            applicationId "com.example.myapp"
        }
        productFlavors {
            free {
                applicationIdSuffix ".free"
            }
            pro {
                applicationIdSuffix ".pro"
            }
        }
    }
    

這樣,“free”產品變種的應用 ID 就是“com.example.myapp.free”。

您也可以根據自己的構建類型使用 applicationIdSuffix 追加一段,如下所示:

android {
        ...
        buildTypes {
            debug {
                applicationIdSuffix ".debug"
            }
        }
    }
    

由於 Gradle 會在產品變種後面應用構建類型配置,因此“free debug”構建變體的應用 ID 現在是“com.example.myapp.free.debug”。如果您希望同一設備上同時具有調試版本和發佈版本,這會很有用,因爲兩個 APK 不能具有相同的應用 ID。

注意:爲了與以前的 SDK 工具兼容,如果您未在 build.gradle 文件中定義 applicationId 屬性,構建工具會將 AndroidManifest.xml 文件中的軟件包名稱用作應用 ID。在這種情況下,重構您的軟件包名稱也會更改您的應用 ID

將構建變量注入清單

如果您需要將變量插入在 build.gradle 文件中定義的 AndroidManifest.xml 文件,則可以使用 manifestPlaceholders 屬性來執行此操作。此屬性採用鍵值對的映射,如下所示:

android {
        defaultConfig {
            manifestPlaceholders = [hostName:"www.example.com"]
        }
        ...
    }
    

然後,您可以將某個佔位符作爲屬性值插入清單文件,如下所示:

<intent-filter ... >
        <data android:scheme="http" android:host="${hostName}" ... />
        ...
    </intent-filter>
    

默認情況下,構建工具還會在 ${applicationId} 佔位符中提供應用的應用 ID。該值始終與當前編譯的最終應用 ID(包括編譯變體的應用 ID 更改)一致。當您要對標識符(如 intent 操作)使用唯一的命名空間時,這很有用,即使要求在編譯變體之間保持唯一性,這也很有用。

例如,如果您的 build.gradle 文件如下所示:

android {
        defaultConfig {
            applicationId "com.example.myapp"
        }
        productFlavors {
            free {
                applicationIdSuffix ".free"
            }
            pro {
                applicationIdSuffix ".pro"
            }
        }
    }
    

那麼,您可以按如下方式將應用 ID 插入清單:

<intent-filter ... >
        <action android:name="${applicationId}.TRANSMOGRIFY" />
        ...
    </intent-filter>
    

當您構建“free”產品變種時,清單結果如下所示:

<intent-filter ... >
       <action android:name="com.example.myapp.free.TRANSMOGRIFY" />
        ...
    </intent-filter>
    

更改軟件包名稱

默認情況下,項目的軟件包名稱與應用 ID 匹配,但您可以更改軟件包名稱。不過,如果您要更改軟件包名稱,需要注意的是,軟件包名稱(由項目目錄結構定義)應始終與 AndroidManifest.xml 文件中的 package 屬性匹配,如下所示

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp"
        android:versionCode="1"
        android:versionName="1.0" >
    

Android 構建工具使用 package 屬性來發揮兩種作用:

  • 它將此名稱用作應用生成的 R.java 類的命名空間。
    示例:對於上面的清單,R 類將爲 com.example.myapp.R。

  • 它會使用此名稱解析清單文件中聲明的任何相關類名。
    示例:對於上面的清單,聲明爲 的 Activity 將解析爲 com.example.myapp.MainActivity。

因此,package 屬性中的名稱應始終與項目的基礎軟件包名稱匹配,基礎軟件包中保存着您的 Activity 及其他應用代碼。當然,您的項目中可以包含子軟件包,但是這些文件必須從 package 屬性導入使用命名空間的 R.java 類,而且清單中聲明的任何應用組件都必須添加缺失的子軟件包名稱。
如果您要完全重構您的軟件包名稱,請確保也更新 package 屬性。只要您使用 Android Studio 的工具重命名和重構您的軟件包,那麼這些屬性就會自動保持同步。(如果它們未保持同步,您的應用代碼將無法解析 R 類,因爲它不再位於同一軟件包中,並且清單無法識別您的 Activity 或其他組件。)

注意:您必須始終在項目的主 AndroidManifest.xml 文件中指定 package 屬性。如果您有其他清單文件(如產品變種或構建類型的清單文件),請注意,優先級最高的清單文件提供的軟件包名稱始終用於最終合併的清單。

還有一點需要了解:雖然清單 package 和 Gradle applicationId 可以具有不同的名稱,但構建工具會在構建結束時將應用 ID 複製到 APK 的最終清單文件中。所以,如果您在構建後檢查 AndroidManifest.xml 文件,發現 package 屬性發生更改就不足爲奇了。實際上,Google Play 商店和 Android 平臺會查看 package 屬性來識別您的應用。所以,構建系統利用原始值(設置 R 類的命名空間並解析清單類名稱)後,它會捨棄該值並將其替換爲應用 ID。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章