以前一直是在公司别人搭建好的平台上进行编译开发。现在自己的笔记本上XP已经可以访问ubuntu了,所以想自己学习建立编译环境,过程不复杂,但是一波三折,看来以后还是要对shell编程学习一番。
1,原始开发包包括:
Cross Tool Chain: 4.3.1-eabi-armv6-20080707.tar.bz2 (交叉编译器)
U-BOOT: s3c-u-boot-1.1.6_android.tar.bz2 (uboot)
Linux Kernel: android_kernel_smdk6410.tar.gz (linux内核)
Android Cupkake: cupcake.tar.bz2 (android文件系统OS)
Delta File: delta.tar.gz (补丁包)
Build Script: script.tar.gz (编译脚本)
2,安装交叉编译器:
mkdir /usr/local/arm
cp 4.3.1-eabi-armv6-20080707.tar.bz2 /usr/local/arm
tar xvjf 4.3.1-eabi-armv6-20080707.tar.bz2
编辑用户目录下.bashrc文件,建立环境变量:
vi ~/.bashrc
在末尾处添加:
PATH=$PATH:/usr/local/arm/4.3.1-eabi-armv6/usr/bin
source ~/.bashrc
3,编译Uboot:
解压Uboot包,进入目录:
vi makefile
改变编译器路径:
CROSS_COMPILE = /usr/local/arm/4.3.1-eabi-armv6/usr/bin/arm-linux- (注意后面的“-”)
执行配置:
make smdk6410_config
生成Uboot.bin:
make
4,编译Linux kernel:
编辑用户目录下.bashrc文件,建立生成路径,末尾添加:
export SEC_PRODUCT=smdk6410
export SEC_OUTDIR=/home/zhangcheng/Foxlink2/output
export PATH=$PATH:/home/zhangcheng/Foxlink2/SMDK6410_IB3/android_script
(注意以上=两侧没有空格,否则会出现编译错误:export:'=':not a valid identifier)
进入内核目录,编译配置:
make smdk6410_android_defconfig
build_kernel.sh
通常情况下就可以编译kernel了,如果出现“syantex error:unexpected '('”,需要把build_kernel.sh脚本的头sh换成bash
5,编译android os
解压缩cupcake和delta文件夹,将解压后delta的内容覆盖掉cupcake的部分内容(这步非必须)。
进入cupcake目录:
build_android.sh
====================================================================================================
Android 编译选项分为eng、user、userdebug,我们先看一下几种模式的不同吧。eng:为了开发而包含了很多工具;user:出厂时候面向用户的;userdebug:打开了一些debug选项。
(1)eng 工程模式:This is the default flavor. A plain make is the same as make eng.
ro.secure=0
ro.debuggable=1 //打开串口调试
ro.kernel.android.checkjni=1
adb is enabled by default.
ADB有root权限
(2)user 用户模式:This is the flavor intended to be the final release bits.
ro.secure=1
ro.debuggable=0 //关闭串口调试
adb is disabled by default.
ADB只有shell权限
(3)性能比较
原则上进行性能测试请使用user 版本测试。user 版本为提高第一次开机速度,使用了DVM 的预优化,将dex 文件分解成可直接load 运行的odex 文件,ENG 版本不会开启这项优化;更少的LOG 打印,uart 的关闭,原则上user 版本的性能要优于eng 版本。
(4)如何确认user/eng 版本
A,Java 层,check android.os.Build 类中的TYPE 值;B,native 层,property_get("ro.build.type", char* value, "eng"); 然后check value 值;C,Debug 时,adb shell getprop ro.build.type 返回值如果是user 即user 版本,eng 即eng 版本。
参考原文:http://blog.csdn.net/xubin341719/article/details/7706867