2013-05-30 46 views
12

我已經更新我的項目以使用新的基於Gradle的構建系統,主要是因爲我一直很惱火,我無法安裝我的應用程序我的設備使用它,因爲我使用該設備進行開發。我在packageNameSuffix產品中看到了很多承諾。新的Android Gradle構建系統構建配置包名稱與提供者權限衝突

我遇到的問題涉及清單中包名以外的其他內容。還有其他部分必須是唯一的,包括權限(專門用於GCM)和ContentProvider授權。當試圖用.debug後綴進行安裝時,我得到的錯誤是該包的GCM權限尚未定義,而且我試圖安裝重複的提供程序。

是否有一個變量可以放入我的清單中而不是這些字符串,以便構建系統也可以正確替換這些變量?

回答

7

這是我對packageNameSuffix的GCM問題的解決方案。

主要問題是應具有「.debug」後綴的權限名稱。我把這個權限調試並釋放合併到最終清單中的清單。

AndroidManfest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.experiment.myapplication" 
      android:versionCode="1" 
      android:versionName="1.0" > 

    <uses-sdk 
      android:minSdkVersion="8" 
      android:targetSdkVersion="17" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

    <uses-permission android:name="android.permission.VIBRATE" /> 
    <application 
      android:allowBackup="true" 
      android:icon="@drawable/ic_launcher" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme" > 
     <activity 
       android:name=".MainActivity" 
       android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 


    </application> 

</manifest> 

調試AndroidManifest

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.experiment.myapplication"> 


    <permission android:name="com.experiment.myapplication.debug.permission.C2D_MESSAGE" 
       android:protectionLevel="signature" /> 
    <uses-permission android:name="com.experiment.myapplication.debug.permission.C2D_MESSAGE" /> 

    <application> 
     <receiver 
       android:name=".GcmBroadcastReceiver" 
       android:permission="com.google.android.c2dm.permission.SEND" > 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <category android:name="com.experiment.myapplication.debug" /> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest 

>

版本的Android清單

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.experiment.myapplication" > 

    <permission android:name="com.experiment.myapplication.permission.C2D_MESSAGE" 
       android:protectionLevel="signature" /> 
    <uses-permission android:name="com.experiment.myapplication.permission.C2D_MESSAGE" /> 

    <application> 
     <receiver 
       android:name=".GcmBroadcastReceiver" 
       android:permission="com.google.android.c2dm.permission.SEND" > 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <category android:name="com.experiment.myapplication" /> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 
+0

當使用新的播放服務而不是舊的gcm-client時,您不需要包特定的權限。 – deekay

+0

我試圖將這種解決方案與Urban Airship一起使用,但並未按預期工作。我仍然收到包名稱上的合併衝突。 –

+0

這對我很好,謝謝! – rharter

6

這是當前已知的更改變體包名稱的限制。我打算儘快解決這個問題。

+4

它是否固定。你可以添加鏈接到問題跟蹤器跟蹤這個問題? –

+0

任何更新Xav? –

+0

有沒有關於這方面的更新? – spierce7

1

我已經更換了所有我的應用程序的軟件包名稱AndroidManifest.xml中有佔位符$ {}的packageName,所以清單合併完成所有工作

例如:

<uses-permission android:name="${packageName}.permission.C2D_MESSAGE" /> 
1

您可以使用:

<permission android:name=".permission.C2D_MESSAGE" 
      android:protectionLevel="signature" /> 
<uses-permission android:name=".permission.C2D_MESSAGE" /> 

Android將自動添加當前的包名,正如你從.開始。