文章目录
前言
情况是这样的,我修改了项目包名和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