差量更新失败的问题总结adb install -l

2015/10/30 Android

常用的adb 安装命令

install [options] <PATH>
Installs a package (specified by <PATH>) to the system.
Options:
·         -l: Install the package with forward lock.
·         -r: Reinstall an exisiting app, keeping its data.
·         -t: Allow test APKs to be installed.
·         -i <INSTALLER_PACKAGE_NAME>: Specify the installer package name.
·         -s: Install package on the shared mass storage (such as sdcard).
·         -f: Install package on the internal system memory.
·         -d: Allow version code downgrade.

问题预期

输入法上新版本后,会同时在我们的市场上两个版本(AB)的差量更新包,我需要验证一下内容

  1. AB版本的输入法能够差量升级成功
  2. 非AB版本的输入法能够全量升级成功
  3. 日志版本号正确。Done!,从准备环境到完成预计1H完成

问题描述

  1. 第一遍安装输入法A,日志正确,是差量升级,从“应用管理”页面升级后验证版本号正确……心想:还挺顺利
  2. 欲从市场页面检查“省流量更新”的功能,结果,第二遍却不是差量升级了,卸了又安,卸了又安……死活都不是差量升级了
  3. 开始用回忆排查问题:
    • 是不是PC指host了?
    • 是不是fiddler里面有自定义脚本?
    • 是不是自己安装的版本有问题(难道输入法只对个别渠道才会进行差量?)?
    • 是不是手机WiFi是测试网络?
    • 跟开发反馈后,后台开发说我的请求中携带的MD5值根本查不到!!!
  • 纳尼??!——>差量升级后台是怎么判断?各种问题扑面而来……淡定!!!一个个屡清楚……时间慢慢的飘过~~~ *

  • 不是PC的host问题;
  • 不是fiddler自定义脚本的问题;
  • 不是手机WiFi的问题;
  • 不是安装包的问题;
  • 如果是自己安装版本的问题的话那么怎么忽好忽坏呢;
  • 最后将问题锁定在差量升级的逻辑上

问题分析1

  1. 和客户端开发确认差量升级的逻辑,XX请求中携带输入法包的MD5值并传给后台服务器,服务器和库里的MD5值对比一致后,返回差量包的地址,大小等
  2. 为什么我使用同样的版本安装,XX请求中的MD5值却不同呢?客户端开发提示说“apk安装到内存和安装到SD卡可能会导致MD5值不同”
  3. 回想我在测试过程中使用的安装工具是不是有将输入法安装到SD卡中的情况:

问题分析2

  1. 使用adb install命令默认安装到内存,-s命令安装失败
  2. 使用 360PC助手安装, XX请求中MD5值和实际的一致;
  3. 使用安装器,不能选择安装路径,但是XX请求中MD5值和实际的一致;
  4. 使用PC助手安装,设置中选择“优先安装到SD卡”,实际安装后是安装到内存,XX请求中MD5值和实际的不一致
  5. 使用PC助手安装,设置中选择“优先安装到内存”,实际安装后是安装到内存,XX请求中MD5值和实际的不一致

问题分析3

局势已经开始明朗,PC助手安装apk时是怎么安装的,为什么导致输入法的MD5值发生变化呢?

  1. PC助手安装apk使用的命令是:adb install -r -l 路径;;;再对-r –l单独操作
  2. 单独使用adb install –r 路径,MD5值前后一致;
  3. 单独使用adb install –l 路径,MD5值前后不一致;
  4. 幸好遇到了爱钻研的帅帅同学,TA把这个问题告诉帅帅后,经过帅帅同学的一番钻研后发现:-l命令安装本地apk后,具有保护apk不被转移的功能,XX请求通过系统接口获取不到真正apk包的MD5值(root之后的手机在mnt/esac路径下能够看到该包以及res.zip,由于经过-l安装后的apk被保护,XX请求只能拿到res.zip的MD5值,so通过PC助手安装后,MD5值发生了变化

总结

  1. install -l 安装apk后会导致apk在Android手机被保护,因此读取MD5使可能会读取异常
  2. 读取MD5有两种情况,包本身的MD5和签名的MD5
  3. 修改fiddler脚本测试完成后,应及时将脚本注销,防止在后续测试的过程中产生影响
  4. 给install 传多个参数进行安装apk时,在排查问题时,可以单独传参,排查问题
  5. 没有不能重现的bug
  6. 追查问题挺痛苦的,但是可以学到东西

TODO处理

  1. 没有root的手机被-l安装后是不是拿不到MD5值了?
    • 答复:与手机是否root没有关系,只安装时的传参有关系。因此,结论是:无论手机root与否,当使用-l安装,则不会进行差量更新,这部分APP在这一版本就不能通过差量更新升级了,但是后续这个版本的全量升级一定会开放,可以通过这个版本升级(目前:1.0不能升级到2.0,但是后续,1.0一定可以升级到3.0)
  2. adb install -l安装apk后,全量更新能够成功吗?
    • 答复:无论是否使用-l安装,最终都能够成功升级到对应版本
  3. adb install -l安装apk被锁定后,会影响什么,会有什么操作不能做?
    • 答复:原本安装包释放在data\app下面,-l之后释放到mnt/esac路径下,看不到,安装和卸载,升级都能够正常,通知也能正常弹出;通过-l 安装后,再使用-r安装,该apk包会被移除被保护目录

Search

    Post Directory