Я получаю диалоговое окно «Не удается установить» при попытке установить из Play Store, когда другой вариант уже установлен.
У меня есть два варианта: бесплатный и платный. Оба имеют разные идентификаторы приложений, например:
free {
applicationId "aaa.bbb.ccc.free"
}
paid {
applicationId "aaa.bbb.ccc.paid"
}
Я не могу установить Free, если установлена Paid, и наоборот.
В коде я по существу использую основной вариант для платной версии и добавляю рекламные материалы в бесплатную версию.
FreeActivity1 наследует Activity1 и
FreeActivity2 наследуется от Activity2
Мой основной манифест (используется в платной версии):
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
package = "aaa.bbb.ccc"
android:sharedUserId = "aaa.bbb.ccc">
...
<application ...>
<activity
android:name = ".Activity1">
<intent-filter>
<action android:name = "android.intent.action.MAIN"/>
<action android:name = "android.intent.action.VIEW"/>
<category android:name = "android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity-alias
android:name = "${applicationId}.act1"
android:targetActivity = ".Activity1"/>
<activity
android:name = ".ddd.Activity2"/>
<activity-alias
android:name = "${applicationId}.act2"
android:targetActivity = ".ddd.Activity2"/>
</application>
и мой бесплатный манифест:
<manifest xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:tools = "http://schemas.android.com/tools"
package = "aaa.bbb.ccc"
android:sharedUserId = "aaa.bbb.ccc">
<application tools:ignore = "GoogleAppIndexingWarning">
<activity
android:name = ".FreeActivity1">
<intent-filter>
<action android:name = "android.intent.action.MAIN"/>
<action android:name = "android.intent.action.VIEW"/>
<category android:name = "android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity-alias
tools:replace = "android:targetActivity"
android:name = "${applicationId}.act1"
android:targetActivity = ".FreeActivity1"/>
<activity
tools:node = "remove"
android:name = ".Activity1"
/>
<activity
android:name = ".ddd.FreeActivity2"/>
<activity-alias
tools:replace = "android:targetActivity"
android:name = "${applicationId}.act2"
android:targetActivity = ".ddd.FreeActivity2"/>
<activity
tools:node = "remove"
android:name = ".ddd.Activity2"
/>
...
</application>
У меня есть 2 приложения в Play Console, и они отлично выпущены, но одна из моих функций — перенос пользовательских настроек из бесплатной версии в платную. Как бы то ни было, я просто не могу установить оба на одном устройстве через Google Play. Он отлично работает с установкой apk.
Может быть, косвенно связано (?): У меня есть две учетные записи Google с доступом к Play Store. В один этих учетных записей Play Store сообщает мне, что моя версия Pro несовместима с моим устройством (то же устройство, которое я использую в другой учетной записи). Я использую одни и те же функции/разрешения (интернет) бесплатно и платно.
Помощь будет принята с благодарностью! Заранее спасибо!
Обновлено:
Я отладил установку игрового магазина с помощью logcat. Я получаю следующую ошибку:
Error -505 while installing aaa.bbb.ccc.free: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE: Package couldn't be installed in /data/app/aaa.bbb.ccc.freeXXXXXXXXXXXX: Package aaa.bbb.ccc.free has no signatures that match those in shared user aaa.bbb.ccc; ignoring!
Похоже, имя вашего пакета одинаково в вашем манифесте как для платного, так и для бесплатного использования. Попробуй поменять там.
Хорошо, это на самом деле довольно плохая проблема:
Я использовал SharedUserId и Google App Signing вместе. Это просто невозможно (см. редактирование в op), и в Play Console 0 предупреждений.
Поскольку процесс автоматической подписи всегда создает новый ключ для каждого приложения в Магазине, эти подписи не будут совпадать, но Play Store требует их, если они имеют одинаковый sharedUserId.
Либо я удаляю все функции, требующие sharedUserId, либо отменяю публикацию обоих своих приложений и создаю две новые версии с другим applicationId и использую ручную подпись.
Я декомпилировал свои apks, и оба манифеста имеют идентификатор приложения в атрибуте пакета.