8

我正在使用Android Studio版本2.1.2,並且我正在嘗試將Google雲消息傳遞應用於我的應用。Android:使用哪一個包名稱? Manifest的包名或Gradle applicationId?

爲了做到這一點,我必須獲得Google服務json文件(配置文件)才能添加到我的項目中。

爲了得到來自谷歌的API控制檯面板這個文件,我需要提供我的應用程序名稱我的應用程序的軟件包名稱。這是我的問題開始的地方。

在我的應用程序,在清單文件包名稱是應用層面的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" 
} 

現在,這些提供給谷歌作爲包名稱獲取配置文件?其次,哪一個應該用於請求我的清單文件中的C2D_MESSAGE的格式所在的位置;

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

感謝您的任何幫助。

+0

爲什麼不能在兩個文件中將它更改爲相同,任何方式Gradle優先 –

+0

爲什麼不使用Firebase而不是GCM? – chiappins

回答

15

將使用在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> 
+0

謝謝Alim.I還沒有嘗試過解決方案,但是由於一般意見給出了相同的答案,我接受了答案。 – Orcun

+0

您應該澄清清單包屬性在編譯之後纔會被覆蓋。因此,R類將保留在屬性 – JensV

1

gradle替換清單。使用gradle

0

據我所知,你需要他們兩個。清單需要它才能找到activity元素使用的類。如果你不需要它,IDE會顯示一個註釋,指定'你不需要這個,它被覆蓋....'

Gradle替換清單。使用gradle

這對於某種程度的擴展是正確的,但您仍然需要Manifest中的包名稱。我不確定它爲什麼在gradle中,但是gradle 不會覆蓋清單中的包!

7

有關於這個here由Android工作室一個很大的支持文章。

爲什麼有兩個?

  • 是在你的內置apk文件的清單中所使用的最終方案,併爲您的應用程序被稱爲您的設備上,並在谷歌Play商店的包裝,是在gradle這個規定的「應用程序ID」文件。
  • 在您的源代碼中用於引用您的R類並解決任何相關活動/服務註冊的包仍然稱爲清單中定義的「包」。

哪一個我應該修改,以改變我的最後包名
在搖籃包名稱將在清單覆蓋的包名。所以你應該在Gradle中改變它。

如果你想真正改變你的項目的結構,那麼你需要改變你的包名中的Manifest.xml

對於權限
你的具體情況,權限,你問您應該爲Google消息傳遞提供哪個包名稱。由於Google消息傳遞需要您的最終包名,因此您應該輸入您的gradle包名。如果您使用的是風味,您應該按照@alim's answer.

+0

中定義的相同包中。非常感謝,這非常有幫助。 – Orcun

0

的建議動態執行此操作Google使用您的包名稱作爲唯一名稱來標識您的應用。既然你提到它在Google Play上,你應該使用Gradle文件中的一個來實現它。

並回答您的問題的第二部分,它只是一個約定,將應用程序<application-package-name> + ".permission.C2D_MESSAGE定義爲您的權限名稱,因此您可以使用Gradle文件中提到的那個。

希望這會有所幫助:)

0

隨着Android Studio的介紹,看到的已被更改。之前在eclipse Manifest.xml包名中,當您在Google Play商店上傳您的應用程序時,它將被視爲完整且唯一的,它將從Manifest.xml中選擇包名,但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。我們必須手動完成。請注意這一點,因爲它非常重要。正如我們在Google Play商店上傳我們的應用程序時,google會選擇與applicationId匹配的包名稱,如上例com.company.testapp。

相關問題