Android 1.6源码编译

概述

本篇为使用Ubuntu10.04编译Android 1.6源码的教程,使用的是清华的AOSP镜像,Ubuntu的版本和所需依赖的包等可以参考Android源码编译环境要求

编译成功的环境

  1. Linux系统:Ubuntu10.04
  2. Android源码版本:Ubuntu10.04
  3. VMware Workstation版本: 12.1.0 build-3272444
  4. JDK版本:jdk-1_5_0_22-linux-amd64-rpm.bin
  5. gcc版本:4.3
  6. g++版本:4.3

一、下载Ubuntu 10.04 64位操作系统镜像文件

中国科学技术大学或者的网站中下载对应的iso文件,或者这个网址下载。

二、创建虚拟机环境

(1) 在VMware Workstation中创建一个64位的Linux系统,内存分配5G,硬盘60G。

(2) 安装下载的Ubuntu系统镜像文件,过程略。

三、修改软件下载源

因为10.04版本上的软件源不支持下载,比如下载一个git,会出现“无法定位软件包 git”的错误。处理方式如下:

(1)使用如下命令编辑source.list文件。

sudo gedit /etc/apt/sources.list

(2)替换source.list的文件内容如下:

## Major bug fix updates produced after the final release of the
## distribution.
deb http://old-releases.ubuntu.com/ubuntu/ maverick main restricted
deb-src http://old-releases.ubuntu.com/ubuntu/ maverick main restricted
deb http://old-releases.ubuntu.com/ubuntu/ maverick-updates main restricted
deb-src http://old-releases.ubuntu.com/ubuntu/ maverick-updates main restricted
 
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://old-releases.ubuntu.com/ubuntu/ maverick universe
deb-src http://old-releases.ubuntu.com/ubuntu/ maverick universe
deb http://old-releases.ubuntu.com/ubuntu/ maverick-updates universe
deb-src http://old-releases.ubuntu.com/ubuntu/ maverick-updates universe
 
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://old-releases.ubuntu.com/ubuntu/ maverick multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ maverick multiverse
deb http://old-releases.ubuntu.com/ubuntu/ maverick-updates multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ maverick-updates multiverse

(3)使用如下命令进行更新。

sudo apt-get update

四、安装依赖包

使用如下命令安装10.04版本编译时所需要的依赖包

sudo apt-get install git gnupg flex bison gperf build-essential \
  zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \
  x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \
  libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \
  libxml2-utils xsltproc

(1)安装Jdk1.5

1.下载Jdk1.5

前往下载地址下载Jdk1.5.

2.安装Jdk1.5

下载下来的安装包名称为jdk-1_5_0_22-linux-amd64-rpm.bin,将其复制到Soft/目录下,进入到该目录执行下列步骤。

修改文件的可执行权限:

chmod +x jdk-1_5_0_22-linux-amd64-rpm.bin

解压文件,文件解压后,会产生一个jdk-1_5_0_22-linux-amd64.rpm文件:

./jdk-1_5_0_22-linux-amd64-rpm.bin

安装文件,执行此命令后,会自动安装到/usr/java目录下:

rpm -ivh jdk-1_5_0_22-linux-amd64.rpm --nodeps --force

上面的--nodeps --force两个参数的作用为:安装时不再分析包之间的依赖关系而直接安装,没有这两个参数,会出现如下错误导致安装不成功:

rpm: RPM should not be used directly install RPM packages, use Alien instead!
rpm: However assuming you know what you are doing...
error: Failed dependencies:
    glibc >= 2.1.2-11 is needed by jdk-2000:1.5.0_22-fcs.x86_64
    sh-utils >= 2.0-1 is needed by jdk-2000:1.5.0_22-fcs.x86_64
    fileutils >= 4.0-8 is needed by jdk-2000:1.5.0_22-fcs.x86_64
    gawk >= 3.0.4-1 is needed by jdk-2000:1.5.0_22-fcs.x86_64
    textutils >= 2.0-2 is needed by jdk-2000:1.5.0_22-fcs.x86_64
    /bin/sh is needed by jdk-2000:1.5.0_22-fcs.x86_64

3.配置环境变量

编辑/etc/profile文件,在最后面追加如下配置:

#set java environment
JAVA_HOME=/usr/java/jdk1.5.0_22
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
PATH=$JAVA_HOME/bin:$PATH
export PATH JAVA_HOME CLASSPATH

保存后执行如下代码,使刚才的配置生效:

source /etc/profile

使用如下指令,查看是否安装成功:

root@caiyuan-desktop:/home/caiyuan# java -version
java version "1.5.0_22"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03)
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_22-b03, mixed mode)

(2)安装gcc、g++

在Ubuntu10.04系统中使用的gcc4.4、g++4.4对语法检查比较严格,因此需要下载并切换成较低的版本,这边使用gcc4.3、g++4.4成功编译,如果使用系统默认的gcc、g++版本,则会出现如下错误:

development/emulator/qtools/trace_reader.cpp: In function ‘char* ExtractDexPathFromMmap(const char*)’:
development/emulator/qtools/trace_reader.cpp:1012: error: invalid conversion from ‘const char*’ to ‘char*’
development/emulator/qtools/trace_reader.cpp:1015: error: invalid conversion from ‘const char*’ to ‘char*’
make: *** [out/host/linux-x86/obj/EXECUTABLES/bb2sym_intermediates/trace_reader.o] Error 1

为了能够顺利编译,安装gcc:

sudo apt-get install gcc-4.3

安装g++:

sudo apt-get install g++-4.3

切换gcc、g++的版本为我们刚才安装的版本:

root@caiyuan-desktop:/home/caiyuan# cd /usr/bin
root@caiyuan-desktop:/usr/bin# ls -l gcc*
lrwxrwxrwx 1 root root      7 2017-11-15 12:35 gcc -> gcc-4.4
-rwxr-xr-x 1 root root 242840 2010-09-10 17:16 gcc-4.3
-rwxr-xr-x 1 root root 259232 2012-03-09 09:00 gcc-4.4
root@caiyuan-desktop:/usr/bin# sudo mv gcc gcc.bak
root@caiyuan-desktop:/usr/bin# sudo ln -s gcc-4.3 gcc

查看gcc版本:

root@caiyuan-desktop:/usr/bin# gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.3.5-3ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.3.5 (Ubuntu 4.3.5-3ubuntu1) 

切换g++版本并查看是否切换成功:

root@caiyuan-desktop:/usr/bin# ls -l g++*
lrwxrwxrwx 1 root root      7 2017-11-15 12:35 g++ -> g++-4.4
-rwxr-xr-x 1 root root 242752 2010-09-10 17:16 g++-4.3
-rwxr-xr-x 1 root root 263240 2012-03-09 09:00 g++-4.4
root@caiyuan-desktop:/usr/bin# sudo mv g++ g++.bak
root@caiyuan-desktop:/usr/bin# sudo ln -s g++-4.3 g++
root@caiyuan-desktop:/usr/bin# g++ -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.3.5-3ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.3.5 (Ubuntu 4.3.5-3ubuntu1) 

安装g++-4.3-multilib,不安装则会出现could not find lgcc类似的错误:

sudo apt-get install g++-4.3-multilib

五、下载Android1.6版本的源代码

(1) 下载repo工具,教程

执行如下命令:

mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo

(2)修改repo文件

修改bin/repo文件,改动有两处,修改最低的git版本。

将MIN_GIT_VERSION = (1, 7, 2)修改成MIN_GIT_VERSION = (1, 7, 1)

修改REPO_URL

将  REPO_URL = 'https://gerrit.googlesource.com/git-repo'修改为  REPO_URL = 'https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

(3)初始化

执行如下命令进行初始化,其中android-1.6_r1.5为对应的源码版本号,详见版本号列表

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-1.6_r1.5

(4)同步源码树(下载代码)

repo sync

六、编译源码

进入到源码根目录,执行:

make

七、导出源码到AndroidStudio

进入到源码根目录,执行如下命令,它会生成idegen.jar文件:

root@caiyuan-desktop:/home/caiyuan/Android1.6#  source build/envsetup.sh
root@caiyuan-desktop:/home/caiyuan/Android1.6# mmm development/tools/idegen/
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=1.6
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=DMD64
============================================
make: Entering directory `/home/caiyuan/Android1.6'
Install: out/host/linux-x86/framework/idegen.jar
Copy: out/target/product/generic/system/etc/apns-conf.xml
make: Leaving directory `/home/caiyuan/Android1.6'

然后执行如下命令,它会在根目录生成文件android.iml、android.ipr这两个文件:

root@caiyuan-desktop:/home/caiyuan/Android1.6# development/tools/idegen/idegen.sh
Read excludes: 3ms
Traversed tree: 3225ms

然后在AndroidStudio中导入android.ipr文件,设置项目配置如下:

p3.png
p4.png
p5.png

八、在模拟器中运行刚编译出来的Rom

在"Android Virtual Device Manager"中点击“Create Cirtual Device”创建一个模拟器,这里创建了一个名字叫Emualtor1.6的模拟器,设备为Nexus S。

p1.png

在Sdk的根目录下面有一个叫“.android”的目录,进入目录找到“avd”的子目录,这里就是模拟器的存储位置,然后在“Emualtor1.6.avd”目录中放置我们编译好的系统镜像文件即可,镜像文件的目录地址为“Android1.6/out/target/product/generic”,将其中的ramdisk.img、system.img、userdata.img、userdata-qemu.img这四个文件拷贝到该目录,然后启动模拟器即可。

p2.png

九、直接运行编译后的模拟器

编译完成之后会在根目录生成一个out文件夹,然后要设置对应的环境变量,才能够使用命令运行模拟器。

export PATH=$PATH:/home/caiyuan/Android1.6/out/host/linux-x86/bin
export ANDROID_PRODUCT_OUT=/home/caiyuan/Android1.6/out/target/product/generic

执行下面的命令启动模拟器,这个命令在out/host/linux-x86/bin目录下面,所以上面一步要设置环境变量。

emulator

十、调试进程

调试应用进程

在弹出的“Choose Process”对话框中,选中应用进程即可。

调试系统进程

system_server、Zygote之类的系统进程在对话框中被统一叫做system_process,所以选择它就可以调试AMS、WMS的逻辑了。


p6.png

十一、指定模块编译

编译模块

使用m、mm、mmm编译命令

//首先执行
source build/envsetup.sh

//编译framework模块
mm framework

重新生成镜像文件

部分模块编译后,需要重新执行指令生成镜像文件

make snod

VirtualBox使用技巧

加载共享文件夹

sudo mount -t vboxsf share /home/caiyuan/ShareFile

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345