本文內容是針對 Nexus 7 2013(含 Mobile 與 Wi-Fi)。但你只要參照文章最後面的表格,把文章裡面的 device/asus/flo-kernel、msm 改成相應的字串,就可以適用在其他機種了。


當你用以下指令來取得 AOSP 的原始程式碼時,

$ repo init -u https://android.googlesource.com/platform/manifest

$ repo sync

你並沒有取得 Kernel 的原始程式碼,你得到的只是 prebuilt kernel(一個預先編譯好的 binary file)。

如果你需要某個機型的 kernel source,你可以參考 Google 的這個網頁:

Building Kernels

這個網頁所敘述的步驟,我精簡如下:(只想抓 Source code 下來參考,不編譯。)

  1. git clone https://android.googlesource.com/device/asus/flo-kernel
  2. cd flo-kernel
  3. git log –max-count=1 kernel
  4. 記下 commit
  5. cd ..
  6. git clone https://android.googlesource.com/kernel/msm.git
  7. cd msm
  8. git checkout <commit_from_step_4>

前幾天,我的 N7 用 SlimPort 連接電視時,出了點問題。我懷疑是 Kernel 的問題。所以,想下載 AOSP 的 source,來跟 CM 的 source 比對。

我用上述網頁的方法,結果卻失敗了!

我下的指令如下:

$ git clone https://android.googlesource.com/device/asus/flo-kernel

$ cd flo-kernel

$ git log –max-count=1 kernel

輸出如下:

commit 32c48206a97de3bb593ca40f4943886cd65b958f

Author: Ed Tam <etam@google.com>

Date:   Tue Feb 10 10:54:00 2015 -0800

flo: update prebuilt kernel

2e8a9353 msm: smd_pkt: Avoid prematurely stashing driver info

Linux version 3.4.0-g2e8a935 (android-build@vpbs1.mtv.corp.google.com)

(gcc version 4.6.x-google 20120106 (prerelease) (GCC) ) #1 SMP PREEMPT

Tue Feb 10 18:55:38 UTC 2015

Bug: 18759663

Change-Id: Ia25a9cd17c446dd2bcaf921e1dbe9e17738b814e

Signed-off-by: Ed Tam <etam@google.com>

然號我再:

$ cd ..

$ git clone https://android.googlesource.com/kernel/msm.git

$ cd msm

$ git checkout 32c48206a97de3bb593ca40f4943886cd65b958f

結果得到這個錯誤訊息:

fatal: reference is not a tree: 32c48206a97de3bb593ca40f4943886cd65b958f

為什麼會如此呢?

先上 Google 的 Git: https://android.googlesource.com/kernel/msm/

原來 kernel/msm 的 master branch 是空的。

所以要用 git checkout <commit_from_first_step> 來指定版本。

但先前用 git log –max-count=1 kernel 得到的 commit,怎麼會錯了呢?

再看看: https://android.googlesource.com/device/asus/flo-kernel/+/master

我看到了 32c4820,但只有一個 binary file,沒有 source。

再點 log :

我看到了一堆更新紀錄,但這都是針對 prebuilt kernel 的更新。

那 source 的更新在哪裡?

好吧!再仔細看一下 git log –max-count=1 kernel 的輸出。

赫然發現有一行:

2e8a9353 msm: smd_pkt: Avoid prematurely stashing driver info

對了,這應該是 32c480 這次 commit 所涉及的 source code 修改內容吧!一次 prebuilt kernel 更新可能會包含很多次 source code 的修改。所以我要找的 commit,應該是:2e8a9353。

再回到 https://android.googlesource.com/kernel/msm/ ,

拉到下面,選最新的 tag,目前是 android-5.1.0_r0.10。

(這裡 branch / tag 的命名也跟其他的不一樣!)

再點 log :

我看到了 2e8a935……

點進去,再往下拉….. 我終於看到 source tree 了!

所以,我要的 commit 就是:2e8a93539dd21d5856afdeb599b636b5b42bb473。

(其實,用 2e8a9353 就可以啦!)

趕緊試試:

$ git checkout 2e8a9353

Checking out files: 100% (41714/41714), done.

Note: checking out ‘2e8a9353’.

You are in ‘detached HEAD’ state. You can look around, make experimental

changes and commit them, and you can discard any commits you make in this

state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may

do so (now or later) by using -b with the checkout command again. Example:

git checkout -b new_branch_name

HEAD is now at 2e8a935… msm: smd_pkt: Avoid prematurely stashing driver info

$

哈哈…… 終於成功啦!

但這不是最新的喔!它上面還有一個 75977811169d779c039da38e63a1cac4e0cd1693。

所以,master branch 的 prebuilt kernel,不一定是最新的 kernel 喔!

以後下面這些步驟都可以省略了。

$ git clone https://android.googlesource.com/device/asus/flo-kernel

$ cd flo-kernel

$ git log –max-count=1 kernel

直接上 https://android.googlesource.com/kernel/msm/ 找到想要版本的最新 commit。然後,

$ git clone https://android.googlesource.com/kernel/msm.git

$ cd msm

$ git checkout <commit>

這樣就可以了!

以下是目前 AOSP 官方支援的機種:

Device Binary location Source location Build configuration
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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *