一.开发环境:
PC 環境:Fedora 8
硬件平臺:MSM7627
二.操作流程:
1. PC工作环境准备
从网上下载Fedora 8 安装 package, 使用硬盘安装方式进行安装。
这里你要保证存放Feora 8镜像文件的盘为FAT32格式,因为无论Linux还是DOS,都不能识别NTFS。另外你还要为Linux系统空出一部分空间出来,空间大小最好在10G以上。
下载Grub for DOS工具(http://www.linuxidc.com/Linux/2007-10/8641.htm),这是在开机时引导进入Linux安装过程用的。将下载好的Grub for DOS里面的文件(包括了menu.lst ,grldr,grub.exe)解压缩到C盘根目录下。而不是将解压后的文件夹拷到C盘根目录下, 其实仅这个文件grldr是必要的 。
在C盘根目录打开文件boot.ini,在该文件的最后一行,添加C:\grldr="Start Grub",保存,退出。C盘找到menu.lst文件,用记事本打开,在末尾添加以下三行(仅红色部分):
title Install-Fedora 8
kernel (hd0,0)/vmlinuz /*文件vmlinuz所在地址为(hd0,0)*/
initrd (hd0,0)/initrd.img /*文件initrd.img所在地址为(hd0,0)*/
保存退出重新启动,安装即可。
2. 创建工作目录:
#mkdir /home/android
#cd /home/android
#mkdir bin
3. 下载安装repo版本管理工具:
#curl http://android.git.kernel.org/repo> /home/android /bin/repo
#cd bin
#chmod a+x repo
由于Android项目官方采用repo来做同步管理,所以这里只有使用repo才可以做代码同步。
4. 下载安装git
Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制软件,它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓库(repository),许多个工作目录(working copy),而像Git这样的分布式版本控制系统中(其他主要的分布式版本控制系统还有BitKeeper、Mercurial、GNU Arch、Bazaar、Darcs、SVK、Monotone等),每一个工作目录都包含一个完整仓库,它们可以支持离线工作,本地提交可以稍后提交到服务器上。分布式系统理论上也比集中式的单服务器系统更健壮,单服务器系统一旦服务器出现问题整个系统就不能运行了,分布式系统通常不会因为一两个节点而受到影响。因为Android是由kernel、Dalvik、Bionic、prebuilt、build等多个Git项目组成,所以Android项目编写了一个名为Repo的Python的脚本来统一管理这些项目的仓库。.
如果没有事先安装git, 那么首先进行git 安装, Fedaro 8 目前没有git 安装包,所以需要从网上进行下载安装。
5. 准备下载Android
#cd /home/android
首先下載代碼包,依据MSM7627 release notes 80-VR358-6_B_M76xxTSNCJNLYA4615.pdf 到以下网址https://www.codeaurora.org/wiki/QAEP#Branch_Releases 进行BSP 下载, 下载比较麻烦,需要支持 git.
$ repo init -u git://codeaurora.org/platform/manifest.git -b [branch] -m [manifest]
$ repo sync
进 入/home/android/可以看到Android的源码目录如下:
–repo –主要是同步管理所用到的一系列文件
–bionic –Android编译过程所需要的一些库
–bootable –负责启动和备份的一些文件
–build –最主要的一些makefile和编译配置文件
–dalvik –经过Google优化了的java虚拟机
–development –开发用的一些文件夹,包括模拟器和工具等
–external –Android工程中引入的外部功能库
–frameworks –中间件部分
–hardware –和硬件有关的一些支持文件,包括wifi,电信模块等
–kernel –经过了优化和修改的linux内核
–packages –所有的上层应用包
–prebuild –Android编译工具所在目录
–system –一些系统级文件
6. 检查GNU 版本
可以到官網http://www.gnu.org/ 下載最新的make版本.
安裝方法:
$ tar zxvf make-3.8.1.tar.gz -C /home/user/tmp
$ cd /home/user/tmp/make-3.8.1
$ ./configure
$ make && make install
安裝完成后,重新登陸shell時可以使用 make -version 查看是否安裝成功。
JDK(java development kit)包含了整個java的核心,包括開發環境,運行環境,java工具,java基礎類庫,等等。
安裝方法:
$ su //切換到root賬戶
# chmod +x jdk-6u12-linux-i586.bin
# ./jdk-6u12-linux-i586.bin
# mv jdk1.6.0_12 /usr/local
# exit
安裝完成后,打開 .bash_profile文件,在文件末尾加入幾行:
$ vi ~/.bash_profile
export JAVA_HOME=/usr/local/jdk1.6.0_12
export ANDROID_JAVA_HOME=$JAVA_HOME
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
重新登陸shell,輸入 java –version就可以看到安裝是否成功了。
Python 是一种开放源代码的脚本语言,需要python 2.4或者以上的版本。
Gperf 是一种完美的散列函数,它是被作为Hash 函数的生成器。
$ tar zxvf gperf-3.0.4.tar.gz -C /home/user/tmp
$ cd /home/user/tmp/gperf-3.0.4
$ ./configure
$ make && make install
重新登陸shell,輸入 gperf --version 即可以查看是否安裝成功。
Android 所需要的編譯器所包含的include文件至少是2.6版本的,否則Android編譯時會出現找不到定義。
升級方法:到http://www.kernel.org/ 下載最新的內核源碼包。
$ tar jxvf linux-2.6.27.tar.bz2 -C /usr/src
$ cd /usr/src/linux-2.6.27
$ su
# make defconfig && make
//……大約1個小時之后編譯完成……
# cd /usr/include
# mv /usr/include/linux /usr/include/linux-old-bk
# ln -s /usr/src/linux-2.6.27/include/linux linux
#cat /usr/include/linux/version.h //出現下面的兩個語句就表明成功了
#define LINUX_VERSION_CODE 132635
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
Android文件系统由于已经自带了经过优化的交叉编译工具,并且为所有的源码都提供了经过验证的makefile,所 以系统的整体编译相对简单,官方发布的版本中基本功能都已经包含进了makefile中,如果想加入中文输入法这里做适当修改:
#cd /home/android/build/target/product/
#gedit generic.mk
打开这个文件后,在PRODUCT_PACKAGES中,加入PinyinIME,然后保存退出。这样在整体编译的时候就会把中文输入法也编译进system中了。
第一次进行整体编译,这个过程大概持续2到3小时,默认情况下,会在 /home/android/目录下生成一个out文件夹 ,所有的编译生成物都在这一目录下。如果想更改生成文件的目录,请参考/build/buildspec.mk.default文件中的说明。
开始编译:
$ cd /home/user/myandroid
$ make
大約2個小時以后編譯就完成了。
………
…… //順利的話,你就可以看到下面信息
Generated: (out/target/product/generic/android-info.txt)
Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates/system.img
Install system fs image: out/target/product/generic/system.img
Target ram disk: out/target/product/generic/ramdisk.img
Target userdata fs image: out/target/product/generic/userdata.img
查看/myandroid/out/target/product/generic就可以看到三個img文件:ramdisk.img system.img userdata.img
13. 运行emulator
修改.bashrc, 增加相应的声明信息。(用户可自行修改到相应Android目录) 修改.bashrc,增加相應的環境變量。
$ vi ~/.bash_profile
export PATH=/home/user/myandroid/out/host/linux-x86/bin:$PATH
export ANDROID_PRODUCT_OUT=/home/user/myandroid/out/target/product/generic
// 重新登陸shell
$ emulator
........虛擬機開始運行……
主畫面:
14. 烧录方法:
在PC上配置tftp服務器,這樣我們就可以通過USB或者Ethernet下載代碼到目標板。配置ftp服務器的方法:
請參考 http://www.yuanma.org/data/2006/0803/article_1300.htm
三.FRQ
1.全部安装完Fedora 8, 出现编译错误:
Make: execvp: /bin/bash: Argument List too long
2. 全部重新安装即可,必须check gperf version.
3. 得到全部环境后,要chmod –R a=rwx /home/linux/* 来改变整个目录的属性,以便可以操作。
4.在linux上建samba服务器,将android代码共享给windows。系统—》管理—》samba.
注意点:关闭防火墙,或者在防火墙中将samba端口打开
关闭selinux,修改/etc/selinux/config 文件 enforcingàdisabled
重新修改SAMBA配置后,最好重新启动SAMBA服务器。命令:
Service smb restart 或者 Service smb stop Service smb start
5. Build 命令请参考kernel\Documentation\kbuild 和How_to_Write_makefile.pdf
6. 默认启动SVN server:
vi /etc/rc.d/rc.local
Add the below command.
killall svnserver
svnserve -d -r /home/svn/newrepos
7. 烧录方法:
source build/envsetup.sh
fastboot devices
fastboot flash boot boot.img
fastboot flash system system.img
fastboot flash userdata userdata.img
8.How to modify build script to add one new feature
\kernel\arch\arm\configs\msm7627_defconfig
CONFIG_MMC=y
Or
CONFIG_MMC=m
\kernel\driver\makefile
obj-$(CONFIG_MMC) += mmc/
9. #pragma once
#pragma pack( push, 4) // push to stack and meanwhile set align bytes
#pragma pack(pop)
#pragma pack(show) //show the current setting
#pragma pack() //restore default setting
Instead of
#pragma pack
struct s
{
char c;
int i;
};
with
struct s
{
char c;
int i __attribute__ ((__packed__));
};
or
__attibute__((aligned(n));
总结一下:
关于字节对齐的使用,gcc 一般用
__attribute__((aligned(n))
VC 中使用
#pragma pack(n)
还有一些程式使用另外的一种方式:
_declspec(align(n))
9. make menuconfig
Please use “make kernelconfig” instead of “make menuconfig”