2025/6/28

apksigner 在
./out/host/linux-x86/bin/apksigner 
platform.pk8 在
./build/make/target/product/security/platform.pk8
./build/make/target/product/security/platform.x509.pem
AOSP 中 OTA 相關的 generate key 說明:Sign build for release

2025/6/22

原來有一些遣在的 rule.
packages/app/app-name 這個 app-name 要跟 Android.bp 的

2025/6/19

Cuttlefish Android Emulator

ref: 原來在 aosp 中的 emulator (goldfish) 在run aosp android14 的時候, qemu x86 kernel 一邊沒 lz4,一邊 ramfs 好像不一樣。
然後 aosp source project site 說明 竟然都寫 cuttlefish 了。

cuttlefish 已經是獨立的 project,clone 下來後,build 成 deb,需要 libtinfo5,所以ubuntu24.04 用 libtinfo6 會 build fail。
只好download libtinfo5 的 deb 下來 install,才能 build 成功。
tools/buildutils/build_packages.sh

build 完會有這麼多 deb..
  • cuttlefish-orchestration_1.13.0_amd64.deb : 在 google 的 雲端server 用的(?)
  • cuttlefish-base_1.13.0_amd64.deb : 這個就是 emulator 的 deb
  • cuttlefish-integration_1.13.0_amd64.deb : 跟google 雲端上的 emulator溝通用的一些tool
  • base/ cuttlefish-common-build-deps_1.13.0_amd64.deb :
  • cuttlefish-user_1.13.0_amd64.deb : web server 版的 emulator,會run 成一個 web server,用 browser 來操作
  • /frontend/cuttlefish-frontend-build-deps_1.13.0_all.deb :
  • cuttlefish-common_1.13.0_amd64.deb : [DEPRECATED]
所以把 base 和 user 安裝(用 apt),之後,會產生 幾個 group,要把自己加進去:
sudo usermod -aG kvm,cvdnetwork,render $USER
然後因為會產生 /dev/ 下的node,所以要 reboot.

準備 system image,從 aosp build, target 是 aosp_cf_x86_64_phone-trunk-userdebug
build 完aosp source code,就會有 launch_avd 這個 command.
follow google 說明直接 launch 的話,會有 Error:
launch_avd
....
ailed to connect:No such device
[2025-06-19T10:09:00.523729147+00:00 ERROR crosvm] exiting with error 1: the architecture failed to build the vm

Caused by:
    failed to create a PCI root hub: failed to create proxy device: Failed to configure tube: failed to receive packet: Connection reset by peer (os error 104)
Detected unexpected exit of monitored subprocess /home/charles-chang/aosp/out/host/linux-x86/bin/process_restarter
Subprocess /home/charles-chang/aosp/out/host/linux-x86/bin/process_restarter (16314) has exited with exit code 1
Failed to connect:No such device
Client closed the connection
Client closed the connection
Client closed the connection
[2025-06-19T10:09:01.549915546+00:00 ERROR crosvm] exiting with error 1: the architecture failed to build the vm

Caused by:
    failed to create a PCI root hub: failed to create proxy device: Failed to configure tube: failed to receive packet: Connection reset by peer (os error 104)
....
不知道是什麼原因,但是加上 gpumode 之後就可以開起來..
launch_cvd --gpu_mode=gfxstream
...
VIRTUAL_DEVICE_BOOT_STARTED
VIRTUAL_DEVICE_NETWORK_MOBILE_CONNECTED
VIRTUAL_DEVICE_BOOT_COMPLETED
Virtual device booted successfully
依照 google cuttlefish 的說明,這樣啟動的 emulator 是沒有螢幕的,所以用 adb 可以連線。
開啟 webserver 的話,加上 --daemon
launch_cvd --gpu_mode=gfxstream --daemon
...
Virtual device booted successfully
VIRTUAL_DEVICE_BOOT_COMPLETED
這樣會跑在background,用 browser 開啟 http://localhost:8443 就會看到 cvd-1
按下 "connect" 就會出現android 手機畫面..
google 建議用 webrtc,效果會更好。
launch_cvd --gpu_mode=gfxstream -start_webrtc --daemon
停止要用 cvd reset 或 stop_cvd

cuttlefish 使用 virtual network,所以沒版法直接 listen public IP。
如果其他機器要連線,要用 ssh-tunnel:
  • 在 remote mynb 啟動 cuttlefish -start_webrtc
  • 在 local pc 設定 ssl tunnel : ssh -L 50000:localhost:8443 myname@mynb
  • local pc 的 browser 開啟 localhost:50000


cuttlefish 啟動過就會在 $HOME 之下create 一個 cuttlefish 目錄,其中
  • assembly : 設定檔
  • environment : 會有folder env-1,裡面是上次run 的環境變數
  • instance : 會有 folder cvd-1 (emulator id),上次的instance 紀錄
然後在 $HOME 下,會有cuttlefish_XXX link 到 cuttlefish 下的folder/file。
所以一旦emulator 出問題,關掉下次再開也是出問題,用 cvd reset 也無效,就要手動刪掉那些 cvd-1 目錄。

所以在 ~/cuttlefish/instance/cvd-1/ 裡:
  • kernel.log : 就是 kernel message
  • console : 就是 emulator 的 console,會是 link 到 /dev/pty/X,可以用 screen 來開



emulator 是否run 的起來,竟然和host和 android image 有關,使用 Adnroid-14 AOSP build 出來的 aosp_cf image,在有些pc 上可以 run,有些不行,有些要加 --gpu_mode,有些不能加。
而且 run 起來後,app 啟動計次顯示就會發生問題,系統反應也變慢。
但是使用 -b android-latest-release 的image則幾乎所有機器都沒問題,而且只需要加 --start_webrtc 就可以,不用管 --gpu_mode,cuttlefish 會自己偵測。

2025/6/15

Build image from AOSP and run on emulator

ref:
想要build aosp 在 emulator 跑,測試 user build 和 userdebug build 的差異。
然後..
先 clone source..
mkdir aosp && cd aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r75 --depth=1
repo sync -c --no-tags --no-clone-bundle -j3
超過 3 就會有 resource limiit error,其實最後還是用1。
中途出現一些 checkout error,把整個source code 刪除,留下 .repo 目錄,再 sync 一次就 OK

然後做 lunch,這個有點問題
source buile/envsetup.sh
lunch
出現一堆,但是都沒有類似說明的 x86_64,ref:how do I build android emulator from source 的說明。
有些 lunch target 本來就不會show,所以試試看
lunch sdk_phone64_x86_64-trunk_staging-user
竟然 OK 了。-- 嘗試 userdebug, eng 也都 OK
把 printconfig列出來確認:
============================================
PLATFORM_VERSION_CODENAME=VanillaIceCream
PLATFORM_VERSION=VanillaIceCream
PRODUCT_INCLUDE_TAGS=com.android.mainline mainline_module_prebuilt_nightly
TARGET_PRODUCT=sdk_phone64_x86_64
TARGET_BUILD_VARIANT=user
TARGET_ARCH=x86_64
TARGET_ARCH_VARIANT=x86_64
TARGET_2ND_ARCH_VARIANT=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-6.8.0-60-generic-x86_64-Ubuntu-24.04.2-LTS
HOST_CROSS_OS=windows
BUILD_ID=AP2A.240805.005.S4
OUT_DIR=out
============================================
如果依照 ref 的說明
lunch aosp_cf_x86_64_only_phone-aosp_current-userdebug
...
build/make/core/release_config.mk:145: error: No release config found for TARGET_RELEASE: aosp_current. Available releases are: ap2a next staging trunk trunk_food trunk_staging.
依照error 說明把 aosp_current 改掉
lunch aosp_cf_x86_64_only_phone-trunk-user
就可以了 (順便測試 user build 也 OK)
============================================
PLATFORM_VERSION_CODENAME=VanillaIceCream
PLATFORM_VERSION=VanillaIceCream
PRODUCT_INCLUDE_TAGS=com.android.mainline mainline_module_prebuilt_nightly
TARGET_PRODUCT=aosp_cf_x86_64_only_phone
TARGET_BUILD_VARIANT=user
TARGET_ARCH=x86_64
TARGET_ARCH_VARIANT=silvermont
HOST_OS=linux
HOST_OS_EXTRA=Linux-6.8.0-60-generic-x86_64-Ubuntu-24.04.2-LTS
HOST_CROSS_OS=windows
BUILD_ID=AP2A.240805.005.S4
OUT_DIR=out
============================================
cf 就是給 cuttlefish (android emulator name) 用的。



有時候 build 到最後會有Error,說 /dev/loop2 沒有,這是因為沒有 disk 權縣,加入 disk group 就可以了。



google 說以後都要用 AOSP-release 了。
加上用 android 14 的tag, cuttlefish ru 一下就 hang 住,拿 prebuild 的又OK。
查 prebuild 是Android-16,所以 follow aosp 說明...
repo init --partial-clone --no-use-superproject -b android-latest-release -u https://android.googlesource.com/platform/manifest
repo sync -c -j3
依照googlesource 說明
lunch aosp_cf_x86_64_only_phone-aosp_current-userdebug
因為現在 lunch 都不會出現target 讓你選了。

然後就可以用 m 來 build.
ubuntu 24.04 會出現 mount error, ref: permission denied in mount (/):
sudo sysctl -w kernel.apparmor_restrict_unprivileged_unconfined=0
sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0
或是增加這個檔案到系統,免得每次開機都要重新設:
$ cat /etc/sysctl.d/99-apparmor-unconfined.conf
kernel.apparmor_restrict_unprivileged_unconfined=0
kernel.apparmor_restrict_unprivileged_userns=0

$sudo sysctl --system

2025/6/5

google 為了 GKI 的 kernel , mantain 了一個 manifest.xml,裡面包含 kernel source 和 build kernel image 需要的 tool。
所以用repo把對應的manifest.xml 的所有project都拉回來就可以 build 了,不用再額外安裝tool

build kernel image 使用 bazel
tools/bazel run //common:kernel_aarch64_dist -- --dist_out=out

2025/5/23

install pythton2.7 to ubuntu 24.04

因為 ubuntu 24.04 把 python2 整個移除了,所以 apt 沒有 python2 了。
一般說明都是download python2 source 來 build.
但是從 Python2.7.13 開始,在 ubuntu 24.04 上 build 就會有 ssl function error。
所以若是要用 2.7.13 以上的版本,只好用 AppImage,ref: 下載需要版本的 appimage 後,chmod +x,之後建 link 到 /usr/bin/python2 就可以用了。
--- 雖然不知道會不會有危險,但是它也有提供source:python-appimage,只是env packages 是從docker image 拿的。

2025/5/19

networkmanager, netplan

ubuntu 24.04 用 NetworkManager 來設定 網路相關功能。
所以都用 nmcli 做,不用像以前要設定 iptable, dnsmasq..
所以都會出現在 /etc/netplan/***.yaml

每個 network 設定都會再 /etc/netplan/ 下留下一個紀錄。
曾經發生過 設定 ipv4 share 的 NIC,device 無法正確 forward 出去。
network setting 在usb-network多出一個Setting,

之後把/etc/netplan/ 下沒用到的,不正確的 yaml 刪除重新開機後,好像就正常了。