2022年11月15日 星期二

2022年11月2日 星期三

[Android] OTA image只更新bootloader

轉貼本網站文章請註明出處 from Awaysu
https://awaysu-programming.blogspot.com 


一般更新軟體方式有以下二種:
1. 透過Bootloader更新:
    通常為晶片廠商給予的更新方式,透過此方式安全機制被關閉沒有限制.

2. 透過OTA更新
    為預設android更新方式,更新前會先檢查必須是相同的fingerprint和sign key才能做更新.


通常已出貨的產品已帶有客戶軟體,並且會把bootloader更新的功能關掉,但是如產品要做RAM時候,會需要更新回工廠測試用的軟體,這時候就必須有一個OTA image是把Bootloader更新開啟的版本,更新後就可以使用Bootloader方式更新.做成OTA image的話其實不需要也更新system和vendor等parition,所以下敘為OTA image只更新bootloader方法. 因Android有recovery mode和A/B system二種方式,下面依據不同方式來做修改:

1. Recovery mode:

diff -Naur a/build/make/tools/releasetools/common.py b/build/make/tools/releasetools/common.py
--- a/build/make/tools/releasetools/common.py   2020-05-26 15:14:31.486036205 +0800
+++ b/build/make/tools/releasetools/common.py   2020-05-26 15:18:31.344028332 +0800
@@ -1579,17 +1579,18 @@
     return self._required_cache

   def WriteScript(self, script, output_zip, progress=None):
-    if not self.src:
+    script.Print("Cancel WriteScript")
+#    if not self.src:
       # write the output unconditionally
-      script.Print("Patching %s image unconditionally..." % (self.partition,))
-    else:
-      script.Print("Patching %s image after verification." % (self.partition,))
-
-    if progress:
-      script.ShowProgress(progress, 0)
-    self._WriteUpdate(script, output_zip)
-    if OPTIONS.verify:
-      self._WritePostInstallVerifyScript(script)
+#      script.Print("Patching %s image unconditionally..." % (self.partition,))
+#    else:
+#      script.Print("Patching %s image after verification." % (self.partition,))
+#
+#    if progress:
+#      script.ShowProgress(progress, 0)
+#    self._WriteUpdate(script, output_zip)
+#    if OPTIONS.verify:
+#      self._WritePostInstallVerifyScript(script)

   def WriteStrictVerifyScript(self, script):
     """Verify all the blocks in the care_map, including clobbered blocks.
diff -Naur a/build/make/tools/releasetools/ota_from_target_files.py b/build/make/tools/releasetools/ota_from_target_files.py
--- a/build/make/tools/releasetools/ota_from_target_files.py    2020-05-26 15:14:24.790092278 +0800
+++ b/build/make/tools/releasetools/ota_from_target_files.py    2020-05-26 15:18:51.279861498 +0800
@@ -846,11 +846,11 @@

   AddCompatibilityArchiveIfTrebleEnabled(input_zip, output_zip, target_info)

-  common.CheckSize(boot_img.data, "boot.img", target_info)
-  common.ZipWriteStr(output_zip, "boot.img", boot_img.data)
+#  common.CheckSize(boot_img.data, "boot.img", target_info)
+#  common.ZipWriteStr(output_zip, "boot.img", boot_img.data)

-  script.ShowProgress(0.05, 5)
-  script.WriteRawImage("/boot", "boot.img")
+#  script.ShowProgress(0.05, 5)
+#  script.WriteRawImage("/boot", "boot.img")

   script.ShowProgress(0.2, 10)
   device_specific.FullOTA_InstallEnd()


2. A/B system mode
--- a/gtv/device/mediatek-stb/common/BoardConfigCommon.mk    2022-10-31 09:06:38.100755542 +0800
+++ b/gtv/device/mediatek-stb/common/BoardConfigCommon.mk    2022-10-31 13:36:00.723097043 +0800
@@ -86,14 +86,14 @@
 BOARD_USES_RECOVERY_AS_BOOT   := $(BOARD_AB_UPDATE_ENABLE)
 ifeq ($(BOARD_AB_UPDATE_ENABLE), true)
 AB_OTA_UPDATER := true
-AB_OTA_PARTITIONS := \
-    vbmeta \
-    boot \
-    system \
-    vendor \
-    dtbo \
-    tvconfig \
-    tvservice
+#AB_OTA_PARTITIONS := \
+#    vbmeta \
+#    boot \
+#    system \
+#    vendor \
+#    dtbo \
+#    tvconfig \
+#    tvservice
 
 endif

--- a/gtv/system/update_engine/scripts/brillo_update_payload      2022-10-31 09:10:11.925108379 +0800
+++ b/gtv/system/update_engine/scripts/brillo_update_payload      2022-10-31 13:36:14.091350529 +0800
@@ -646,17 +646,17 @@
     GENERATOR_ARGS+=( --max_timestamp="${FLAGS_max_timestamp}" )
   fi

-  if [[ -n "${POSTINSTALL_CONFIG_FILE}" ]]; then
-    GENERATOR_ARGS+=(
-      --new_postinstall_config_file="${POSTINSTALL_CONFIG_FILE}"
-    )
-  fi
+ # if [[ -n "${POSTINSTALL_CONFIG_FILE}" ]]; then
+ #   GENERATOR_ARGS+=(
+ #     --new_postinstall_config_file="${POSTINSTALL_CONFIG_FILE}"
+ #   )
+ # fi

-  if [[ -n "{DYNAMIC_PARTITION_INFO_FILE}" ]]; then
-    GENERATOR_ARGS+=(
-      --dynamic_partition_info_file="${DYNAMIC_PARTITION_INFO_FILE}"
-    )
-  fi
+ #if [[ -n "{DYNAMIC_PARTITION_INFO_FILE}" ]]; then
+ #   GENERATOR_ARGS+=(
+ #     --dynamic_partition_info_file="${DYNAMIC_PARTITION_INFO_FILE}"
+ #   )
+ # fi

   echo "Running delta_generator with args: ${GENERATOR_ARGS[@]}"
   "${GENERATOR}" "${GENERATOR_ARGS[@]}" 


另外可以在device/{chip name}/下搜尋*.py檔案,這邊晶片廠商也可能會對OTA步驟做一些修改.


2022年9月25日 星期日

[STB] 杜比認證 Dolby Certification

 轉貼本網站文章請註明出處 from Awaysu
https://awaysu-programming.blogspot.com


1. 甚麼是杜比
影片聲音未壓縮為PCM格式,杜比將原始影片多個聲道PCM聲音壓縮編碼合成,再次播放時還原成原本聲道. 認證為確定該產品在播放各類杜比聲音能正常撥放.

2. 杜比英文簡寫
    1) Dolby Digital: 支援最高5.1聲道,英文簡寫DD或AC3
    2) Dolby Digital Plus: 支援最高5.1聲道,英文簡寫DDP或AC3+
    3) MS11/12: 多年前有做過MS11,測項會多AAC(DP)部分,印象是整合AAC進來

3. 在STB上的杜比模式選擇
    1) PCM : 指STB的HDMI或是SPDIF輸出是PCM,如果影片聲音是杜比,STB需要解碼成PCM.
    2) Pass-Through : STB對影片聲音不做任何動作直接輸出至HDMI或是SPDIF
    3) Auto (Bit-Stream) : 會透過EDID偵測TV或是擴大機最高支援的音源模式來做動作甚至重新  編碼. 例如電腦螢幕只支援PCM,STB就會只輸出PCM.如果是擴大器有支援杜比就會輸出杜比. 杜比認證預設須設定成該模式,確保不管接上甚麼設備都能輸出聲音.

3. 送測步驟
1) 下載NPL並填寫
    申請杜比透過該表格申請,在Dolby Technology Code一欄點選會跑出所有認證種類,例如幾聲道的DD或是DDP. 如果客戶沒有特別需求一般選2 Ch DD + DDP consumer decoder (2A32D+)就夠了. 上傳完可以從NPL Form確認有無問題.
2) Pre-Test & Generate Test Report
    Pretest前先下載測試影片和工具Download Development Kit,裡面有很多種類,請先確認DUT為何種去下載. 例如: 下載Test Materials和MP4 Test Files,DUT有tuner功能還需下載Test Signals DVB MPEG-2.
3) 上傳NPL至www.dolbycustomer.com
4) mail相關文件
    *User Manual文件裡Dolby logo或產品上的Dolby logo照片
    *Audio/System Block Diagram
    *教學文件,包含如何撥放影片和如何更新DUT軟體
    *sample寄回給你的RRCF和RTM表單
5) 等候結果 (2~4週)

4. 測試儀器
    杜比需要Audio Precision APx音頻分析儀測試,當然也需要擴大機和喇叭. 儀器軟體有類似script的功能 (Dolby Project Controller),方便長時間多檔案測試.

5. 自我驗證
    如果沒有產品送過認證,還必須寄送sample到實驗室,實驗室會測試確認和你的Pre-Test報告是否符合. 在幾次認證後可以和杜比確認是否以後還要寄送sample,如果不需要以後自我驗證Pre-Test後寄送報告就可以.

6. 費用
    認證不需要費用,將從出貨每台抽取費用.

7. 當時送測被要求的項目
    1) 要有PCM/Auto/Pass-Through可以選擇
    2) DRC預設RF mode
    3) Stereo預設Surround (LtRt) mode
    4) 要可以設定音量
    5) 確認EDID功能正常
    6) 預設必須視Auto (Bit-Stream)並確認功能正常


註釋:
SET : Set top box 機上盒
DUT : Device under test 待測物






2022年7月3日 星期日

[Android] Android TV開發流程簡敘 (5) - 關於GOTA

轉貼本網站文章請註明出處 from Awaysu
https://awaysu-programming.blogspot.com


Google Over-the-Air (GOTA) 是一套Android更新使用的系統網站,點進後可以看見主要以下大項:

1) Deployment(部署) : 
需先在APFE設定,並決定為test,dev或是release種類 (注1)。主要是從fingerprint裡的key名稱去判斷。在Release種類的fingerprint須通過Android TV認證才可以把該OTA image上傳到GOTA.

2) Assignments (任務) : 
這裡需去設定某組Device Group對應某組OTA Configuration。預設中則是有一組PRODUCTION,沒有設定Device Group的其他裝置都會被判定為這組。

3) Device Group (裝置群組) : 
需加入serial number到Device Group,你可以有很多Device Group。

4) OTA Configuration (OTA設置) : 
設定OTA Configuration之前你必須先上傳OTA image,OTA Configuration可以去設定哪一版更新到哪一版,或是full/incremental等 (注2)。

請注意出貨大量的產品甚至sample如果想之後透過GOTA更新,務必使用同個種類
如果你DUT裡面是test key是無法透過GOTA變更為release key的image
這個到客戶那一個一個用隨身碟更新成release key的經驗談

注1:
透過ota_from_target_files指令可以將dev key轉換成release key
請參考https://source.android.com/devices/tech/ota/tools

注2:
incremental OTA image是和上一target file相比之後產生出來變化的image
適用於二個版本變化很小的更新
一樣也是透過ota_from_target_files
請參考https://source.android.com/devices/tech/ota/tools


2022年6月23日 星期四

[Android] Android TV開發流程簡敘 (4) - 送測3PL

 轉貼本網站文章請註明出處 from Awaysu
https://awaysu-programming.blogspot.com

1. 提供Project Tracker link


2. 3PL提供的WelcomeEmail_ATV.xlsx要填寫回覆

3. 確認3PL提供的ATV_Application_information.xlsx裡的項目,確認以下property內容格式正確
  ro.build.version.security_patch
  ro.com.google.gmsversion
  ro.product.first_api_level
  ro.com.google.clientidbase
  ro.build.version.incremental
  ro.oem.key1

4. 提供上一版approved的fingerprint

5. 提供user-debug & user build的OTA image,並提供如何更新文件

6. xTS Procedure
如果xTS有特別手法的測試方式,可以寫一份文件告知,避免信件來來回回
有些項目測試手法會影響結果,例如有些需要透過VPN,甚至IPV6要關掉才能PASS。

7. All xTS pretest report link
請上傳到Google drive並按照3PL規定取名和放置

8. Waiver的文件或mail和WaiverID

9. 提供BTS 上傳到Google drive的url

10. 提供遙控器的設計文件 (需要求廠商提供)

11. 提供產品的User Manual (需要求客戶提供)


一般沒意外3PL應該1~2周測試
測試完上傳報告至APFE等候1~2周Google給approved

[Android] Android TV開發流程簡敘 (3) - xTS測試項目

轉貼本網站文章請註明出處 from Awaysu
https://awaysu-programming.blogspot.com


Android TV Certification主要為下面測試項目:

1. CTS (Compatibility Test Suite)
自動測試測試,檢查Android實現的各個元素之間的兼容性,確保與Google定義的函式行為一致。

2. GTS (Google Mobile Services Test Suite)
自動測試測試,驗證GTVS跑起來沒有問題。

3. VTS (Vendor Test Suite)
自動測試測試,確保硬體相關的函式與Google定義行為一致。

4. STS (Security Test Suite)
自動測試測試,驗證是否已正確應用並修復相應的安全漏洞補丁。

5. BTS (Build Test Suite)
自動測試測試,上傳映像檔至APFE檢查是否有惡意軟件和其他潛在有害應用程序。

6. TVTS
自動測試測試,通過運行一系列特定於電視的性能測試來衡量 Android TV 設備的性能。

7. GSI (Generic System Image)
自動測試測試,通用系統映像的兼容性測試套件測試

8. CTS Verifier
一份test plan excel檔案,CTS驗證的手動測試。

9. Somke test
一份test plan excel檔案,提供的各種手動測試,以及與CTS和其他自動化測試套件一起使用。

10. Youtube test
一份test plan excel檔案,YouTube手動測試,驗證對YouTube影片格式播放是否正常。


流程是你需要先自己pretest過,確認無誤後將所需資料交給3PL來幫忙驗證。自己pretest過的報告不要自己上傳到APFE,3PL會上傳他們測試完的report。如果有failed需要waiver,3PL會提供你一個文件敘述,完成後他們會幫你上傳到Google issue tracker,此ticket ID就是waiver ID,到時候可以填在APFE裡的報告中,目前要waiver變的嚴苛Goole要求one patch one waiver。