Подтвердить что ты не робот

Конфликт разрешений Android L между релизами и debug apks

Я обновился до Android L и выпустил как выпущенную версию своего приложения в Google Play, так и версию отладки, которую мы используем для разработки.

Они подписаны с разными ключами.

Моя проблема в том, что я устанавливаю версию Google Play, а затем, когда я пытаюсь установить версию отладки, которая определяется следующим образом:

debug {
        debuggable true
        packageNameSuffix ".debug"
        buildConfigField BOOLEAN, IS_DEV, TRUE
    }

И это ошибка, которую я получаю:

Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.app.name.permission.C2D_MESSAGE pkg=com.app.name]

Это проблемное разрешение:

<permission
    android:name="com.app.name.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>

<uses-permission android:name="com.app.name.permission.C2D_MESSAGE"/>

Я знаю (http://commonsware.com/blog/2014/08/04/custom-permission-vulnerability-l-developer-preview.html) и того факта, что это было создано из-за проблемы с безопасностью, но мне все еще нужно чтобы иметь возможность работать с командой, каждая из которых имеет свой собственный ключ подписи отладки.

Я попытался удалить с помощью adb uninstall (qaru.site/info/39650/...), и я попытался очистить кэш всех приложений на устройстве.

4b9b3361

Ответ 1

Я могу одновременно иметь как debug, так и release выпуски клиентского приложения GCM, установленного на том же Android 5.0 Nexus 9, путем внесения изменений в манифест для использования заполнителей:

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

Обратите внимание, что вы также должны использовать ${applicationId} в <receiver> для <category>:

    <receiver
        android:name="GCMBroadcastReceiverCompat"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE"/>

            <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>

(честно говоря, я не уверен, что пользовательский <permission> еще больше нужен, учитывая, что я попытался удалить его и все еще могу получать сообщения GCM)

Если вы затем определите свой build.gradle, как он есть, с applicationIdSuffix для одного из типов сборки (например, debug), вы получите отдельные пользовательские разрешения по типу сборки, и вы уметь устанавливать их рядом друг с другом.