一、问题引入
1.1 背景
预置条件:已编译出2个版本的target包;
问题引入:项目需要本地验证当前项目是否可以编译出OTA差分包和全量包,并通过差分包和全量包成功完成测试机系统版本升级(这里重点讨论编译差分包过程中遇到的问题)
1.2 编译命令
编译OTA的命令:
./build/tools/releasetools/ota_from_target_files -p out/host/linux-x86 -k device/qcom/common/security/releasekey -s device/qcom/common/releasetools.py -v --block -i ota/qssi-target_files-eng1126.zip ota/qssi-target_files-eng1201.zip ota/ota1126_to_1201.zip
参数描述:
第一个为制作OTA的脚本工具;
-s后面为mtk的插入脚本工具;
-k后面为项目签名(如果项目有专门签名,那么就是device/mediatek/common/security/<project>/releasekey,如果项目没有定制签名就用平台签名build/target/product/security/ releasekey)
-v 显示正在执行的命令
--block 基于block更新,代码生成基于块的升级包,其实已经没有意义了。android P的代码,不再支持基于文件的升级包
-p 指定在做包过程中用于搜索相应的bin程序和jar包的路径
-i 制作差分包
-k 表示用后面紧跟的密钥重新签名升级包。
二、问题处理过程
2.1 no module protobuf
问题描述:使用ota脚本编译OTA报错:ImportError: No module named google.protobuf
问题原因:python环境中缺少google.protobuf,通过如下命令安装该工具
pip install google
pip install protobuf
2.2 python版本语法问题
问题描述:使用ota脚本编译OTA报错如下:
File "/media/user/code2/aosp/qssi/build/make/tools/releasetools/common.py", line 1672
f"GKI boot_signature size must be <= {BOOT_SIGNATURE_SIZE}")
问题原因:python版本导致的语法问题,这里使用python2的环境编译了python3语法的代码,只需要把报错的脚本代码修改为python3的语法即可,例如将上述语句修改为:
"GKI boot_signature size must be <= {}".format(BOOT_SIGNATURE_SIZE)
另外,切换当前系统python版本的方法如下:
(1)列出可用的python替代版本:
update-alternatives --list python
(2)在列出的python替代版本中选择对应的python版本,选择需要的python版本序号回车确定即可:
sudo update-alternatives --config python
注:如果上述(1)中报如下错误,则表示 Python 的替代版本尚未被update-alternatives 命令识别,需要对该版本的python进行安装,安装命令如下第2、3条
update-alternatives: error: no alternatives for python
update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2
三、JDK版本导致的报错
3.1 报错信息
详细报错信息如下:
ExternalError: Failed to run signapk.jar: return code 1:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/signapk/SignApk has been compiled by a more recent version of the Java Runtime (class file version 53.0), this version of the Java Runtime only recognizes class file versions up to 52.0
......
3.2 问题分析和解决
根据报错分析是因为用于编译jar文件的jdk版本不一致导致,适用于jdk8的Java类版本是52,适用于jdk11的Java类版本是55,解决方法如下:
(1)首先用如下命令查看jdk版本,我之前的版本是openjdk-8
java --version
(2)使用如下命令安装openjdk-11
sudo apt-get install openjdk-11-jdk
(3)使用如下命令配置linux默认jdk版本,选择你需要的JDK版本
sudo update-alternatives --config java
(4)使用如下命令配置默认java版本,选择你需要的 java 版本。
sudo update-alternatives --config javac
四、swap分区不足问题
4.1 问题描述
编译OTA时用到的target包是通过项目代码整编获取的,最终生成的target包位于项目的如下目录中:
out/target/product/qssi/obj/PACKAGING/target_files_intermediates/
而当整编项目代码时,有一种编译失败,报错中会有这样一句:Clang SA is not enabled,这样的报错一般都是因为swap分区不足造成的,只需要增大Linux系统swap分区的大小即可。
4.2 swap分区扩展
1.1 查看当前swap分区的大小;
free -h
1.2 总内存为3.7G,交换分区大小为500M;
2.1 创建大小为4G的空间
dd if=/dev/zero of=/swap1 bs=1M count=4096
2.2 if 表示infile,of表示outfile,bs=1M代表增加的模块大小,count=4096代表4096个模块,也就是4G空间
3. 将目的文件设置为swap分区文件
mkswap /swap1
4. 激活swap,立即启用交换分区文件
swapon <swap_file>
例如:swapon /swap1
5. free -h查看swap已经增加了,但这只是临时性的,如果机器重启会失效
6.1 设置开机自动挂载
vi /etc/fstab
6.2 最后一行添加
/swap1 swap swap defaults 0 0
7. 重启测试,测试成功!内存增加
文章来源:https://www.toymoban.com/news/detail-661354.html
文章来源地址https://www.toymoban.com/news/detail-661354.html
到了这里,关于OTA编译报Exception in thread “main“ java.lang.UnsupportedClassVersionError: com/android/signapk/SignApk的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!