Android开发经验谈Android开发Android知识

Android 1.6源码编译

2017-11-17  本文已影响106人  安卓程序员小黄

概述

本篇为使用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

参考资料

上一篇下一篇

猜你喜欢

热点阅读