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

我正在使用Android Studio版本2.1.2 ,并试图将Google云消息传递到我的应用程序。

为了做到这一点,我必须获得一个Google服务json文件(configuration文件)添加到我的项目。

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

在我的应用程序中, Manifest文件中的包名称与应用程序级别build.gradle文件中的applicationId不同 。 而在谷歌播放商店,applicationId正在使用。

为了说明我的意思,在我的Manifest文件中;

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> 

并在我的gradle文件中;

 android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId 'com.menu.jkrk' minSdkVersion 16 targetSdkVersion 23 versionCode 3 versionName "1.0" } 

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

其次,哪一个应该用于请求我的清单文件中的格式是C2D_MESSAGE的许可;

 <application-package-name> + ".permission.C2D_MESSAGE 

谢谢你的帮助。

  • GCM令牌何时到期以及什么是InstanceID?
  • Android 4.x设备接收GCM消息,但Android 2.3设备不
  • 当Application在Background中时,不会调用GcmListenerService
  • Azure通知中心不再接受GCM API密钥
  • 在sdk Manager中找不到适用于Android库的Google Cloud Messaging
  • 与GCM不同的口味
  • GCM:为什么我的应用程序崩溃在GCMRegistrar.checkDevice(this);
  • GCM令牌何时过期以及什么是InstanceID?
  • 将使用在build.gradle中指定的应用程序ID。

    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> 

    Android Studio有一个关于这方面的很好的支持文章。

    为什么有两个?

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

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

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

    对于权限
    在您的特定情况下,您可以询问您应该为Google消息传递提供哪个包名称。 由于Google消息传递需要您的最终包名称,因此您应该input您的gradle包名称。 如果你使用的是风味,你应该像@ alim的回答所build议的那样dynamic地做到这一点。

    gradlereplacemanifest。 使用gradle

    据我所知,你们都需要他们。 清单需要它来查找activity元素使用的类。 如果你不需要它,IDE会显示一个注释,指出“你不需要这个,它被覆盖…”

    Gradlereplace清单。 使用gradle

    这在某种程度上是正确的,但是你仍然需要在Manifest中的包名称。 我不确定它为什么在gradle中,但gradle 不会覆盖清单中的包!

    Google使用您的软件包名称作为唯一的名称来识别您的应用。 既然你提到它在Google Play上,你应该使用Gradle文件中的一个来实现。

    回答你的问题的第二部分,这只是一个约定,定义应用程序<application-package-name> + ".permission.C2D_MESSAGE作为你的权限名称,所以你可以使用Gradle文件中提到的那个。

    希望这可以帮助 :)

    随着Android Studio的介绍看到了已经改变。 之前在eclipse Manifest.xml包名中,当您在Google Play商店上传您的应用程序时,它将被视为完整且唯一的,它将从Manifest.xml中select包名,但Android Studio并非如此。

    在Android Studio中有两个应用程序包名称的地方。

    1. 的Manifest.xml
    2. 的build.gradle

    build.gradle示例

     defaultConfig { applicationId "com.company.testapp" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" } 

    注意applicationId上面是包名的其他地方。

    @Mdlc是绝对正确的。

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

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

    当我们重构重命名Android Studio中的应用程序包名称时,它不会更改应用程序ID。 我们必须手动完成。 请注意这一点,因为它非常重要。 正如我们上传我们的应用程序在谷歌Play商店谷歌select与applicationId匹配的包名称,例如上面的例子com.company.testapp。