石家莊 外貿(mào)網(wǎng)站建設(shè)公司排名網(wǎng)絡(luò)營(yíng)銷(xiāo)項(xiàng)目
Android 虛擬 A/B 分區(qū)推出快三年了,不論是 google 還是百度結(jié)果,除了源代碼之外,竟然沒(méi)有人提到這個(gè) Android Virtual A/B 的調(diào)試工具 ,著實(shí)讓人感覺(jué)意外。
所以我相信還有不少人不知道 Android OTA 到底都有哪些調(diào)試工具,這些工具又該如何使用?所以決定開(kāi)一個(gè)專(zhuān)欄,專(zhuān)門(mén)介紹 Android OTA 相關(guān)的各種工具。
本文為洛奇看世界(guyongqiangx)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處。
文章鏈接:https://blog.csdn.net/guyongqiangx/article/details/129122159
有下圖為證,到目前位置,百度結(jié)果還沒(méi)有 snapshotctl 相關(guān)內(nèi)容:
對(duì)于 snapshotctl,除了 Android 自家的開(kāi)發(fā)者之外,肯定有下游開(kāi)發(fā)者用過(guò),但沒(méi)有人分享過(guò)這個(gè)工具,因此本篇算是全網(wǎng)對(duì) snapshotctl 介紹的第一篇,我相信還有不少人連這個(gè)工具都沒(méi)有聽(tīng)說(shuō)過(guò)。
本文基于 Android 代碼版本: android-11.0.0_r21,但后續(xù)版本也大同小異
在線代碼:http://aospxref.com/android-11.0.0_r21/
其實(shí) snapshotctl 的工具使用并不復(fù)雜,源碼也還算簡(jiǎn)單,代碼位于:
system/core/fs_mgr/libsnapshot/snapshotctl.cpp
這里不再詳細(xì)分析代碼,主要演示 snapshotct 工具的使用。
1. snapshotctl 的功能
在早期版本(android-11.0.0_r21)中,snapshotctl 支持 dump 和 map 操作,后面又增加了 unmap 操作。
snapshotctl 的幫助信息:
console:/ # snapshotctl -h
snapshotctl: Control snapshots.
Usage: snapshotctl [action] [flags]
Actions:dumpPrint snapshot states.mergeDeprecated.mapMap all partitions at /dev/block/mapper
64|console:/ #
2. dump 操作
dump 操作是 snapshtctl 最有用的操作,可以輸出系統(tǒng)升級(jí)中的各種狀態(tài)。
以下是我的一塊板子上運(yùn)行 snapshotctl dump
的輸出:
console:/ # snapshotctl dump
snapshotctl W 10-10 21:43:54 3770 3770 snapshot.cpp:247] Cannot read /metadata/ota/snapshot-boot: No such file or directory
Update state: initiated
Compression: 0
Current slot: _a
Boot indicator: booting from unknown slot
Rollback indicator: No such file or directory
Forward merge indicator: No such file or directory
Source build fingerprint: google/inuvik/inuvik:11/RVC/eng.rocky.20221010.210616:userdebug/dev-keys
Snapshot: system_bstate: CREATEDdevice size (bytes): 1263079424snapshot size (bytes): 1263079424cow partition size (bytes): 119177216cow file size (bytes): 949866496allocated sectors: 0metadata sectors: 0compression: none
Snapshot: vendor_bstate: CREATEDdevice size (bytes): 80506880snapshot size (bytes): 80506880cow partition size (bytes): 0cow file size (bytes): 978944allocated sectors: 0metadata sectors: 0compression: none
console:/ #
3. map 操作
如果升級(jí)中出現(xiàn)了問(wèn)題,可以通過(guò) snapshotctl map
操作把系統(tǒng)中的各種 base, cow 和 cow-img 等文件都映射成設(shè)備方便檢查。
以下是一個(gè)映射示例:
console:/ # snapshotctl map
snapshotctl I 10-11 19:59:53 6127 6127 snapshot.cpp:2525] Successfully unmapped snapshot system_b
snapshotctl I 10-11 19:59:53 6127 6127 fs_mgr_dm_linear.cpp:247] [libfs_mgr]Created logical partition system_b-base on device /dev/block/dm-4
snapshotctl I 10-11 19:59:53 6127 6127 snapshot.cpp:638] Mapped system_b-cow-img to /dev/block/dm-5
snapshotctl I 10-11 19:59:53 6127 6127 snapshot.cpp:2596] Mapped COW device for system_b at /dev/block/dm-6
snapshotctl I 10-11 19:59:53 6127 6127 snapshot.cpp:2490] Mapped system_b as snapshot device at /dev/block/dm-7
snapshotctl I 10-11 19:59:53 6127 6127 snapshot.cpp:2525] Successfully unmapped snapshot vendor_b
snapshotctl I 10-11 19:59:53 61[10577.688566] audit: rate limit exceeded
27 6127 fs_mgr_dm_linear.cpp:247] [libfs_mgr]Created logical partition vendor_b-base on device /dev/block/dm-8
snapshotctl I 10-11 19:59:53 6127 6127 snapshot.cpp:638] Mapped vendor_b-cow-img to /dev/block/dm-9
snapshotctl I 10-11 19:59:53 6127 6127 snapshot.cpp:2556] Mapped COW image for vendor_b at vendor_b-cow-img
snapshotctl I 10-11 19:59:53 6127 6127 snapshot.cpp:2490] Mapped vendor_b as snapshot device at /dev/block/dm-10
snapshotctl I 10-11 19:59:53 6127 6127 snapshot.cpp:2741] MapAllSnapshots succeeded.
console:/ #
上面的 map 操作映射了下面的文件:
console:/ # ls -lh data/gsi/ota/
total 454M
-rw------- 1 root root 26 2022-10-11 00:00 system_b-cow-img.img
-rw------- 1 root root 906M 2022-10-11 00:00 system_b-cow-img.img.0000
-rw------- 1 root root 26 2022-10-11 00:00 vendor_b-cow-img.img
-rw------- 1 root root 956K 2022-10-11 00:00 vendor_b-cow-img.img.0000
如果 super 空間有分配用于升級(jí)也會(huì)被映射,具體我還沒(méi)有詳細(xì)檢查。
一旦映射了分區(qū),就可以通過(guò)其它工具對(duì)升級(jí)的鏡像進(jìn)行檢查了,例如使用 dmctl 工具查看映射的狀態(tài),如下:
console:/ # dmctl
usage: dmctl <command> [command options]dmctl -f file
commands:create <dm-name> [-ro] <targets...>delete <dm-name>list <devices | targets> [-v]getpath <dm-name>getuuid <dm-name>info <dm-name>status <dm-name>resume <dm-name>suspend <dm-name>table <dm-name>help-f file reads command and all parameters from named fileTarget syntax:<target_type> <start_sector> <num_sectors> [target_data]
234|console:/ # dmctl table
Invalid arguments, see 'dmctl help'
234|console:/ # su
console:/ # dmctl list devices
Available Device Mapper Devices:
userdata : 252:3
system_b : 252:7
vendor_b : 252:10
vendor_b-base : 252:8
system_a : 252:0
vendor_b-cow-img : 252:9
vendor_a : 252:1
system_b-base : 252:4
system_b-cow-img : 252:5
system_b-cow : 252:6
scratch : 252:2
console:/ #
console:/ # dmctl info vendor_b-base
device : vendor_b-base
active : true
access : rw
activeTable : true
inactiveTable : false
bufferFull : false
console:/ #
console:/ # dmctl info vendor_b-cow-img
device : vendor_b-cow-img
active : true
access : rw
activeTable : true
inactiveTable : false
bufferFull : false
console:/ #
console:/ #
console:/ # dmctl table vendor_b-cow-img
Targets in the device-mapper table for vendor_b-cow-img:
0-1912: linear, 259:4 6107136
console:/ #
console:/ # dmctl table system_b-cow
Targets in the device-mapper table for system_b-cow:
0-888: linear, 259:3 2469000
888-232768: linear, 259:3 2627128
232768-2087976: linear, 252:5 0
console:/ #
console:/ # dmctl table system_b-cow-img
Targets in the device-mapper table for system_b-cow-img:
0-4096: linear, 259:4 569344
4096-8192: linear, 259:4 675840
8192-12288: linear, 259:4 1134592
12288-16384: linear, 259:4 1155072
16384-20480: linear, 259:4 1179648
20480-28672: linear, 259:4 1187840
28672-65536: linear, 259:4 1200128
65536-69632: linear, 259:4 1253376
69632-73728: linear, 259:4 1269760
73728-77824: linear, 259:4 1302528
77824-86016: linear, 259:4 1318912
86016-102400: linear, 259:4 1351680
102400-106496: linear, 259:4 1376256
106496-118784: linear, 259:4 1384448
118784-131072: linear, 259:4 1466368
131072-155648: linear, 259:4 1482752
155648-159744: linear, 259:4 1515520
159744-163840: linear, 259:4 1699840
163840-172032: linear, 259:4 1712128
172032-176128: linear, 259:4 1773568
176128-184320: linear, 259:4 1867776
184320-192512: linear, 259:4 2097152
192512-196608: linear, 259:4 2109440
196608-204800: linear, 259:4 2134016
204800-208896: linear, 259:4 2158592
208896-212992: linear, 259:4 2170880
212992-217088: linear, 259:4 2187264
217088-221184: linear, 259:4 2215936
221184-225280: linear, 259:4 2244608
225280-249856: linear, 259:4 2310144
249856-253952: linear, 259:4 2355200
253952-294912: linear, 259:4 2449408
294912-311296: linear, 259:4 2912256
311296-323584: linear, 259:4 4030464
323584-372736: linear, 259:4 4050944
372736-376832: linear, 259:4 4149248
376832-385024: linear, 259:4 4165632
385024-389120: linear, 259:4 4325376
389120-516096: linear, 259:4 4620288
516096-557056: linear, 259:4 4751360
557056-565248: linear, 259:4 4796416
565248-1855208: linear, 259:4 4812800
console:/ #
4. unmap 操作
可以通過(guò) snapshotctl unmap
將前面映射的分區(qū)卸載。
console:/ # snapshotctl unmap
snapshotctl I 10-11 19:59:48 6120 6120 snapshot.cpp:2525] Successfully unmapped snapshot system_b
snapshotctl I 10-11 19:59:48 6120 6120 snapshot.cpp:2525] Successfully unmapped snapshot vendor_b
console:/ #
5. merge 操作
目前 snapshotctl 工具中的 merge 操作已經(jīng)取消。
console:/ # snapshotctl merge
snapshotctl W 10-11 19:43:10 5986 5986 snapshotctl.cpp:66] Deprecated. Call update_engine_client --merge instead.
70|console:/ #
這里的提示指出,如果需要進(jìn)行 merge,可以通過(guò)命令:" update_engine_client --merge
" 來(lái)進(jìn)行。
所以,如果虛擬分區(qū)升級(jí)出現(xiàn)問(wèn)題,可以先通過(guò) snapshotctl dump
查看一些基本信息,然后通過(guò) snapshotctl map
將所有虛擬分區(qū)設(shè)備映射出來(lái)進(jìn)行檢查,具體有哪些檢查的手段,這個(gè)看每個(gè)人自己的工具儲(chǔ)備了,也可以多關(guān)注我的博客"洛奇看世界(https://blog.csdn.net/guyongqiangx)",后面陸續(xù)為您分享更多 OTA 工具,包括一些洛奇自己開(kāi)發(fā)的工具。
6. 其它
到目前為止,我寫(xiě)過(guò) Android OTA 升級(jí)相關(guān)的話題包括:
- 基礎(chǔ)入門(mén):《Android A/B 系統(tǒng)》系列
- 核心模塊:《Android Update Engine 分析》 系列
- 動(dòng)態(tài)分區(qū):《Android 動(dòng)態(tài)分區(qū)》 系列
- 虛擬 A/B:《Android 虛擬 A/B 分區(qū)》系列
- 升級(jí)工具:《Android OTA 相關(guān)工具》系列
更多這些關(guān)于 Android OTA 升級(jí)相關(guān)文章的內(nèi)容,請(qǐng)參考《Android OTA 升級(jí)系列專(zhuān)欄文章導(dǎo)讀》。
如果您已經(jīng)訂閱了動(dòng)態(tài)分區(qū)和虛擬分區(qū)付費(fèi)專(zhuān)欄,請(qǐng)務(wù)必加我微信,備注訂閱賬號(hào),拉您進(jìn)“動(dòng)態(tài)分區(qū) & 虛擬分區(qū)專(zhuān)欄 VIP 答疑群”。我會(huì)在方便的時(shí)候,回答大家關(guān)于 A/B 系統(tǒng)、動(dòng)態(tài)分區(qū)、虛擬分區(qū)、各種 OTA 升級(jí)和簽名的問(wèn)題。
除此之外,我有一個(gè) Android OTA 升級(jí)討論群,里面現(xiàn)在有 400+ 朋友,主要討論手機(jī),車(chē)機(jī),電視,機(jī)頂盒,平板等各種設(shè)備的 OTA 升級(jí)話題,如果您從事 OTA 升級(jí)工作,歡迎加群一起交流,請(qǐng)?jiān)诩游椅⑿艜r(shí)注明“Android OTA 討論組”。此群僅限 Android OTA 開(kāi)發(fā)者參與~
公眾號(hào)“洛奇看世界”后臺(tái)回復(fù)“wx”獲取個(gè)人微信。