1. 程式人生 > >編譯Android原始碼與核心總結

編譯Android原始碼與核心總結

這些天花了些時間自己下載了android原始碼來編譯,其中走了一些彎路導致耗了些時間,現在重新梳理總結下,讓有相同想法的人自己編譯的時候能少走些彎路,官方指導文件在http://source.android.com/source/initializing.html

1、安裝linux環境

我是windows系統,安裝了Vmware虛擬機器,在虛擬機器上裝了ubuntu-12.04,我的這個版本是32位的,這個還蠻重要的,安裝32位或者64位的將決定你能編譯的android版本,官方文件裡For Gingerbread (2.3.x) and newer versions, including the master branch, a 64-bit environment is required. Older versions can be compiled on 32-bit systems.

如果你編譯的是2.3以上的版本,就要安裝64位的ubuntu系統,否則裝32位版本即可,我這裡編譯的是2.3.5版本,因此選擇32位版本的Ubuntu 12.04.5 LTS。記憶體3g,硬碟40g(官網建議是30G以上)。

2、安裝jdk

很多網上的資料都講到http://www.oracle.com官網下載,然後我也去傻傻地下載了,下載了最新版本1.8以上了,結果後來執行的時候發現andorid使用的是jdk1.6的,因此得安裝jdk1.6。

編譯的提示如下:

Your version is: java version "1.6.0_24". The correct version is: Java SE 1.6


下載jdk-6u33-linux-i586.bin,然後把它移動到linux目錄下,我移動到/usr/lib下。

2.1分配許可權 chmod +x jdk-6u33-linux-i586.bin

2.2解壓 ./jdk-6u33-linux-i586.bin

一路確認下來,最後解壓出jdk1.6.0_33資料夾

2.3配置 

sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jdk1.6.0_33/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/libjdk1.6.0_33

/bin/javac" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jdk1.6.0_33/bin/javaws" 1
sudo update-alternatives --install "/usr/bin/jar" "jar" "/usr/lib/jdk1.6.0_33/bin/jar" 1
sudo update-alternatives --config java

如果你的機器本來就裝有其他版本的java,這個時候會讓你選擇要生效的java版本,記住選擇當前這個1.6的版本

2.4 修改環境變數:

sudo gedit /etc/environment

export JAVA_HOME=/usr/lib/jdk1.6.0_33
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:${JAVA_HOME}/bin:${JRE_HOME}/bin"

sudo gedit /etc/profile

export JAVA_HOME=/usr/lib/jdk1.6.0_33
export JRE_HOME=${JAVA_HOME}/jre
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:${PATH}
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

2.5.source /etc/profile

source /etc/environment

2.6.check java version

java -version

得到 

java version "1.6.0_33"
Java(TM) SE Runtime Environment (build 1.6.0_33-b04)
Java HotSpot(TM) Client VM (build 20.8-b03, mixed mode, sharing)

3、下載android 原始碼

網上很多教程都是聯網下載,但由於眾所周知的原因,這個方法可能被牆或者很慢,我在網上搜了個網址原始碼下載 ,我下載了2.3.5的原始碼Android2.3.5_Kernel.7z,解壓後得到.tar,繼續解壓後得到mydroid資料夾,這個就是原始碼程式碼,將原始碼同樣移動到/usr/lib下

進入原始碼目錄,輸入make,就會有很多輸出。

其中我遇到的一個問題:

frameworks/base/libs/utils/RefBase.cpp: 在成員函式‘void android::RefBase::weakref_type::trackMe(bool, bool)’中:
frameworks/base/libs/utils/RefBase.cpp:483:67: 錯誤: 將‘const android::RefBase::weakref_impl’作為‘void android::RefBase::weakref_impl::trackMe(bool, bool)’的‘this’實參時丟棄了型別限定 [-fpermissive]
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] 錯誤 1

這個問題是因為本機裝的gcc版本太高,需要換到合適的可以編譯android的版本

sudo apt-get install gcc-4.4

sudo apt-get install g++-4.4

sudo rm -rf /usr/bin/gcc /usr/bin/g++

sudo ln -s /usr/bin/gcc-4.4 /usr/bin/gcc

 sudo ln -s /usr/bin/g++-4.4 /usr/bin/g++


第一次編譯會比較久,我是放一晚上讓它跑,第二天早上起來看到輸出

Target system fs image:    out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img  Install system fs image: out/target/product/generic/system.img  Target ram disk: out/target/product/generic/ramdisk.img  Target userdata fs image: out/target/product/generic/userdata.img   Installed file list: out/target/product/generic/installed-files.txt 

代表成功make編譯了原始碼。

4、編譯linux核心

然後我們還需要編譯android的linux核心,雖然是linux原始碼,但不能隨便從網上下個linux原始碼,因為Android在Linux核心的基礎上添加了自己所特有的驅動程式,因此要編譯android的linux核心必須使用android專門的linux核心,網上很多方法都是提供git clonehttp://android.googlesource.com/kernel/goldfish.git的方法去下載,但由於有牆因此不好用,我搜了半天了搜到了一個http://pan.baidu.com/s/1qW0TkkO這裡就可以下載了,大概300多M,比原始碼小多了。

下載完後解壓在android原始碼目錄下新建一個目錄kernel,並將解壓後的核心原始碼放在該目錄下


還需要對Makefile檔案的有些地方做些改動,將

ARCH ?= (SUBARCH)   CROSS_COMPILE?=  改為   ARCH ?= arm  #體系結構為arm   CROSS_COMPILE     ?= arm-eabi- 同時修改path,新增交叉編譯環境,我的如圖(紅色部分為編譯android核心需要的交叉編譯環境)
然後在核心原始碼目錄系執行[email protected]:/usr/lib/mydroid2.3.5/kernel/common$ make goldfish_defconfig [email protected]:/usr/lib/mydroid2.3.5/kernel/common$ make
最後得到Kernel: arch/arm/boot/zImage is ready這個輸出證明核心原始碼也編譯出來了。 5、執行模擬器檢視 有了前面的步驟後,這一步就方便多了,先新增環境變數(紅線部分,大家根據自己的放置路徑做相應改動)

命令列輸入[email protected]:/usr/lib/mydroid2.3.5$ emulator -kernel ./kernel/common/arch/arm/boot/zImage &

隨後模擬器將啟動,此時輸入adb shell進入android系統,繼續輸入

cd /proc

cat version,將看到自己編譯出來的版本,比如我的如下



好了,大功告成了!

相關推薦

編譯Android原始碼核心總結

這些天花了些時間自己下載了android原始碼來編譯,其中走了一些彎路導致耗了些時間,現在重新梳理總結下,讓有相同想法的人自己編譯的時候能少走些彎路,官方指導文件在http://source.android.com/source/initializing.html。 1、安

編譯Android原始碼核心原始碼的歸納總結

經過一個多星期的努力,終於在零基礎的情況下在ubuntu-12.04-desktop-amd64(64位Ubuntu系統)成功編譯了android-4.0.3的原始碼和Linux version 2.6.29的linux核心原始碼。期間遇到很多困難,好幾次想放棄

Android系統移植平臺開發(五)- 編譯Android原始碼

2.3編譯Android原始碼 Android原始碼體積非常龐大,由Dalvik虛擬機器、Linux核心、編譯系統、框架程式碼、Android定製C庫、測試套件、系統應用程式等部分組成,在編譯Android原始碼之前,必須要先掌握Android原始碼的組成。 2.3.1An

編譯Spark原始碼子專案GraphX中踩過的坑

編譯Spark原始碼與子專案GraphX中踩過的坑 原始目標:在三臺虛擬機器上真實分散式安裝spark平臺,並通過修改graphx對應的原始碼,觀察graphx的分散式效能,為進一步做圖劃分做準備。 官網文件:http://spark.apachecn.org/do

編譯Spark原始碼單個子專案GraphX

編譯Spark原始碼與單個子專案GraphX 文章目錄 編譯Spark原始碼與單個子專案GraphX Spark原始碼獲取 需要安裝的支援環境 配置環境 編譯spark原始碼 編譯前配置 使用

MacOS X 編譯Android原始碼

MacOS X 編譯Android原始碼 本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 由於在工作中遇到了很多關於android內部實現的問題,雖然後面都解決了,有些是看了原始碼實現,有些原始碼看不了只能去google,百度。這就導致了對於很多的問題其實是知其然不知其

編譯android原始碼7---android 原始碼目錄結構

Android  |-- Makefile (全域性的Makefile) |-- bionic                        (Android 標準C執行支援庫) |-- bootable                (Android核心載入器

Mac編譯android原始碼的坑

Mac編譯android原始碼 因為專案需要在程式碼線上編譯app,想在mac上直接編譯,省時省力。不過,配置環境過程中遇到不少坑,現在逐一記錄下來。 主要有以下幾點: andr

編譯Android原始碼過程中遇到的錯誤

編譯環境:(1)ubuntu15.04(2)jdk1.6 JDK環境設定:     export JAVA_HOME=/home/zr/jdk1.6.0_45        export JRE_HOME=${JAVA_HOME}/jre       export CL

Linux下編譯Android原始碼問題彙總

前言         本人最近在研究Android原始碼編譯,現將編譯過程中遇到問題彙總於此。 環境         系統:CentOS 7 x86_64         源    :中科大映象源(詳見這裡) 問題彙總 (1)Increase Java heap s

Mac 10.12 編譯 Android 原始碼

Android 原始碼系列文章: 環境準備 這裡只講 Mac 10.12 的環境配置, 其他的我沒有嘗試過, 不好描述 我們需要的編譯的是 Android6.0, 所以我們需要 Xcode , Command L

在Mac OS 10.12 編譯Android原始碼:錯誤小結

在Mac OS 10.12 編譯Android原始碼 錯誤小結 記錄自己遇到的一些問題 1、在Terminal跳轉到映象目錄的命令是 cd /Volumes/映象名稱 即建立的磁碟映象是在根目錄下的Volumes資料夾 2、在通過ma

下載並編譯Android模擬器Linux核心goldfish教程

1. 下載goldfish原始碼 在Android原始碼根目錄下新建kernel資料夾: $ mkdir kernel $ cd kernel 下載原始碼: $ git clone http://android.googles

Mac上下載及編譯android原始碼

參考:     https://blog.csdn.net/u010963246/article/details/71480684     https://blog.csdn.net/qq_25333681/article/details/79838325     https

ubuntu16.04 編譯android 原始碼出現的錯誤

1、openjdk 版本不對 解決:2、/bin/bash: prebuilts/misc/linux-x86/bison/bison: 沒有那個檔案或目錄 build/core/binary.mk:609: recipe for target 'out/host/linu

如何單獨編譯Android原始碼中的模組

      第一次下載好Android原始碼工程後,我們通常是在Android原始碼工程目錄下執行make命令,經過漫長的等待之後,就可以得到Android系統映象system.img了。以後如果我們修改了Android原始碼中的某個模組或者在Android原始碼工程新增一個

Mac下編譯Android以及goldfish核心

虛擬機器掛了,Android原始碼都沒了。。不準備再在虛擬機器中下載Android原始碼了,於是就直接在Mac下編譯Android。 在Mac下編譯Android比想象的簡單多了。我的Mac系統是10.10Yousemite。安裝的Xcode也是最新的7.1beta版本。

多使用者同時在一臺伺服器編譯Android原始碼錯誤——Communication error with Jack server (77)

錯誤: FAILED: /bin/bash -c "(prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-s

單獨編譯Android原始碼中的模組

第一次下載好Android原始碼工程後,我們通常是在Android原始碼工程目錄下執行make命令,經過漫長的等待之後,就可以得到Android系統映象system.img了。以後如果我們修改了Android原始碼中的某個模組或者在Android原始碼工程新增一個自己的模組

ubuntu12.04 64bit 編譯android原始碼時遇到的問題"make: *** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates"

ubuntu12.04 64bit 編譯android原始碼時出現如下錯誤:         host Executable: cmu2nuance (out/host/linux-x86/obj/EXECUTABLES/cmu2nuance_intermediates/