Android應用ID和包名關係

前言

情況是這樣的,我修改了項目包名和AndroidManifest.xml中的package,但是build.gradle文件裏的applicationId沒有修改。打完包之後,我使用Android Studio自帶的APK分析工具查看,發現配置文件裏的package變成了applicationId。包名還是原來的。 這就說明:項目包名可以改,因爲最後決定包名的還是applicationId。
由於全局修改包名,有些引用可能不存在需要手動改回來原來的,比如greendao生成的Dao文件,推送相關permission、uses-permission裏包名改成申請時填的applicationId等。

  • 一般情況
    包名和applicationId是一樣的,如果您在應用市場、微信開發者平臺、第三方推送服務平臺等發佈了您的應用,絕不應更改應用ID。更改應用Id意味着重新發佈一個新應用,所有的配置都需要設置新的。

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

  • AndroidManifest.xml中的package和和build.gradle的applicationId不一致
    清單 package 和 Gradle applicationId 可以具有不同的名稱,但構建工具會在構建結束時將應用 ID 複製到 APK 的最終清單文件中。

獲取應用id

  • Context#getPackageName()
  • Application#getApplicationInfo().packageName
  • Application#getApplicationInfo().processName

上面的方法都可以獲取applicationId.

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

將構建變量注入清單

${applicationId}

默認情況下,構建工具還會在 ${applicationId} 佔位符中提供應用的應用 ID。該值始終與當前編譯的最終應用 ID(包括編譯變體的應用 ID 更改)一致。

使用 manifestPlaceholders 屬性構建變量

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

在AndroidManifest.xml使用

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

配置構建變體

apk有debug版和release版,一款應用在谷歌商店可以同時存在免費版和收費版。
想一下:如何在一臺手機上安裝2個版本的包(如果只是網絡請求地址不同的話,寫一個暗口直接切換請求地址的baseUrl即可)?如何區分開收費版和免費版?
答案就是構建變體。

配置 Build 類型

    android {
        defaultConfig {
            manifestPlaceholders = [hostName:"www.example.com"]
            ...
        }
        buildTypes {
            release {
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }

            debug {
                applicationIdSuffix ".debug"
                debuggable true
            }

            /**
             * The `initWith` property allows you to copy configurations from other build types,
             * then configure only the settings you want to change. This one copies the debug build
             * type, and then changes the manifest placeholder and application ID.
             */
            staging {
                initWith debug
                manifestPlaceholders = [hostName:"internal.example.com"]
                applicationIdSuffix ".debugStaging"
            }
        }
    }
    

applicationIdSuffix ".debug"這一行即可實現一臺手機同時安裝debug和release包。 debug包打出來包名爲:${applicationId}.debug
staging模塊分析:initWith debug意思是複製debug標籤內的配置,然後再修改他的配置。
staging包打出來包名爲:${applicationId}.debugStaging

Google Play中的多APK分發

注意:要使用 Google Play 中的多 APK 支持分發您的應用,請將同一 applicationId 值分配給所有變體,併爲每個變體分配不同的 versionCode。要在 Google Play 中以獨立應用的形式分發應用的不同變體,您需要爲每個變體分配一個不同的 applicationId。

android {
        defaultConfig {
            applicationId "com.example.myapp"
        }
        //定義一個產品維度
        flavorDimensions "sample"
        //產品類型
        productFlavors {
            free {
                dimension "sample"
                applicationIdSuffix ".free"
                versionNameSuffix "-free"
            }
            pro {
                dimension "sample"
                applicationIdSuffix ".pro"
                versionNameSuffix "-pro"
            }
        }
    }
    

最後打出來的包就結合了productFlavors和buildTypes,舉個例子,打出的包名爲:
${applicationId}.pro.debug(即:com.example.myapp.pro.debug)

參考:https://developer.android.com/studio/build/application-id

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