常用的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)的差量更新包,我需要验证一下内容
- AB版本的输入法能够差量升级成功
- 非AB版本的输入法能够全量升级成功
- 日志版本号正确。Done!,从准备环境到完成预计1H完成
问题描述
- 第一遍安装输入法A,日志正确,是差量升级,从“应用管理”页面升级后验证版本号正确……心想:还挺顺利
- 欲从市场页面检查“省流量更新”的功能,结果,第二遍却不是差量升级了,卸了又安,卸了又安……死活都不是差量升级了
- 开始用回忆排查问题:
- 是不是PC指host了?
- 是不是fiddler里面有自定义脚本?
- 是不是自己安装的版本有问题(难道输入法只对个别渠道才会进行差量?)?
- 是不是手机WiFi是测试网络?
- 跟开发反馈后,后台开发说我的请求中携带的MD5值根本查不到!!!
-
纳尼??!——>差量升级后台是怎么判断?各种问题扑面而来……淡定!!!一个个屡清楚……时间慢慢的飘过~~~ *
- 不是PC的host问题;
- 不是fiddler自定义脚本的问题;
- 不是手机WiFi的问题;
- 不是安装包的问题;
- 如果是自己安装版本的问题的话那么怎么忽好忽坏呢;
- 最后将问题锁定在差量升级的逻辑上
问题分析1
- 和客户端开发确认差量升级的逻辑,XX请求中携带输入法包的MD5值并传给后台服务器,服务器和库里的MD5值对比一致后,返回差量包的地址,大小等
- 为什么我使用同样的版本安装,XX请求中的MD5值却不同呢?客户端开发提示说“apk安装到内存和安装到SD卡可能会导致MD5值不同”
- 回想我在测试过程中使用的安装工具是不是有将输入法安装到SD卡中的情况:
问题分析2
- 使用adb install命令默认安装到内存,-s命令安装失败
- 使用 360PC助手安装, XX请求中MD5值和实际的一致;
- 使用安装器,不能选择安装路径,但是XX请求中MD5值和实际的一致;
- 使用PC助手安装,设置中选择“优先安装到SD卡”,实际安装后是安装到内存,XX请求中MD5值和实际的不一致
- 使用PC助手安装,设置中选择“优先安装到内存”,实际安装后是安装到内存,XX请求中MD5值和实际的不一致
问题分析3
局势已经开始明朗,PC助手安装apk时是怎么安装的,为什么导致输入法的MD5值发生变化呢?
- PC助手安装apk使用的命令是:adb install -r -l 路径;;;再对-r –l单独操作
- 单独使用adb install –r 路径,MD5值前后一致;
- 单独使用adb install –l 路径,MD5值前后不一致;
- 幸好遇到了爱钻研的帅帅同学,TA把这个问题告诉帅帅后,经过帅帅同学的一番钻研后发现:-l命令安装本地apk后,具有保护apk不被转移的功能,XX请求通过系统接口获取不到真正apk包的MD5值(root之后的手机在mnt/esac路径下能够看到该包以及res.zip,由于经过-l安装后的apk被保护,XX请求只能拿到res.zip的MD5值,so通过PC助手安装后,MD5值发生了变化
总结
- install -l 安装apk后会导致apk在Android手机被保护,因此读取MD5使可能会读取异常
- 读取MD5有两种情况,包本身的MD5和签名的MD5
- 修改fiddler脚本测试完成后,应及时将脚本注销,防止在后续测试的过程中产生影响
- 给install 传多个参数进行安装apk时,在排查问题时,可以单独传参,排查问题
- 没有不能重现的bug
- 追查问题挺痛苦的,但是可以学到东西
TODO处理
- 没有root的手机被-l安装后是不是拿不到MD5值了?
- 答复:与手机是否root没有关系,只安装时的传参有关系。因此,结论是:无论手机root与否,当使用-l安装,则不会进行差量更新,这部分APP在这一版本就不能通过差量更新升级了,但是后续这个版本的全量升级一定会开放,可以通过这个版本升级(目前:1.0不能升级到2.0,但是后续,1.0一定可以升级到3.0)
- adb install -l安装apk后,全量更新能够成功吗?
- 答复:无论是否使用-l安装,最终都能够成功升级到对应版本
- adb install -l安装apk被锁定后,会影响什么,会有什么操作不能做?
- 答复:原本安装包释放在data\app下面,-l之后释放到mnt/esac路径下,看不到,安装和卸载,升级都能够正常,通知也能正常弹出;通过-l 安装后,再使用-r安装,该apk包会被移除被保护目录