使用 Play 核心库验证非 Google Play 应用安装

Posted

技术标签:

【中文标题】使用 Play 核心库验证非 Google Play 应用安装【英文标题】:Verify non-Google Play app installs using Play core library 【发布时间】:2019-11-05 14:27:04 【问题描述】:

一些背景:当我们迁移到 Android app bundle 发布方法时,我们大多数人可能都遇到过这个ResourceNotFoundException。很明显,问题是由于侧面加载应用程序造成的。 Reference here.

Google 最近针对这个问题发布了solution。使用 play 核心库,我们可以识别应用程序是否侧载(识别缺少的拆分 apk)。如果应用程序被侧载,它会显示“安装失败”弹出窗口并重定向到 Play 商店,用户可以通过 Google Play 商店正确安装应用程序。

问题:一切正常,直到从 Play 商店安装缺少的拆分 apk。现在,当我重新启动该应用程序时,它会立即崩溃并显示一条错误消息。

默认 FirebaseApp 未在此过程中初始化

注意:直接从 Play 商店下载应用程序完全可以正常工作,不会出现任何崩溃。仅当应用因侧载问题而重新下载时才会发生崩溃。

代码: 项目build.gradle

buildscript 
 dependencies 
  classpath 'com.android.tools.build:bundletool:0.9.0'
 

App模块的build.gradle

 implementation 'com.google.android.play:core:1.6.1'

扩展应用程序的类:

 public void onCreate() 
    if (MissingSplitsManagerFactory.create(this).disableAppIfMissingRequiredSplits()) 
        // Skip app initialization.
        return;
    
    super.onCreate();
    .....
 

任何帮助都会非常棒。

【问题讨论】:

您能否详细说明“仅当应用程序因侧载问题而重新下载时才会发生崩溃”是什么意思?您执行什么操作? @Pierre 这意味着,当我安装侧面加载的应用程序时,播放核心库会识别该应用程序是侧面加载的并显示弹出窗口说“安装失败”并重定向到播放商店以安装缺少的拆分 apk .当我从 Play 商店安装缺少的拆分 apk 时,现在如果我运行 apk,它会因上述错误而崩溃。 应用需要卸载重新安装。 @Pierre 没错。这是应该的。但是当弹出窗口重定向到 Play 商店时,我们会看到两个选项“卸载”和“更新”。人们会选择“更新”。我们不能指望侧载应用程序的人会卸载并重新安装。这必须在某个地方强制执行或实施更好的方法。 我认为您可能会在您的情况下看到“更新”,因为实际上有更新版本的应用程序可用。不过,我们正在努力改进,是的。 【参考方案1】:

我已经用最新版本的 Play 核心库解决了这个问题:

App 模块的 build.gradle:

implementation "com.google.android.play:core:1.7.2"

其他实现保持不变。

扩展应用程序的类:

public void onCreate() 
 if (MissingSplitsManagerFactory.create(this).disableAppIfMissingRequiredSplits()) 
    // Skip app initialization.
    return;
 
 super.onCreate();
 .....

如何测试:

正确测试它的更好方法是在 Play 商店内部测试通道中发布包含上述修复的 app bundle(将自己添加为测试人员)。

模拟安装无效的 apk - 使用 bundletool 从 bundle 中获取 .apks 文件,解压并使用 adb 命令安装 base_master.apk adb install base_master.apk.

启动应用程序,您应该会看到“安装失败”对话框,它会重定向到 Play 商店,点击更新,Play 商店将安装缺少的 apk。

现在启动应用程序应该可以正常工作了。

希望对你有帮助

【讨论】:

此方法现已弃用

以上是关于使用 Play 核心库验证非 Google Play 应用安装的主要内容,如果未能解决你的问题,请参考以下文章

没有要导入的项目 - 对于 google-play-services_lib

由于不符合所有文件访问权限政策,Google Play 商店不断被拒绝

如何为项目使用不同版本的 google-play-services 库

通过 Firebase 身份验证使用 Google Play 游戏

如何将 Google Play 游戏登录与 Firebase 身份验证结合使用

使用 Google Play 游戏进行 Firebase 身份验证