讓你的Android手機支援LKM

freakish發表於2018-01-03

前言

  • 除錯Android程式的時候不可避免的會遇到一些噁心的反除錯,為了一勞永逸的解決這些反除錯問題,使用LKM模組來製作一個除錯沙箱是一個很不錯的想法,就像當年Windows平臺上盛行一時的reload kernel一樣。所以LKM是個好東西,但是預設情況,Andriod的Kernel是沒有開啟LKM支援的,我們需要重新配置核心選項讓它支援LKM,一個比較好的辦法就是使用核心原始碼配置核心選項,編譯新核心並刷機,這篇文章記錄了我的操作過程。

環境準備

  • Google Nexus 5X手機一部
  • Android 原始碼一份
  • Ubuntu 14.10

核心原始碼下載

  • 既然是5X的手機,我們需要根據官方的指導,找到適合我這個手機的原始碼,這裡直接給出對照表:
  • 裝置 二進位制檔案所在的位置 原始碼所在的位置 編譯配置
    marlin device/google/marlin-kernel kernel/msm marlin_defconfig
    sailfish device/google/marlin-kernel kernel/msm marlin_defconfig
    hikey device/linaro/hikey-kernel kernel/hikey-linaro hikey_defconfig
    angler device/huawei/angler-kernel kernel/msm angler_defconfig
    bullhead device/lge/bullhead-kernel kernel/msm bullhead_defconfig
    shamu device/moto/shamu-kernel kernel/msm shamu_defconfig
    fugu device/asus/fugu-kernel kernel/x86_64 fugu_defconfig
    volantis device/htc/flounder-kernel kernel/tegra flounder_defconfig
    hammerhead device/lge/hammerhead-kernel kernel/msm hammerhead_defconfig
    flo device/asus/flo-kernel/kernel kernel/msm flo_defconfig
    deb device/asus/flo-kernel/kernel kernel/msm flo_defconfig
    manta device/samsung/manta/kernel kernel/exynos manta_defconfig
    mako device/lge/mako-kernel/kernel kernel/msm mako_defconfig
    grouper device/asus/grouper/kernel kernel/tegra tegra3_android_defconfig
    tilapia device/asus/grouper/kernel kernel/tegra tegra3_android_defconfig
    maguro device/samsung/tuna/kernel kernel/omap tuna_defconfig
    toro device/samsung/tuna/kernel kernel/omap tuna_defconfig
    panda device/ti/panda/kernel kernel/omap panda_defconfig
    stingray device/moto/wingray/kernel kernel/tegra stingray_defconfig
    wingray device/moto/wingray/kernel kernel/tegra stingray_defconfig
    crespo device/samsung/crespo/kernel kernel/samsung herring_defconfig
    crespo4g device/samsung/crespo/kernel kernel/samsung herring_defconfig
  • 我的手機是 Nexus5X,也就是bullhead(手機插上電腦之後,adb shell之後,可以看到提示符部分顯示的手機型號),於是根據表格第三列的提示,我們開始下載原始碼

  • 為了省去翻牆的麻煩,經過幾番折騰,我把程式碼fork到了我的github中,在ubuntu系統中轉到我的Android原始碼儲存的目錄,開始下載核心原始碼 git clone https://github.com/freakishfox/kernel_msm.git
  • 經過一段時間的等待,原始碼應該會clone完畢,進入 kernel_msm 目錄,執行git branch -a | grep bullhead檢視程式碼分支
  • 我直接選擇第一個分支,然後把程式碼拉下來,使用如下命令操作:
  • git checkout remotes/origin/android-msm-bullhead-3.10-marshmallow-dr
  • 到這裡程式碼就獲取完畢了

編譯核心

  • 經過上面一番折騰,我已經拿到了核心原始碼,下面準備進入編譯階段,現在我們進入核心程式碼目錄 cd kernel_msm
  • 接著先執行一條比較重要的命令:export ARCH=arm64, 這條命令指定了我們要編譯的核心的CPU架構,基於我手機的原因,我選擇arm64
  • 我們的主要目的是要讓核心支援LKM,所以在開始編譯之前,我們來配置一下,執行命令:make menuconfig,開啟圖形化配置,透過空格+Tab鍵操作,配置結果如下:
  • 第一處是讓核心支援LKM,第二處可以順便設定一下,方便後續開發LKM的時候直接操作核心記憶體資料,而不用去管記憶體防寫,接著儲存即可
  • 其實還有一個比較省事的辦法就是直接 cp 目錄下的 .config.old到.config
  • 接著我們設定一下編譯需要的幾個環境變數:
  • export PATH=PATH
  • export CROSS_COMPILE=aarch64-linux-android-
  • 這兩個環境變數,一個告訴編譯器交叉編譯工具的路徑,一個告訴編譯器交叉編譯工具的字首名(這兩個變數其實是編譯指令碼中使用的,如果不想匯出,也可以直接修改編譯指令碼直接指定),貼一下我的環境:
  • 完畢之後,直接執行 make 進行編譯

核心刷到手機

  • 等待編譯完成之後,會得到這樣的結果:
  • 有了這個結果,我們就可以用編譯好的結果來製作新的啟動映象了,也就是 boot.img
  • 我這裡使用Android原始碼中的 make bootimage 命令來操作,這個命令預設會使用prebuilts中的qmenu-kernel來打包boot.img,所以在執行命令之前,先定義一下打包命令使用的核心路徑,使用命令:export TARGET_PREBUILT_KERNEL=$你的核心目錄/arch/arm/boot/zImage-dtb
  • 然後轉到Android原始碼目錄,執行 . build/envsetup.sh 命令,設定一下接下來編譯用的環境,接著選擇編譯選項,lunch命令,我之前手機編譯的系統是 AOSP-bullhead-userdebug, 我這裡依然選擇這個選項
  • 然後就是開始編譯了, make bootimage
  • 經過一段時間的等待,會生成新的boot.img
  • 重啟手機到 bootloader 介面,然後使用 fastboot flash boot boot.img命令刷機即可

相關文章