2013-05-30 11 views
12

Ho aggiornato il mio progetto per utilizzare il nuovo sistema di build basato su Gradle, in gran parte perché sono stato infastidito dal fatto che non posso avere la mia app installata su il mio dispositivo per usarlo poiché utilizzo il dispositivo per lo sviluppo. Ho visto molte promesse nell'offerta packageNameSuffix del nuovo sistema di build.Il nuovo sistema Android Gradle Build System configura il nome del pacchetto di configurazioni Configs con l'autorità del provider

Il problema che sto incontrando coinvolge cose diverse dal nome del pacchetto nel manifest. Ci sono altre parti che devono essere uniche, comprese le autorizzazioni (in particolare per GCM) e le autorità ContentProvider. Quando provo a installare con un suffisso .debug, ottengo degli errori che l'autorizzazione GCM per quel pacchetto non è stata definita e che sto cercando di installare un provider duplicato.

C'è una variabile che posso inserire nel mio manifest al posto di queste stringhe in modo che il sistema di creazione sostituisca anche quelle in modo appropriato?

risposta

7

Ecco la mia soluzione per problemi GCM con packageNameSuffix.

Il problema principale sono i nomi di autorizzazione che dovrebbero avere il suffisso ".debug". Ho dato il permesso di eseguire il debug e rilasciare i manifesti che sono uniti al manifest finale.

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> 

di 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 

>

rilascio di 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

Quando si utilizzano i nuovi servizi di riproduzione anziché il vecchio client gcm, non è necessaria l'autorizzazione specifica per il pacchetto. – deekay

+0

Ho provato a utilizzare questa soluzione con Urban Airship e non ha funzionato come previsto. Sto ancora ottenendo conflitti di fusione sui nomi dei pacchetti. –

+0

Questo ha funzionato alla grande per me, grazie! – rharter

6

Questa è una limitazione attualmente nota della modifica del nome del pacchetto per una variante. Sto pensando di sistemarlo il prima possibile.

+4

È corretto o meno. Potresti aggiungere un link al tracker dei problemi per tenere traccia di questo problema? –

+0

Qualche aggiornamento Xav? –

+0

Ci sono aggiornamenti in merito? – spierce7

1

Ho sostituito tutti il ​​nome del pacchetto di mia app in AndroidManifest.xml con segnaposto $ {} packageName, così Fusione manifesto fa tutto il lavoro

Ad esempio:

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

È possibile utilizzare:

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

Android aggiungerà il nome del pacchetto corrente automaticamente, come hai iniziato con un ..

Problemi correlati