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

11

一些背景信息: 当我们迁移到Android App Bundle发布方式时,大多数人可能会面临此ResourceNotFoundException问题。显然,这个问题是由于侧载应用程序导致的。参考资料在这里。

谷歌最近宣布了解决方案来解决这个问题。使用Play Core库,我们可以识别应用程序是否被侧载(识别缺失的分割apk)。如果应用程序被侧载,它会显示“安装失败”弹出窗口并重定向到Play商店,在那里用户可以通过Google Play Store正常安装应用程序。

问题: 直到从Play商店安装缺失的分割apk为止,一切都运行正常。现在,当我重新启动应用程序时,立即崩溃,并显示错误:

Default FirebaseApp未在此进程中初始化

注意: 直接从Google Play商店下载应用程序没有任何崩溃问题。只有由于侧载问题而重新下载应用程序时才会出现崩溃。

代码:
项目的build.gradle

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

应用程序模块的build.gradle文件:

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

扩展Application的类:

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

任何帮助都将非常棒。


你能详细说明一下“仅在应用程序由于侧载问题重新下载时发生崩溃”的意思吗?你执行了哪些操作? - Pierre
@Pierre,当我安装侧载应用程序时,Play Core库会识别该应用程序是侧载的,并显示弹出窗口,提示“安装失败”,并重定向到Play商店以安装缺少的分割APK。当我从Play商店安装缺少的分割APK后,现在如果运行APK,则会崩溃并显示上述错误。 - Naveen T P
该应用程序需要被卸载并重新安装。 - Pierre
@Pierre,没错。这就是应该的方式。但是当弹出窗口重定向到Play商店时,我们会看到两个选项:“卸载”和“更新”。人们会选择“更新”。我们不能指望那些已经侧载了应用程序的人会卸载并重新安装。这必须在某个地方被强制执行或者采取更好的方法来实现。 - Naveen T P
嗨 @Pierre,使用 play core v1.6.3,这个问题仍然存在。至少有什么解决方法吗? - Naveen T P
显示剩余5条评论
1个回答

2

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

应用程序模块的build.gradle:

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

其他实现保持不变。

一个扩展Application类的类:

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

如何进行测试:

  • 更好的测试方法是将应用程序包与上述修复一起发布到Play商店内部测试通道(将自己添加为测试人员)。

  • 模拟安装无效的APK - 使用bundletool从捆绑包中获取.apks文件,提取它并使用adb命令安装base_master.apk adb install base_master.apk

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

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

希望这可以帮助你。


该方法现已过时。 - marticztn
1
@marticztn,你知道是否有替代品吗? - moertel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接