在ubuntu14.04上编译android4.2.2系统

时间:2021-04-22 15:25:01

原创作品,转载请注明出处,严禁非法转载             copyright:weishusheng   2015.8.1

时下android系统非常流行,下面就来说一下,下载编译一个android系统的过程。此处仅是我个人开发过程的总结和记录,想获取更详细资料,可参考官方文档。在编译之前一定要找对相关资料,错误的资料会让你做的很痛苦,还有就是android源码下载比较慢,编译也很慢,建议下载和编译在晚上睡觉之前,这样第二天醒来就编译好了,避免了等待的烦躁。

环境:

电脑:Lenovo 32位  2G内存(编译android明显不够,后面会说到如何增加swap存储容量)

主机:VMware10.0.0+ubuntu14.04(最好是64位,32位的编译会出问题)

android版本:android4.2.2

目标平台:TMDXEVM355x (AM355x start kit)

参考资料:

(1)《android4.2.2开发指导》参考TI 官方档:http://downloads.ti.com/sitara_android/esd/TI_Android_DevKit/TI_Android_JB_4_2_2_DevKit_4_1_1/index_FDS.html

(2)《Vmware Workstation安装ubuntu14.04》参考技术博客:

http://jingyan.baidu.com/article/0320e2c1ef9f6c1b87507bf6.html

(3)《如何在BIOS中开启虚拟化技术》参考网络文档:

http://wenku.baidu.com/link?url=6fySZ5sXqb67pdU3TcoegwBKrqfgJG28cA0XLy2OYkKRM5k4K8AVwj2cY6w9GD6TjXez-P_z5kRtVE0mMrYa6Gq7DpTjboauNTofPv-cHWC

(4)《Ubuntu Linux创建和增加Swap分区教程》参考:

http://www.linuxidc.com/Linux/2014-12/110155.htm

(5) 另外给出android镜像、调试工具、SDk、学习文档等的中文网页链接,里面真是应有尽有,真是android学习者的福音,一定要进去看看,你绝对不会后悔的:http://www.androiddevtools.cn/

适用对象:

编译出的android系统适用于TMDXEVM355x (AM355x start kit)目标平台

本文适用于android开发工作者,不需要有太多的android知识(因为对android,我也是刚入门),致力于使android开发者可以快速在TMDXEVM355x (AM355x start kit)上运行自己编译的android4.2.2系统。

编译大体流程:

安装ubuntu开发环境--->安装依赖库--->下载android源码--->配置交叉编译环境--->编译Bootloader--->编译android linux内核--->编译文件系统--->制作启动SD卡--->从SD卡启动

1.安装ubuntu14.04 64位

android的编译需要ubuntu 64位的系统,具体安装过程可以百度,在安装ubuntu之前需要开启PC的硬件虚拟化。

2.安装依赖库

为了顺利编译android系统,执行下面的命令安装必须的软件包和库

$ sudo apt-get install git-core gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386 \
minicom tftpd uboot-mkimage expect libgl1-mesa-dri
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

安装JDK6

下载JDK6,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

执行下面的命令安装JDK6

$ chmod a+x jdk-6uXX-linux-x64.bin
$ ./jdk-6uXX-linux-x64.bin
$ sudo mkdir -p /usr/lib/jvm
$ sudo mv jdk1.6.0_XX /usr/lib/jvm/
$ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.6.0_XX/bin/java" 1
$ sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.6.0_XX/bin/javac" 1
$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac 主意:
android4.2.2系统的编译需要JDK6以上版本
硬盘空间至少要留有30G可用空间

3.下载android4.2.2源码(有两个方式)

方式一:repo下载

在HOME目录下新建bin目录,并添加环境变量

$ mkdir ~/bin
$ export PATH=~/bin:$PATH

下载repo脚本,并给予脚本执行权限

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo 
$ chmod a+x ~/bin/repo

执行以下命令下载android源码

$ mkdir $HOME/rowboat-android
$ cd $HOME/rowboat-android
$ repo init -u git://gitorious.org/rowboat/manifest.git -m TI-Android-JB-4.2.2-DevKit-4.1.1.xml
$ repo sync
如果上述下载方法速度太慢,可以试试方法二 方法二:直接下载
下载地址:http://downloads.ti.com/sitara_android/esd/TI_Android_DevKit/TI_Android_JB_4_2_2_DevKit_4_1_1/exports/TI_Android_JB_4.2.2_DevKit_4.1.1.bin 下载完成后,执行下面的命令进行解压
$ cd $HOME
$ chmod a+x TI_Android_JB_4.2.2_DevKit_4.1.1.bin
$ ./TI_Android_JB_4.2.2_DevKit_4.1.1.bin

解压完成后会生成许多目录,比较重要的比如:

  • Android File system : $HOME/TI_Android_JB_4.2.2_DevKit_4.1.1/
  • Android Linux Kernel: $HOME/TI_Android_JB_4.2.2_DevKit_4.1.1/kernel
  • Bootloader  : $HOME/TI_Android_JB_4.2.2_DevKit_4.1.1/u-boot
  • Toolchain location will be at $HOME/TI_Android_JB_4.2.2_DevKit_4.1.1/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin

4.设置交叉编译工具链

设置android源码目录下的prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin里的arm-eabi-作为交叉编译工具

$ export PATH=$HOME/rowboat-android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH

注意:强烈建议把arm-eabi-设置为交叉编译工具,避免使用其他交叉编译工具而产生的冲突

5.编译Bootloader
进入u-boot目录
$ cd <android source path>/u-boot

执行下面的命令
$ make CROSS_COMPILE=arm-eabi- distclean
$ make CROSS_COMPILE=arm-eabi- am335x_evm_config
$ make CROSS_COMPILE=arm-eabi- 这将会生成MOL、u-boot.img 6.编译Android Linux Kernel

进入kernel目录

$ cd <android source path>/kernel

执行下面的命令
$ make ARCH=arm CROSS_COMPILE=arm-eabi- distclean
$ make ARCH=arm CROSS_COMPILE=arm-eabi- am335x_evm_android_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-eabi- uImage 编译完成后会在 kernel/arch/arm/boot 下产生uImage 7.增加swap分区 编译android文件系统时,至少需要4G的运行内存,如果少于4G,编译会通不过(当然看个人编译环境了,我是亲自试过了,2G编了一天一夜,没过,再加了2G swap,还是没过,用了整整8个小时)但我只有2G,所以需要增加swap分区,在我增加5G的swap分区后,终于编译通过了,这次用了6个小时。
增加swap分区步骤
首先查看当前内存情况
$ free -m 创建swap分区
$ mkdir swap
$ cd swap
$ dd if=/dev/zero of=swapfile bs=1024 count=5000000                 //我创建了大概5.8G,需要多大,大家自己计算
把swapfile转变为swap格式
$ mkswap swapfile 启动swapfile
$ swapon swapfile 让系统启动时自动加载这个swap文件
$ vim /etc/fstab
增加以下内容
/SWAP_PATH/swapfile swap swap defaults 0 0  再次查看
当前内存情况
$ free -m
8.编译android文件系统
进入源码顶层目录
$ cd <android source path>

编译文件系统
$ make TARGET_PRODUCT=am335xevm_sk OMAPES=4.x -j<N>  

注意:

N是处理器数量的两倍,这个参数可以加快编译速度

文件系统将会在out/target/product/目录下生成

9.压缩文件系统

$ cd out/target/product/am335xevm_sk
$ mkdir android_rootfs
$ cp -r root/* android_rootfs
$ cp -r system android_rootfs
$ ../../../../build/tools/mktarball.sh ../../../host/linux-x86/bin/fs_get_stats android_rootfs . rootfs rootfs.tar.bz2
mktarball.sh会把SD卡分成四个区,并把Bootloader,kernel,文件系统等自动烧录进相应的分区。

10.编辑启动引导脚本uEnv.txt,该脚本在启动时告诉系统启动的参数
执行下面的命令进行镜像烧写
$ mkdir uEnv.txt
bootargs=console=ttyO0,115200n8 androidboot.console=ttyO0 mem=256M root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait init=/init ip=off
bootcmd=mmc rescan ; fatload mmc 0 81000000 uImage ; bootm 81000000
uenvcmd=boot 11.新建系统镜像目录,并把Bootloader、kernel、文件系统都拷贝进去
$ mkdir image_folder
$ cp uEnv.txt image_folder
$ cp kernel/arch/arm/boot/uImage image_folder
$ cp u-boot/u-boot.img image_folder
$ cp u-boot/MLO image_folder
$ cp out/target/product/am335xevm_sk/rootfs.tar.bz2 image_folder
$ cp Media_Clips image_folder 注意:
Media_Clips可以在官网上下载,那里有编译好的所有镜像。Media_Clipes里存放的是图片和音视频文件,也可以不烧写进系统。 12.把镜像写入SD卡
注意:
SD卡至少需要2G容量
写入时会首先格式化SD卡,原来的数据会全部丢失
把SD卡通过读卡器连接到ubuntu,然后执行下面的命令把镜像写入SD卡
$ cd image_folder
$ sudo ./mkmmc-android.sh /dev/sd<sd card mount-point> MLO u-boot.img uImage uEnv.txt rootfs.tar.bz2 Media_Clips

注意:

<sd card mount-point>是SD卡的挂载点,不要选错,选错了系统可能就被格式化了。

13.启动android系统

成功写入SD卡后,把SD卡从读卡器取出,放入开发板,上电启动,首次启动比较慢,大概5分钟后启动成功,第二次启动会快很多。