阅读:9887回复:5

Android OTA升级的问题

楼主#
更多 发布于:2019-09-25 11:43
     我们客户最近反映了一个问题,之前给他们出的一版S905X-6.0的固件,他们发现Google play service自动更新后,play store里面没法更新Youtube了,这个问题也不是重点,没必要去纠结为什么没法更新的问题, 客户想要的是Youtube更新,给他们推送OTA差分升级就可以,顺便把一些他们之前提的其他问题一块也解决了一起更新。
      问题来了,Youtube是打包在/system/preinstall/ 目录下面,做过Amlogic的同学都知道,他们给的一个安装APK的补丁,主要是开机启动service,运行/system/bin/preinstall.sh脚本:

MARK=/data/local/symbol_thirdpart_apks_installed
PKGS=/system/preinstall/
if [ ! -e $MARK ]; then
echo "booting the first time, so pre-install some APKs."
find $PKGS -name "*\.apk" -exec sh /system/bin/pm install {} \;
touch $MARK
echo "OK, installation complete."

脚本里面定义了一个文件:MARK=/data/local/symbol_thirdpart_apks_installed 第一次开机是没有这个文件的,所以会执行安装命令,安装完成后touch这个文件,以后就不会再执行安装命令了。因为OTA升级后,这个文件依然存在,所以不会安装/system/preinstall/ 目录下的APK,对于这个问题我刚开始还琢磨了许久,想了很多种方法,考虑了各种问题,后来发现是我想多了,当时是晚上真的是头脑不清晰。今天早上过来略加思索,马上明白过来,原来乳此简单,果然是早上头脑清醒。只需要修改一下脚本里的这个文件MARK=/data/local/symbol_thirdpart_apks_installed就好了。比如我现在是OTA升级v1版本,修改为MARK=/data/local/symbol_thirdpart_apks_installed_v1就好了。

但是OTA升级之后发现,apk依然没有更新,这时候不要慌,看看到底发生了什么,检查了一下,发现安装命令确实有执行过了,MARK=/data/local/symbol_thirdpart_apks_installed_v1已经创建了,于是删掉这个文件,手动执行了一下脚本,发现:
booting the first time, so pre-install some APKs.
       pkg: /system/preinstall/happycast.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]
       pkg: /system/preinstall/kakaokids.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]
       pkg: /system/preinstall/kodi-17.6-Krypton-armeabi-v7a.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]
       pkg: /system/preinstall/youtube2.apk
原来是apk已经存在,所以安装失败了,检查一下脚本的安装命令:
find $PKGS -name "*\.apk" -exec sh /system/bin/pm install {} \;
改成:
find $PKGS -name "*\.apk" -exec sh /system/bin/pm install -r {} \;

加上 -r 强制覆盖就解决了

最新喜欢:

VastStarGamesVastSt...
[url]http://190.lsal.cn/195/1329.gif?0728100424873[/url]
沙发#
发布于:2019-09-25 12:10
[url]http://190.lsal.cn/195/1329.gif?0728100424873[/url]
板凳#
发布于:2020-12-29 22:13
今天在想preinstall这个脚本的原理,就是每次开机时检测mask文件,如果mask不存在就安装apk,并创建mask,但存在一个问题,如果用户删除这个预装的应用,再想使用这个应用时就只能恢复出厂设置了。因此,我修改了一下脚本:

#!/system/bin/sh

MARK=/data/local/symbol_thirdpart_apks_installed
PKGS=/vendor/preinstall/

for i in `busybox find $PKGS -name "*.apk"`; do
        pkg=`echo $i|cut -d '/' -f 4|cut -d '.' -f 1`
        installed=`pm list package $pkg`
        if [ -z $installed ]; then
                /system/bin/pm install $i
        fi
done
要求apk以包名命名,比如qqmusic.apk。
即使应用被用户删除,下次重启时检测到包名不存在时还会自动安装。
脚本写得有点丑,后面有时间再优化一下cut语句
地板#
发布于:2020-12-30 09:30
老铁不错,shell语句用的出神入化,确实是个不错的方法。
[url]http://190.lsal.cn/195/1329.gif?0728100424873[/url]
4楼#
发布于:2020-12-30 09:34
陆沉子:今天在想preinstall这个脚本的原理,就是每次开机时检测mask文件,如果mask不存在就安装apk,并创建mask,但存在一个问题,如果用户删除这个预装的应用,再想使用这个应用时就只能恢复出厂设置了。因此,我修改了一下脚本:

#!...
回到原帖
老铁不错,shell语句用的出神入化,确实是个不错的方法。
[url]http://190.lsal.cn/195/1329.gif?0728100424873[/url]
5楼#
发布于:2020-12-31 11:41
zhaoyf13:老铁不错,shell语句用的出神入化,确实是个不错的方法。回到原帖
哈哈,刚好看了下pm命令的用法,就用上了,正则表达式没怎么用过,临时百度了一下,将就着用
游客

返回顶部