Ошибка консоли Google Play - невозможно обновить до установленного приложения

Я разработал apk для мгновенного приложения на основе руководств и примеров Google. Когда я пытаюсь начать развертывание в производственной среде, я вижу одну ошибку: не подлежит обновлению до установленного приложения.

ПРОБЛЕМА

Некоторые пользователи APK-файлов этого приложения с мгновенным запуском не смогут использовать какие-либо APK-файлы в установленном приложении.

РАЗРЕШАЮЩАЯ СПОСОБНОСТЬ

Убедитесь, что таргетинг APK-файлов вашего приложения с мгновенным запуском соответствует таргетингу APK-файлов.

Структура проекта: Есть два сценария, 1-й:

base - baseFeature, minSdk 18, targetSdk 26

application project(':apk')
feature project(':item-details')

функция item-details - minSdk 18, targetSdk 26

api project(':base')

ui - функция, не включенная в мгновенный модуль, minSdk 18, targetSdk 26, модуль содержит все представления

implementation project(':base')
other modules like customcomponents, shared etc

Instant - модуль мгновенного приложения minSdk 18 или 23, targetSdk 26

implementation project(':base')
implementation project(':item-details')

apk - модуль apk, minSdk 18, targetSdk 26

implementation project(':ui')
implementation project(':shared')

Во втором сценарии в baseFeature есть код деталей.

Приложение с мгновенным запуском запускается из Android Studio и из Google Play для разработки и предварительной версии. Также, когда я пытаюсь перейти на установленное приложение, все работает нормально. На мой взгляд, таргетинг правильный, но Google Play Console думает иначе.

Вы знаете какие-нибудь идеи о том, как развертывать мгновенные приложения? Пожалуйста, помогите :( Я работаю над этой версией 3 дня и не могу развернуть приложение.

ОБНОВЛЕНИЕ 10.09.2017. Сведения об APK:

Supported Android devices 8448 devices 
API levels 18+ 
Target SDK 26 
Screen layouts 4 screen layouts 
Localizations default + 113 languages 
Features 2 features 
Required permissions 12 permissions 
OpenGL ES versions 1.0+ 
OpenGL textures all textures 
Uploaded Sep 9, 2017, 7:57:11 AM PDT 

person Skye    schedule 31.08.2017    source источник
comment
Сообщение об ошибке касается не minSdk, а targetSdk. Пожалуйста, проверьте, совпадают ли ваши targetSdks во всех ваших модулях gradle.   -  person keyboardsurfer    schedule 31.08.2017
comment
@keyboardsurfer targetSdk - 26 в каждом модуле (я использую глобальные параметры).   -  person Skye    schedule 31.08.2017
comment
В вашем градиенте ‘apk’ отсутствуют зависимости проекта реализации (': base'), проекта реализации (': item-details').   -  person Julia K    schedule 01.09.2017
comment
Зависимости вашего модуля «apk» содержат проект реализации (': shared'). Есть ли у вас еще один функциональный модуль с именем «shared»?   -  person Julia K    schedule 01.09.2017
comment
Модуль @JuliaK 'shared' - это просто библиотека (с расширениями kotlin, моделями, утилитами, файлами конфигурации и т. Д.), Она включена во все функции.   -  person Skye    schedule 01.09.2017
comment
@JuliaK Итак ... я должен поместить модуль ': base' в модуль 'apk', даже если модуль 'ui' содержит ': base'?   -  person Skye    schedule 01.09.2017
comment
Извините, я упустил это из виду, вам не нужно добавлять 'реализация проекта (': base ')' в модуль 'apk', но вам нужно добавить 'проект реализации (': item-details ')' в свой ' apk 'модуль.   -  person Julia K    schedule 05.09.2017
comment
Похожая проблема stackoverflow.com/questions/44790614/ - У вас есть какие-либо дополнительные разрешения в вашем мгновенном приложении, которых нет в установленном приложении?   -  person Julia K    schedule 05.09.2017
comment
@JuliaK Я удалил базовый модуль из apk и добавил детали в apk. Базовые разрешения: ИНТЕРНЕТ, ACCESS_NETWORK_STATE, ACCESS_WIFI_STATE, WAKE_LOCK. права доступа к деталям: ИНТЕРНЕТ, ACCESS_NETWORK_STATE, WAKE_LOCK. Все еще не работает :(   -  person Skye    schedule 05.09.2017
comment
Под «Базовыми разрешениями» вы имеете в виду разрешения вашего устанавливаемого приложения?   -  person Julia K    schedule 07.09.2017
comment
WAKE_LOCK не поддерживается для мгновенных приложений. Пожалуйста, обратитесь к FAQ «Какие разрешения доступны для мгновенного приложения?» вопрос для подробностей developer.android.com/topic/instant-apps/faqs .html # general   -  person Julia K    schedule 07.09.2017
comment
@JuliaK Base module permissions :) Убрал, не помогло :(   -  person Skye    schedule 07.09.2017
comment
Можете ли вы сделать ссылку на устанавливаемое приложение в Play Store? И, если вы готовы поделиться, ссылки на манифесты в вашем мгновенном приложении? К сожалению, это минималистичное сообщение об ошибке скрывает очень сложный набор проверок. Как правило, ваше мгновенное приложение должно поддерживать подмножество устройств и URL-адресов, поддерживаемых установленным приложением. (Таким образом, мгновенному приложению требуются такие же или более высокие ограничения для устройств и такие же или меньшие фильтры намерений.)   -  person philo    schedule 08.09.2017
comment
@philo app - play.google.com/store/apps/details? id = skyesoftware.blogspace манифестирует: gist.github.com/banaszeknorbert/   -  person Skye    schedule 09.09.2017


Ответы (5)


Согласно документации Android:

Вы можете использовать инструмент aapt, включенный в Android SDK, чтобы определить, как Google Play будет фильтровать ваше приложение на основе заявленных функций и разрешений. Для этого запустите aapt с командой dump badging. Это заставляет aapt анализировать манифест вашего приложения и применять те же правила, что и в Google Play, для определения функций, которые требуются вашему приложению.

Выполнив эту команду в устанавливаемых и мгновенных приложениях приложений, печатается следующая информация.

Устанавливаемое приложение (версия 551):

package: name='skyesoftware.blogspace' versionCode='551' versionName='0.3.1.551' platformBuildVersionName=''
sdkVersion:'18'
targetSdkVersion:'26'
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.READ_EXTERNAL_STORAGE'
uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE'
uses-permission: name='android.permission.ACCESS_WIFI_STATE'
uses-permission: name='android.permission.ACCESS_NETWORK_STATE'
uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED'
uses-permission: name='android.permission.ACCESS_COARSE_LOCATION'
uses-permission: name='android.permission.ACCESS_FINE_LOCATION'
uses-permission: name='android.permission.WAKE_LOCK'
uses-permission: name='com.google.android.providers.gsf.permission.READ_GSERVICES'
uses-permission: name='com.google.android.c2dm.permission.RECEIVE'
uses-permission: name='skyesoftware.blogspace.permission.C2D_MESSAGE'
…
feature-group: label=''
  uses-feature: name='android.hardware.faketouch'
  uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps'
  uses-feature: name='android.hardware.location'
  uses-implied-feature: name='android.hardware.location' reason='requested android.permission.ACCESS_COARSE_LOCATION permission, and requested android.permission.ACCESS_FINE_LOCATION permission'
  uses-feature: name='android.hardware.screen.portrait'
  uses-implied-feature: name='android.hardware.screen.portrait' reason='one or more activities have specified a portrait orientation'
  uses-feature: name='android.hardware.wifi'
  uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission'
…
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--' 'af' 'am' 'ar' 'az' 'az-AZ' 'be' 'be-BY' 'bg' 'bn' 'bn-BD' 'bs' 'bs-BA' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-GB' 'en-IN' 'es' 'es-ES' 'es-US' 'et' 'et-EE' 'eu' 'eu-ES' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gl-ES' 'gu' 'gu-IN' 'hi' 'hr' 'hu' 'hy' 'hy-AM' 'id' 'in' 'is' 'is-IS' 'it' 'iw' 'ja' 'ka' 'ka-GE' 'kk' 'kk-KZ' 'km' 'km-KH' 'kn' 'kn-IN' 'ko' 'ky' 'ky-KG' 'lo' 'lo-LA' 'lt' 'lv' 'mk' 'mk-MK' 'ml' 'ml-IN' 'mn' 'mn-MN' 'mr' 'mr-IN' 'ms' 'ms-MY' 'my' 'my-MM' 'nb' 'ne' 'ne-NP' 'nl' 'pa' 'pa-IN' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'si-LK' 'sk' 'sl' 'sq' 'sq-AL' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'ta-IN' 'te' 'te-IN' 'th' 'tl' 'tr' 'uk' 'ur' 'ur-PK' 'uz' 'uz-UZ' 'vi' 'zh-CN' 'zh-HK' 'zh-TW' 'zu'
densities: '120' '160' '240' '320' '480' '640' '65534'

Базовая функция мгновенного приложения:

package: name='skyesoftware.blogspace' versionCode='1' versionName='1.0.0' platformBuildVersionName=''
sdkVersion:'18'
targetSdkVersion:'26'
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.ACCESS_NETWORK_STATE'
uses-permission: name='android.permission.WAKE_LOCK'
uses-permission: name='com.google.android.c2dm.permission.RECEIVE'
uses-permission: name='skyesoftware.blogspace.permission.C2D_MESSAGE'
application: label='' icon=''
feature-group: label=''
  uses-feature: name='android.hardware.faketouch'
  uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps'
other-activities
other-receivers
other-services
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--' 'af' 'am' 'ar' 'az' 'az-AZ' 'be' 'be-BY' 'bg' 'bn' 'bn-BD' 'bs' 'bs-BA' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-GB' 'en-IN' 'es' 'es-US' 'et' 'et-EE' 'eu' 'eu-ES' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gl-ES' 'gu' 'gu-IN' 'hi' 'hr' 'hu' 'hy' 'hy-AM' 'in' 'is' 'is-IS' 'it' 'iw' 'ja' 'ka' 'ka-GE' 'kk' 'kk-KZ' 'km' 'km-KH' 'kn' 'kn-IN' 'ko' 'ky' 'ky-KG' 'lo' 'lo-LA' 'lt' 'lv' 'mk' 'mk-MK' 'ml' 'ml-IN' 'mn' 'mn-MN' 'mr' 'mr-IN' 'ms' 'ms-MY' 'my' 'my-MM' 'nb' 'ne' 'ne-NP' 'nl' 'pa' 'pa-IN' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'si-LK' 'sk' 'sl' 'sq' 'sq-AL' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'ta-IN' 'te' 'te-IN' 'th' 'tl' 'tr' 'uk' 'ur' 'ur-PK' 'uz' 'uz-UZ' 'vi' 'zh-CN' 'zh-HK' 'zh-TW' 'zu'
densities: '120' '160' '240' '320' '480' '640' '65534'

APK функции мгновенного приложения:

package: name='skyesoftware.blogspace' versionCode='1' versionName='1.0.0' split='blogspace_item_details' platformBuildVersionName=''
sdkVersion:'18'
targetSdkVersion:'26'
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.ACCESS_NETWORK_STATE'
application: label='' icon=''
feature-group: label=''
  uses-feature: name='android.hardware.faketouch'
  uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps'
other-activities
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '160'

Как видите, ваше устанавливаемое приложение запрашивает разрешения ACCESS_COARSE_LOCATION и ACCESS_FINE_LOCATION, которые неявно добавить требование функции android.hardware.location. Точно так же разрешение ACCESS_WIFI_STATE подразумевает функцию android.hardware.wifi. Пользователь, у которого нет ни GPS, ни Wi-Fi на своем устройстве (звучит странно, но такие устройства существуют в дикой природе), не сможет обновить ваше мгновенное приложение до устанавливаемого.

Еще одна вещь, ограничивающая доступность вашего устанавливаемого приложения, - это функция android.hardware.screen.portrait, которая подразумевалась, потому что:

одно или несколько действий указали портретную ориентацию

Чтобы исправить все эти проблемы и сделать ваше устанавливаемое приложение доступным для всех пользователей мгновенного приложения, добавьте следующий блок в манифест устанавливаемого приложения (на уровне ниже тега <manifest>):

<uses-feature
    android:name="android.hardware.location"
    android:required="false" />

<uses-feature
    android:name="android.hardware.location.network"
    android:required="false" />

<uses-feature
    android:name="android.hardware.location.gps"
    android:required="false" />

<uses-feature
    android:name="android.hardware.wifi"
    android:required="false" />

<uses-feature
    android:name="android.hardware.screen.portrait"
    android:required="false" />

Функции android.hardware.location.network и android.hardware.location.gps соответствуют следующему требованию :

Если ваше приложение нацелено на Android 5.0 (уровень API 21) или выше и использует разрешение ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION для получения обновлений местоположения из сети или GPS, соответственно, вы также должны явно заявить, что ваше приложение использует аппаратные функции android.hardware.location.network или android.hardware.location.gps. .


Кстати, еще один способ выяснить, какие функции требуются для устанавливаемого приложения, - это Информация об APK в разделе "Выпуски приложений" консоли Google Play.

person Idolon    schedule 07.09.2017
comment
1. Имеет ли это значение? оба имеют одинаковый код версии и название версии. 2. Каждый раз так делаю. 3. minSdkVersion и targetSdkVersion одинаковы. Я постараюсь загрузить устанавливаемый apk с более высоким кодом версии, чем мгновенный apk. - person Skye; 07.09.2017
comment
1. Это было требованием до публичного выпуска Instant Apps. Похоже, этого больше нет, так как я не могу найти его в документации для разработчиков (в любом случае, пожалуйста, дайте мне знать, имеет ли значение изменение кода версии). - person Idolon; 07.09.2017
comment
@Skye Также можете убедиться, что URL-адрес точки входа по умолчанию определен для одного (и только одного) действия в базовой функции, как описано здесь, и тот же URL по умолчанию также является частью фильтр намерений активности средства запуска в" установленном "приложении. - person Idolon; 08.09.2017
comment
Значит, я должен определять точки входа только в базовой функции, верно? Изменение кода версии не помогло :( У меня такая же точка входа для функции мгновенного приложения и функции, которая не является частью мгновенного приложения. - person Skye; 08.09.2017
comment
@Skye Я говорил о url точки входа по умолчанию, который указан для приложения Instant в метатеге с android:name="default-url". Подробности см. Здесь: developer.android.com/ тема / мгновенные приложения /. Тот же URL-адрес должен быть также частью фильтра намерений запуска программы установленного приложения. - person Idolon; 08.09.2017
comment
@Skye Еще один вопрос. Вы случайно не используете разделение APK? - person Idolon; 08.09.2017
comment
Idolon, выложу новые апки с дефолтными точками входа :) возможно поможет. Неа, разбиты apk не использую. Нужно ли мне? - person Skye; 08.09.2017
comment
@Skye Не могли бы вы поделиться своим результатом AndroidManifest.xml из APK-файла мгновенного приложения, как показано в Анализатор APK? Возможно, что-то не так во время процесса слияния манифестов. - person Idolon; 09.09.2017
comment
@Skye, кстати, я получаю. Это приложение несовместимо со всеми вашими устройствами, когда я открываю веб-сайт Google Play с помощью браузера и не могу найти ваше приложение (то есть оно отфильтровано) в приложении Play Store на телефоне. Но… Я загрузил файл APK с помощью загрузчика APK, установил и успешно запустил приложение на своем телефоне Pixel. Проверьте Play Console, есть ли у вас ограничения для устройств: support.google. ru / googleplay / android-developer / answer /. И на всякий случай проверьте также и ограничения страны: support.google.com / googleplay / android-developer / table / 3541286 - person Idolon; 09.09.2017
comment
Idolon, приложение доступно не во всех странах. Сейчас я сосредотачиваюсь на Польше, пока не сделаю мгновенное приложение (а у меня пока нет языковых версий :(). В Google Play Console мгновенное приложение доступно в тех же странах, что и устанавливаемый apk. - person Skye; 09.09.2017
comment
@Skye А ограничений устройства нет? - person Idolon; 09.09.2017
comment
@Skye Хорошо, теперь все ясно - ваше устанавливаемое приложение требует ACCESS_COARSE_LOCATION и ACCESS_FINE_LOCATION, которые неявно добавляют требования к функциям _3 _ / _ 4_: developer.android.com/guide/topics/manifest/. - person Idolon; 09.09.2017
comment
@Skye Я обновил ответ. Это, вероятно, должно окончательно решить проблему. - person Idolon; 09.09.2017
comment
Хорошо, только для манифеста устанавливаемого приложения? Например, в манифест apk или, может быть, в манифест базового модуля? - person Skye; 09.09.2017
comment
@Skye, да, добавьте его только в манифест устанавливаемого приложения, поскольку ваше мгновенное приложение не использует упомянутые разрешения и не требует этих неявных функций. - person Idolon; 09.09.2017
comment
@Skye Okey ... Тогда попробуйте добавить его и в мгновенное приложение. Если и это не помогает, поделитесь, пожалуйста, информацией об устанавливаемом APK, как показано в вашем Play Console -> Release management -> Artifact library -> (i) icon - person Idolon; 09.09.2017
comment
Давайте продолжим это обсуждение в чате. - person Idolon; 10.09.2017
comment
@Skye Не могли бы вы расширить часть функций в информации APK и проверить, что это за 2 функции? Я предполагаю, что один будет android.hardware.touchscreen, а второй - android.hardware.screen.portrait. Если да, добавьте <uses-feature android:name="android.hardware.screen.portrait" android:required="false" /> в манифест устанавливаемого приложения и снова проверьте загрузку. - person Idolon; 10.09.2017
comment
Idolon, есть 2 особенности - android.hardware.FAKETOUCH android.hardware.screen.PORTRAIT. Ok :) - person Skye; 10.09.2017
comment
@Skye Я обновил ответ. Похоже, добавление <uses-feature android:name="android.hardware.screen.portrait" android:required="false" /> должно, наконец, решить вашу проблему. Пожалуйста, дайте мне знать, если это сработает для вас. - person Idolon; 10.09.2017
comment
Идолон, спасибо тебе огромное !!! :) Никогда бы не подумал, что он может не работать из-за чего-то подобного. Я успешно выпустил мгновенное приложение, но не могу найти его в поиске Google: / это нормально? (Задержка для мобильных устройств равна 0,00, поэтому весь трафик предназначен для мгновенного приложения). Я отметил ваш ответ как правильный :) - person Skye; 11.09.2017
comment
Рад, что ты разблокирован! Одна нюанс: вместо того, чтобы отключать подразумеваемые функции устанавливаемого приложения, было бы лучше потребовать функции в мгновенном приложении. То есть, поскольку ваше приложение использует, например, ACCESS_FINE_LOCATION, вам действительно нужен gps. Это уже подразумевается в устанавливаемом приложении, но мгновенное приложение должно явно требовать эту функцию. Повторное мгновенное приложение не отображается в результатах поиска Google: вы имеете в виду, что есть результат поиска, но он не помечен как мгновенный? Индексирование может занять некоторое время. Сообщите нам, если через несколько дней он по-прежнему не работает. - person philo; 11.09.2017
comment
@Skye, я рад, что все получилось! Как сказал Philo, для индексации мгновенного приложения Google может потребоваться некоторое время. Если это не сработает, задайте здесь еще один вопрос. - person Idolon; 12.09.2017

Я последовал совету Idolon (запустил aapt dump badging MyApp.apk на обоих apks и сравнил) и добавил несколько пропущенных разрешений.

Однако я все еще не мог заставить его полностью работать, пока не добавил функцию OpenGLES, соответствующую моему установленному приложению. В моем случае:

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

person AbePralle    schedule 06.05.2018

Это сообщение имеет смысл. Просто посмотрите на функции, необходимые вашему установленному приложению (для этого вы можете использовать classyshark). Если для этого требуется телефон, потому что вы запрашиваете разрешения номеронабирателя или просто вручную запрашиваете его, или вы запрашиваете GSL версии 2 как минимум для установленных вами версий, тогда имеет смысл та часть пользователей, которая не соответствует этим критериям, но имеет Android 6+ не сможет использовать вашу установленную версию, а сможет использовать только мгновенную версию.

person Ilya Gazman    schedule 07.09.2017

Глядя на манифест установленного приложения и ваше мгновенное приложение через суть вашего комментария выше, у вас действительно есть проблема с вашим minSdk. У вашего установленного приложения есть minSdk 18, а ваше мгновенное приложение не устанавливает minSdk. Установите minSdk 18 в мгновенном базовом манифесте приложения и посмотрите, позаботится ли он об этом.

Интуитивно этот валидатор защищает от сценария, который не может произойти: пользователь до JB получает ваше мгновенное приложение и не может выполнить обновление до установленного приложения. Потому что сама среда выполнения мгновенных приложений не заходит так далеко назад. Валидатор действительно тупой. Он просто смотрит на эти значения minSdk. Но, вероятно, именно так мы и хотим, поскольку совместимость среды выполнения неуклонно возвращается к более старым устройствам, и это происходит без повторной публикации. (Крайне маловероятно, что мы когда-нибудь вернемся к sdk 17. Просто превентивно обосновывая, почему мы не хотели бы делать этот валидатор «умнее».)

person philo    schedule 09.09.2017
comment
Я объявляю minSdk 18 в каждом файле gradle, поэтому объявление в манифесте игнорируется. Я сделал это также в файле Gradle мгновенного приложения (с объявлением плагина: com.android.instantapp). - person Skye; 09.09.2017
comment
Можете ли вы поделиться сгенерированным артефактом, zip-файлом? - person philo; 09.09.2017
comment
2 манифеста из мгновенных приложений и файлов gradle: gist.github.com/banaszeknorbert/ Link do zip файл: - person Skye; 09.09.2017

Простой ответ: это произойдет, если вы не увеличили номер версии правильно.

Только те, у кого номер версии «ниже», могут обновиться - те, у кого номер версии выше, не могут обновиться.

person igbow Games    schedule 26.04.2018