一、問題引入
1.1 背景
? ? ? ? 預(yù)置條件:已編譯出2個版本的target包;
? ? ? ? 問題引入:項目需要本地驗證當前項目是否可以編譯出OTA差分包和全量包,并通過差分包和全量包成功完成測試機系統(tǒng)版本升級(這里重點討論編譯差分包過程中遇到的問題)
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
參數(shù)描述:
第一個為制作OTA的腳本工具;
-s后面為mtk的插入腳本工具;
-k后面為項目簽名(如果項目有專門簽名,那么就是device/mediatek/common/security/<project>/releasekey,如果項目沒有定制簽名就用平臺簽名build/target/product/security/ releasekey)
-v ?顯示正在執(zhí)行的命令
--block 基于block更新,代碼生成基于塊的升級包,其實已經(jīng)沒有意義了。android P的代碼,不再支持基于文件的升級包
-p 指定在做包過程中用于搜索相應(yīng)的bin程序和jar包的路徑
-i 制作差分包
-k 表示用后面緊跟的密鑰重新簽名升級包。
二、問題處理過程
2.1 no module protobuf
? ? ? ? 問題描述:使用ota腳本編譯OTA報錯:ImportError: No module named google.protobuf
????????問題原因:python環(huán)境中缺少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的環(huán)境編譯了python3語法的代碼,只需要把報錯的腳本代碼修改為python3的語法即可,例如將上述語句修改為:
"GKI boot_signature size must be <= {}".format(BOOT_SIGNATURE_SIZE)
? ? ? ? 另外,切換當前系統(tǒng)python版本的方法如下:
? ? ? ? (1)列出可用的python替代版本:
update-alternatives --list python?
? ? ? ? (2)在列出的python替代版本中選擇對應(yīng)的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 問題分析和解決
????????根據(jù)報錯分析是因為用于編譯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分區(qū)不足問題
4.1 問題描述
? ? ? ? 編譯OTA時用到的target包是通過項目代碼整編獲取的,最終生成的target包位于項目的如下目錄中:
out/target/product/qssi/obj/PACKAGING/target_files_intermediates/
? ? ? ? 而當整編項目代碼時,有一種編譯失敗,報錯中會有這樣一句:Clang SA is not enabled,這樣的報錯一般都是因為swap分區(qū)不足造成的,只需要增大Linux系統(tǒng)swap分區(qū)的大小即可。
4.2 swap分區(qū)擴展
? ? ? ? 1.1 查看當前swap分區(qū)的大?。?/p>
free -h
? ? ? ? 1.2 總內(nèi)存為3.7G,交換分區(qū)大小為500M;?
? ? ? ? ?2.1 創(chuàng)建大小為4G的空間
dd if=/dev/zero of=/swap1 bs=1M count=4096
? ? ? ? 2.2?if 表示infile,of表示outfile,bs=1M代表增加的模塊大小,count=4096代表4096個模塊,也就是4G空間
? ? ? ? ?3.?將目的文件設(shè)置為swap分區(qū)文件
mkswap /swap1
? ? ? ? 4.?激活swap,立即啟用交換分區(qū)文件
swapon <swap_file>
例如:swapon /swap1
? ? ? ? 5.?free -h查看swap已經(jīng)增加了,但這只是臨時性的,如果機器重啟會失效
? ? ? ? 6.1 設(shè)置開機自動掛載?
vi /etc/fstab
? ? ? ? 6.2?最后一行添加
/swap1 swap swap defaults 0 0
? ? ? ? 7. 重啟測試,測試成功!內(nèi)存增加
文章來源:http://www.zghlxwxcb.cn/news/detail-661354.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-661354.html
到了這里,關(guān)于OTA編譯報Exception in thread “main“ java.lang.UnsupportedClassVersionError: com/android/signapk/SignApk的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!