文章目錄
前言
情況是這樣的,我修改了項目包名和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