概述
本篇为使用Ubuntu10.04编译Android 1.6源码的教程,使用的是清华的AOSP镜像,Ubuntu的版本和所需依赖的包等可以参考Android源码编译环境要求
编译成功的环境
- Linux系统:Ubuntu10.04
- Android源码版本:Ubuntu10.04
- VMware Workstation版本: 12.1.0 build-3272444
- JDK版本:jdk-1_5_0_22-linux-amd64-rpm.bin
- gcc版本:4.3
- 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文件,设置项目配置如下:
八、在模拟器中运行刚编译出来的Rom
在"Android Virtual Device Manager"中点击“Create Cirtual Device”创建一个模拟器,这里创建了一个名字叫Emualtor1.6的模拟器,设备为Nexus S。
在Sdk的根目录下面有一个叫“.android”的目录,进入目录找到“avd”的子目录,这里就是模拟器的存储位置,然后在“Emualtor1.6.avd”目录中放置我们编译好的系统镜像文件即可,镜像文件的目录地址为“Android1.6/out/target/product/generic”,将其中的ramdisk.img、system.img、userdata.img、userdata-qemu.img这四个文件拷贝到该目录,然后启动模拟器即可。
九、直接运行编译后的模拟器
编译完成之后会在根目录生成一个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的逻辑了。
十一、指定模块编译
编译模块
使用m、mm、mmm编译命令
//首先执行
source build/envsetup.sh
//编译framework模块
mm framework
重新生成镜像文件
部分模块编译后,需要重新执行指令生成镜像文件
make snod
VirtualBox使用技巧
加载共享文件夹
sudo mount -t vboxsf share /home/caiyuan/ShareFile