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

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