A. eBPF on android之編譯內核與打補丁(解決觸摸和WIFI失效問題)
本文為看雪論壇優秀文章
看雪論壇作者ID:seeeseee
一、前言在之前嘗試ptach內核時,配置CONFIG_KRETPROBES後遇到了觸摸和WIFI失效的問題。後經missking指導,發現修改內核編譯選項的操作不正確。正確的步驟如下:
但即便如此,編譯出的內核仍然導致觸摸和WIFI失效。後續參考多個帖子,解決了觸摸問題,但WIFI問題未能解決。
刷自編譯內核導致的觸摸屏失靈問題、正確的自編譯內核操作及解決觸摸屏問題的步驟、內核編譯問題、單獨編譯內核的方法、解決觸摸屏失靈問題的實踐篇、內核編譯內文以及相關補丁操作等,均被提及。在一系列操作後,觸摸功能得以修復,但WIFI問題仍然懸而未決。
經過進一步探索,發現單獨編譯內核且包含boot.img的正確方式,這與之前的操作有所區別。對於BUILD_BOOT_IMG的設定和其中的GKI_RAMDISK_PREBUILT_BINARY、VENDOR_RAMDISK_BINARY的理解,以及boot.img解包和生成所需文件的過程,都有了更深入的了解。
通過分析build/build.sh腳本,明確當BOOT_IMAGE_HEADER_VERSION為3時,需指定GKI_RAMDISK_PREBUILT_BINARY和KERNEL_VENDOR_CMDLINE。解包boot.img後,根據文件信息調整BUILD_BOOT_IMG、BASE_ADDRESS、PAGE_SIZE、KERNEL_CMDLINE和KERNEL_BINARY的值,確保正確生成initramfs.cpio和VENDOR_RAMDISK_BINARY。補丁添加bpf_probe_read_user功能,確保內核能正常讀取用戶空間數據。
進行內核編譯配置調整,包括修改內核編譯配置選項,確保觸摸屏和WIFI功能正常。操作步驟包括進入內核源碼目錄、生成floral_defconfig、打開內核編譯配置界面、保存並退出配置、覆蓋floral_defconfig文件、刪除.config文件等。最終,通過正確編譯命令生成可正常使用的boot.img文件,解決觸摸屏和WIFI失效問題。
二、環境搭建環境時,請根據需要添加代理連接。首先,根據官方指南安裝所需庫和軟體,並創建工作目錄。選擇與手機內核版本對應的分支(如Pixel 4XL對應的android-msm-coral-4.14-android13),同步內核源代碼並使用官方說明操作。注意,如果沒有設置編譯工具,可手動同步代碼或使用官方提供的工具。
三、步驟操作步驟包括:
通過解決觸摸屏失靈和WIFI失效問題,了解到單獨編譯內核並生成boot.img的正確方法。在內核編譯過程中,明確相關選項和參數的重要性,確保生成的內核能正常運行觸摸和WIFI功能。通過實踐操作,內核可實現正常啟動、觸摸和WIFI功能正常,同時支持eBPF設定。
B. 如何在android user 版本下打開uart log
如果為了調試
1. 打開一個文件:
alps/mediatek/config/common/autoconfig/kconfig/USER
查看是否存在CONFIG_COMLINE=」console=ttyMT3,921600n1 loglevel=0」,如果存在,則把loglevel=0修改為loglevel = 8
然後
./mk n k
./mk bootimage
2. 如不存在CONFIG_COMMLINE,則查看alps/bootable/bootloader/lk/app/mt_boot/mt_boot.c的boot_linux()函數:
if (!has_set_p2u) {
#ifdef USER_BUILD
sprintf(cmdline,"%s%s",cmdline," printk.disable_uart=1");
#else
sprintf(cmdline,"%s%s",cmdline," printk.disable_uart=0");
#endif
}
修改為:
if (!has_set_p2u) {
#ifdef USER_BUILD
sprintf(cmdline,"%s%s",cmdline," printk.disable_uart=0 ignore_loglevel");
#else
sprintf(cmdline,"%s%s",cmdline," printk.disable_uart=0");
#endif
}
C. android設備/proc目錄下都有啥
/proc/cpuinifo CPU的信息(型號、家族、緩存大小等)
/proc/meminfo物理內存、交換空間
/proc/mounts 已載入的文件系統的列表
/proc/devices 可用設備的列表,這個文件列出字元和塊設備的主設備號,以及分配到這些設備號的設備名稱。
/proc/filesystems 被支持的文件系統
/proc/moles 已載入的模塊
/proc/virsion 內核版本
/proc/cmdline 系統啟動時輸入的內核命令行參數
/proc/XXX XXX是指以進程PID(數字編號)命名的目錄,每一個目錄表示一個進程(即線程組)。
/proc/swaps 要獲知swap空間的使用情況
/proc/fs/nfsd/exports 列出由NFS共享的文件系統
/proc/kmsg 該文件被作為內核日誌信息源,它可以被作為一個系統信息調用的介面使用
/proc/self -- 到當前進程/proc目錄的符號鏈接,通過這個目錄可以獲取當前運行進程的信息。
/proc/pci -- 掛接在PCI匯流排上的設備
/proc/tty/driver/serial --串口配置、統計信息
/proc/version -- 系統版本信息
/proc/sys/kernel/ostype
/proc/sys/kernel/osrelease
/proc/sys/kernel/version
/proc/sys/kernel/hostname -- 主機名
/proc/sys/kernel/domainname -- 域名
/proc/partitions -- 硬碟設備分區信息
/proc/sys/dev/cdrom/info -- CDROM信息
/proc/locks -- 當前系統中所有的文件鎖
/proc/loadavg -- 系統負荷信息
/proc/uptime -- 系統啟動後的運行時間
D. 如何獲取 android 的系統日誌 logcat
在windows7操作系統下,開發平台為android studio可以按照如下步驟獲取android 的系統日誌 logcat。
1、首先打開android studio的頁面,如下圖:
E. 如何解包/編輯/打包android系統的boot.img文件
Android產品中,內核格式是Linux標準的zImage,根文件系統採用ramdisk格式。這兩者在Android下是直接合並在一起取名為boot.img,會放在一個獨立分區當中。這個分區格式是Android自行制定的格式。Android開發時,最標準的做法是重新編譯於內核和根文件系統,然後調用Android給的命令行文件mkbootimg(out/host/linux-x86/bin/)來打包。 在製作手機ROM時,有時會單獨編譯內核或抽出根文件進行修改內容,比如我只編譯內核,其餘的地方不變。這樣重新安裝巨大的Android開發環境實在不劃算。因此很多boot.img解包工具被人開發出來,這一些工具都是把內核和根文件系統從一個現成的boot.img抽取出來,修發後再次打包還原。一.常見的解包工具因為boot.img的格式比較簡單,它主要分為三大塊(有的可能有四塊)因此很多人開發分析工具,有是linuxshell腳本,比如repack-zImage,也有人採用perl,還有C語言編寫的unbootimg, 我使用的是在源碼位置system/core/mkbootimg/下的mkbootimg。為了簡化,藍點工坊把與mkbootimg中打包工具和解包工具以及所包含的libmincrpty庫抽出來,並且重寫一個Makefile,作為開源項目。使用者只需要在linux(需安裝gcc,make,一般是標配)或windows(需要安裝mingw)的命令行執行make,即可產生可執行文件mkbootimg,unpackbootimg。二.解/打包工具使用解包工具:unpackbootimg常見格式 unpackbootimg-i.\tmp\boot.img-o.\out 這一句命令行表示把boot.img解包,所有文件輸出到out目錄下它會解壓出如下文件:boot.img-zImage(內核文件)boot.img-ramdisk.gz(根文件系統打包文件) boot.img-cmdline(mkbootimgcmdline參數) boot.img-pagesize(mkbootimgpagesize參數) boot.img-base(mkbootimgbase參數)打包工具:mkbootimg(Android自帶)常見的命令格式: ./mkbootimg --cmdline'no_console_suspend=1console=null' --kernel zImage --ramdisk boot/boot.img-ramdisk.gz -o boot.img--base02e00000 這句含義是把內核文件zImage和boot目錄下的根文件壓縮包boot.img-ramdisk.gz打包成boot.img. 其中cmdline和base的值均來源於unpackbootimg的結果