當前位置:首頁 » 安卓系統 » android內核編譯

android內核編譯

發布時間: 2023-03-02 22:31:09

1. 為什麼編譯android內核的時候, 編譯器提示找不到頭文件,而該頭文件其實是存在的,

你應該帖出具體的報錯提示。你有沒有改好交叉編譯鏈的位置,或者換個交叉編譯鏈的版本試試

2. 自己可以編譯安卓源碼

用最新的Ubuntu 16.04,請首先確保自己已經安裝了Git.沒安裝的同學可以通過以下命令進行安裝:

sudo apt-get install git git config –global user.email 「[email protected]」 git config –global user.name 「test」

其中[email protected]為你自己的郵箱.

簡要說明

android源碼編譯的四個流程:1.源碼下載;2.構建編譯環境;3.編譯源碼;4運行.下文也將按照該流程講述.

源碼下載

由於某牆的原因,這里我們採用國內的鏡像源進行下載.
目前,可用的鏡像源一般是科大和清華的,具體使用差不多,這里我選擇清華大學鏡像進行說明.(參考:科大源,清華源)

repo工具下載及安裝

通過執行以下命令實現repo工具的下載和安裝

mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo

補充說明
這里,我來簡單的介紹下repo工具,我們知道AOSP項目由不同的子項目組成,為了方便進行管理,Google採用Git對AOSP項目進行多倉庫管理.在聊repo工具之前,我先帶你來聊聊多倉庫項目:

我們有個非常龐大的項目Pre,該項目由很多個子項目R1,R2,...Rn等組成,為了方便管理和協同開發,我們為每個子項目創立自己的倉庫,整個項目的結構如下:


這里寫圖片描述

執行完該命令後,再使用make命令繼續編譯.某些情況下,當你執行jack-admin kill-server時可能提示你命令不存在,此時去你去out/host/linux-x86/bin/目錄下會發現不存在jack-admin文件.如果我是你,我就會重新repo sync下,然後從頭來過.

錯誤三:使用emulator時,虛擬機停在黑屏界面,點擊無任何響應.此時,可能是kerner內核問題,解決方法如下:
執行如下命令:

  • ./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7

  • 通過使用kernel-qemu-armv7內核 解決模擬器等待黑屏問題.而-partition-size 1024 則是解決警告: system partion siez adjusted to match image file (163 MB >66 MB)

    如果你一開始編譯的版本是aosp_arm-eng,使用上述命令仍然不能解決等待黑屏問題時,不妨編譯aosp_arm64-eng試試.

    結束吧

    到現在為止,你已經了解了整個android編譯的流程.除此之外,我也簡單的說明android源碼的多倉庫管理機制.下面,不妨自己動手嘗試一下.

    3. Android內核編譯時如何獲得.config文件

    得到config之後,直接復制到你下載來的內核文件夾kernel下,更名為.config,打開終端,進入此目錄(假設你放在里你的home下,即~/kernel)運行make ARCH=arm menuconfig(ARCH=arm表示編譯的是arm平台的)

    4. 如何編譯android kernel

    1.准備工作: (ubuntu1110 32位)
    ubuntu等linuxOS,下載好eclipse,安裝好JDK, 安裝好android的SDK, 在eclipse中成功打開android 手機模擬器即OK。

    2.初始化編譯環境 :
    關注該網頁上的「installing required packages」,其中有的軟體包因為版本問題而安裝不上,不用管它,之後遇到錯誤再單獨解決。

    3.下載內核源碼:
    android 2.3 內核 下載需要等待一段時間。

    4.下載交叉編譯器:
    該步驟有可能耗費大量時間,依據網速不同,幾個小時到幾天不等,或許可以嘗試git clone 後面的地址只下載prebuilt/linux-x86/toolchain

    5.設置參數以及編譯:
    $ export ARCH=arm
    $ export SUBARCH=arm
    $ export CROSS_COMPILE=arm-eabi-
    $ cd goldfish // 進入下載的源代碼目錄
    $ git checkout <commit_from_first_step> //這個步驟我沒有做,不知道幹嘛用的
    $ make goldfish_defconfig
    $ make

    6.報錯信息:
    若有報錯說找不到 (arm-eabi-gcc command not found)等等,嘗試使用http://blog.csdn.net/davidbeckham2901/article/details/7397447 中說到的解決方案即可(即採用另外一個交叉編譯器)。

    7.測試:

    最後,測試一下剛才編譯的內核:emulator -avd myavd -kernel ~/goldfish/arch/arm/boot/zImageemulator若系統找不到,可以去android SDK中某文件夾找到,加入系統PATH即可。 -avd後面的參數 myavd即為模擬器的名字,這個我是在eclipse中的模擬器管理中新建的一個模擬器,用那個模擬器的名字即可。 -kernel後面的參數就找到剛才編譯出的內核的路徑。
    若啟動模擬器失敗,可嘗試關閉後再啟動。第一次啟動模擬器時可能需要等待比較長的時間,3分鍾到15分鍾不等。

    5. 怎麼修改Android 的Linux內核

    Android 產品中,內核格式是Linux標準的zImage,根文件系統採用ramdisk格式。這兩者在Android下是直接合並在一起取名為boot.img,會放在一個獨立分區當中。這個分區格式是Android自行制定的格式。

    Android開發時,最標準的做法是重新編譯於內核和根文件系統,然後調用Android給的命令行文件mkbootimg(out/host/linux-x86/bin/)來打包。

    在製作手機ROM時,有時會單獨編譯內核或抽出根文件進行修改內容,比如我只編譯內核,其餘的地方不變。這樣重新安裝巨大的Android開發環境實在不劃算。因此很多boot.img解包工具被人開發出來,這一些工具都是把內核和根文件系統從一個現成的boot.img抽取出來,修發後再次打包還原。

    一.常見的解包工具

    因為boot.img的格式比較簡單,它主要分為三大塊(有的可能有四塊)

    因此很多人開發分析工具,有是linux shell腳本,比如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 (mkbootimg cmdline參數)
    boot.img-pagesize (mkbootimg pagesize參數)

    boot.img-base (mkbootimg base參數)

    打包工具:mkbootimg (Android自帶)

    常見的命令格式:
    ./mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel zImage --ramdisk boot/boot.img-ramdisk.gz -o boot.img --base 02e00000
    這句含義是把內核文件zImage和boot目錄下的根文件壓縮包 boot.img-ramdisk.gz打包成boot.img.
    其中cmdline和base的值均來源於unpackbootimg的結果

    6. 在編譯android內核的時候出現下面的錯誤,是怎麼回事

    解決方案:找到工程中Makefile文件,將其中 「-m64" 字元串刪除即可。
    原因:gcc 3.4 或者更高版本,已經將其去除了,所以會出現上面的錯誤!
    去android源代碼網站找樓主編譯android版本的對應GCC,安裝後重新編譯

    7. 編譯Android源碼和內核源碼的區別

    Android源碼編譯之後生成的是ramdisk.img、system.img和userdata.img。而內核源碼編譯完成之後生成的是ZImage。在一般情況下Android源碼是不帶有內核源碼的,但是帶有一個鏡像,這樣在編譯完Android源碼之後就可以模擬器啟動了,如果要更換系統的內核,此時將高版本的內核源碼進行編譯生成ZImage然後替換Android系統的的鏡像。這樣使用模擬器啟動之後就可以查看內核是否已經被刷新。
    請注意,android源碼和kernel源碼是分開下載的

    編譯android源碼
    進入source目錄下,執行make 即可。
    編譯完成後,可以在源碼目錄的out/target/proct/generic/目錄下看到編譯好的ramdisk.img、system.img和userdata.img了。

    編譯內核源碼
    新建Kernel/goldfish,在這個目錄下進行編譯

    8. 如何在32位ubuntu11.10 下編譯android 4.0.1源碼和goldfish內核

    一準備工作

    1安裝javasdk6
    (1)從jdk官方網站http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u29-download-513648.html下載jdk-6u29-linux-i586.bin文件。
    (2)執行jdk安裝文件

    [html] view plain
    $chmod a+x jdk-6u29-linux-i586.bin
    $jdk-6u29-linux-i586.bin

    (3)配置jdk環境變數

    [html] view plain
    $sudo vim /etc/profile
    [html] view plain
    #JAVAEVIRENMENT
    exportJAVA_HOME=/usr/lib/java/jdk1.6.0_29
    exportJRE_HOME=$JAVA_HOME/jre
    exportCLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
    exportPATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

    保存後退出編輯,並重啟系統。
    2安裝依賴包

    [html] view plain
    $sudo apt-get install git-core gnupg flex bison gperf build-essential\
    zipcurlzlib1g-devlibc6-devlib32ncurses5-devia32-libs\
    x11proto-core-devlibx11-devlib32readline5-devlib32z-dev\
    libgl1-mesa-devg++-multilibmingw32tofrodospython-markdown\
    libxml2-utils

    3用repo工具下載源碼
    (1)初始化repo

    [html] view plain
    $cd ~
    $mkdir bin
    $curlhttps://dl-ssl.google.com/dl/googlesource/git-repo/repo>~/bin/repo
    $chmod a+x ~/bin/repo
    $exportPATH=$PATH:~/bin(導出環境變數)

    (2)下載android最新源碼

    [html] view plain
    $mkdir android
    $cd android
    $ repo init -u https://android.googlesource.com/platform/manifest -bandroid-4.0.1_r1
    ...(輸入用戶名和郵箱名)
    $repo sync -j5
    ...(此處用5個線程開始下載源碼,下載過程及其漫長,需要耐心等待)

    二 編譯源碼
    1開始編譯

    [html] view plain
    $source build/envsetup.sh
    includingdevice/samsung/maguro/vendorsetup.sh

    includingdevice/samsung/tuna/vendorsetup.sh

    includingdevice/ti/panda/vendorsetup.sh

    includingsdk/bash_completion/adb.bash

    $make-j4(此處用4個線程編譯)

    編譯完成後,會看到類似的輸出:

    [html] view plain
    Targetramdisk:out/target/proct/generic/ramdisk.img
    Targetuserdatafsimage:out/target/proct/generic/userdata.img
    Installedfilelist:out/target/proct/generic/installed-files.txt

    2編譯遇到的問題
    編譯錯誤:

    [html] view plain
    <命令行>:0:0:錯誤:「_FORTIFY_SOURCE」重定義[-Werror]

    <built-in>:0:0:附註: 這是先前定義的位置

    cc1plus:所有的警告都被當作是錯誤

    make:*** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o]錯誤 1

    原因:
    因機器上的gcc版本過高,需替換成4.4.6重新進行編譯。
    解決方法:
    1)安裝4.4版本的gcc和g++

    [html] view plain
    $ sudo apt-get install gcc-4.4
    $ sudo apt-get install g++-4.4

    2)設置gcc版本,使gcc鏈接到gcc-4.4

    [html] view plain
    $ ls -l /usr/bin/gcc*

    lrwxrwxrwx 1 root root 7 2011-11-01 23:56 /usr/bin/gcc -> gcc-4.6

    -rwxr-xr-x 1 root root 224544 2011-10-06 05:47 /usr/bin/gcc-4.4

    -rwxr-xr-x 1 root root 302104 2011-09-17 05:43 /usr/bin/gcc-4.6

    $ cd /usr/bin
    $ sudo mv gcc gcc.bak
    $ sudo ln -s gcc-4.4 gcc

    3)設置g++版本,使g++鏈接到g++-4.4

    [html] view plain
    $ sudo mv g++ g++.bak
    $ sudo ln -s g++-4.4 g++

    4)設置完畢後,重新進行編譯即可

    3從模擬器啟動編譯後的鏡像文件
    1)設置環境變數:

    [html] view plain
    export PATH=~/android/out/host/linux-x86/bin:$PATH

    export ANDROID_PRODUCT_OUT=~/android/out/target/proct/generic

    其中linux-x86/bin存放模擬器emulator工具,proct/generic存在編譯後的鏡像文件。

    2)啟動模擬器

    [html] view plain
    $emulator

    emulator:WARNING: system partition size adjusted to match image file (162 MB >66 MB)

    啟動後的截圖:

    三 編譯androidgoldfish內核
    1)進入android4.0.1源碼目錄,下載goldfish內核源碼

    [html] view plain
    $ mkdir kernel
    $ cd kernel
    $ git clone http://android.googlesource.com/kernel/goldfish.git
    $ cd goldfish
    $ git branch -a
    * (no branch)

    master

    remotes/origin/HEAD -> origin/master

    remotes/origin/android-goldfish-2.6.29

    remotes/origin/master

    $ git checkout remotes/origin/android-goldfish-2.6.29

    2)修改Makefile

    [html] view plain
    goldfish$ gedit Makefile

    修改

    [html] view plain
    ARCH ?=$(SUBARCH)
    CROSS_COMPILE ?=



    [html] view plain
    ARCH ?=arm
    CROSS_COMPILE ?=arm-eabi-

    3)導出交叉編譯器目錄為環境變數
    $ export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin

    4)編譯內核

    [html] view plain
    goldfish$ make goldfish_armv7_defconfig

    goldfish$ make

    編譯完成後,可看到類似如下的輸出:

    [html] view plain
    OBJCOPY arch/arm/boot/zImage
    Kernel: arch/arm/boot/zImage is ready

    5)從模擬器中啟動內核鏡像

    [html] view plain
    $emulator -kernel ~/android/kernel/goldfish/arch/arm/boot/zImage &

    啟動模擬器後,可從Settings->System->AboutPhone中查看內核版本信息。

    熱點內容
    安卓什麼功能好 發布:2025-05-11 18:21:31 瀏覽:354
    我的世界2b2t伺服器中國版 發布:2025-05-11 18:16:35 瀏覽:693
    萌將風雲腳本 發布:2025-05-11 18:07:14 瀏覽:745
    密碼鎖aid代表什麼 發布:2025-05-11 18:00:01 瀏覽:757
    編程的組成 發布:2025-05-11 17:58:34 瀏覽:808
    火山易語言apk反編譯 發布:2025-05-11 17:52:01 瀏覽:814
    鋼琴密碼鎖本的密碼該在哪裡看 發布:2025-05-11 17:49:44 瀏覽:469
    in運演算法則 發布:2025-05-11 17:41:32 瀏覽:407
    微信怎麼分身兩個賬號安卓 發布:2025-05-11 17:32:14 瀏覽:916
    新人采訪問題 發布:2025-05-11 17:14:29 瀏覽:900