Android:哪一个用于包名?Manifest的packagename或Gradle applicationId?

Orc*_*cun 13 android android-manifest google-cloud-messaging android-studio android-gradle-plugin

我正在使用Android Studio 2.1.2版,我正在尝试将Google Cloud Messaging应用到我的应用中.

为了能够做到这一点,我必须获得一个Google Services json文件(配置文件)才能添加到我的项目中.

要从Google Api控制台面板获取此文件,我需要提供我的应用名称应用的应用包名称.这是我的问题开始的地方.

在我的应用程序中,Manifest文件中的包名称与应用程序级build.gradle文件中的applicationId不同.在Google Play商店中,正在使用applicationId.

说明我的意思,在我的清单文件中;

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
Run Code Online (Sandbox Code Playgroud)

在我的gradle文件中;

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
    applicationId 'com.menu.jkrk'
    minSdkVersion 16
    targetSdkVersion 23
    versionCode 3
    versionName "1.0"
}
Run Code Online (Sandbox Code Playgroud)

现在,哪一个提供谷歌作为包名来获取配置文件?

其次,哪个应该用于请求在我的清单文件中允许使用C2D_MESSAGE格式;

<application-package-name> + ".permission.C2D_MESSAGE
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

小智 17

将使用build.gradle中指定的应用程序标识.

AndroidManifest.xml被覆盖的条目被覆盖

你的AndroidManifest.xml样子会是这样的

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<receiver ...>
    <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

            <category android:name="${applicationId}" />
        </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)


Mdl*_*dlc 9

有一个关于这个伟大的支持文章在这里由Android工作室.

为什么有两个?

  • 您构建的.apk清单中使用的最终软件包,以及您的应用在您的设备和Google Play商店中所知的软件包,是gradle文件中指定的"应用程序ID".
  • 源代码中用于引用R类并解析任何相关活动/服务注册的包继续被称为清单中定义的"包".

我应该编辑哪一个来更改我的最终包名称
Gradle中的包名称将覆盖Manifest中的包名称.所以你应该在Gradle中更改它.

如果您想实际更改项目的结构,那么您需要在Manifest.xml中更改您的包名称

对于权限
在您的特定情况下,您需要知道应为Google Messaging提供哪个软件包名称.由于Google Messaging需要您的最终包名,因此您应输入您的gradle包名.如果你正在使用口味,你应该按照@alim的回答建议动态地这样做.