2013-05-30 4 views
12

Ich habe mein Projekt aktualisiert, um das neue Gradle-basierte Build-System zu verwenden, vor allem weil ich irgendwie genervt bin, dass ich meine App nicht installieren lassen kann mein Gerät, um es zu benutzen, da ich das Gerät für die Entwicklung verwende. Ich sah eine Menge Versprechen in der packageNameSuffix Angebot des neuen Build-System.Neues Android Gradle Build System Build-Konfigurationen Paketname Konflikte mit Provider Authority

Das Problem, in das ich renne, betrifft andere Dinge als den Paketnamen im Manifest. Es gibt andere Teile, die eindeutig sein müssen, einschließlich Berechtigungen (speziell für GCM) und ContentProvider-Autoritäten. Wenn ich versuche, mit einem .debug Suffix zu installieren, bekomme ich Fehler, dass die GCM-Berechtigung für dieses Paket nicht definiert wurde und ich versuche, einen doppelten Provider zu installieren.

Gibt es eine Variable, die ich anstelle dieser Zeichenfolgen in mein Manifest einfügen kann, damit das Build-System diese ebenfalls ersetzt?

Antwort

7

Hier ist meine Lösung für GCM Probleme mit packageNameSuffix.

Das primäre Problem sind Berechtigungsnamen, die das Suffix ".debug" haben sollten. Ich habe diese Berechtigung zum Debuggen und Freigeben von Manifesten eingegeben, die mit dem endgültigen Manifest zusammengeführt werden.

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> 

debug 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 

>

Release Android Manifest

<?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

Wenn Sie die neuen Play Services anstelle des alten gcm-clients verwenden, benötigen Sie nicht die paketspezifische Berechtigung. – deekay

+0

Ich habe versucht, diese Lösung mit Urban Airship zu verwenden und es hat nicht wie erwartet funktioniert. Ich bekomme immer noch die Zusammenführungskonflikte auf den Paketnamen. –

+0

Das hat super für mich funktioniert, Danke! – rharter

6

Dies ist eine derzeit bekannte Einschränkung beim Ändern des Paketnamens für eine Variante. Ich habe vor, dies so schnell wie möglich zu beheben.

+4

Ist es behoben oder nicht. Könnten Sie einen Link zum Issue Tracker hinzufügen, um dieses Problem zu verfolgen? –

+0

Irgendein Update Xav? –

+0

Gibt es Updates diesbezüglich? – spierce7

1

I ersetzt habe die ganze Paket meine App-Namen in AndroidManifest.xml mit Platzhalter $ {package}, so Manifest Merger macht alle Arbeit

Zum Beispiel:

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

Sie verwenden können:

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

Android wird die aktuellen Paketnamen automatisch hinzufügen, wie du mit einem . gestartet hast.

Verwandte Themen