Skip to content

常见问题

xuexiangjys edited this page May 9, 2022 · 14 revisions

接入的问题

1.问:为什么我刚接入的时候,一直报错updateHttpService == null?

答:你需要仔细阅读接入文档,必须在Application中按要求初始化XUpdate,而其中IUpdateHttpService必须设置,除非你自定义版本检查器和版本更新下载器,否则框架将无法正常使用!

2.问:为什么我在开发调试的时候,能够出现最新版本的提示,但是打出来的包却什么反应也没有?

答:出现这个问题,一般是少了混淆配置。如果你使用了自定义的版本更新解析器,请对你的接口实体进行混淆配置。

3.问:为什么我点击下载后文件是能下载下来的,但是进度条不更新,或者打印出进度条的值是-1?

答:出现这种情况可以从两个方面来排查。

  • 如果你打印出进度条的值是-1,那很有可能是服务端提供的下载服务本身就不支持进度。因为如果你在请求服务端下载文件的时候,服务端在请求头中没有返回数据长度,即contentLength(Content-Length)没有设置,是未知的,那么是不可能有进度的。这个你可以通过抓包来查看响应头中是否设置了“Content-Length”。

  • 如果你使用的服务端本身已经确认是支持进度的。那么就可能需要考虑是不是你的IUpdateHttpServicedownload接口实现有问题,你务必要保证接口DownloadCallbackonStartonProgress方法能被正常执行(在主线程中)。

4.问:为什么我执行了版本更新的方法,它却一直提示无最新版本或者是一直在进行版本更新?

答:出现这个问题,你首先得明确一点的是,你判断是否有最新版本的依据是什么。到底是依据VersionCode还是VersionName,这个取决于你实际使用的场景。明确完这一点,你才可以根据日志去判断到底是前端出了问题还是后端出了问题。

5.问:这个最新版本我已经下载过了,只不过没安装,在下一次进行版本更新的检查时,为什么我还要重新下载一次?

答:出现这个问题,只能证明你的后端在返回版本信息的时候并没有返回最新版本文件的MD5值,或者返回了你没有设置。如果你设置了MD5值,那么就是你设置的MD5值和文件计算出来的MD5值不匹配,这种情况下,你的APK文件极有可能被篡改了(当然在这种情况下,你也不能正常安装),或者是你们前后端的MD5值计算算法不一致(一般不存在这种情况)。

6.问:为什么我最新的应用下载了,但是点击安装按钮后一直提示更新失败呢?

答:出现这种问题的情况有很多种。

  • 首先你需要确保能否找到下载下来的最新APK,如果你设置了MD5值的话,还需要判断下载下来的最新APK计算出来的MD5值和后台接口返回的MD5值是否一致(计算文件的MD5值Demo中有对应的方法),注意这里的MD5值指的是应用APK文件的MD5值,而非应用签名文件的MD5值!!
  • 其次你需要手动安装一下APK,确保APK文件没问题(签名一致、文件完整),能正常安装。例如出现 "未安装应用" 弹窗提示的,一般都是签名不一致导致的问题。(你运行的应用是debug签名,但是你打包的应用却是正式签名)
  • 最后你可以在多台设备上尝试一下,确保不是设备自身的问题。
  • 如果以上方法都不能解决问题,很遗憾,那么你只能自定义安装监听器OnInstallListener接口,实现能够正确安装APK的方法了。

7.问:在版本更新的过程中出现了错误,我该如何进行排查?

答:最好的解决方法当然是打断点逐个进行排查啦!当然在打断点前,我们需要调用XUpdate.get().debug(true)开启debug模式,打印相关日志,明确出错的位置,这样才能更快地解决问题啦!

8.问:为什么版本更新弹窗弹不出来,报System.err: at com.xuexiang.xupdate.widget.BaseDialog.init(BaseDialog.java:72) 错误?

答:最好的解决方法就是传入的context使用的是AppCompatActivity, 而不是Activity或者FragmentActivity!如果你一定要使用Activity或者FragmentActivity,那么请设置其主题为Theme.AppCompat类型的主题。

9.问:为什么我设置了isAutoMode=true(自动版本更新模式),但是却无法做到自动静默安装?

答:框架默认提供的静默安装的方法目前只是在较低Android版本上的实现,在高版本Android和定制Rom上需要做额外的适配。如果想要实现自动静默安装,就需要实现OnInstallListener接口,实现静默安装的方法。

自定义的问题

经常有使用者反馈不知道该如何自定义接口(面对一堆接口,不知道该如何下手),进行个性化的定制,以满足版本更新实现的需求,下面我将一一列举问题和解决的方法。

1.问:我使用的是retrofit自定义的接口,不想使用IUpdateHttpService那套通用请求方式来查询最新版本,我该怎么办?

答:可以自定义版本更新检查器IUpdateChecker,它主要负责的是查询是否存在最新版本。可参考框架默认提供的版本更新检查器来自定义。

2.问:我不想使用框架默认的请求服务器返回的json格式,因为公司的后端有自己的一套数据返回格式,我该怎么办?

答:可以自定义版本更新解析器IUpdateParser,它主要负责的是解析服务端返回的数据结果,并构建更新信息实体UpdateEntity。具体可参考自定义版本更新解析器, 也可参考框架默认提供的版本更新解析器来自定义。

3.问:我觉得框架提供的一套默认的版本更新提示界面不符合我们公司的UI风格,我能自定义一套自己的版本更新提示界面吗?

答:可以自定义版本更新提示器IUpdatePrompter,它主要负责的是展示最新的版本信息。具体可参考自定义版本更新提示器, 也可参考框架默认提供的版本更新提示器来自定义。

4.问:我总觉得框架中提供的最新版本APK下载服务速度不行,我想实现自己的下载服务,并做相关下载进度的提示,可以吗?

答:可以自定义版本更新下载器IUpdateDownloader,它主要负责的是下载最新的版本APK安装包。可参考框架默认提供的版本更新下载器来自定义。

5.问:我的应用和普通应用有些特别,并不能使用系统的安装api安装程序,我该怎么办?

答:如果你的apk安装与众不同,你可以实现自己的apk安装器。你只需要实现OnInstallListener接口,并通过XUpdate.setOnInstallListener进行设置即可生效。

【注意】以上实现的自定义接口,都可以通过XUpdate进行全局和局部的设置。

错误码

错误码 备注
2000 查询更新失败
2001 没有wifi
2002 没有网络
2003 正在进行版本更新
2004 无最新版本
2005 版本检查返回空
2006 版本检查返回json解析失败
2007 已经被忽略的版本
2008 应用下载的缓存目录为空
3000 版本提示器异常错误
3001 版本提示器所在Activity页面被销毁
4000 新应用安装包下载失败
4001 读写权限申请失败
5000 apk安装失败
5100 未知错误
Clone this wiki locally