導航:首頁 > 源碼編譯 > 安卓本機內核編譯環境

安卓本機內核編譯環境

發布時間:2025-02-25 16:54:26

編譯android 源碼需要sdk環境嗎

下面是android學習手冊,可以查看編譯源碼,360手機助手中下載,

編譯環境:ubuntu9.10,widnows平台目前不被支持。

1)安裝必要的軟體環境

$ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev

官方推薦的就是上面這些,如果在編譯過程中發現某些命令找不到,就apt-get它。可能需要的包還有:

$ sudo apt-get install make
$ sudo apt-get install gcc
$ sudo apt-get install g++
$ sudo apt-get install libc6-dev

$ sudo apt-get install patch
$ sudo apt-get install texinfo

$ sudo apt-get install zlib1g-dev
$ sudo apt-get install valgrind
$ sudo apt-get install python2.5(或者更高版本)

需要注意的是,官方文檔說如果用sun-java6-jdk可出問題,得要用sun-java5- jdk。經測試發現,如果僅僅make(make不包括make sdk),用sun-java6-jdk是沒有問題的。而make sdk,就會有問題,嚴格來說是在make doc出問題,它需要的javadoc版本為1.5。

因此,我們安裝完sun-java6-jdk後最好再安裝sun-java5-jdk,或者只安裝sun-java5-jdk。這里sun-java6-jdk和sun-java5-jdk都安裝,並只修改javadoc.1.gz和javadoc。因為只有這兩個是make sdk用到的。這樣的話,除了javadoc工具是用1.5版本,其它均用1.6版本:

$ sudo apt-get install sun-java6-jdk

修改javadoc的link:

$ cd /etc/alternatives
$ sudo rm javadoc.1.gz
$ sudo ln -s /usr/lib/jvm/java-1.5.0-sun/man/man1/javadoc.1.gz javadoc.1.gz
$ sudo rm javadoc
$ sudo ln -s /usr/lib/jvm/java-1.5.0-sun/bin/javadoc javadoc

2)設置環境變數

$ emacs ~/.bashrc

在.bashrc中新增或整合PATH變數,如下:

#java 程序開發/運行的一些環境變數

JAVA_HOME=/usr/lib/jvm/java-6-sun
JRE_HOME=${JAVA_HOME}/jre
export ANDROID_JAVA_HOME=$JAVA_HOME
export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export JAVA_HOME;
export JRE_HOME;
export CLASSPATH;
HOME_BIN=~/bin/
export PATH=${PATH}:${JAVA_PATH}:${HOME_BIN};

保存後,同步更新:

source ~/.bashrc

3)安裝repo(用來更新android源碼)

創建~/bin目錄,用來存放repo程序,如下:

$ cd ~
$ mkdir bin

並加到環境變數PATH中,在第2步中已經加入。

下載repo腳本並使其可執行:

$ curlhttp://android.git.kernel.org/repo>~/bin/repo
$ chmod a+x ~/bin/repo

4)初始化repo

repo是android對git的一個封裝,簡化了一些git的操作。

創建工程目錄:

$ mkdir android
$ cd android

repo初始化:

$ repo init -u git://android.git.kernel.org/platform/manifest.git

在此過程中需要輸入名字和email地址。初始化成功後,會顯示:

repo initialized in /android

在~/android下會有一個.repo的隱藏目錄。

5)同步源代碼

$ repo sync

這一步要很久很久。

6)編譯android源碼,並得到~/android/out目錄

$ cd ~/andoird
$ make

這一過程很久。

7)在模擬器上運行編譯好的android

編譯好android之後,emulator在~/android/out/host/linux-x86/bin下,ramdisk.img,system.img和userdata.img則在~/android/out/target/proct/generic下。

$ cd ~/android/out/host/linux-x86/bin

增加環境變數

$ emacs ~/.bashrc

在.bashrc中新增環境變數,如下

#java 程序開發/運行的一些環境變數

export ANDROID_PRODUCT_OUT=~/android/out/target/proct/generic
ANDROID_PRODUCT_OUT_BIN=~/android/out/host/linux-x86/bin
export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_PRODUCT_OUT};

最後,同步這些變化:

$ source ~/.bashrc
$ cd ~/android/out/target/proct/generic
$ emulator -system system.img -data userdata.img -ramdisk ramdisk.img

最後進入android桌面,就說明成功了。

8)編譯模塊

android中的一個應用程序可以單獨編譯,編譯後要重新生成system.img。

在源碼目錄下執行

$ . build/envsetup.sh (.後面有空格)

就多出一些命令:

- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the moles in the current directory.
- mmm: Builds all of the moles in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.

可以加—help查看用法。

我們可以使用mmm來編譯指定目錄的模塊,如編譯聯系人:

$ mmm packages/apps/Contacts/

編完之後生成兩個文件:

out/target/proct/generic/data/app/ContactsTests.apk
out/target/proct/generic/system/app/Contacts.apk

可以使用

$ make snod

重新生成system.img,再運行模擬器。

9)編譯SDK

直接執行make是不包括make sdk的。make sdk用來生成SDK,這樣,我們就可以用與源碼同步的SDK來開發android了。

a)修改/frameworks/base/include/utils/Asset.h

『UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024』 改為 『UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024』

原因是eclipse編譯工程需要大於1.3M的buffer;

b)編譯ADT

由於本人不使用eclipse,所以沒有進行這步;

c)執行make sdk

注意,這里需要的javadoc版本為1.5,所以你需要在步驟1中同時安裝sun-java5-jdk

$ make sdk

編譯很慢。編譯後生成的SDK存放在out/host/linux-x86/sdk/,此目錄下有android-sdk_eng.xxx_linux- x86.zip和android-sdk_eng.xxx_linux-x86目錄。android-sdk_eng.xxx_linux-x86就是 SDK目錄。

實際上,當用mmm命令編譯模塊時,一樣會把SDK的輸出文件清除,因此,最好把android-sdk_eng.xxx_linux-x86移出來。

此後的應用開發,就在該SDK上進行,所以把7)對於~/.bashrc的修改注釋掉,增加如下一行:

export PATH=${PATH}:~/android/out/host/linux-x86/sdk/android-sdk_eng.xxx_linux-x86/tools

注意要把xxx換成真實的路徑;

d)關於環境變數、android工具的選擇

目前的android工具有:

A、我們從網上下載的Android SDK,如果你下載過的話( tools下有許多android工具,lib/images下有img映像)
B、我們用make sdk編譯出來的SDK( tools下也有許多android工具,lib/images下有img映像)
C、我們用make編譯出來的out目錄( tools下也有許多android工具,lib/images下有img映像)

那麼我們應該用那些工具和img呢?

首先,我們一般不會用A選項的工具和img,因為一般來說它比較舊,也源碼不同步。其次,也不會用C選項的工具和img,因為這些工具和img沒有經過SDK的歸類處理,會有工具和配置找不到的情況;事實上,make sdk產生的很多工具和img,在make編譯出來out目錄的時候,已經編譯產生了,make sdk只是做了而已。

e)安裝、配置ADT
略過;

f)創建Android Virtual Device

編譯出來的SDK是沒有AVD(Android Virtual Device)的,我們可以通過android工具查看:

$ android list

創建AVD:

$ android create avd -t 1 -n myavd

可以android –help來查看上面命令選項的用法。創建中有一些選項,默認就行了。

再執行android list,可以看到AVD存放的位置。

以後每次運行emulator都要加-avd myavd或@myavd選項:

$ emulator -avd myavd

10)編譯linux內核映像

a)准備交叉編譯工具鏈

android代碼樹中有一個prebuilt項目,包含了我們編譯內核所需的交叉編譯工具。

b)設定環境變數

$ emacs ~/.bashrc

增加如下兩行:

export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin
export ARCH=arm

保存後,同步變化:

$ source ~/.bashrc

c)獲得合適的內核源代碼

$ cd ~/android

獲得內核源代碼倉庫

$ git clone git://android.git.kernel.org/kernel/common.git kernel
$ cd kernel
$ git branch

顯示

* android-2.6.27

說明你現在在android-2.6.27這個分支上,也是kernel/common.git的默認主分支。

顯示所有head分支:

$ git branch -a

顯示

* android-2.6.27
remotes/origin/HEAD -> origin/android-2.6.27
remotes/origin/android-2.6.25
remotes/origin/android-2.6.27
remotes/origin/android-2.6.29
remotes/origin/android-goldfish-2.6.27
remotes/origin/android-goldfish-2.6.29

我們選取最新的android-goldfish-2.6.29,其中goldfish是android的模擬器模擬的CPU。

$ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29
$ git branch

顯示

android-2.6.27
* android-goldfish-2.6.29

我們已經工作在android-goldfish-2.6.29分支上了。

d)設定交叉編譯參數

打開kernel目錄下的Makefile文件,把CROSS_COMPILE指向剛才下載的prebuilt中的arm-eabi編譯器.

CROSS_COMPILE ?= arm-eabi-

LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,
$(call ld-option, -Wl$(comma)–build-id,))

這一行注釋掉,並且添加一個空的LDFLAGS_BUILD_ID定義,如下:

LDFLAGS_BUILD_ID =

e)編譯內核映像

$ cd ~/android/kernel
$ make goldfish_defconfig
$ make

f)測試生成的內核映像

$ emulator -avd myavd -kernel ~/android/kernel/arch/arm/boot/zImage

② 關於android和x86的幾點疑問。 android基因linux內核,系統除了內核還有其他什麼

android 除了基於 Linux 內核,他的上層運行環境和相關函數庫,命令程序都是自己的。
其實 android 就是一個基於 Linux 內核的 JAVA 虛擬機環境。
實際 Android 程序都是基於 JAVA 虛擬機跑的解釋型語言程序。

但解釋型語言程序性能肯定不如本地二進製程序。所以 Android 還有一種 NDK 程序。
也就是 Android 裡面有部分本地二進製程序的內容。這樣本地程序方式運行,效率可以最高而且可以根據 CPU 功能做優化(比如 neon )。

指令集不同,但他的 JAVA 虛擬機是解釋型語言,基於 JAVA 語言的程序是可以無差別運行的。只要能保證 Android 上面的 JAVA 虛擬機可以在 x86 上面成功運行就行了。

但 Android 有個另外的問題,就是 JAVA 虛擬機是針對 ARM 做性能優化的,在 X86 上面,這種性能優化都沒了,需要另外在 x86 上面重新優化。但聽說 Android 的 JAVA 虛擬機的語言裡面,也有針對 ARM 硬體進行的修改設計,所以這種針對 ARM 性能優化的 JAVA 程序,在 X86 的系統上面性能也有損失。

所以 Android 出來很久後,在 x86 上面的運行效率都一直不怎麼樣。

而且現在還有 NDK 程序的出現, ARM 的二進製程序在 x86 上面是不能運行的。這些程序都不能運行。
不過 x86 有個優勢就是自己的性能很強,而且模擬器技術現在也很強了。在 x86 上面,可以藉助虛擬機(qemu 的 user mode 就值得看看)來運行 ARM 的二進製程序。
不過虛擬機其實還是有性能損失的。

所以未來,Android 的跨 CPU 架構依然還是問題。純 JAVA 程序好說,用了 NDK 的程序就是問題了。

不過 llvm 這個編譯器又給了另外一條路,既可以虛擬機方式運行,又可以編譯成本地程序而成為二進製程序來優化性能運行。或許 Android 會考慮使用這種方法或者類似的讓 NDK 程序可以跨 CPU 實現。代價是 Android 要自帶一個編譯器,體積也不小的。

MAC OS X 還有一種方法。在 MAC 放棄 IBM 的 Power CPU 而改用 Intel 的 CPU 後,他的程序都是裡面附帶兩套二進製程序,老的 G4 CPU 的機器,就用程序裡面的 power 指令集的程序代碼。新的 Intel CPU 的機器,就自動用裡面的 x86 指令來運行程序。從而實現完美的雙指令集運行。不過代價是這樣的程序都是兩套指令集的內容,體積翻倍。

目前來說,似乎用了 NDK 的程序還都不能用的。不排除現在某些 x86 的手機,使用了虛擬機技術來實現運行 NDK 程序。現在 Linux 下面的 qemu 的 usermode 配合內核的 binfmt_misc 功能,可以讓系統自動識別某個架構的程序,去調用 qemu 來執行。

③ 安卓內核下載什麼軟體安卓內核下載

android內核是?

大家聽過和Android內核最多的詞語應該是「AndroidFramework」以及「Dalvik虛擬機」,那麼,這兩個核心部分從內部運行機制的角度來看,到底扮演著什麼角色,彼此之間如何協同工作呢?了解清楚了這些,也就了解了所謂Android的核心價值,即Android內核。

從進程的角度來看,當Linux內核啟動後,此時系統的狀態和普通的Linux系統基本相同,通過配置Linux中的init.rc文件,可以指定內核啟動後都要執行什麼程序,而這之後所啟動的程序才是Android系統和普通Linux應用系統的區別。

android怎樣編譯kernel命令make?

1.准備工作:(ubuntu111032位)

ubuntu等linuxOS,下載好eclipse,安裝好JDK,安裝好android的SDK,在eclipse中成功打開android手機模擬器即OK。

2.初始化編譯環境:

關注該網頁上的「installingrequiredpackages」,其中有的軟體包因為版本問題而安裝不上,不用管它,之後遇到錯誤再單獨解決。

3.下載內核源碼:

android2.3內核下載需要等待一段時間。

4.下載交叉編譯器:

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

5.設置參數以及編譯:

$exportARCH=arm

$exportSUBARCH=arm

$exportCROSS_COMPILE=arm-eabi-

$cdgoldfish//進入下載的源代碼目錄

$gitcheckout

$makegoldfish_defconfig

$make

安卓手機的內核是什麼意思?詳細點?

手機內核也是Linux內核,Android系統是基於Linux研發的,它負責管理系統的進程,內存,設備驅動程序,文件和網路系統,決定著系統的性能和穩定性,內核以獨占的方式執行最底層任務,保證系統正常運行,協調多個並發進程,管理進程使用的內存,使它們相互之間不產生沖突,滿足進程訪問磁碟的請求等等.

安卓系統如何換內核?

可以的,以Virtuous_S4A-2為例1、從網上下載Virtuous_S4A-2內核。

(註:此內核只是作為例子,並不適用於所有機型。

你要替換的內核要對應自己的機型以及版本!)

2、然後解壓Virtuous_S4A-2,得到4個文件夾,分別是data,kernel,meta-inf,system。

3、在進入廚房選擇0進入高級操作菜單,選擇20,boot.img工具4、選擇S查看一下內核信息,用筆記錄相關信息以便完成後核對數據。特別是基址。

5、復制完文件後,我們回到廚房工具,選擇b,新建boot.img6、建完後,查看新的boot.img信息。看基址是否一樣。

7、替換內核後,我們也要選擇23把update-script格式轉換為updater-script格式。

然後和上面一樣,打包!簽名!

如何給手機安裝內核?

無法手動安裝,瀏覽器內核是固定的,可以升級官方更新好的,內核可能會自動升級,或者重新下載高版本。

④ 自己可以編譯安卓源碼嗎

用最新的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源碼的多倉庫管理機制.下面,不妨自己動手嘗試一下.

    ⑤ 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設定。

    閱讀全文

    與安卓本機內核編譯環境相關的資料

    熱點內容
    什麼app可以教你化妝 瀏覽:541
    程序員加班996怎麼過 瀏覽:823
    有個什麼tv美女直播app 瀏覽:856
    編譯gcc比較全的參數 瀏覽:199
    stvd取消編譯器優化 瀏覽:418
    pdf存儲格式 瀏覽:585
    加密軟體提取時沒有這個鍵怎麼辦 瀏覽:909
    可以用命令行做什麼好玩的東西 瀏覽:132
    榮耀30s帶方丹編譯器嗎 瀏覽:51
    黑甲蟲加密軟體加密後文件不見了 瀏覽:273
    惠州程序員名單 瀏覽:176
    java可移植性 瀏覽:737
    加密卡寫卡工具 瀏覽:392
    德善緣app是干什麼的 瀏覽:817
    中山雲存儲伺服器 瀏覽:686
    google蜂鳥演算法 瀏覽:942
    為什麼程序員這么受人詬病 瀏覽:99
    linuxgtk編程 瀏覽:255
    迪拜用什麼app打車 瀏覽:633
    java字元串不轉義 瀏覽:309