Android系統(tǒng)升級的幾種方式詳解
幾種啟動模式
◆ 正常模式
- 進(jìn)入方式:不按鍵,正常啟動時進(jìn)入.
- 文件:loader + Uboot + Boot.img + system.img
◆ recovery模式
- 進(jìn)入方式:特殊組合按鍵,reboot recovery命令, MISC分區(qū)
- 指令,系統(tǒng)崩潰.
- 文件:loader + Uboot + recovery.img
- recovery.img = Boot.img + recovery(/sbin/recorey)
- 操作界面在recovery程序中提供
◆ fastboot模式
- 進(jìn)入方式:特殊組合按鍵
- 文件:loader + Uboot
- 操作界面在Uboot中提供
MISC分區(qū)
◆存放Bootloader Control Block (BCB),是bootloader與Recovery的通信接口.啟動時bootloader中讀取BCB, 根據(jù)指令決定啟動方式.
struct bootloader_message { char command[32]; char status[32]; char recovery[1024]; };
command:“boot-recovery”:指示bootloader應(yīng)該進(jìn)入recovery modestatus:完成相應(yīng)的更新后,bootloader將執(zhí)行結(jié)果寫入到這個字段recovery:該文件的內(nèi)容格式如下:
“recovery\n <recovery command>\n <recovery command>”
是一個字符串,以“recovery\n”開頭,后面一行對應(yīng)一個recovery命令,與/cache/recovery/command文件相對應(yīng)
CACHE分區(qū)
recovery通過/cache/recovery/目錄下的三個文件與主系統(tǒng)通信,增量升級過程中也需要借助于/cache分區(qū)存放臨時文件.進(jìn)入recovery 程序后,會先讀取BCB的內(nèi)容,失敗再讀取/cache/recovery/command的內(nèi)容,以決定是否有特殊命令要執(zhí)行
◆ /cache/recovery/command:recovery命令,由主系統(tǒng)寫入,每一行就是一條命令,是以下命令的組合:
- ● --wipe_data:擦除用戶數(shù)據(jù),會清除/data分區(qū)和/cache分區(qū)
- ● --wipe_cache :擦除/cache分區(qū)
- ● --update_package=path: 表示要進(jìn)行OTA升級,recovery使用路徑為path的OTA升級包
- ● --send_intent=anystring: 傳遞的intent
- ◆ /cache/recovery/log:recovery模式在工作中的log輸出,再次進(jìn)入recovery的時候會清除
- ◆ /cache/recovery/intent:recovery傳遞給主系統(tǒng)的intent,在recovery結(jié)束時將定義的intent字符串寫入到/cache/recovery/intent中
幾種系統(tǒng)升級方式
◆ recovery升級也稱為卡刷,全量升級,按鍵進(jìn)入recovery后執(zhí)行存儲卡上下載好的升級包依賴于能正常進(jìn)入recovery, 升級包大
◆ OTA升級OTA(over the air),也稱為在線升級,增量升級,一般為按鍵進(jìn)入recovery后執(zhí)行下載好的升級包,也可下載全量升級包依賴于系統(tǒng)運(yùn)行正常, 需要網(wǎng)絡(luò),升級包小,操作便捷
◆ fastboot升級也稱線刷,進(jìn)入fastboot模式后,機(jī)器連接USB線,使用PC上的燒錄工具將鏡像文件燒錄到機(jī)器,類似于USB燒錄依賴于Uboot正常即可,升級數(shù)據(jù)量大,操作相對復(fù)雜,穩(wěn)定性高
◆ ADB升級也稱一鍵刷機(jī),通過ADB,使用flash_image程序,借助于PC將鏡像文件更新到機(jī)器依賴于ADB開放和能正常root, 升級數(shù)據(jù)量大,操作簡單,穩(wěn)定性低
recovery升級
recovery升級-升級包構(gòu)成
◆system/, data/, recovery/:這些目錄對應(yīng)需要升級的分區(qū),分別對應(yīng)system,data,recovery分區(qū)的內(nèi)容
◆boot.img這些文件對應(yīng)需要升級的文件,升級過程中會直接覆蓋鏡像
◆MANIFEST.MF簽名相關(guān)文件.遍歷包中的所有文件,對非文件夾非簽名文件的文件,逐個生成SHA1的數(shù)字簽名信息,再用Base64進(jìn)行編碼
◆CERT.SF簽名相關(guān)文件.對Manifest文件,使用SHA1-RSA算法,用私鑰進(jìn)行簽名
◆CERT.RSA簽名相關(guān)文件.文件中保存了公鑰、所采用的加密算法等信息
◆metadata文件是描述設(shè)備信息及環(huán)境變量的元數(shù)據(jù)。主要包括一些編譯選項,時間戳以及設(shè)備型號等
◆otacert簽名公鑰,對應(yīng)xxx.x509.pem文件
◆update-binary是一個二進(jìn)制文件,相當(dāng)于一個腳本解釋器,能夠識別updater-script中描述的操作.對應(yīng)源碼位于:bootable/recovery/updater/
◆updater-script此文件是一個腳本文件,具體描述了更新過程。我們可以根據(jù)具體情況編寫該腳本來適應(yīng)我們的具體需求.
recovery升級-升級包簽名
◆update.zip的簽名
$ java –jar out/host/linux/framework/signapk.jar –w /build/target/product/security/xxx.x509.pem /build/target/product/security/xxx.pk8 update_signed.zipupdate.zip
recovery升級包在進(jìn)行簽名時使用signapk.jar工具,與APK簽名使用的工具相同,但與APK簽名不同的是,使用了-w選項,指對整個文件進(jìn)行簽名,使用-w簽名的包在結(jié)尾是6個特征字節(jié)
制作包使用私鑰對update.zip進(jìn)行簽名,recovery中使用對應(yīng)的公鑰進(jìn)行驗證,recovery 代碼里面使用的公鑰(/res/keys)是按照RSAPublicKey數(shù)據(jù)結(jié)構(gòu)存儲。這個數(shù)據(jù)是通過RSAPublicKey工具(dumpkey.jar)從制作出來的x509證書文件中獲得
◆破解簽名驗證
在update.zip簽名時使用的公鑰/私鑰對不是公開的key(比如testkey)的情況下,因為用戶無法得到正確的私鑰,而且recovery使用的公鑰隨recovery.img發(fā)布,所以很難偽造簽名來通過recovery驗證
變通的做法是給系統(tǒng)刷入一個使用testkey公鑰進(jìn)行驗證recovery.img,而包對應(yīng)使用testkey進(jìn)行簽名.或者刷入一個不進(jìn)行簽名驗證的recovery.img
recovery升級-制作升級包
◆制作方式有手動制作和自動制作兩種
● 手動制作
準(zhǔn)備好升級文件和目錄,手動寫腳本updater-script,copy腳本解釋程序update-binary(system/bin/updater),打包成zip文件,然后使用signapk.jar對zip文件進(jìn)行簽名
● 自動制作
源碼根目錄執(zhí)行 make otapackage,out目錄下生成全量升級包,名稱為: out/target/product/h600s/h600s-ota-eng.lsg.zip
第一步:編譯Makefile,生成原始包
第二步:在原始包的基礎(chǔ)上使用python腳本生成全量升級包,python腳本路徑:build/tools/releasetools/ota_from_target_files,入口函數(shù)是:WriteFullOTAPackage(input_zip,output_zip)
☆注意:
make otapackage 會對整個系統(tǒng)進(jìn)行編譯,要注意這里的編譯方式
與正常編譯的一致性
recovery升級-腳本
◆assert(condition)
如果condition參數(shù)的計算結(jié)果為False,則停止腳本執(zhí)行,否則繼續(xù)執(zhí)行腳本。
◆show_progress(frac,sec)
frac表示進(jìn)度完成的數(shù)值,sec表示整個過程的總秒數(shù)。主要用與顯示UI上的進(jìn)度條。
示例: show_progress(0.1, 10);
下面的操作可能進(jìn)行10s,完成后進(jìn)度條前進(jìn)0.1(也就是10%)
◆format(fs_type, partition_type, location, fs_size,mount_point)
fs_type,文件系統(tǒng)類型,取值一般為“vfat”或“ext4”。
Partition_type,分區(qū)類型,一般取值為“MTD”或則“EMMC”。
location,設(shè)備路徑
fs_size,等于0表示格式化整個分區(qū),大于0表示按指定大小格式化,小于0表示在分區(qū)最后保留一定大小
◆mount(fs_type,partition_type,location,mount_point)
前兩個參數(shù)同上,location要掛載的設(shè)備,mount_point掛載點。作用:掛載一個文件系統(tǒng)到指定的掛載點。
◆ui_print(const char *fmt, …)
作用:將字符串顯示到屏幕上
示例:ui_print(“update system.img…”);
◆symlink(target,src1,src2,……,srcN)
target,字符串類型,是符號連接的目標(biāo)。SrcX代表要創(chuàng)建的符號連接的目標(biāo)點。
示例:symlink(“mksh”, “/system/bin/sh”);
◆set_perm(uid,gid,mode,file1,file2,……,fileN)
作用是設(shè)置單個文件或則一系列文件的權(quán)限,最少要指定一個文件
示例:set_perm(0, 1000, 0750, “/system/bin/tc”);
◆package_extract_file(srcfile_path,desfile_paht)
srcfile_path,要提取的文件,desfile_path,提取文件的目標(biāo)位置。
示例:package_extract_file(“boot.img”,”/tmp/boot.img”)將升級包中的boot.img文件拷貝到內(nèi)存文件系統(tǒng)的/tmp下
◆package_extract_dir(src_path,destination_path)src_path,
要提取的目錄,destination_path目標(biāo)目錄。作用:從升級包內(nèi),提取目錄到指定的位置。
示例:package_extract_dir(“system”,”/system”)
◆write_raw_image(src-image,partition):
src-image源鏡像文件,partition,目標(biāo)分區(qū)。作用:將鏡像寫入目標(biāo)分區(qū)。
示例:write_raw_image(“/sdcard/system.img”,“system”);將system.img鏡像寫入到系統(tǒng)的system分區(qū)。
◆/etc/recovery.fstab
提供各分區(qū)對應(yīng)的設(shè)備, 及分區(qū)文件系統(tǒng)類型. 非編譯生成, 在board目錄是掛載和燒錄的關(guān)鍵.
例如(H8):
/xboot emmc /dev/block/platform/jzmmc.0/by-name/xboot/boot emmc /dev/block/platform/jzmmc.0/by-name/boot/recovery emmc /dev/block/platform/jzmmc.0/by-name/recovery/system ext4 /dev/block/platform/jzmmc.0/by-name/system/data ext4 /dev/block/platform/jzmmc.0/by-name/data/cache ext4 /dev/block/platform/jzmmc.0/by-name/cache/misc emmc /dev/block/platform/jzmmc.0/by-name/misc/mnt/sdcard2 vfat /dev/block/platform/jzmmc.0/by-name/storage1/mnt/sdcard0 vfat /dev/block/platform/jzmmc.0/by-name/storage2/mnt/sdcard1 vfat /dev/block/mmcblk2p1 /dev/block/mmcblk2/sdcard auto /dev/block/mmcblk2p1 /dev/block/mmcblk2
recovery升級-過程
源碼路徑: bootable/recovery/
升級update.zip的核心函數(shù)在 install_package()
■1.ensure_path_mount()
先判斷所傳的update.zip包路徑所在的分區(qū)是否已經(jīng)掛載。如果沒有則先掛載。
■2.load_keys()
加載公鑰源文件,路徑位于/res/keys。這個文件在Recovery鏡像的根文件系統(tǒng)中。
■3.verify_file()
對升級包update.zip包進(jìn)行簽名驗證。
■4.mzOpenZipArchive()
打開升級包,并將相關(guān)的信息拷貝到一個臨時的ZipArchinve變量中。這一步并未對我們的update.zip包解壓。
■5.try_update_binary()
在這個函數(shù)中才是對我們的update.zip升級的地方。這個函數(shù)一開始先根據(jù)我們上一步獲得的zip包信息
以及升級包的絕對路徑將update_binary文件拷貝到內(nèi)存文件系統(tǒng)的/tmp/update_binary中。以便后面使用。
■6.fork()
創(chuàng)建子進(jìn)程。其中的子進(jìn)程主要負(fù)責(zé)執(zhí)行binary(execv(binary,args),即執(zhí)行我們的安裝命令腳本.
父進(jìn)程負(fù)責(zé)接受子進(jìn)程發(fā)送的命令去更新ui顯示(顯示當(dāng)前的進(jìn)度)。子父進(jìn)程間通信依靠管道。
腳本里描述的過程大概有以下幾步:
■1.比較時間戳,匹配機(jī)型設(shè)備信息,條件不符則停止腳本運(yùn)行
■2.顯示進(jìn)度條起始位置
■3.格式化system分區(qū)并掛載
■4.提取包中的recovery以及system目錄下的內(nèi)容到系統(tǒng)的/system下
■5.為/system下的文件建立符號連接, 設(shè)置屬性
■6.更新包中的boot.img
■7.如果要更新/data分區(qū),則掛載/data,并更新/data分區(qū)的內(nèi)容
■8.如果有其他的鏡像文件比如uboot等需要更新,則更新這些鏡像文件
■9.卸載已掛載的分區(qū),腳本結(jié)束
recovery升級-定制
◆1. 修改releasetool.py
recovery在 build/tools/releasetools/common.py 中提供了一個類
(DeviceSpecificParams)用于自定義一些功能
具體的功能實現(xiàn)放在名為releasetool.py的文件中,這個文件放在具體
的board文件夾下,比如build/target/board/h600s/releasetools.py
可以自定義的功能有: FullOTA_InstallBegin, FullOTA_InstallEnd,
IncrementalOTA_InstallBegin, IncrementalOTA_InstallEnd
◆2. 直接修改build/tools/releasetools/ 下的文件
OTA升級
OTA升級-升級包構(gòu)成
OTA升級-制作升級包
◆OTA不一定是升級增量包,但一般指增量升級.增量升級只能在指定兩個版本間進(jìn)行升級.
◆制作增量包以原始包(target包)為基礎(chǔ),將第一次生成的target包暫時稱為target-A.zip,將第二次生成的target包暫時稱為target-B.zip
◆利用這兩個target包,生成增量包
./build/tools/releasetools/ota_from_target_files -v -i target-A.zip target-B.zip ota-A-B-incremental.zip
☆注意
1. 發(fā)布版本時要注意備份原始包,且保證原始包的數(shù)據(jù)與下單版本完全一致;
2. 目標(biāo)版本(target-B.zip)比基礎(chǔ)版本(target-A.zip)少的文件會在基礎(chǔ)版本中刪除,目標(biāo)版本(target-B.zip)比基礎(chǔ)版本(target-A.zip)多的文件會在基礎(chǔ)版本中增加,要保持一致性不要輕易刪除文件;
3. 同一模塊的名字在兩個版本中不要隨意改變;
OTA升級-原始包
◆make otapackage過程中生成,路徑如下:out/target/product/h600s/obj/PACKAGING/target_files_intermediates/h600starget_files-eng.lsg.zip
◆單個原始包(target包)可以生成全量包(full包),兩個原始包(target包)可以生成增量包(increment包),都使用到腳本:
build/tools/releasetools/ota_from_target_files
包含的基本目錄:
◆BOOT/, RECOVERY/
包括RAMDISK/和kernel
◆SYSTEM/
system目錄的原始拷貝
◆OTA/
applypatch等升級中用到的程序
◆META/
文件清單及文件對應(yīng)權(quán)限,分區(qū)類型和大小等信息
OTA升級-腳本
在增量升級中特有的:
◆apply_patch_check(file, [sha1_1, …])
檢查文件file的SHA1值是不是多個中的一個,前面的為目標(biāo)SHA1值
示例:
apply_patch_check(“/system/app/BBKSettings.apk”,
“8bca5488310c0625bc4498285c37e5fecd873b3a”,
“48f4d405351a334feea17a52ad118c346f64a253”)
◆apply_patch(srcfile, tgtfile, tgtsha1, tgtsize, sha1_1, patch_1, …)
srcfile:源文件,tgtfile:目標(biāo)文件,“-“表示與源文件相同
tgtsha1:目標(biāo)文件SHA1值,tgtsize:目標(biāo)文件長度
作用:利用patch文件將源文件升級到目標(biāo)文件
示例:apply_patch(”/system/app/BBKSettings.apk”, “-”,
8bca5488310c0625bc4498285c37e5fecd873b3a, 911757,
48f4d405351a334feea17a52ad118c346f64a253,
package_extract_file(“patch/system/app/BBKSettings.apk.p”));
OTA升級-過程
◆總體上分為兩步:
第一步:OTA升級程序根據(jù)機(jī)器版本從服務(wù)器上找出最適合的升級包,然后下載到本地,調(diào)用RecoverySystem類的方法,使機(jī)器重啟進(jìn)入recovery,并將升級包路徑寫入cache分區(qū)
第二步:進(jìn)入recovery界面后,獲取升級包路徑,自動開始執(zhí)行升級過程,升級完畢后自動重啟進(jìn)入正常啟動模式
腳本里描述的過程大概有以下幾步:
■1.檢查系統(tǒng)版本,機(jī)型信息,系統(tǒng)版本必須是兩個版本中的一個
■2.檢查文件是否一致(“Verifying current system…”),當(dāng)前系統(tǒng)中的文件必須與起始版本文件的sha1 值一致,調(diào)用apply_patch_check進(jìn)行檢查
■3.刪除不需要的文件(“Removing unneeded files…”),調(diào)用delete,只存在于起始版本或目標(biāo)版本中的文件在這里先刪除
■4.應(yīng)用差量文件(“Patching system files…”),調(diào)用apply_patch,使用.p文件升級起始版本的文件為目標(biāo)版本的文件
■5.增加新文件(“Unpacking new files…”),將增加的新文件拷貝到機(jī)器上,注意對于目標(biāo)版本中新增的文件,通常會刪除舊文件在增加新文件
■6.修改文件權(quán)限,結(jié)束
增量升級一個文件的過程如下(applypatch):
■1.獲取目標(biāo)文件的 sha1 值(target_sha1),此值會與當(dāng)前文件的sha1值進(jìn)行比較,如果一致就證明文件已于目標(biāo)文件一致,無需升級直接返回
■2.載入源文件(source_file)(注意是一次性載入),如果載入失敗,則試圖入/cache/saved.file文件
■3.判斷源文件所在分區(qū)是否有足夠剩余空間,如果沒有足夠空間則將源文件復(fù)制到cache分區(qū),保存為/cache/saved.file,并刪除源文件
■4.在源文件目錄建立".patch"的文件,使用patch工具進(jìn)行增量
■5.增量完畢后,計算文件(.patch)的 sha1 值并與target_sha1比較。如果一致就證明增量成功,成功則將".patch"去掉.patch; 失敗則重試,達(dá)到設(shè)定的重試次數(shù)后,認(rèn)為失敗,返回結(jié)果
fastboot
fastboot界面示例
◆操作步驟:
1.準(zhǔn)備好fastboot數(shù)據(jù)包和fastboot PC工具
2.機(jī)器關(guān)機(jī),按組合鍵進(jìn)入fastboot模式
3.機(jī)器連接USB線,安裝好USB驅(qū)動,在PC工具上能看到識別設(shè)備成功
4.從PC工具上選擇fastboot數(shù)據(jù)包,開始升級
當(dāng)機(jī)器進(jìn)入fastboot模式,PC上fastboot驅(qū)動安裝完畢后,就能通過fastboot命令操作機(jī)器
◆fastboot devices
作用:輸出所有連接的設(shè)備
◆fastboot erase
作用:擦除分區(qū)
示例:fastboot erase system; fastboot erase userdata
◆flashboot flash [ ]
作用:刷入鏡像
示例: fastboot flash system system.img
◆fastboot reboot
作用:重啟
ADB升級
◆大多數(shù)的一鍵刷機(jī)工具都是采用此種方式,機(jī)器要開放ADB且能獲得root權(quán)限
◆需要借助flash_image程序,flash_image程序由bootable/recovery/下編譯生成
◆示例:
adb root
adb shell mount /sdcard
adb shell push c:\system.img /mnt/sdcard/
adb shell flash_image system /mnt/sdcard/system.img
adb shell reboot
☆注意
此種方式不穩(wěn)定,變磚可能性較大
Root
◆為什么要Root?
擁有root權(quán)限后,可以訪問,修改,刪除系統(tǒng)的任何文件.刪除預(yù)置應(yīng)用,修改系統(tǒng)等
◆怎么樣Root?
最終目標(biāo)是將su放入/system/bin/下,安裝授權(quán)管理程序Superuser.apk
◆Root的方式?
實現(xiàn)方式有多種,包括利用Android漏洞,利用recovery刷入此兩文件.
利用Android漏洞的方式不一定對所有機(jī)型都適用
◆怎樣刷第三方ROM?
刷入一個不做簽名驗證或利用testkey做簽名驗證的recovery. 刷入recovery的
方式可以利用fastboot, 也可以使用adb方式
以上就是Android系統(tǒng)升級的幾種方式詳解的詳細(xì)內(nèi)容,更多關(guān)于Android系統(tǒng)升級的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android自定義水波紋底部導(dǎo)航的實現(xiàn)
TabLayout作為導(dǎo)航組件來說,使用場景非常的多,也意味著要滿足各種各樣的需求,這篇文章主要介紹了Android自定義水波紋底部導(dǎo)航的實現(xiàn)2022-08-08Android使用MediaCodec將攝像頭采集的視頻編碼為h264
這篇文章主要為大家詳細(xì)介紹了Android使用MediaCodec將攝像頭采集的視頻編碼為h264,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10基于Flutter實現(xiàn)短信驗證碼監(jiān)控與轉(zhuǎn)發(fā)
這篇文章主要為大家詳細(xì)介紹了如何基于Flutter實現(xiàn)短信驗證碼監(jiān)控與轉(zhuǎn)發(fā)功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03Android編程滑動效果之Gallery仿圖像集瀏覽實現(xiàn)方法
這篇文章主要介紹了Android編程滑動效果之Gallery仿圖像集瀏覽實現(xiàn)方法,結(jié)合實例形式詳細(xì)分析了Gallery瀏覽圖片的原理、步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2016-02-02