Новый Android Gradle Конструкция сборки сборки создает конфликты с именами пакетов с полномочиями поставщика

Я обновил свой проект, чтобы использовать новую систему сборки на основе Gradle, в основном потому, что меня раздражало, что я не могу установить приложение на свое устройство, чтобы использовать его, так как я использую устройство для развитие. Я видел многообещающих предложений packageNameSuffix новой системы сборки.

Проблема, с которой я сталкиваюсь, включает в себя вещи, отличные от имени пакета в манифесте. Существуют и другие компоненты, которые должны быть уникальными, включая разрешения (в частности, для GCM) и органы ContentProvider. При попытке установить с суффиксом .debug я получаю ошибки, что разрешение GCM для этого пакета не было определено и что я пытаюсь установить дубликата поставщика.

Есть ли переменная, которую я могу поместить в свой манифест вместо этих строк, чтобы система сборки также заменила их соответствующим образом?

Ответ 1

Вот мое решение для проблем GCM с packageNameSuffix.

Первичная проблема - это имена прав, которые должны иметь суффикс ".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>

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
<Р →

релиз 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>

Ответ 2

Это текущее известное ограничение изменения имени пакета для варианта. Я планирую установить это как можно скорее.

Ответ 3

Я заменил все имя своего приложения в AndroidManifest.xml с помощью placeholder ${packageName}, поэтому Manifest Merger все работает

Например:

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

Ответ 4

Вы можете использовать:

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

Android автоматически добавит имя текущего пакета, когда вы начали с ..