OTA升级
1.日志查看
通过查看recovery日志分析问题
通过adb shell logcat -v time >upgradelog.txt,输出升级过程日志,查看问题卡在何处。
通过adb pull cache/recovery ,查看升级后的日志
2. SELinux权限QA
万能规则解决SELinux中绝大部分的avc denied问题
2.1示例一:
这是一个典型的SELinux权限问题,下面让我们一步步的来破解分析。
分析过程:
缺少什么权限: { write }权限
谁缺少权限: scontext=u:r:kernel:s0
对哪个文件缺少权限: tcontext=u:object_r:block_device
什么类型的文件: tclass=blk_file
解决方法:添加对应的规则,这里建议添加在对应的kernel.te里面
allow kernel block_device:blk_file write;
2.2示例二:
解决方法:按照示例一的流程,这里建议添加在对应的platform_app.te里面添加对应的规则。
allow platform_app app_data_file:file execute
2.3注意
有时候avc denied的log不是一次性显示所有问题,要等你解决一个权限问题之后,才会提示另外一个权限问题。比如提示确实某个目录的read权限,你加入read之后,再显示缺少write权限,要你一次次一次试,一次一次加。这时你可以简单粗暴写个rw_dir_perms,这个权限包含了{open search write …}等等很多权限。可以查看external/sepolicy/global_macros来了解更多权限声明 (相对应的在Android 7和Android 8对应的就是external/sepolicy/global_macros,如果有定义的话 );
要加入的权限很多时,可以用中括号,比如:
allow engsetmacaddr vfat:dir { search write add_name create};
2.4关闭SELinux权限检查
遇到问题不确定是否由于selinux问题造成,可先在adb shell 下,输入setenforce 0,让selinux失效,看是否问题还出现。以此可以澄清是否由selinux造成的问题。
3.升级包制作
3.1整包
1.source build/envtsetup.sh
2.lunch 31(此处选择项目中实际的选项)
3.make otapackage -j8
3.2差分包
1.执行make otapackage -j8 然后拷贝资料
out/target/product/msm8909/obj/PACKAGING/target_files_intermediates/msm8909-target_files-eng.smart-jenkins.zip
到编译根目录,改名为old.zip
2.重复步骤1,改名为new.zip
3.执行命令,制作差分包
./build/tools/releasetools/ota_from_target_files -v --block -p out/host/linux-x86/ -k build/target/product/security/testkey -i old.zip new.zip update.zip
得到差分包update.zip
4.升级包上传&升级任务建立
Type | |
---|---|
车机型号 | 针对不同的车机型号,可以指定升级任务对应的型号 |
车机版本号 | 可以指定当前车机版本号为多少的全部升级 |
设备ID | 车辆序列号,可以指定设备序列号 |
任务类型 | MCU升级或者Android系统升级 |
例如:产线上,某款ABC某批次版本号为v0.7.1 的车机出现严重BUG,线刷成本巨大,现针对v0.7.1 序列为xxxx-xxxx发布升级任务进行在线升级(版本回退或者升级).
5.版本校验&升级包下载
1.读取车机型号/车机版本号/设备ID,从后台服务器获取升级任务
2.升级任务校验,查看升级任务详情,比较版本号等信息,确认是否需要升级.
3.下载升级包,查看本地是否有待下载的升级包,是否是同一升级包,是否需要继续下载或者重新下载
6.升级流程
1.写入缓存目录
将升级包由下载目录拷贝至升级目录data/cache/
2.升级包校验
RecoverySystem.verifyPackage…
3. 安装升级包
RecoverySystem.installPackage…
4.升级结果反馈
车机重启后,校验版本号,检测升级结果,上传服务器
其他升级方式
1.通过Recovery SD卡方式
将刷机包拷贝到sd 卡中。通过adb reboot recovery 方式重启进入recovery 模式进行升级;
然后找到升级包在sd 卡中的位置,点击就能升级了。
2.通过Android adb命令方式
adb root
adb push update.zip /data/update.zip
将升级包导入手机,这个步骤,到时候我们就可以直接通过apk 下载升级包到/data/ 目录或/cache 目录或SD 下。
接下来我们在cache 目录下创建recovery 文件夹:
adb shell "mkdir /cache/recovery"
然后在recovery 目录下创建文件command
adb shell "touch /cache/recovery/command"
下一步就是往command 这个文件中写入:
adb shell
echo "--update_package=/data/update.zip" > /cache/recovery/command
sync
最后我们重启到recovery,系统就会自动进行更新了:
adb reboot recovery