测试APK扩展库的问题

Cod*_*ers 10 android expansion apk google-play

我已经将来自Google的APK扩展文件下载库集成到我的项目中,它或多或少都可以正常工作(除了一些小问题,其他人已经在SO上报告了).

但是,我很难测试它.当我第一次测试时,我将已签名的APK +主扩展文件版本1上传到Google Play,效果很好.

但是,当我升级我的应用程序时,与主扩展文件版本2一起,应用程序无法再下载文件 - 库立即返回NO_DOWNLOAD_REQUIRED,但文件不存在!我开始调试LVL检查通行证,但可下载的文件表是空的!当我试图调试细节时...它突然又开始工作了!

我认为这是一种暂时的故障并继续我的工作,只是再次更新我的APK和扩展文件后再次遇到同样的问题.应用程序通过LVL检查,但库再次假定没有要下载的文件.

这是谷歌图书馆的一个已知问题吗?或者我可能需要等待一段时间,直到文件在Google的云上可用?

编辑:它刚开始工作正常.它似乎需要一些时间让文件以某种方式在Google方面传播.关于该库的一个坏处是,一旦它验证了许可证,它就再也不会检查下载列表,所以我不得不重新安装该应用程序.奇怪......为什么这么复杂?

小智 16

一点点线程坏死,但由于我在OBB下载工作时遇到了很多麻烦,我想把所有问题放在一个地方.谷歌如何设法从t'internet下载文件,这非常复杂,超出了我的想法.

将库添加到Android Studio

Misinformation部(https://developer.android.com/google/play/expansion-files.html)自豪地向您提供的官方指示是完全错误的.

在导入库之前,请转到sdk\extras\google\market_apk_expansion\downloader_library并编辑project.properties以完全删除"android.library.0"行.您可能还需要在同一文件中更新android目标版本行以匹配现有项目的目标版本.

按照上面链接的页面上的安装说明,"准备使用下载程序库"步骤2应为"文件>新建>导入模块"而不是"文件>新建>新模块".

导入两个模块后,转到"文件>项目结构"并添加依赖项:

  • 您的应用应在许可和下载程序库上具有"模块依赖性"
  • 下载程序库应该在许可库上具有"模块依赖性"

显示"您必须将BASE64_PUBLIC_KEY值更新为属于您的发布者帐户的公钥"的步骤.也是错的.在您选择应用程序后,您需要此特定应用程序的公钥,而不是您的帐户,该帐户位于"服务和API"下的在线开发者控制台中.

许可证验证库和下载程序库都依赖于现已删除的软件包"org.apache.http"

用以下代码替换"decodeExtras"方法的两个实例(一个在APKExpansionPolicy.java中,一个在ServerManagedPolicy.java中):

private Map<String, String> decodeExtras(String extras) {
    Map<String, String> results = new HashMap<String, String>();

    UrlQuerySanitizer sanitizer = new UrlQuerySanitizer();
    sanitizer.setAllowUnregisteredParamaters(true);
    sanitizer.setUnregisteredParameterValueSanitizer(new UrlQuerySanitizer.IllegalCharacterValueSanitizer(
            UrlQuerySanitizer.IllegalCharacterValueSanitizer.URL_LEGAL));
    sanitizer.parseQuery(extras);

    for (UrlQuerySanitizer.ParameterValuePair item : sanitizer.getParameterList()) {
        String name = item.mParameter;
        int i = 0;
        while (results.containsKey(name)) {
            name = item.mParameter + ++i;
        }
        results.put(name, item.mValue);
    }

    return results;
}
Run Code Online (Sandbox Code Playgroud)

在运行时崩溃,说"服务意图必须明确"

请参阅/sf/ask/1713604861/上的答案.

W/LicenseValidator:联系许可服务器时出错

许可证验证库不能在模拟器上运行,这是它抛出的错误.如果您使用的是真实设备,则可能只是真正的超时.

调试版本未通过签名检查(签名验证失败),因此被拒绝访问.

调用许可证验证服务的二进制文件必须是正确签名的发行版本.如果您运行的调试副本不是这种情况,那么许可证检查将失败.

  • 转到在线开发者控制台,设置,帐户详细信息
  • 将"许可证测试响应"更改为"许可"(或您正在测试的任何内容)
  • 在"具有测试权限的Gmail帐户"下输入您的电子邮件地址.

下载程序返回"STATE_COMPLETED"但未完成下载.

这是之前更改的副作用.您被许可,但仍然没有提供APK扩展名的文件,因为你没有真正的授权.此步骤允许您在分发后实际测试下载,而不是手动将文件放到测试设备上.

  • 为应用创建促销代码.
  • 在您的设备上创建一个新用户,获取全新的GMail帐户.
  • 以新用户身份登录您的设备,兑换促销代码.您现在是真正的应用程序所有者.
  • 在"具有测试访问权限的Gmail帐户"下添加新的Gmail帐户,如上一节所述.

您无法使用开发人员的帐户执行此操作,因为购买或兑换将失败,这意味着您永远不会拥有自己产品的副本,这意味着OBB下载永远不会有效.

现在您有了第二个帐户,使用该应用程序的正版Play商店副本注册为具有"假"许可状态的测试帐户,您可以运行代码的调试副本,获取许可状态,拥有下载工作正如您所期望的那样.

W/LVLDL:中止下载请求 .obb:在写入目标文件时:java.io.FileNotFoundException:

从Android v23开始,必须明确请求写入"外部存储"的权限,无论是否是SD卡,以及清单中列出的权限.请参阅https://developer.android.com/guide/topics/permissions/requesting.html.

"找不到文件"是指下载程序库要将OBB文件放入的外部存储上的目录,它无法创建.如果无法创建文件,则会引发异常,但如果无法创建目录,则会以静默方式失败.请参阅processResponseHeaders()DownloadThread.java.

W/LVLDL:中止下载主要请求.无论 .obb:http错误410

您应用的版本号必须与Google知道的当前APK相匹配,否则您的下载请求将被拒绝,错误410.

如果发现一次有效,图书馆将不会重新检查许可证.

如果你正在测试,你可能需要重做几次.许可证验证库在发现许可证后将其状态缓存.您无需完全卸载应用即可清除此问题:

DownloadsDB db = DownloadsDB.getDB(my_app_context);
db.updateMetadata(0, 0);
Run Code Online (Sandbox Code Playgroud)

它还保持下载的OBB到位,可以使用以下命令找到并清除:

final String dlName = Helpers.getExpansionAPKFileName(my_app_context, true, expansionVersion);
final String dlFullPath = Helpers.generateSaveFileName(my_app_context, dlName);
File dlFile = new File(dlFullPath);
if (dlFile.exists())
{
    dlFile.delete();
}
Run Code Online (Sandbox Code Playgroud)

现在,如果你能原谅我,我将在一个月左右的精神静修.


小智 7

除了作者描述的传播时间之外,APK +扩展工作流程还有其他非直观和未记录的陷阱.

  1. 增加APK versionCode但继续使用相同的(旧)扩展文件.似乎如果您没有将新APK上传到开发者控制台,则下载将无法使用更新的应用程序(使用adb直接安装).错误消息也没有帮助:"下载失败,因为无法找到资源".对我而言,谷歌似乎在说"好的,我知道这个扩展文件版本,但我不知道这个应用版本".我在当前文档中没有找到任何对此要求的引用.

  2. 新APK上传到开发者控制台似乎从旧APK"捕获"扩展文件关联.示例:如果删除新的APK(但保留旧版本,其版本与扩展版本相同),则扩展文件似乎也会消失.也许他们认为工作流程是"我们必须将扩展与新的APK相关联,因此开发人员可以毫无问题地自由删除旧的APK".这仍然是另一个似乎没有在任何地方描述的问题.

这些是初步说明.我提交了一份支持请求,可能会确认这些调查结果,所以我会在这里发布更新时(如果?)他们回复...