fota升级总结
一、[FAQ12481]Recovery mode在cache/recovery目錄下新建一支文件,重啟后,新建文件消失了
[DESCRIPTION]
1、在recovery.cpp文件的最后新建一支文件 /cache/recovery/wetest;并寫入內容:welcome to recovery mode!
2、編譯版本、燒寫手機,開機后,進行恢復出廠設置;等手機進入自動重啟狀,并在彈出開機向導前,通過命令進入到/cache/recovery/,有wetest文件,內容也正確;但是等開機向導走完之后,再進入/cache/recovery查看,生成的文件就消失了。
[SOLUTION]
原因是:
開機完成后,在frameworks/base/core/java/android/os/recoverysystem.java里面會去判斷/cache/recovery目錄下面的文件是不是以"last_"開頭的,如若不是,就會delete掉,目的是讓該目錄只存儲recovery mode指定的幾支文件。
如果有需求一定要在該目錄下新建文件,請務必在您的文件名前加上前綴"last_",以避免在重啟后被刪除。
二、[FAQ14484]如何修改L版本recovery mode 小機器人界面進入菜單,由volume up&power改為直接按power(如同KK以前版本)
[DESCRIPTION]
L版本進入recovery mode 會出現小機器人界面需同時按volume up & power 才能進入菜單,
如何改為像KK以前版本,直接按power 進入菜單
[SOLUTION]
1.alps/bootable/recovery/Ui.cpp
key_long_press(false),
key_down_count(0),
enable_reboot(true),
+ recovery_show_menu_flag(0),
consecutive_power_keys(false),
consecutive_alternate_keys(0),
RecoveryUI::KeyAction RecoveryUI::CheckKey(int key) {
+ if (key == KEY_POWER && recovery_show_menu_flag==false) {
+ recovery_show_menu_flag=true;
+ return TOGGLE;
+ }
if ((IsKeyPressed(KEY_POWER) && key == KEY_VOLUMEUP) || key == KEY_HOME) {
2.alps/bootable/recovery/ui.h
int rel_sum;
+ bool recovery_show_menu_flag;
int consecutive_power_keys;
int consecutive_alternate_keys;
三、[FAQ12492]SD卡升級包升級后,如何刪除升級包文件?
修改方法如下:
在alps\bootable\recovery.cpp文件如下處修添加code(綠色):
………
if (status != INSTALL_SUCCESS || ui->IsTextVisible()) {
prompt_and_wait(device, status);
}
#endif
if(update_package) //add
remove_mota_file(update_package); //add
// Otherwise, get ready to boot the main system...
finish_recovery(send_intent);
ui->Print("Rebooting...\n");
android_reboot(ANDROID_RB_RESTART, 0, 0);
return EXIT_SUCCESS;
}
四、[FAQ08726][Recovery]How to enable adb in Recovery Mode
【Description】
之前Recovery Mode下,ENG版本的手機只能敲入adb pull將log提取出來分析。
現在,只需要修改/recovery/etc/init.rc,就可實現RecoveryMode和NormalMode一樣,隨意的使用adb command啦。
【Solution】
下圖框框里的init.rc是在89JB2.MP上驗證過,是可行的,直接替代原有的/recovery/etc/init.rc就OK。
如果是72版本的,需要注意----『ubifs的mount命令是不同的』。
標紅部分是需要注意的地方。
on early-init
start ueventd
on init
export PATH /sbin:/system/bin
export ANDROID_ROOT /system
export ANDROID_DATA /data
export EXTERNAL_STORAGE /sdcard
symlink /system/etc /etc
mkdir /sdcard
mkdir /system
mkdir /data
mkdir /cache
mount /tmp /tmp tmpfs
insmod /sec.ko
mknod /dev/sec c 182 0
chmod 0660 /dev/sec
mount ext4 /emmc@android /system wait commit=1,noauto_da_alloc
chown root shell /tmp
chmod 0775 /tmp
write /sys/class/android_usb/android0/enable 0
write /sys/class/android_usb/android0/idVendor 0BB4
write /sys/class/android_usb/android0/idProduct 0c01
write /sys/class/android_usb/android0/functions adb
on boot
ifup lo
hostname localhost
domainname localdomain
class_start default
service ueventd /sbin/ueventd
critical
service recovery /sbin/recovery
service adbd /sbin/adbd recovery
start adbd
# Always start adbd on userdebug and eng builds
on property:ro.debuggable=1
write /sys/class/android_usb/android0/enable 0
write /sys/class/android_usb/android0/idVendor 0BB4
write /sys/class/android_usb/android0/idProduct 0c01
write /sys/class/android_usb/android0/functions adb
write /sys/class/android_usb/android0/enable 1
start adbd
# Restart adbd so it can run as root
on property:service.adb.root=1
write /sys/class/android_usb/android0/enable 0
restart adbd
write /sys/class/android_usb/android0/enable 1
備注:這個功能只可用于debug,正式版本須關閉,不然可能會引起升級失敗。
五、[FAQ12633]更新APN列表OTA升級后開機即生效
[DESCRIPTION]
更新APN列表OTA升級后需要恢復出廠設置APN更新才有效, 客戶需要做升級后開機即生效。
[SOLUTION]
因為,OTA升級更新的是三個區域,boot , recovery, system,
APN屬于DATA域,OTA升級不會涉及到, 所以,必須reset之后才會更新有效。
所以, 需要修改alps\build\tools\releasetools\ota_from_target_files這個腳本,
在
script.DeleteFiles([i[1] for i in to_create])
script.MakeSymlinks(to_create)
之后添加以下命令:
script.Mount("/data")
script.DeleteFiles(["/data/data/com.android.providers.telephony/databases/telephony.db",
"/data/data/com.android.providers.telephony/shared_prefs/load-apn.xml"])
這樣做的目的是在升級之后,開機再重新把apns-conf.xml里的apn信息寫入db , 達到更新的目的。
該措施在Android M之后可能不可行,在M之后data分區加密導致在recovery下掛載失敗,此方法沒有驗證
六、[FAQ11015]通過組合鍵進入recovery模式選擇sdcard菜單升級,升級完如何自動重啟?
[DESCRIPTION]
將OTA升級包放入SD卡根目錄下,在recovery模式下進入OTA升級包,升級完成后無法自動重啟,需要手動完成重啟,新需求:能自動重啟。
[SOLUTION]
修改alps/bootable/recovery/recovery.cpp
1. 在代碼中找到以下code,并在后面添加return;
ui->Print("\nInstall from sdcard complete.\n");
finish_recovery(NULL);
return; //add by MTK
2. 在代碼中找到以下code,并在后面添加return;
ui->Print("\nInstall from sdcard2 complete.\n");
finish_recovery(NULL);
return; //add by MTK
七、[FAQ08110]如何修改recovery mode下字體的大小
[DESCRIPTION]
當客戶手機為1080P的時候,如果感覺recovery mode下的字體太小,可以按照如下方式修改
[SOLUTION]
1,拷貝alps/mediatek/factory/src/miniui/font_16X28.h到alps\bootable\recovery\minui下
2、修改alps\bootable\recovery\minui\graphics.c文件中的#include "font_16x28.h"
3、修改alps\bootable\recovery\ui.c中CHAR_HEIGHT和CHAR_WIDTH分別修改為 28和 16
4 ,按照如下方式編譯recovery.img并重新download即可
./makeMtk mm bootable/recovery/
./makeMtk -opt=ONE_SHOT_MAKEFILE=build/target/board/Android.mk r recoveryimage
八、[FAQ18251][Recovery][common] Android M Adoptable SD卡無法在recovery mode識別和使用
[DESCRIPTION]
Android M 版本,當外置的SD卡被Adoptable 之后,即Format As internal Storage,此時,如果把升級包置于SD卡,進入recovery mode后是無法找到升級包并正常升級的。
[SOLUTION]
首先,外置SD卡可以被Adoptable 這個功能,是Android M 引入的一個new feature,其次,在被Format As internal Storage之后,SD卡會被加密并被Format成Ext4格式,而在recovery mode 是無法訪問這時的SD卡,這個是Google原生的做法,MTK維持Google的做法,所以無法在recovery mode是無法掛載Adoptable后的SD的,謝謝!
這種情況下,如果要實現OTA升級,強烈建議您把升級包放入/data/ 下面,謝謝!
相關可參考:
FAQ17442
[Recovery][Common]Android M 版本data加密后升級包放入/data分區如何升級?
九、[FAQ18202][Recovery][Common]Android L ->M版本OTA/T卡升級注意事項
[DESCRIPTION]
Android L -> M 升級,除了前后版本partition 數目,大小,順序需一致的升級基本規則外,
相對于升級到L版本的不同,需額外注意的的地方如下
[SOLUTION]
1.升級包制作命令 添加 –s device/mediate/build/releasetools/mt_ota_from_target_files
? Full : ./build/tools/releasetools/ota_from_target_files –v --block -k $(key_path) –s device/mediatek/build/releasetools/mt_ota_from_target_files src.zip update.zip
? Incremental : ./build/tools/releasetools/ota_from_target_files –v --block -k $(key_path) –s device/mediatek/build/releasetools/mt_ota_from_target_files –i src.zip tgt.zip update.zip
2.建議使用block-base升級(加--block參數),如使用file-base升級(不加--block參數)
請關閉M 版本dm-verity ,否則升級后無法正常開機
關閉dm-verity方法,將fastab里
/dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/system /system __MTK_SYSIMG_FSTYPE ro wait,verify
修改為(去掉verity參數)
/dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/system /system __MTK_SYSIMG_FSTYPE ro wait
3.如何升級preloader 與LK 與其它raw 分區
preloader , lk :
請參考 FAQ17441 [Recovery][Common]Android M 版本如何升級lk 、preloader ?
其他raw分區,如logo.. :
請參考 FAQ18188 [Recovery][Common]Android M 版本如何升級logo等rawdata分區方法?
4. L版本 請配置MTK_SHARED_SDCARD=yes ,MTK_2SDCARD_SWAP=no,否則升級至M版本用戶數據丟失
因為MTK_2SDCARD_SWAP在M版本已經phase out 不支持,
若已出貨L版本已開啟MTK_2SDCARD_SWAP=yes需升級至M版本,請在M版本下載patch id: ALPS02551082
5.差分包編譯失敗
如差分包制作diff過程如下時異常退出而無法生成,
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 574, in diff_worker
patch = compute_patch(src, tgt, imgdiff=(xf.style == "imgdiff"))
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 60, in compute_patch
raise ValueError("diff failed: " + str(p))
ValueError: diff failed: 1
或
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 273, in Compute
self.ComputePatches(prefix)
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 594, in ComputePatches
for patch, xf in patches:
TypeError: 'NoneType' object is not iterable
請抓patch id: ALPS02608209后驗證,
或直接修改\bootable\recovery\applypatch\imgdiff.c
char ptemp[] = "/tmp/imgdiff-patch-XXXXXX";
- mkstemp(ptemp);
+ int fd = mkstemp(ptemp);
+
+ if (fd == -1) {
+ printf("MakePatch failed to create a temporary file: %s\n",
+ strerror(errno));
+ return NULL;
+ }
+ close(fd); // temporary file is created and we don't need its file
+ // descriptor
若仍無法制作請提交e-service
6./data加密后升級包如何由內卡或放置/data分區下升級
請參考 FAQ17442 [Recovery][Common]Android M 版本data加密后升級包放入/data分區如何升級?
如uncrypt出現權限失敗問題請抓patch id: ALPS02625151
7.升級后modem能否正常工作?
請參考 FAQ17640 [NVRAM]檢查兩個不同modem版本的modem nvram是否可以采用OTA升級
8.其他:
可參考DMS文檔 OTA and Android SD upgrade application note.docx
十、[FAQ14973]Adb sideload OTA升級失敗報錯:"E: unknown volume for path [/sideload/pakage.zip]”
[DESCRIPTION]
操作步驟:
1. Enter the recovery mode by pressing the buttons with Power + Volume
2. Select the "Recovery"
3. Pressing the button "Power" and soon after the button "Volume +"
4. Select the "Apply update from ADB"
5. On the PC running the command "adb sideload <filename>"
6. Check the behavior
實際結果:
Is not possible to carry out the recovery and is shown msg "Sideload aborted"
The log is shown:
E: unknown volume for path [/sideload/pakage.zip]
E: can`t mount /sideload/package.zip
I: GPT is supported!
[SOLUTION]
在bootable/recovery/ roots.cpp如下函數添加code:
1、ensure_path_mounted函數開始位置加上:
if (!strncmp(path, "/sideload", strlen("/sideload"))) {//add
return 0;//add
}//add
Volume* v = volume_for_path(path);
2、同樣ensure_path_unmounted函數開始位置加上:
if (!strncmp(path, "/sideload", strlen("/sideload"))) {//add
return 0;//add
}//add
Volume* v = volume_for_path(path);
十一、[FAQ17442][Recovery][Common]Android L和M 版本data加密后升級包放入/data分區如何升級?
[DESCRIPTION]
Android L和M 版本,data加密后,開啟MTK_SHARED_SDCARD并把升級包放入內卡;或者有需要把升級包放入/data分區來升級, 一般這種情況,直接按鍵進入recovery mode,選擇apply from sdcard來實現升級,是行不通的,建議在驗證升級時,使用adb 命令的方式升級。
[SOLUTION]
L版本的步驟如下:
1、在normal mode先把升級包(update.zip) push 到data分區目,比如/data/update.zip.
2、adb shell 下執行:echo "--update_package=@/cache/recovery/block.map" > /cache/recovery/command
4、adb shell 下執行:system/bin/uncrypt
M版本的步驟如下:
1、在normal mode先把升級包(update.zip) push 到data分區目,比如/data/update.zip.
2、adb shell 下執行:system/bin/uncrypt /data/update.zip /cache/recovery/block.map
注意:要等待一段時間,直到命令執行退出…,然后在執行如下命令;
3、adb shell 下執行:echo "--update_package=@/cache/recovery/block.map" > /cache/recovery/command
4、adb reboot recovery
十二、[FAQ12491][Recovery mode][Common] 選擇"apply update from sdcard"直接進入data/目錄是否正常?
[DESCRIPTION]
Recovery mode 選擇"apply update from sdcard"直接進入data/目錄,說明您開了MTK_SHARED_SDCARD宏;請檢查下貴司project下的projectconfig.mk文件,謝謝!
至于開了share sd功能后的升級方案:請參考:
ID: FAQ12477
關于打開MTK_SHARED_SDCARD宏后MTK目前升級方案
KK 版本默認是支持在打開MTK_SHARED_SDCARD宏后從內卡升級,即從/data/media/下面選取升級包升級;但這種情況有些Limitation;詳情見FAQ12477。
[SOLUTION]
這種現象是正常的! 謝謝!
十三、[FAQ14769]L版本OTA升級遇到error:"system has been remounted R/W; reflash device to reenable OTA updates"
[DESCRIPTION]
L版本;如果有在bootable/recovery/目錄下code中添加ensure_path_mounted(“/system”);
或者是在recovery mode下執行root integrity check之后,導致OTA升級失敗,而且last_log中有如下error:
script aborted: system has been remounted R/W; reflash device to reenable OTA updates
system has been remounted R/W; reflash device to reenable OTA updates
[SOLUTION]
可以嘗試在 /bootable/recovery/roots.cpp中作如下修改:(藍色為添加部分)
int ensure_path_mounted(const char* path) {
} else if (strcmp(v->fs_type, "ext4") == 0 ||
strcmp(v->fs_type, "vfat") == 0) {
if (strcmp(v->mount_point, "/system") == 0)//add
result = mount(v->device, v->mount_point, v->fs_type,MS_NOATIME | MS_NODEV | MS_NODIRATIME | MS_RDONLY, "");//add
else //add
result = mount(v->device, v->mount_point, v->fs_type,
MS_NOATIME | MS_NODEV | MS_NODIRATIME, "");
十四、[FAQ11954]如何實現恢復出廠后不重新啟動手機?
[DESCRIPTION]
實現恢復出廠后不重新啟動手機
[SOLUTION]
請在/bootable/recovery/recovery.cpp文件如下處修改:
// Otherwise, get ready to boot the main system...
finish_recovery(send_intent);
return;//添加這一句,直接return
ui->Print("Rebooting...\n");
android_reboot(ANDROID_RB_RESTART, 0, 0);
return EXIT_SUCCESS;
}
十五、[FAQ03439][Recovery]如何進入recovery mode立即顯示menu菜單
請將alps/bootable/recovery/ui.c文件中的static int show_text = 0;
修改為static int show_text = 1;
十六、[FAQ04813]update.zip包中各個文件的含義
將全量升級包update.zip包解壓后里面的各個文件的含義如下:
boot.img:(boot.img=kernel+ramdisk)
system:(升級后會放在系統的system分區。主要用來更新系統的一些應用或則應用會用到的一些庫) recovery/recovery-from-boot.p:(是boot.img和recovery.img的補丁) recovery/etc/install-recovery.sh:(install-recovery.sh是更新腳本)
META-INF/CERT.RSA:(簽名文件相關,保存公匙和加密算法)
META-INF/CERT.SF:(簽名文件相關,保存私匙,CERT代表簽名者)
META-INF/MAINFEST.MF:(這個manifest文件定義了與包的組成結構相關的數據) com/google/android/update-binary:(一個腳本解釋器,能夠識別updater-script中描述的操作) com/google/android/updater-script:(腳本文件,具體描述了更新過程) com/google/android/metadata:(描述設備信息及環境變量的元數據)
十七、[FAQ17418][Recovery][Build] 預置資源(如apk)到userdata,otapackage之后的userdata.img沒有此資源
[Background]
隨著FLASH空間的使用率被廣泛專注,MTK_SHARED_SDCARD的使用逐漸成為主流。
MTK_SHARED_SDCARD enable的前提下,phone storage和internal storage共享userdata分區,其中phone storage的目錄變成了/data/media。
MTK_SHARED_SDCARD enable時的內置資源預置方式,可以參見FAQ:
[FAQ14735]【sdcard-FAT filesystem】MTK_SHARED_SDCARD打開時L上如何預置資源
[Issue]
按照FAQ14735預置資源以后,new之后的userdata.img是包含新內置資源,此時再執行otapackage,out目錄下的userdata.img并不包含此資源。
[Solution]
經分析,主要原因如下所示:
/build/core/Makefile 中otapackage的主要flow --
otapackage: $(INTERNAL_OTA_PACKAGE_TARGET)
-> $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS)
-> $(BUILT_TARGET_FILES_PACKAGE)
$(hide) ./build/tools/releasetools/add_img_to_target_files -p $(HOST_OUT) $@
$(hide) ./build/tools/releasetools/replace_img_from_target_files.py $@ $(PRODUCT_OUT)
Add_img_to_target_files對各個image的處理 --
/build/tools/releasetools/add_img_to_target_files
main
-> AddImagesToTargetFiles(args[0])
-> AddSystem(output_zip, recovery_img=recovery_image, boot_img=boot_image)
-> AddUserdata(output_zip)
-> AddCache(output_zip)
上面flow的目的是以out/obj/的中間包(cota包)為source重新生成image,放入中間包。
def AddUserdata(output_zip, prefix="IMAGES/"):
"""Create an empty userdata image and store it in output_zip."""
其中, AddUserdata與其他接口的實現不同,主要是生成一個空的目錄,google要求otapackage release出去的dataimage是空的(升級本身也是不包含userdata的)。
-> $(hide) ./build/tools/releasetools/replace_img_from_target_files.py $@ $(PRODUCT_OUT)
這段的目的是從中間包將image copy出來替換out目錄。
所以,otapackage最終out/obj目錄下的/DATA目錄是有apk的,但是最后生成的out目錄和中間包里的userdata.img都是空的。
如果一定要預置apk,可以嘗試將new后的userdata.img保留下來。Otapackage之后,再用new后的userdata.img替換out目錄下的userdata.img。
或是直接修改/build/tools/releasetools/replace_img_from_target_files.py
將
if img.find(".img") != -1:
修改為
if img.find(".img") != -1 and img.find("userdata") == -1 :
十八、[FAQ03434][Recovery]恢復出廠設置之后如何將時間變為初始值
Recovery.c (bootable\recovery):
#include <linux/rtc.h>
#include <sys/ioctl.h>
void set_rtc(void) {
struct tm tm;
int fd;
tm.tm_sec = 0;
tm.tm_min = 0;
tm.tm_hour = 0;
tm.tm_mday = 1;
tm.tm_mon = 0;
tm.tm_year = 2012-1900;
fd = open("/dev/rtc0", O_WRONLY);
if (fd != -1) {
ioctl(fd, RTC_SET_TIME, &tm);
close(fd);
}
}
int
main(int argc, char **argv) {
...
中的
} else if (wipe_data) {
....
//
/*該else if代碼最后 新增代碼如下*/
set_rtc();
}
十九、[FAQ14751]L 版本Security OTA升級方法
[DESCRIPTION]
L版本Security OTA升級方法;
[SOLUTION]
首先:修改build/core/makefile如下:(藍色為添加項)
# host tools needed to build dist and OTA packages
SECURITY_SIG_TOOL := vendor/mediatek/proprietary/scripts/sign-image/sign_image.sh
SIGN_TOOL := vendor/mediatek/proprietary/scripts/sign-image/SignTool.pl
FWUPGRADEPACKAGE_SH := ./build/core/FWUpgradePackage.sh
DISTTOOLS := $(HOST_OUT_EXECUTABLES)/minigzip \
endif
ifeq ($(strip $(MTK_SECURITY_SW_SUPPORT)), yes)
#security boot signature
$(hide) cp -ru $(zip_root)/SYSTEM/* $(SYSTEMIMAGE_SOURCE_DIR)
$(hide) $(SHELL) $(SECURITY_SIG_TOOL)
$(hide) cp $(PRODUCT_OUT)/sig/boot.sig $(zip_root)/META/
$(hide) cp $(PRODUCT_OUT)/sig/recovery.sig $(zip_root)/META/
$(hide) cp $(PRODUCT_OUT)/sig/recovery.sig $(zip_root)/SYSTEM/etc/
$(hide) cp $(SYSTEMIMAGE_SOURCE_DIR)/etc/firmware/S_ANDRO_SFL.ini $(zip_root)/SYSTEM/etc/firmware/
endif
@# Zip everything up, preserving symlinks
$(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .)
$(hide) (cd $(zip_root) && zip -q ../$(notdir $@) META/*filesystem_config.txt)
$(hide) ./build/tools/releasetools/add_img_to_target_files -p $(HOST_OUT) $@
$(hide) ./build/tools/releasetools/replace_img_from_target_files.py $@ $(PRODUCT_OUT)
ifeq ($(strip $(MTK_SECURITY_SW_SUPPORT)), yes)
$(hide) perl $(SIGN_TOOL) $(MTK_BASE_PROJECT) $(MTK_PROJECT_NAME) $(MTK_PATH_CUSTOM) $(MTK_SEC_SECRO_AC_SUPPORT) $(MTK_NAND_PAGE_SIZE) $(PRODUCT_OUT) $(OUT_DIR) $(DEAL_STDOUT_SIGN_IMAGE)
注意:最后一行添加的綠色部分,是由文件vendor/mediate/proprietary/scripts/sign-image/Android.mk 的最后一行copy而來,具體以貴司實際文件內容為準。
然后:build diff OTA升級的步驟如下:
1、new整個project。
2、Step1: ./vendor/mediatek/proprietary/scripts/sign-modem/sign_modem.sh
Step2: ./vendor/mediatek/proprietary/scripts/sign-image/sign_image.sh
3、make otapackage
4、產生差分包: MTK_SECURITY_SW_SUPPORT=yes ./build/tools/releasetools/ota_from_target_files --block -k <key_path> -i old.zip new.zip update.zip
build full OTA升級的步驟如下:
1、new整個project。
2、Step1: ./vendor/mediatek/proprietary/scripts/sign-modem/sign_modem.sh
Step2: ./vendor/mediatek/proprietary/scripts/sign-image/sign_image.sh
3、make otapackage
二十、[FAQ05739]SD或者OTA升級secutiry device和non-security device的區別!
問題現象: 同樣的升級包在升級non-security device可以升級成功,升級secutiry device確不能升級成功!
原因說明:SD在升級non-security device和security device的區別是:在升級security device時,SUPPORT_SBOOT_UPDATE這個宏會打開!然后升級security device時會去檢查升級包中的SEC_VER.txt這個文件,并且檢查SEC_VER.txt這個文件里的CUSTOM_NAME,BOOTIMG,RECOVERY,ANDROID四項,并且要求BOOTIMG,RECOVERY,ANDROID這三項的值要比手機里面這三項的值要相等或者大于手機版本里的值!否則會升級失敗!
下面舉一個例子來說明,假如bootimg第一版是version 1
1. 空機先燒錄進bootimg,則device里面的記錄是version 1 2. 假如發現bootimg有security bug,重新編出一版 version
2;接著燒錄,device里面就變成記錄的是version 2
3. 假如發現bootimg有security bug,重新編出一版 version 3;接著燒錄,device里面就變成記錄的是version 3
4. (此時,如果要燒錄回去verison 1或version 2,都是不允許的動作)
5. 假如這個時候USER透過OTA去升級,而OTA package記錄的BOOTIMG版本號是4,那就允許更新;如果是2或3,都不允許更新
二十一、[FAQ03128]Android系統中的6種模式
[DESCRIPTION]
Android系統中的6種模式
[SOLUTION]
1:一般啟動模式(normal mode):
功能是正常啟動手機,方法為關機狀態下按電源鍵啟動。
2:安全模式(safe mode):
此模式和正常啟動一樣,但沒有登記Google,所以不能訪問Market或使用你的Google賬號。操作方法為按住“menu”鍵,按電源鍵啟動手機,直至手機啟動完成松開“menu”鍵。
3:恢復模式(recovery mode)
可打開命令解釋程序(shell),刷新映像文件(flash image),執行備份等。當然這一切取決于你手機上的recovery image版本。使用方法很簡單,就是home鍵和電源鍵一起按。
4:引導模式(bootloader mode)
功能是從SD卡上安裝新的系統映像(DREAIMG.NBH),只需再按一次電源鍵。值得一提的事為Android手機獲取root權限,就是使用這個模式。操作方法為照相鍵和電源鍵一起按。
5:fastboot模式
主要是在電腦上使用fastboot命令來刷新映像文件。使用方法為按住返回鍵,按電源鍵啟動手機,直至屏幕出現FASTBOOT字樣后松開返回鍵。
6:診斷模式(diagnostic mode)
是為了測試手機各項功能的模式,刻意通過軌跡球中心鍵和電源鍵打開。
二十二、[FAQ18202][Recovery][Common]Android L ->M版本OTA/T卡升級注意事項
[DESCRIPTION]
Android L -> M 升級,除了前后版本partition 數目,大小,順序需一致的升級基本規則外,
相對于升級到L版本的不同,需額外注意的的地方如下
[SOLUTION]
1.升級包制作命令 添加 –s device/mediate/build/releasetools/mt_ota_from_target_files
? Full : ./build/tools/releasetools/ota_from_target_files –v --block -k $(key_path) –s device/mediatek/build/releasetools/mt_ota_from_target_files src.zip update.zip
? Incremental : ./build/tools/releasetools/ota_from_target_files –v --block -k $(key_path) –s device/mediatek/build/releasetools/mt_ota_from_target_files –i src.zip tgt.zip update.zip
2.建議使用block-base升級(加--block參數),如使用file-base升級(不加--block參數)
請關閉M 版本dm-verity ,否則升級后無法正常開機
關閉dm-verity方法,將fastab里
/dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/system /system __MTK_SYSIMG_FSTYPE ro wait,verify
修改為(去掉verity參數)
/dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/system /system __MTK_SYSIMG_FSTYPE ro wait
3.如何升級preloader 與LK 與其它raw 分區
preloader , lk :
請參考 FAQ17441 [Recovery][Common]Android M 版本如何升級lk 、preloader ?
其他raw分區,如logo.. :
請參考 FAQ18188 [Recovery][Common]Android M 版本如何升級logo等rawdata分區方法?
4. L版本 請配置MTK_SHARED_SDCARD=yes ,MTK_2SDCARD_SWAP=no,否則升級至M版本用戶數據丟失
因為MTK_2SDCARD_SWAP在M版本已經phase out 不支持,
若已出貨L版本已開啟MTK_2SDCARD_SWAP=yes需升級至M版本,請在M版本下載patch id: ALPS02551082
5.差分包編譯失敗
如差分包制作diff過程如下時異常退出而無法生成,
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 574, in diff_worker
patch = compute_patch(src, tgt, imgdiff=(xf.style == "imgdiff"))
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 60, in compute_patch
raise ValueError("diff failed: " + str(p))
ValueError: diff failed: 1
或
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 273, in Compute
self.ComputePatches(prefix)
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 594, in ComputePatches
for patch, xf in patches:
TypeError: 'NoneType' object is not iterable
請抓patch id: ALPS02608209后驗證,
或直接修改\bootable\recovery\applypatch\imgdiff.c
char ptemp[] = "/tmp/imgdiff-patch-XXXXXX";
- mkstemp(ptemp);
+ int fd = mkstemp(ptemp);
+
+ if (fd == -1) {
+ printf("MakePatch failed to create a temporary file: %s\n",
+ strerror(errno));
+ return NULL;
+ }
+ close(fd); // temporary file is created and we don't need its file
+ // descriptor
若仍無法制作請提交e-service
6./data加密后升級包如何由內卡或放置/data分區下升級
請參考 FAQ17442 [Recovery][Common]Android M 版本data加密后升級包放入/data分區如何升級?
如uncrypt出現權限失敗問題請抓patch id: ALPS02625151
7.升級后modem能否正常工作?
請參考 FAQ17640 [NVRAM]檢查兩個不同modem版本的modem nvram是否可以采用OTA升級
8.其他:
可參考DMS文檔 OTA and Android SD upgrade application note.docx
From:http://www.cfanz.cn/index.php?c=article&a=read&id=305804
[DESCRIPTION]
1、在recovery.cpp文件的最后新建一支文件 /cache/recovery/wetest;并寫入內容:welcome to recovery mode!
2、編譯版本、燒寫手機,開機后,進行恢復出廠設置;等手機進入自動重啟狀,并在彈出開機向導前,通過命令進入到/cache/recovery/,有wetest文件,內容也正確;但是等開機向導走完之后,再進入/cache/recovery查看,生成的文件就消失了。
[SOLUTION]
原因是:
開機完成后,在frameworks/base/core/java/android/os/recoverysystem.java里面會去判斷/cache/recovery目錄下面的文件是不是以"last_"開頭的,如若不是,就會delete掉,目的是讓該目錄只存儲recovery mode指定的幾支文件。
如果有需求一定要在該目錄下新建文件,請務必在您的文件名前加上前綴"last_",以避免在重啟后被刪除。
二、[FAQ14484]如何修改L版本recovery mode 小機器人界面進入菜單,由volume up&power改為直接按power(如同KK以前版本)
[DESCRIPTION]
L版本進入recovery mode 會出現小機器人界面需同時按volume up & power 才能進入菜單,
如何改為像KK以前版本,直接按power 進入菜單
[SOLUTION]
1.alps/bootable/recovery/Ui.cpp
key_long_press(false),
key_down_count(0),
enable_reboot(true),
+ recovery_show_menu_flag(0),
consecutive_power_keys(false),
consecutive_alternate_keys(0),
RecoveryUI::KeyAction RecoveryUI::CheckKey(int key) {
+ if (key == KEY_POWER && recovery_show_menu_flag==false) {
+ recovery_show_menu_flag=true;
+ return TOGGLE;
+ }
if ((IsKeyPressed(KEY_POWER) && key == KEY_VOLUMEUP) || key == KEY_HOME) {
2.alps/bootable/recovery/ui.h
int rel_sum;
+ bool recovery_show_menu_flag;
int consecutive_power_keys;
int consecutive_alternate_keys;
三、[FAQ12492]SD卡升級包升級后,如何刪除升級包文件?
修改方法如下:
在alps\bootable\recovery.cpp文件如下處修添加code(綠色):
………
if (status != INSTALL_SUCCESS || ui->IsTextVisible()) {
prompt_and_wait(device, status);
}
#endif
if(update_package) //add
remove_mota_file(update_package); //add
// Otherwise, get ready to boot the main system...
finish_recovery(send_intent);
ui->Print("Rebooting...\n");
android_reboot(ANDROID_RB_RESTART, 0, 0);
return EXIT_SUCCESS;
}
四、[FAQ08726][Recovery]How to enable adb in Recovery Mode
【Description】
之前Recovery Mode下,ENG版本的手機只能敲入adb pull將log提取出來分析。
現在,只需要修改/recovery/etc/init.rc,就可實現RecoveryMode和NormalMode一樣,隨意的使用adb command啦。
【Solution】
下圖框框里的init.rc是在89JB2.MP上驗證過,是可行的,直接替代原有的/recovery/etc/init.rc就OK。
如果是72版本的,需要注意----『ubifs的mount命令是不同的』。
標紅部分是需要注意的地方。
on early-init
start ueventd
on init
export PATH /sbin:/system/bin
export ANDROID_ROOT /system
export ANDROID_DATA /data
export EXTERNAL_STORAGE /sdcard
symlink /system/etc /etc
mkdir /sdcard
mkdir /system
mkdir /data
mkdir /cache
mount /tmp /tmp tmpfs
insmod /sec.ko
mknod /dev/sec c 182 0
chmod 0660 /dev/sec
mount ext4 /emmc@android /system wait commit=1,noauto_da_alloc
chown root shell /tmp
chmod 0775 /tmp
write /sys/class/android_usb/android0/enable 0
write /sys/class/android_usb/android0/idVendor 0BB4
write /sys/class/android_usb/android0/idProduct 0c01
write /sys/class/android_usb/android0/functions adb
on boot
ifup lo
hostname localhost
domainname localdomain
class_start default
service ueventd /sbin/ueventd
critical
service recovery /sbin/recovery
service adbd /sbin/adbd recovery
start adbd
# Always start adbd on userdebug and eng builds
on property:ro.debuggable=1
write /sys/class/android_usb/android0/enable 0
write /sys/class/android_usb/android0/idVendor 0BB4
write /sys/class/android_usb/android0/idProduct 0c01
write /sys/class/android_usb/android0/functions adb
write /sys/class/android_usb/android0/enable 1
start adbd
# Restart adbd so it can run as root
on property:service.adb.root=1
write /sys/class/android_usb/android0/enable 0
restart adbd
write /sys/class/android_usb/android0/enable 1
備注:這個功能只可用于debug,正式版本須關閉,不然可能會引起升級失敗。
五、[FAQ12633]更新APN列表OTA升級后開機即生效
[DESCRIPTION]
更新APN列表OTA升級后需要恢復出廠設置APN更新才有效, 客戶需要做升級后開機即生效。
[SOLUTION]
因為,OTA升級更新的是三個區域,boot , recovery, system,
APN屬于DATA域,OTA升級不會涉及到, 所以,必須reset之后才會更新有效。
所以, 需要修改alps\build\tools\releasetools\ota_from_target_files這個腳本,
在
script.DeleteFiles([i[1] for i in to_create])
script.MakeSymlinks(to_create)
之后添加以下命令:
script.Mount("/data")
script.DeleteFiles(["/data/data/com.android.providers.telephony/databases/telephony.db",
"/data/data/com.android.providers.telephony/shared_prefs/load-apn.xml"])
這樣做的目的是在升級之后,開機再重新把apns-conf.xml里的apn信息寫入db , 達到更新的目的。
該措施在Android M之后可能不可行,在M之后data分區加密導致在recovery下掛載失敗,此方法沒有驗證
六、[FAQ11015]通過組合鍵進入recovery模式選擇sdcard菜單升級,升級完如何自動重啟?
[DESCRIPTION]
將OTA升級包放入SD卡根目錄下,在recovery模式下進入OTA升級包,升級完成后無法自動重啟,需要手動完成重啟,新需求:能自動重啟。
[SOLUTION]
修改alps/bootable/recovery/recovery.cpp
1. 在代碼中找到以下code,并在后面添加return;
ui->Print("\nInstall from sdcard complete.\n");
finish_recovery(NULL);
return; //add by MTK
2. 在代碼中找到以下code,并在后面添加return;
ui->Print("\nInstall from sdcard2 complete.\n");
finish_recovery(NULL);
return; //add by MTK
七、[FAQ08110]如何修改recovery mode下字體的大小
[DESCRIPTION]
當客戶手機為1080P的時候,如果感覺recovery mode下的字體太小,可以按照如下方式修改
[SOLUTION]
1,拷貝alps/mediatek/factory/src/miniui/font_16X28.h到alps\bootable\recovery\minui下
2、修改alps\bootable\recovery\minui\graphics.c文件中的#include "font_16x28.h"
3、修改alps\bootable\recovery\ui.c中CHAR_HEIGHT和CHAR_WIDTH分別修改為 28和 16
4 ,按照如下方式編譯recovery.img并重新download即可
./makeMtk mm bootable/recovery/
./makeMtk -opt=ONE_SHOT_MAKEFILE=build/target/board/Android.mk r recoveryimage
八、[FAQ18251][Recovery][common] Android M Adoptable SD卡無法在recovery mode識別和使用
[DESCRIPTION]
Android M 版本,當外置的SD卡被Adoptable 之后,即Format As internal Storage,此時,如果把升級包置于SD卡,進入recovery mode后是無法找到升級包并正常升級的。
[SOLUTION]
首先,外置SD卡可以被Adoptable 這個功能,是Android M 引入的一個new feature,其次,在被Format As internal Storage之后,SD卡會被加密并被Format成Ext4格式,而在recovery mode 是無法訪問這時的SD卡,這個是Google原生的做法,MTK維持Google的做法,所以無法在recovery mode是無法掛載Adoptable后的SD的,謝謝!
這種情況下,如果要實現OTA升級,強烈建議您把升級包放入/data/ 下面,謝謝!
相關可參考:
FAQ17442
[Recovery][Common]Android M 版本data加密后升級包放入/data分區如何升級?
九、[FAQ18202][Recovery][Common]Android L ->M版本OTA/T卡升級注意事項
[DESCRIPTION]
Android L -> M 升級,除了前后版本partition 數目,大小,順序需一致的升級基本規則外,
相對于升級到L版本的不同,需額外注意的的地方如下
[SOLUTION]
1.升級包制作命令 添加 –s device/mediate/build/releasetools/mt_ota_from_target_files
? Full : ./build/tools/releasetools/ota_from_target_files –v --block -k $(key_path) –s device/mediatek/build/releasetools/mt_ota_from_target_files src.zip update.zip
? Incremental : ./build/tools/releasetools/ota_from_target_files –v --block -k $(key_path) –s device/mediatek/build/releasetools/mt_ota_from_target_files –i src.zip tgt.zip update.zip
2.建議使用block-base升級(加--block參數),如使用file-base升級(不加--block參數)
請關閉M 版本dm-verity ,否則升級后無法正常開機
關閉dm-verity方法,將fastab里
/dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/system /system __MTK_SYSIMG_FSTYPE ro wait,verify
修改為(去掉verity參數)
/dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/system /system __MTK_SYSIMG_FSTYPE ro wait
3.如何升級preloader 與LK 與其它raw 分區
preloader , lk :
請參考 FAQ17441 [Recovery][Common]Android M 版本如何升級lk 、preloader ?
其他raw分區,如logo.. :
請參考 FAQ18188 [Recovery][Common]Android M 版本如何升級logo等rawdata分區方法?
4. L版本 請配置MTK_SHARED_SDCARD=yes ,MTK_2SDCARD_SWAP=no,否則升級至M版本用戶數據丟失
因為MTK_2SDCARD_SWAP在M版本已經phase out 不支持,
若已出貨L版本已開啟MTK_2SDCARD_SWAP=yes需升級至M版本,請在M版本下載patch id: ALPS02551082
5.差分包編譯失敗
如差分包制作diff過程如下時異常退出而無法生成,
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 574, in diff_worker
patch = compute_patch(src, tgt, imgdiff=(xf.style == "imgdiff"))
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 60, in compute_patch
raise ValueError("diff failed: " + str(p))
ValueError: diff failed: 1
或
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 273, in Compute
self.ComputePatches(prefix)
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 594, in ComputePatches
for patch, xf in patches:
TypeError: 'NoneType' object is not iterable
請抓patch id: ALPS02608209后驗證,
或直接修改\bootable\recovery\applypatch\imgdiff.c
char ptemp[] = "/tmp/imgdiff-patch-XXXXXX";
- mkstemp(ptemp);
+ int fd = mkstemp(ptemp);
+
+ if (fd == -1) {
+ printf("MakePatch failed to create a temporary file: %s\n",
+ strerror(errno));
+ return NULL;
+ }
+ close(fd); // temporary file is created and we don't need its file
+ // descriptor
若仍無法制作請提交e-service
6./data加密后升級包如何由內卡或放置/data分區下升級
請參考 FAQ17442 [Recovery][Common]Android M 版本data加密后升級包放入/data分區如何升級?
如uncrypt出現權限失敗問題請抓patch id: ALPS02625151
7.升級后modem能否正常工作?
請參考 FAQ17640 [NVRAM]檢查兩個不同modem版本的modem nvram是否可以采用OTA升級
8.其他:
可參考DMS文檔 OTA and Android SD upgrade application note.docx
十、[FAQ14973]Adb sideload OTA升級失敗報錯:"E: unknown volume for path [/sideload/pakage.zip]”
[DESCRIPTION]
操作步驟:
1. Enter the recovery mode by pressing the buttons with Power + Volume
2. Select the "Recovery"
3. Pressing the button "Power" and soon after the button "Volume +"
4. Select the "Apply update from ADB"
5. On the PC running the command "adb sideload <filename>"
6. Check the behavior
實際結果:
Is not possible to carry out the recovery and is shown msg "Sideload aborted"
The log is shown:
E: unknown volume for path [/sideload/pakage.zip]
E: can`t mount /sideload/package.zip
I: GPT is supported!
[SOLUTION]
在bootable/recovery/ roots.cpp如下函數添加code:
1、ensure_path_mounted函數開始位置加上:
if (!strncmp(path, "/sideload", strlen("/sideload"))) {//add
return 0;//add
}//add
Volume* v = volume_for_path(path);
2、同樣ensure_path_unmounted函數開始位置加上:
if (!strncmp(path, "/sideload", strlen("/sideload"))) {//add
return 0;//add
}//add
Volume* v = volume_for_path(path);
十一、[FAQ17442][Recovery][Common]Android L和M 版本data加密后升級包放入/data分區如何升級?
[DESCRIPTION]
Android L和M 版本,data加密后,開啟MTK_SHARED_SDCARD并把升級包放入內卡;或者有需要把升級包放入/data分區來升級, 一般這種情況,直接按鍵進入recovery mode,選擇apply from sdcard來實現升級,是行不通的,建議在驗證升級時,使用adb 命令的方式升級。
[SOLUTION]
L版本的步驟如下:
1、在normal mode先把升級包(update.zip) push 到data分區目,比如/data/update.zip.
2、adb shell 下執行:echo "--update_package=@/cache/recovery/block.map" > /cache/recovery/command
4、adb shell 下執行:system/bin/uncrypt
M版本的步驟如下:
1、在normal mode先把升級包(update.zip) push 到data分區目,比如/data/update.zip.
2、adb shell 下執行:system/bin/uncrypt /data/update.zip /cache/recovery/block.map
注意:要等待一段時間,直到命令執行退出…,然后在執行如下命令;
3、adb shell 下執行:echo "--update_package=@/cache/recovery/block.map" > /cache/recovery/command
4、adb reboot recovery
十二、[FAQ12491][Recovery mode][Common] 選擇"apply update from sdcard"直接進入data/目錄是否正常?
[DESCRIPTION]
Recovery mode 選擇"apply update from sdcard"直接進入data/目錄,說明您開了MTK_SHARED_SDCARD宏;請檢查下貴司project下的projectconfig.mk文件,謝謝!
至于開了share sd功能后的升級方案:請參考:
ID: FAQ12477
關于打開MTK_SHARED_SDCARD宏后MTK目前升級方案
KK 版本默認是支持在打開MTK_SHARED_SDCARD宏后從內卡升級,即從/data/media/下面選取升級包升級;但這種情況有些Limitation;詳情見FAQ12477。
[SOLUTION]
這種現象是正常的! 謝謝!
十三、[FAQ14769]L版本OTA升級遇到error:"system has been remounted R/W; reflash device to reenable OTA updates"
[DESCRIPTION]
L版本;如果有在bootable/recovery/目錄下code中添加ensure_path_mounted(“/system”);
或者是在recovery mode下執行root integrity check之后,導致OTA升級失敗,而且last_log中有如下error:
script aborted: system has been remounted R/W; reflash device to reenable OTA updates
system has been remounted R/W; reflash device to reenable OTA updates
[SOLUTION]
可以嘗試在 /bootable/recovery/roots.cpp中作如下修改:(藍色為添加部分)
int ensure_path_mounted(const char* path) {
} else if (strcmp(v->fs_type, "ext4") == 0 ||
strcmp(v->fs_type, "vfat") == 0) {
if (strcmp(v->mount_point, "/system") == 0)//add
result = mount(v->device, v->mount_point, v->fs_type,MS_NOATIME | MS_NODEV | MS_NODIRATIME | MS_RDONLY, "");//add
else //add
result = mount(v->device, v->mount_point, v->fs_type,
MS_NOATIME | MS_NODEV | MS_NODIRATIME, "");
十四、[FAQ11954]如何實現恢復出廠后不重新啟動手機?
[DESCRIPTION]
實現恢復出廠后不重新啟動手機
[SOLUTION]
請在/bootable/recovery/recovery.cpp文件如下處修改:
// Otherwise, get ready to boot the main system...
finish_recovery(send_intent);
return;//添加這一句,直接return
ui->Print("Rebooting...\n");
android_reboot(ANDROID_RB_RESTART, 0, 0);
return EXIT_SUCCESS;
}
十五、[FAQ03439][Recovery]如何進入recovery mode立即顯示menu菜單
請將alps/bootable/recovery/ui.c文件中的static int show_text = 0;
修改為static int show_text = 1;
十六、[FAQ04813]update.zip包中各個文件的含義
將全量升級包update.zip包解壓后里面的各個文件的含義如下:
boot.img:(boot.img=kernel+ramdisk)
system:(升級后會放在系統的system分區。主要用來更新系統的一些應用或則應用會用到的一些庫) recovery/recovery-from-boot.p:(是boot.img和recovery.img的補丁) recovery/etc/install-recovery.sh:(install-recovery.sh是更新腳本)
META-INF/CERT.RSA:(簽名文件相關,保存公匙和加密算法)
META-INF/CERT.SF:(簽名文件相關,保存私匙,CERT代表簽名者)
META-INF/MAINFEST.MF:(這個manifest文件定義了與包的組成結構相關的數據) com/google/android/update-binary:(一個腳本解釋器,能夠識別updater-script中描述的操作) com/google/android/updater-script:(腳本文件,具體描述了更新過程) com/google/android/metadata:(描述設備信息及環境變量的元數據)
十七、[FAQ17418][Recovery][Build] 預置資源(如apk)到userdata,otapackage之后的userdata.img沒有此資源
[Background]
隨著FLASH空間的使用率被廣泛專注,MTK_SHARED_SDCARD的使用逐漸成為主流。
MTK_SHARED_SDCARD enable的前提下,phone storage和internal storage共享userdata分區,其中phone storage的目錄變成了/data/media。
MTK_SHARED_SDCARD enable時的內置資源預置方式,可以參見FAQ:
[FAQ14735]【sdcard-FAT filesystem】MTK_SHARED_SDCARD打開時L上如何預置資源
[Issue]
按照FAQ14735預置資源以后,new之后的userdata.img是包含新內置資源,此時再執行otapackage,out目錄下的userdata.img并不包含此資源。
[Solution]
經分析,主要原因如下所示:
/build/core/Makefile 中otapackage的主要flow --
otapackage: $(INTERNAL_OTA_PACKAGE_TARGET)
-> $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS)
-> $(BUILT_TARGET_FILES_PACKAGE)
$(hide) ./build/tools/releasetools/add_img_to_target_files -p $(HOST_OUT) $@
$(hide) ./build/tools/releasetools/replace_img_from_target_files.py $@ $(PRODUCT_OUT)
Add_img_to_target_files對各個image的處理 --
/build/tools/releasetools/add_img_to_target_files
main
-> AddImagesToTargetFiles(args[0])
-> AddSystem(output_zip, recovery_img=recovery_image, boot_img=boot_image)
-> AddUserdata(output_zip)
-> AddCache(output_zip)
上面flow的目的是以out/obj/的中間包(cota包)為source重新生成image,放入中間包。
def AddUserdata(output_zip, prefix="IMAGES/"):
"""Create an empty userdata image and store it in output_zip."""
其中, AddUserdata與其他接口的實現不同,主要是生成一個空的目錄,google要求otapackage release出去的dataimage是空的(升級本身也是不包含userdata的)。
-> $(hide) ./build/tools/releasetools/replace_img_from_target_files.py $@ $(PRODUCT_OUT)
這段的目的是從中間包將image copy出來替換out目錄。
所以,otapackage最終out/obj目錄下的/DATA目錄是有apk的,但是最后生成的out目錄和中間包里的userdata.img都是空的。
如果一定要預置apk,可以嘗試將new后的userdata.img保留下來。Otapackage之后,再用new后的userdata.img替換out目錄下的userdata.img。
或是直接修改/build/tools/releasetools/replace_img_from_target_files.py
將
if img.find(".img") != -1:
修改為
if img.find(".img") != -1 and img.find("userdata") == -1 :
十八、[FAQ03434][Recovery]恢復出廠設置之后如何將時間變為初始值
Recovery.c (bootable\recovery):
#include <linux/rtc.h>
#include <sys/ioctl.h>
void set_rtc(void) {
struct tm tm;
int fd;
tm.tm_sec = 0;
tm.tm_min = 0;
tm.tm_hour = 0;
tm.tm_mday = 1;
tm.tm_mon = 0;
tm.tm_year = 2012-1900;
fd = open("/dev/rtc0", O_WRONLY);
if (fd != -1) {
ioctl(fd, RTC_SET_TIME, &tm);
close(fd);
}
}
int
main(int argc, char **argv) {
...
中的
} else if (wipe_data) {
....
//
/*該else if代碼最后 新增代碼如下*/
set_rtc();
}
十九、[FAQ14751]L 版本Security OTA升級方法
[DESCRIPTION]
L版本Security OTA升級方法;
[SOLUTION]
首先:修改build/core/makefile如下:(藍色為添加項)
# host tools needed to build dist and OTA packages
SECURITY_SIG_TOOL := vendor/mediatek/proprietary/scripts/sign-image/sign_image.sh
SIGN_TOOL := vendor/mediatek/proprietary/scripts/sign-image/SignTool.pl
FWUPGRADEPACKAGE_SH := ./build/core/FWUpgradePackage.sh
DISTTOOLS := $(HOST_OUT_EXECUTABLES)/minigzip \
endif
ifeq ($(strip $(MTK_SECURITY_SW_SUPPORT)), yes)
#security boot signature
$(hide) cp -ru $(zip_root)/SYSTEM/* $(SYSTEMIMAGE_SOURCE_DIR)
$(hide) $(SHELL) $(SECURITY_SIG_TOOL)
$(hide) cp $(PRODUCT_OUT)/sig/boot.sig $(zip_root)/META/
$(hide) cp $(PRODUCT_OUT)/sig/recovery.sig $(zip_root)/META/
$(hide) cp $(PRODUCT_OUT)/sig/recovery.sig $(zip_root)/SYSTEM/etc/
$(hide) cp $(SYSTEMIMAGE_SOURCE_DIR)/etc/firmware/S_ANDRO_SFL.ini $(zip_root)/SYSTEM/etc/firmware/
endif
@# Zip everything up, preserving symlinks
$(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .)
$(hide) (cd $(zip_root) && zip -q ../$(notdir $@) META/*filesystem_config.txt)
$(hide) ./build/tools/releasetools/add_img_to_target_files -p $(HOST_OUT) $@
$(hide) ./build/tools/releasetools/replace_img_from_target_files.py $@ $(PRODUCT_OUT)
ifeq ($(strip $(MTK_SECURITY_SW_SUPPORT)), yes)
$(hide) perl $(SIGN_TOOL) $(MTK_BASE_PROJECT) $(MTK_PROJECT_NAME) $(MTK_PATH_CUSTOM) $(MTK_SEC_SECRO_AC_SUPPORT) $(MTK_NAND_PAGE_SIZE) $(PRODUCT_OUT) $(OUT_DIR) $(DEAL_STDOUT_SIGN_IMAGE)
注意:最后一行添加的綠色部分,是由文件vendor/mediate/proprietary/scripts/sign-image/Android.mk 的最后一行copy而來,具體以貴司實際文件內容為準。
然后:build diff OTA升級的步驟如下:
1、new整個project。
2、Step1: ./vendor/mediatek/proprietary/scripts/sign-modem/sign_modem.sh
Step2: ./vendor/mediatek/proprietary/scripts/sign-image/sign_image.sh
3、make otapackage
4、產生差分包: MTK_SECURITY_SW_SUPPORT=yes ./build/tools/releasetools/ota_from_target_files --block -k <key_path> -i old.zip new.zip update.zip
build full OTA升級的步驟如下:
1、new整個project。
2、Step1: ./vendor/mediatek/proprietary/scripts/sign-modem/sign_modem.sh
Step2: ./vendor/mediatek/proprietary/scripts/sign-image/sign_image.sh
3、make otapackage
二十、[FAQ05739]SD或者OTA升級secutiry device和non-security device的區別!
問題現象: 同樣的升級包在升級non-security device可以升級成功,升級secutiry device確不能升級成功!
原因說明:SD在升級non-security device和security device的區別是:在升級security device時,SUPPORT_SBOOT_UPDATE這個宏會打開!然后升級security device時會去檢查升級包中的SEC_VER.txt這個文件,并且檢查SEC_VER.txt這個文件里的CUSTOM_NAME,BOOTIMG,RECOVERY,ANDROID四項,并且要求BOOTIMG,RECOVERY,ANDROID這三項的值要比手機里面這三項的值要相等或者大于手機版本里的值!否則會升級失敗!
下面舉一個例子來說明,假如bootimg第一版是version 1
1. 空機先燒錄進bootimg,則device里面的記錄是version 1 2. 假如發現bootimg有security bug,重新編出一版 version
2;接著燒錄,device里面就變成記錄的是version 2
3. 假如發現bootimg有security bug,重新編出一版 version 3;接著燒錄,device里面就變成記錄的是version 3
4. (此時,如果要燒錄回去verison 1或version 2,都是不允許的動作)
5. 假如這個時候USER透過OTA去升級,而OTA package記錄的BOOTIMG版本號是4,那就允許更新;如果是2或3,都不允許更新
二十一、[FAQ03128]Android系統中的6種模式
[DESCRIPTION]
Android系統中的6種模式
[SOLUTION]
1:一般啟動模式(normal mode):
功能是正常啟動手機,方法為關機狀態下按電源鍵啟動。
2:安全模式(safe mode):
此模式和正常啟動一樣,但沒有登記Google,所以不能訪問Market或使用你的Google賬號。操作方法為按住“menu”鍵,按電源鍵啟動手機,直至手機啟動完成松開“menu”鍵。
3:恢復模式(recovery mode)
可打開命令解釋程序(shell),刷新映像文件(flash image),執行備份等。當然這一切取決于你手機上的recovery image版本。使用方法很簡單,就是home鍵和電源鍵一起按。
4:引導模式(bootloader mode)
功能是從SD卡上安裝新的系統映像(DREAIMG.NBH),只需再按一次電源鍵。值得一提的事為Android手機獲取root權限,就是使用這個模式。操作方法為照相鍵和電源鍵一起按。
5:fastboot模式
主要是在電腦上使用fastboot命令來刷新映像文件。使用方法為按住返回鍵,按電源鍵啟動手機,直至屏幕出現FASTBOOT字樣后松開返回鍵。
6:診斷模式(diagnostic mode)
是為了測試手機各項功能的模式,刻意通過軌跡球中心鍵和電源鍵打開。
二十二、[FAQ18202][Recovery][Common]Android L ->M版本OTA/T卡升級注意事項
[DESCRIPTION]
Android L -> M 升級,除了前后版本partition 數目,大小,順序需一致的升級基本規則外,
相對于升級到L版本的不同,需額外注意的的地方如下
[SOLUTION]
1.升級包制作命令 添加 –s device/mediate/build/releasetools/mt_ota_from_target_files
? Full : ./build/tools/releasetools/ota_from_target_files –v --block -k $(key_path) –s device/mediatek/build/releasetools/mt_ota_from_target_files src.zip update.zip
? Incremental : ./build/tools/releasetools/ota_from_target_files –v --block -k $(key_path) –s device/mediatek/build/releasetools/mt_ota_from_target_files –i src.zip tgt.zip update.zip
2.建議使用block-base升級(加--block參數),如使用file-base升級(不加--block參數)
請關閉M 版本dm-verity ,否則升級后無法正常開機
關閉dm-verity方法,將fastab里
/dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/system /system __MTK_SYSIMG_FSTYPE ro wait,verify
修改為(去掉verity參數)
/dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/system /system __MTK_SYSIMG_FSTYPE ro wait
3.如何升級preloader 與LK 與其它raw 分區
preloader , lk :
請參考 FAQ17441 [Recovery][Common]Android M 版本如何升級lk 、preloader ?
其他raw分區,如logo.. :
請參考 FAQ18188 [Recovery][Common]Android M 版本如何升級logo等rawdata分區方法?
4. L版本 請配置MTK_SHARED_SDCARD=yes ,MTK_2SDCARD_SWAP=no,否則升級至M版本用戶數據丟失
因為MTK_2SDCARD_SWAP在M版本已經phase out 不支持,
若已出貨L版本已開啟MTK_2SDCARD_SWAP=yes需升級至M版本,請在M版本下載patch id: ALPS02551082
5.差分包編譯失敗
如差分包制作diff過程如下時異常退出而無法生成,
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 574, in diff_worker
patch = compute_patch(src, tgt, imgdiff=(xf.style == "imgdiff"))
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 60, in compute_patch
raise ValueError("diff failed: " + str(p))
ValueError: diff failed: 1
或
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 273, in Compute
self.ComputePatches(prefix)
File "/home/scm03/5023F_MEA_AL_V1.4_20160511/build/tools/releasetools/blockimgdiff.py", line 594, in ComputePatches
for patch, xf in patches:
TypeError: 'NoneType' object is not iterable
請抓patch id: ALPS02608209后驗證,
或直接修改\bootable\recovery\applypatch\imgdiff.c
char ptemp[] = "/tmp/imgdiff-patch-XXXXXX";
- mkstemp(ptemp);
+ int fd = mkstemp(ptemp);
+
+ if (fd == -1) {
+ printf("MakePatch failed to create a temporary file: %s\n",
+ strerror(errno));
+ return NULL;
+ }
+ close(fd); // temporary file is created and we don't need its file
+ // descriptor
若仍無法制作請提交e-service
6./data加密后升級包如何由內卡或放置/data分區下升級
請參考 FAQ17442 [Recovery][Common]Android M 版本data加密后升級包放入/data分區如何升級?
如uncrypt出現權限失敗問題請抓patch id: ALPS02625151
7.升級后modem能否正常工作?
請參考 FAQ17640 [NVRAM]檢查兩個不同modem版本的modem nvram是否可以采用OTA升級
8.其他:
可參考DMS文檔 OTA and Android SD upgrade application note.docx
From:http://www.cfanz.cn/index.php?c=article&a=read&id=305804
總結
- 上一篇: TJA1050T CAN总线通信硬件原理
- 下一篇: 上班消磨时光的看txt小说神器,很好用