测试APK扩展库的问题

时间:2012-08-13 11:35:17

标签: android google-play apk expansion

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:14)

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

将库添加到Android Studio

错误信息部(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和#34;在您选择了应用后。

许可证验证库和下载程序库都依赖于现已删除的软件包" 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;
}

在运行时崩溃,说&#34;服务意图必须明确&#34;

请参阅https://stackoverflow.com/questions/24480069上的答案。

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

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

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

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

  • 转到在线开发者控制台,设置,帐户详细信息
  • 更改&#34;许可测试响应&#34;到&#34;许可&#34; (或者你正在测试的任何东西)
  • 在&#34;具有测试权限的Gmail帐户&#34;。
  • 下输入您的电子邮件地址

下载器返回&#34; STATE_COMPLETED&#34;但下载没有完成。

这是之前更改的副作用。您已获得许可,但仍未提供APK扩展程序文件,因为您未获得 许可。此步骤允许您在分发后实际测试下载,而不是手动将文件放置到测试设备上。

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

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

现在您拥有了第二个帐户,其中包含应用的正版Play商店副本,该副本已注册为测试帐户,其中包含假冒的&#39;许可状态,您可以运行代码的调试副本,获得许可状态,让下载按预期运行。

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

从Android v23起,必须明确请求写入&#34;外部存储&#34;的权限,无论是否是SD卡,以及是否已列出权限在你的清单中。请参阅https://developer.android.com/guide/topics/permissions/requesting.html

未找到&#34;文件&#34;指的是下载程序库要将OBB文件放入的外部存储上的目录,它无法创建。如果无法创建文件,则会引发异常,但如果无法创建目录,则会无提示失败。请参阅DownloadThread.java中的processResponseHeaders()

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

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

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

如果您正在测试,您可能需要重复做几次。许可证验证库在发现许可证后将其缓存到其状态。您可以清除此,而无需完全卸载您的应用:

DownloadsDB db = DownloadsDB.getDB(my_app_context);
db.updateMetadata(0, 0);

它还保持下载的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();
}

现在,如果你原谅我,我已经有一个月左右的精神静修了。

答案 1 :(得分:7)

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

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

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

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

答案 2 :(得分:0)

获取扩展文件有两种标准方法。(您可以将其作为假设)。

  1. 假设您的应用程序启动时没有扩展文件。
  2. 检查文件是否存在于obvious location中。
  3. 这样您的应用就会像往常一样运作。这种方法的最佳部分是您可以选择下载文件。

    这些是开发者网站的注释。

    Note: The URL that Google Play provides for your expansion files is unique for every download and each one expires shortly after it is given to your application.

    Note: Whether your application is free or not, Google Play returns the expansion file URLs only if the user acquired your application from Google Play.

    Here is how to use
    Here is how to place download request

    希望这会帮助您获得结果。

答案 3 :(得分:0)

如果您使用示例应用中的完整代码,请更改以下代码中的版本代码: -

private static final XAPKFile[] xAPKS = {
        new XAPKFile(
                true, // true signifies a main file
                <Version code here>, // the version of the APK that the file was uploaded
                   // against
                49597391L // the length of the file in bytes
        ),

};