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