12

我基于谷歌教程和示例开发了一个即时应用程序 apk。当我尝试开始部署到生产环境时,我看到一个错误:不可升级到已安装的应用程序

问题

此 Instant App APK 的某些用户将没有资格使用您已安装应用中的任何 APK。

解析度

确保您的免安装应用 APK 的定位与您的 APK 的定位相匹配。

项目结构:有两种情况,第一种:

基础 - baseFeature,minSdk 18,targetSdk 26

application project(':apk')
feature project(':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 中有项目详细信息代码。

Instant 应用在 Android Studio 以及 Google Play 开发和预发布中运行。此外,当我尝试升级到已安装的应用程序时,一切正常。在我看来,定位是正确的,但 Google Play 管理中心的想法不同。

您知道有关如何推出即时应用程序的任何想法吗?请帮助:(我已经在这个版本上工作了 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 
4

5 回答 5

8

根据Android文档

您可以使用aaptAndroid SDK 中包含的工具来确定 Google Play 如何根据应用程序声明的功能和权限来过滤您的应用程序。为此,请aapt使用dump badging命令运行。这会导致aapt解析您的应用程序的清单并应用与 Google Play 相同的规则来确定您的应用程序所需的功能。

通过在可安装和即时应用程序 apk 上运行该命令,将打印以下信息。

可安装应用程序(版本 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'

Instant App 基础功能:

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_LOCATIONACCESS_FINE_LOCATION权限,这隐含地添加了android.hardware.location功能的要求。以同样的方式,ACCESS_WIFI_STATE许可暗示了该android.hardware.wifi功能。设备上没有 GPS 或 WiFi 的用户(这听起来很奇怪,但这样的设备在野外存在)将无法将您的即时应用程序升级到可安装的应用程序。

限制您的可安装应用程序可用性的另一件事是该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.networkandroid.hardware.location.gps功能符合以下要求

如果您的应用面向 Android 5.0(API 级别 21)或更高版本并使用ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION权限分别从网络或 GPS 接收位置更新,您还必须明确声明您的应用使用android.hardware.location.networkandroid.hardware.location.gps硬件功能。

 
顺便说一句,确定可安装应用程序需要哪些功能的另一种方法是Google Play 控制台的应用程序发布部分上的APK 详细信息信息屏幕。

于 2017-09-07T11:05:32.733 回答
2

我遵循了 Idolon 的建议(aapt dump badging MyApp.apk在 apk 和比较上运行)并添加了我缺少的几个权限。

但是,在我添加了一个 OpenGLES 功能来匹配我安装的应用程序之前,我仍然无法让它完全工作。就我而言:

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

于 2018-05-06T02:41:48.800 回答
0

这个消息很有意义。只需查看您安装的应用程序所需的功能(您可以为此使用classyshark)。如果它需要电话,因为您要求拨号器权限,或者您只是手动要求它,或者您要求 GSL 版本 2 作为您安装的版本的最低要求,那么部分不符合这些标准但拥有的用户是有意义的android 6+ 将无法使用您安装的版本,而只能使用即时版本。

于 2017-09-07T14:30:17.077 回答
0

通过上面评论中的要点查看已安装应用程序的清单和即时应用程序,您的 minSdk 确实存在问题。您安装的应用具有 minSdk 18,而您的免安装应用未设置 minSdk。在即时应用程序基本清单上设置 minSdk 18 并查看是否可以解决它。

直观地说,这个验证器正在防止一种不可能发生的情况:JB 之前的用户获取您的即时应用程序,并且无法升级到已安装的应用程序。因为即时应用程序运行时本身并没有那么远。验证者确实很愚蠢。它只是查看那些 minSdk 值。但这可能就是我们想要的样子,因为运行时兼容性正在稳步回到旧设备,并且无需您重新发布即可。(我们极不可能回到 sdk 17。只是先发制人地证明为什么我们不想让这个验证器“更智能”。)

于 2017-09-09T02:32:45.527 回答
0

简单的答案:如果您没有正确增加版本号,就会发生这种情况。

只有版本号“低”的可以升级——版本号高的不能升级。

于 2018-04-26T16:13:04.923 回答