testingAPK扩展库的问题

我已经将Google的APK扩展文件下载库集成到了我的项目中,它的工作原理还是不错的(除了一些小问题,已经被其他人报道了)。

但是,我很难testing它。 当我第一次testing的时候,我把我签名的APK +主扩展文件版本1上传到了Google Play,并且运行的很好。

但是,当我升级我的应用程序,连同主扩展文件版本2,应用程序不能再下载文件 – 库立即返回NO_DOWNLOAD_REQUIRED,但文件不存在! 我开始debuggingLVL检查通行证,但是可下载的文件表是空的! 当我试图debugging的细节…它突然开始工作了!

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

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

编辑:它刚刚开始工作确定。 这似乎确实需要一段时间才能在Google上传播文件。 关于这个库的一个坏处是,一旦它validation了许可证,就不会再检查下载列表,所以我不得不重新安装应用程序。 奇怪…为什么这是如此复杂?

Solutions Collecting From Web of "testingAPK扩展库的问题"

除了作者描述的传播时间之外,APK + Expansion工作stream程还有其他非直观和未公开的细节。

  1. 增加APK versionCode,但继续使用相同(旧)的扩展文件。 看起来,如果您没有将新APK上传到您的开发者控制台,那么下载将无法从更新的应用程序(直接使用adb安装)中运行。 错误消息也没有帮助:“下载失败,因为找不到资源”。 对我来说,Google看起来像是在说:“好吧,我知道这个扩展文件版本,但我不知道这个应用程序版本。 在当前文档中我没有find任何有关这个要求的参考。

  2. 新的APK上传到开发者控制台似乎“捕捉”从旧APK的扩展文件关联。 例如:如果您删除新的APK(但保留与扩展版本相同的旧版本),则扩展文件似乎也会消失。 也许他们认为工作stream程是“我们必须将扩展与新的APK相关联,所以开发者可以自由地擦除旧的APK没有任何问题”。 这仍然是另一个似乎没有被描述的陷阱。

这些是初步笔记。 我提交了一个支持请求,可能会证实这些发现,所以我会在这里发布更新(如果?)他们回复…

有一点线程死灵,但因为我的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应该是“文件>新build>导入模块”,而不是“文件>新build>新build模块”。

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

  • 您的应用程序应该在授权和下载器库上都有“模块依赖”
  • 下载器库应该在许可库上有一个“模块依赖”

“您必须将BASE64_PUBLIC_KEY值更新为属于您的发布者帐户的公钥”。 也是错的。 您需要公共密钥才能使用这个特定的应用程序 ,而不是您的帐户 。在select应用程序后,该帐户位于在线开发者控制台的“服务和API”下。

许可证validation库和下载器库都依赖于现在被移除的包“org.apache.http”

将两个“decodeExtras”方法的实例(APKExpansionPolicy.java中的一个,ServerManagedPolicy.java中的一个)replace为:

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; } 

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

请参阅https://stackoverflow.com/questions/24480069上的答案&#x3002;

W / LicenseValidator:联系授权服务器时出错

许可证validation库不能在仿真器上工作,这是它引发的错误。 如果您使用的是真实的设备,那可能只是一个真正的超时。

debugging版本签名检查失败(签名validation失败),因此被拒绝访问。

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

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

下载器返回“STATE_COMPLETED”,但下载没有完成。

这是以前的变化的一个副作用。 您已获得许可,但仍未提供APK扩展程序文件,因为您没有获得许可。 这一步使您可以实际testing分发后发生的下载,而不是手动将文件放到testing设备上。

  • 为应用程序创build促销代码。
  • 在您的设备上创build一个新的用户,为一个全新的GMail帐户。
  • 以新用户身份login设备,兑换促销代码。 你现在是一个真正的应用程序拥有者
  • 如前一节所述,在“具有testing访问权限的Gmail帐户”下添加新的Gmail帐户。

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

现在,您已经拥有了第二个帐户,并且具有该应用的真实Play商店副本, 并将其注册为具有“虚假”许可状态的testing帐户,您可以运行代码的debugging副本,获取许可状态拥有下载工作就像你期望的那样。

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

自Android v23以来,有必要明确要求写入“外部存储”的权限,无论是否为SD卡,并且拥有清单中列出的权限。 请参阅https://developer.android.com/guide/topics/permissions/requesting.html

“未find文件”指的是下载器库想要放入OBB文件的外部存储器上的目录 ,这是它无法创build的。 如果无法创build文件 ,则会引发exception,但如果无法创build目录 ,则会自动失败。 请参阅DownloadThread.java中的processResponseHeaders()

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

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

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

如果你正在testing,很可能你需要重做几次。 许可证validation库在被发现被许可之后将其caching。 你可以清除这个没有完全卸载你的应用程序:

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

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

 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. 假设您的应用程序启动时没有扩展文件。
  2. 检查文件是否存在于obvious location

这样你的应用程序将照常运行。 这种方法的最好的部分是你可以select下载文件的请求。

这些是来自开发者网站的笔记。

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.

这里是如何使用
这里是如何下载请求

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

如果您使用示例应用程序的完整代码,是否更改了以下代码段中的版本代码:

 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 ), };