ANDROID OTA FOTA

一 ANDROID 6.0 OTA

1.1 编译source版本

#source build/envsetup.sh 
#lunch xxx-userdebug (此例为xxx-userdebug)
#make -j4 
#make otapackage -j4 (将生成制作差分包的对比包xxx-target_files-eng.username.zip)

生成source版本的out/target/product/xxx/obj/PACKAGING/target_files_intermediates/xxx-target_files-eng.username.zip
备份到自定义路径(任意)./OTA/old/
cp out/target/product/xxx/obj/PACKAGING/target_files_intermediates/xxx-target_files-eng.username.zip ./OTA/old/

1.2 下载source软件

source版本编译后,设备下载source版本软件:

#fastboot flash boot boot.img
#fastboot flash aboot emmc_appsboot.mbn
#fastboot flash system system.img
#fastboot flash userdata userdata.img
......

1.3 编译target版本

源代码做改动,更新版本号,改动后的版本为target版本(待更新的版本)。

# make -j4
# make otapackage -j4

生成target版本的out/target/product/xxx/obj/PACKAGING/target_files_intermediates/xxx-target_files-eng.username.zip
备份到自定义路径(任意)./OTA/new/
cp out/target/product/xxx/obj/PACKAGING/target_files_intermediates/xxx-target_files-eng.username.zip ./OTA/new/

1.4 生成差分包

  • 生成差分包update.zip指令
#./build/tools/releasetools/ota_from_target_files -i OTA/old/xxx-target_files-eng.username.zip OTA/new/xxx-target_files-eng.username.zip ./OTA/update.zip

错误:

Applying radio-update script modifications...
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/signapk/SignApk : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:648)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:272)
at java.net.URLClassLoader.access$000(URLClassLoader.java:68)
at java.net.URLClassLoader$1.run(URLClassLoader.java:207)
at java.net.URLClassLoader$1.run(URLClassLoader.java:201)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:200)
at java.lang.ClassLoader.loadClass(ClassLoader.java:325)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:296)
at java.lang.ClassLoader.loadClass(ClassLoader.java:270)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:406)

ERROR: signapk.jar failed: return code 1

错误分析:JDK版本不对。
解决方法:根据android版本选择对应的JDK版
JDK版本切换指令:

#sudo update-alternatives --config java
#sudo update-alternatives --config javac 
#sudo update-alternatives --config javap
#sudo update-alternatives --config javadoc

重新执行

#./build/tools/releasetools/ota_from_target_files -i OTA/old/xxx-target_files-eng.username.zip OTA/new/xxx-target_files-eng.username.zip ./OTA/update.zip

成功生成update.zip

1.5 更新软件

1.5.1 SD卡升级

1)update.zip提前拷贝到SD卡中;
(2)进入 recovery 模式: adb reboot recovery;
(3)选择"apply update from sdcard";
(4)选择 SD 卡中的 update.zip 文件,固件将自动升级。

1.5.2 指令升级

1) adb root
(2) adb push update.zip /data/update.zip
(3) adb shell
(4) mkdir /cache/recovery
(5) touch /cache/recovery/command
(6) echo "--update_package=/data/update.zip" > /cache/recovery/command
(7) reboot recovery
(8)升级完自动开机

1.5.2 sideload升级

1)adb reboot recovery
(2)选择"apply update from ADB"3)adb sideload update.zip
(4)等待升级完成,手动重启设备。
  • 例子:下载ota差分包update.zip
adb sideload update.zip
serving: 'update.zip' (~88%)
  • 升级出现错误: script aborted: Package expects build fingerprint of
Now send the package you want to apply
to the device with "adb sideload <filename>"...
sideload-host file size 7350985 block size 65536
Finding update package...
I:Update location: /sideload/package.zip
Opening update package...
I:read key e=3 hash=20
I:1 key(s) loaded from /res/keys
Verifying update package...
I:comment is 1738 bytes; signature 1720 bytes from end
I:whole-file signature verified against RSA key 0
I:verify_file returned 0
Installing update...
script aborted: Package expects build fingerprint of qcom/xxx/xxx:6.0.1/MMB29M/username05151500:userdebug/test-keys or qcom/xxx/xxx:6.0.1/MMB29M/username05151500:userdebug/test-keys; this device has qcom/xxx/xxx:6.0.1/MMB29M/username10271139:userdebug/test-keys.
Package expects build fingerprint of qcom/xxx/xxx:6.0.1/MMB29M/username05151500:userdebug/test-keys or qcom/xxx/xxx:6.0.1/MMB29M/username05151500:userdebug/test-keys; this device has qcom/xxx/xxx:6.0.1/MMB29M/username10271139:userdebu
E:Error in /sideload/package.zip
  • 分析

当前版本的fingerprint和update.zip不同。

  • 解决

查看out目录
build.prop.bakforspec:41:ro.build.fingerprint=qcom/xxx/xxx:6.0.1/MMB29M/username05151500:userdebug/test-keys
build.prop:41:ro.build.fingerprint=qcom/xxx/xxx:6.0.1/MMB29M/username05151500:userdebug/test-keys
删除build.prop,build.prop.bakforspec,重新执行二~五。

1.6 DEBUG

  • 正常升级log
Supported API: 3
Finding update package...
I:Update location: /data/update.zip
Opening update package...
I:read key e=3 hash=20
I:1 key(s) loaded from /res/keys
Verifying update package...
I:comment is 1738 bytes; signature 1720 bytes from end
I:whole-file signature verified against RSA key 0
I:verify_file returned 0
Installing update...
Source: qcom/xxx/xxx:6.0.1/MMB29M/username10271139:userdebug/test-keys
Target: qcom/xxx/xxx:6.0.1/MMB29M/username10271139:userdebug/test-keys
Verifying current system...
partition read matched size 15818024 sha 70db68bb8ae7641b3e669535250a3ed6b4f591dd
254337024 bytes free on /cache (989184 needed)
Removing unneeded files...patch /system/bin/install-recovery.sh:
now ae6ace2f
patch /system/etc/cdrom_install.iso: Patching system files...
now bad887c5
patch /system/etc/recovery-resource.dat: now a0824d24
patch /system/recovery-from-boot.p: now fa700054
Patching boot image...
patch EMMC:/dev/block/bootdevice/by-name/boot:15818024:70db68bb8ae7641b3e669535250a3ed6b4f591dd:15818024:1e47c2e751dc944d251e288d71ae56d73606e588: partition read matched size 15818024 sha 70db68bb8ae7641b3e669535250a3ed6b4f591dd
254337024 bytes free on /cache (15818024 needed)
now 1e47c2e7
caches dropped
verification read succeeded (attempt 1)
Symlinks and permissions...
Patching firmware images...
Patching remaining system files...

二 ANDROID 10 OTA

2.1 OTA编译

  • 方法1

第一次编译生成source/基础包xxx-target_files-eng.xxx.zip

make dist -j4

备份为OTA/new/xxx-target_files-eng.xxx.zip

修改源代码,更新版本号,第二次编译生成target/目标包xxx-target_files-eng.xxx.zip。

make dist -j4

备份为OTA/old/xxx-target_files-eng.xxx.zip

生成差分包update.zip

./build/tools/releasetools/ota_from_target_files -v -i OTA/old/xxx-target_files-eng.xxx.zip OTA/new/xxx-target_files-eng.xxx.zip ./OTA/update.zip
  • 方法2

android旧版本编译及生成差分包
第一次编译生成source/基础包xxx-target_files-eng.xxx.zip

#make -j4
#make otapackage -j4

备份为OTA/old/xxx-target_files-eng.xxx.zip

修改源代码,更新版本号,第二次编译生成target/目标包xxx-target_files-eng.xxx.zip。

#make -j4
#make otapackage -j4

备份为OTA/new/xxx-target_files-eng.xxx.zip

生成差分包update.zip

#./build/tools/releasetools/ota_from_target_files -v -i OTA/old/xxx-target_files-eng.xxx.zip OTA/new/xxx-target_files-eng.xxx.zip ./OTA/update.zip

2.2 ANDROID 10 示例make dist -j4

#make dist -j4

执行make dist -j4后会分别在以下路径生成3个包,对应相同,可以选择其中一个路径的包备份即可。

  • dist目录
out/dist/msm8937_32-img-eng.username.zip
out/dist/msm8937_32-target_files-eng.username.zip
out/dist/msm8937_32-ota-eng.username.zip
  • out/target/product/msm8937_32目录
out/target/product/msm8937_32-img-eng.username.zip
out/target/product/msm8937_32/obj/PACKAGING/target_files_intermediates/msm8937_32-target_files-eng.username.zip
out/target/product/msm8937_32/msm8937_32-ota-eng.username.zip
  • 整包已经签名

其中msm8937_32-ota-eng.username.zip为ota整包;
msm8937_32-img-eng.username.zip为编译生成的bin的打包,可以用fastboot升级其中的bin。注意,msm8937_32-img-eng.username.zip中缺少emmc_appsboot.mbn,persist.img,mdtp.img。这3个bin也要备份。
msm8937_32-target_files-eng.username.zip用于制作差分包update.zip的对比包。

另外ota整包msm8937_32-ota-eng.username.zip已经签名,userdebug版本为testkey

2021-08-26 18:36:51 - common.py - INFO : Running: "java -Xmx2048m -Djava.library.path=out/host/linux-x86/lib64 -jar out/host/linux-x86/framework/signapk.jar -w build/target/product/security/testkey.x509.pem build/target/product/security/testkey.pk8 /home/username/work/SC200R/SC200R_Android10.0_R04_r023/out/soong/.temp/tmp0h_fRn.zip out/target/product/msm8937_32/msm8937_32-ota-eng.username.zip"
2021-08-26 18:37:06 - ota_from_target_files - INFO : done.
Compressing system.new.dat with brotli
Compressing vendor.new.dat with brotli
Loading radio filesmap...
Loading radio target...
Preparing radio-update files...
Applying radio-update script modifications...
[100% 14749/14749] Dist: out/dist/msm8937_32-ota-eng.username.zip

msm8937_32-target_files-eng.username.zip解压IMAGES目录中的bin和msm8937_32-img-eng.username.zip相同。

  • 生成差分包update.zip
#./build/tools/releasetools/ota_from_target_files -v -i out/old/msm8937_32-target_files-eng.username.zip out/new/msm8937_32-target_files-eng.username.zip ./out/update.zip
  • 签名文件
build/target/product/security/testkey
  • 生成的差分包已经完成了签名,不用另外单独签名
2021-08-27 10:23:40 - common.py - INFO : Running: "java -Xmx2048m -Djava.library.path=out/host/linux-x86/lib64 -jar out/host/linux-x86/framework/signapk.jar -w build/target/product/security/testkey.x509.pem build/target/product/security/testkey.pk8 /tmp/tmp_FLJQ6.zip ./out/update.zip"

2.3 验证过程

2.3.1 升级source包

  • 方法1:fastboot 升级source包

其中的bin为msm8937_32-img-eng.username.zip中的bin,缺少的emmc_appsboot.mbn,persist.img,mdtp.img为out/target/product/msm8937_32路径下文件,也要单独备份。

fastboot flash boot boot.img
fastboot flash dtbo dtbo.img
fastboot flash cache cache.img
fastboot flash recovery recovery.img
fastboot flash system system.img
fastboot flash vendor vendor.img
fastboot flash userdata userdata.img
fastboot flash mdtp mdtp.img
fastboot flash vbmeta vbmeta.img
fastboot flash aboot emmc_appsboot.mbn

fastboot flash dtbobak dtbo.img
fastboot flash vbmetabak vbmeta.img
  • 方法2:recovery模式下使用ota整包(msm8937_32-ota-eng.username.zip)升级source包

(1)adb reboot recovery
(2)选择"apply update from ADB"
(3)adb sideload xxx.zip
(4)等待升级完成,手动重启设备。

例子:ota整包升级,source包msm8937_32-ota-eng.username.zip

Y:\xxx\OTA\old>adb sideload msm8937_32-ota-eng.username.zip
serving: 'msm8937_32-ota-eng.username.zip' (~88%)

升级成功:

Total xfer: 2.00x

2.3.2 更新到target版本(机器在source包的基础上,下载ota差分包)

Y:android_root\out>adb sideload update.zip
loading: 'update.zip'adb server is out of date
Total xfer: 2.00x

2.3.3 DEBUG

  • error 1:Failed to verify package compatibility (result -19)
[ 12.872568] I:Verifying package compatibility...
[ 12.915551] W:Cannot fetch /system/etc/vintf/manifest.xml: Cannot open /mnt/system//system/etc/vintf/manifest.xml: No such file or directory
[ 12.917319] W:Cannot open /mnt/system//system/manifest.xml: No such file or directory
[ 12.919046] W:Cannot open /mnt/system//system/etc/vintf/: No such file or directory
[ 12.920785] W:Cannot open /mnt/system//system/compatibility_matrix.xml: No such file or directory
[ 12.932883] E:Cannot unmount / at /mnt/system: Invalid argument
[ 12.955553] E:Failed to verify package compatibility (result -19): No framework manifest file from device or from update package
[ 12.972096] E:No framework matrix file from device or from update package
[ 12.998578] W:failed to read uncrypt status: No such file or directory
[ 13.013025] W:Failed to read /sys/class/thermal/thermal_zone20/temp: Invalid argument
[ 13.027681] I:current maximum temperature: 51000
[ 13.028220] I:/sideload/package.zip

package兼容性检测错误。查看差分包update.zip中的compatibility.zip缺少system_manifest.xml和system_matrix.xml
解决方法:

  • error :

script aborted: E3005: “EMMC:/dev/block/bootdevice/by-name/boot:33554432:a776db333abb7e7bee2f79ea68c9296f6de9ec69” or “EMMC:/dev/block/bootdevice/by-name/boot:33554432:07fe056b62d4311363e102bb01bccac9348ccd88” has unexpected contents.

[ 2.304909] Verifying current system...
[ 2.897877] Partition contents don't have the expected checksum
[ 3.517770] Failed to read "/cache/saved.file": No such file or directory
[ 3.517946] Both of partition contents and backup don't have the expected checksum
[ 3.554921] script aborted: E3005: "EMMC:/dev/block/bootdevice/by-name/boot:33554432:a776db333abb7e7bee2f79ea68c9296f6de9ec69" or "EMMC:/dev/block/bootdevice/by-name/boot:33554432:07fe056b62d4311363e102bb01bccac9348ccd88" has unexpected contents.
[ 3.564617] E:Error in /cache/update0.zip (status 7)
[ 3.578076]
[ 3.618828] W:failed to read uncrypt status: No such file or directory
[ 3.628772] W:Failed to read /sys/class/thermal/thermal_zone20/temp: Invalid argument
[ 3.634174] I:current maximum temperature: 49992
[ 3.634800] I:/cache/update0.zip
  • error 3:dtbobak vbmetabak分区错误
[ 8.241291] Verifying update package...
[ 12.384595] Installing update...
[ 12.497441] unknown fuse request opcode 2016
[ 12.563293] SELinux: Skipping /product_file_contexts: empty file
[ 12.563848] SELinux: Skipping /odm_file_contexts: empty file
[ 12.564194] SELinux: Loaded file_contexts
[ 12.564523] Source: qcom/msm8937_32/msm8937_32:10/QKQ1.200512.002/eng.username.20210826.180958:userdebug/test-keys
[ 12.569501] Target: qcom/msm8937_32/msm8937_32:10/QKQ1.200512.002/eng.username.20210827.094700:userdebug/test-keys
[ 12.569649] Verifying current system...
[ 13.286409] Partition contents don't have the expected checksum
[ 13.974474] 226627584 bytes free on /cache (33554432 needed)
[ 13.976570] Verifying radio-update...
[ 14.168488] Partition contents don't have the expected checksum
[ 14.460200] Partition contents don't have the expected checksum
[ 14.606320] Failed to read "/cache/saved.file": No such file or directory
[ 14.606506] Both of partition contents and backup don't have the expected checksum
[ 14.615750] script aborted: E3005: "EMMC:/dev/block/bootdevice/by-name/dtbobak:8388608:6eef241e06b33fcf9a84d0b630f81cd7958b6a2b" or "EMMC:/dev/block/bootdevice/by-name/dtbobak:8388608:e3a8063e08f31c0225d140da53d940d9fb8209e3" has unexpected contents.
[ 14.654191] E:Error in /sideload/package.zip (status 7)

分析:source包dtbobak,vbmetabak分区和target包dtbobak,vbmetabak分区不匹配。
解决办法:重刷dtbobak,vbmetabak分区,然后重新进入recovery模式升级差分包update.zip。

fastboot flash dtbobak dtbo.img
fastboot flash vbmetabak vbmeta.img
fastboot reboot

error4:

[ 17.479637] 226525184 bytes free on /cache (8388608 needed)
[ 18.530339] Verified system image...
[ 18.741383] Verified vendor image...
[ 18.741597] Patching system image after verification.
[ 18.741830] performing update
[ 18.752545] blockimg version is 4
[ 18.752637] maximum stash entries 0
[ 18.752743] creating stash /cache/recovery/2bdde8504898ccfcd2c59f20bb8c9c25f73bb524
[ 18.753949] 226521088 bytes free on /cache (29052928 needed)
[ 18.754287] /cache/recovery/last_command doesn't exist.
[ 18.754412] erasing 486791 blocks
[ 19.471430] stashing 6471 overlapping blocks to fe7d1a164d07b791a3b0a0124e0fe3e0e13d5f6c
[ 19.471634] 226516992 bytes free on /cache (26505216 needed)
[ 19.471762] writing 6471 blocks to /cache/recovery/2bdde8504898ccfcd2c59f20bb8c9c25f73bb524/fe7d1a164d07b791a3b0a0124e0fe3e0e13d5f6c
[ 20.214364] patching 6471 blocks to 6471
[ 20.596946] deleting /cache/recovery/2bdde8504898ccfcd2c59f20bb8c9c25f73bb524/fe7d1a164d07b791a3b0a0124e0fe3e0e13d5f6c
[ 21.924866] stashing 7093 overlapping blocks to 9a184160d88de091547c82c483cfa28938d71cc5
[ 21.925023] 226516992 bytes free on /cache (29052928 needed)
[ 21.925147] writing 7093 blocks to /cache/recovery/2bdde8504898ccfcd2c59f20bb8c9c25f73bb524/9a184160d88de091547c82c483cfa28938d71cc5
[ 22.248643] minadbd I 01-01 03:19:00 358 360 usb.cpp:311] USB event: FUNCTIONFS_SUSPEND
[ 22.383037] minadbd I 01-01 03:19:00 358 360 usb.cpp:311] USB event: FUNCTIONFS_RESUME
[ 22.383072] minadbd I 01-01 03:19:00 358 360 usb.cpp:311] USB event: FUNCTIONFS_DISABLE
[ 22.400285] minadbd I 01-01 03:19:00 358 363 transport.cpp:698] UsbFfs: connection terminated: read 6066 failed with error Cannot send after transport endpoint shutdown
[ 22.406251] minadbd I 01-01 03:19:00 358 358 adb.cpp:114] UsbFfs: offline
[ 22.406730] minadbd I 01-01 03:19:00 358 358 transport.cpp:785] destroying transport UsbFfs
[ 22.406748] minadbd I 01-01 03:19:00 358 358 usb.cpp:195] UsbFfsConnection being destroyed
[ 22.528930] minadbd I 01-01 03:19:00 358 359 usb_ffs.cpp:232] opening control endpoint /dev/usb-ffs/adb/ep0
[ 22.541641] minadbd I 01-01 03:19:00 358 359 usb.cpp:180] UsbFfsConnection constructed
[ 22.542345] minadbd I 01-01 03:19:00 358 375 usb.cpp:311] USB event: FUNCTIONFS_BIND
[ 22.733779] patching 7093 blocks to 7093
[ 23.056944] minadbd I 01-01 03:19:01 358 375 usb.cpp:311] USB event: FUNCTIONFS_ENABLE
[ 23.106101] deleting /cache/recovery/2bdde8504898ccfcd2c59f20bb8c9c25f73bb524/9a184160d88de091547c82c483cfa28938d71cc5
[ 23.407452] minadbd W 01-01 03:19:01 358 358 sockets.cpp:278] timeout expired while flushing socket, closing
[ 23.683349] minadbd I 01-01 03:19:01 358 358 adb.cpp:110] UsbFfs: already offline
[ 24.096813] stashing 4417 overlapping blocks to fb419b951201f1acc1da82bd5cb5a13814e40436
[ 24.096972] 226516992 bytes free on /cache (18092032 needed)
[ 24.097098] writing 4417 blocks to /cache/recovery/2bdde8504898ccfcd2c59f20bb8c9c25f73bb524/fb419b951201f1acc1da82bd5cb5a13814e40436
[ 24.613420] patching 4417 blocks to 4417
[ 24.854300] deleting /cache/recovery/2bdde8504898ccfcd2c59f20bb8c9c25f73bb524/fb419b951201f1acc1da82bd5cb5a13814e40436
[ 25.284719] stashing 512 overlapping blocks to 982541c0370f4deb513d08bae811de3772e4283b
[ 25.284880] 226516992 bytes free on /cache (2097152 needed)
[ 25.285006] writing 512 blocks to /cache/recovery/2bdde8504898ccfcd2c59f20bb8c9c25f73bb524/982541c0370f4deb513d08bae811de3772e4283b
[ 25.350340] patching 512 blocks to 512
[ 25.463030] deleting /cache/recovery/2bdde8504898ccfcd2c59f20bb8c9c25f73bb524/982541c0370f4deb513d08bae811de3772e4283b
[ 25.563620] stashing 512 overlapping blocks to 982541c0370f4deb513d08bae811de3772e4283b
[ 25.563771] 226516992 bytes free on /cache (2097152 needed)
[ 25.563870] writing 512 blocks to /cache/recovery/2bdde8504898ccfcd2c59f20bb8c9c25f73bb524/982541c0370f4deb513d08bae811de3772e4283b
[ 25.638784] patching 512 blocks to 512
[ 25.750546] deleting /cache/recovery/2bdde8504898ccfcd2c59f20bb8c9c25f73bb524/982541c0370f4deb513d08bae811de3772e4283b
[ 25.852751] stashing 512 overlapping blocks to 982541c0370f4deb513d08bae811de3772e4283b
[ 25.852902] 226516992 bytes free on /cache (2097152 needed)
[ 25.853001] writing 512 blocks to /cache/recovery/2bdde8504898ccfcd2c59f20bb8c9c25f73bb524/982541c0370f4deb513d08bae811de3772e4283b
[ 25.916222] patching 512 blocks to 512
[ 26.027743] deleting /cache/recovery/2bdde8504898ccfcd2c59f20bb8c9c25f73bb524/982541c0370f4deb513d08bae811de3772e4283b
[ 26.121574] stashing 512 overlapping blocks to 506907e095fbd6665e77f4e3f1d5a3f3073de63c
[ 26.121722] 226516992 bytes free on /cache (2097152 needed)
[ 26.121848] writing 512 blocks to /cache/recovery/2bdde8504898ccfcd2c59f20bb8c9c25f73bb524/506907e095fbd6665e77f4e3f1d5a3f3073de63c
[ 26.185738] patching 512 blocks to 512
[ 26.189804] failed to write to adb host: Success
[ 26.190021] failed to write to adb host: Success
[ 26.190154] failed to write to adb host: Success
[ 26.190276] failed to write to adb host: Success
[ 26.190397] failed to write to adb host: Success
[ 26.190519] failed to write to adb host: Success
[ 26.190640] failed to write to adb host: Success
[ 26.190759] failed to write to adb host: Success
[ 26.193425] failed to write to adb host: Success
[ 26.193648] failed to write to adb host: Success
[ 26.193833] failed to write to adb host: Success
[ 26.193961] failed to write to adb host: Success
[ 26.194086] failed to write to adb host: Success
[ 26.194210] failed to write to adb host: Success
[ 26.194334] failed to write to adb host: Success
[ 26.194485] failed to write to adb host: Success
[ 26.194592] failed to write to adb host: Success
[ 26.194699] failed to write to adb host: Success
[ 26.531357] E:Error in /sideload/package.zip (killed by signal 7)
[ 26.560472]
[ 26.595520] W:failed to read uncrypt status: No such file or directory
[ 26.605423] W:Failed to read /sys/class/thermal/thermal_zone20/temp: Invalid argument
[ 26.614254] I:current maximum temperature: 49000
[ 26.614848] I:/sideload/package.zip

分析:usb连接问题。升级过程中保证usb ad正常即可。

三 ANDROID FOTA升级

  • 集成第三方FOTA apk

第三方FOTA apk的主要作用是检查版本更新,下载差分包或者整包,然后FOTA apk发送指令使得系统重启进入recovery模式,开始升级。升级过程和本地升级基本一样。

本文第一,第二部分为本地升级差分包或者整包的验证过程。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长路慢慢

长路慢慢共同进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值