Android 源码下载, 编译及一些错误处理

Android 源码下载及编译后需要20G硬盘空间
一:环境配置
1.安装git工具:
sudo apt-get install git-core gnupg
2.安装Java jdk:
可以通过官网下载,自己配置环境。也可通过命令行操作进行下载
sudo add-apt-repository ppa:ferramroberto/java
sudo apt-get update
sudo apt-get install sun-java6-jre sun-java6-plugin
sudo apt-get install sun-java6-jdk 
3.安装依赖包:
sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl
4.调试工具:sudo apt-get install valgrind
二:开始下载Android源码
1.下载repo工具:
wget https://dl-ssl.google.com/dl/googlesource/git-repo/repo
chmod 777 repo
cp repo /bin/
2. ~/Andriod$ mkdir Android
   ~/Andriod$ cd Android
   ~/Andriod$ repo init -u https://dl-ssl.google.com/dl/googlesource/git-repo/repo
   ~/Andriod$ repo sync
开始下载,可能需要2~3天时间,如果关机之后,下次进入Android目录,接着执行 repo sync,接着下载。中间可能会有中断,在网上找了个脚本repo.sh,可以一直下载,内容如下:
repo sync
while [ $? -ne 0 ]
do
    repo sync
done
或者:
#!/bin/bash
command="repo sync"
$command
result=$?
echo "result = "$result
until [ $result -eq 0 ]
do
echo "retry"
$command
result=$?
done
三:编译源码
1:~/Andriod$ make
等待比较久,如果出现错误,可查看 这里
2:编译sdk1
切记先执行 ~/Andriod$ source ./build/envsetup.sh
执行之后会有一些额外的命令可以使用如:
名称 说明
croot 切换到源码树的根目录
m 在源码树的根目录执行 make
mm Build 当前目录下的模块
mmm Build 指定目录下的模块
cgrep 在所有 C/C++ 文件上执行 grep
jgrep 在所有 Java 文件上执行 grep
resgrep 在所有 res/*.xml 文件上执行 grep
godir 转到包含某个文件的目录路径
printconfig 显示当前 Build 的配置信息
add_lunch_combo 在 lunch 函数的菜单中添加一个条目 
这里可参考一篇博文,介绍Android Build 系统:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/index.html#iratings
这一步很重要,要不然在编译make sdk中会出现问题
~/Andriod$ lunch sdk-eng
~/Andriod$ make sdk
编译过程中可能会遇到的问题。
   问题一:找不到bios.bin和vgabios-cirrus.bin文件
   couldn't locate source file: usr/share/pc-bios/bios.bin
   couldn't locate source file: usr/share/pc-bios/vgabios-cirrus.bin
   注意,这里的usr/share目录指的是~/Android/out/host/linux-x86目录下的usr/share目录,修改办法是复制~/Android/prebuilt/common下的pc-bios文件夹到~/Android/out/host/linux-x86/usr/share即可:
     ~/Android$ cp ~/Android/prebuilt/common/pc-bios ~/Android/out/host/linux-x86/usr/share
    问题二:找不到ddmlib-tests.jar、 ninepath-tests.jar 、common-tests.jar 和sdkuilib-tests.jar文件
    在~/Android/out/host/linux-x86/framework这个目录下,可以找到以下几个文件common.jar、ddmlib.jar、ninepatch.jar、sdkuilib.jar这四个文件,然后将它们分别复制一份,并重命名,命名的原则很简单,就是在原有的名字后面跟上-tests即可。
四:将编译好的Android镜像放到模拟器
1:设置环境变量:
~/Android$ export PATH=$PATH:~/Android/out/host/linux-x86/bin
~/Android$ export ANDROID_PRODUCT_OUT=~/Android/out/target/product/generic
其中,~/Android/out/host/linux-x86/bin有我们要执行的emulator命令,而~/Android/out/target/product/generic是Android镜像存放目录
2:运行模拟器
模拟器运行需要四个文件,分别是Linux Kernel镜像zImage和Android镜像文件system.img、userdata.img和ramdisk.img。执行emulator命令时,如果不带任何参数,则Linux Kernel镜像默认使用~/Android/prebuilt/android-arm/kernel目录下的kernel-qemu文件,而Android镜像文件则默认使用ANDROID_PRODUCT_OUT目录下的system.img、userdata.img和ramdisk.img,也就是我们刚刚编译出来的镜像问题。
~/Android$ emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir ./out/target/product/generic -system system.img -data userdata.img -ramdisk ramdisk.img
出现问题:qemu: could not load initrd 'ramdisk.img'
网上有更改权限解决: chmod 777 ~/out/target/product/generic
chmod 777 ~/out/target/product/generic/ramdisk.img

这里还是不行,所以就把 -ramdisk ramdisk.img 去掉,结果运行成功

单独编译Android源代码中的模块:
使用mmm命令来编译指定的模块,例如Email应用程序:
~/Android$ mmm packages/apps/Email/
编译完成之后,就可以在out/target/product/generic/system/app目录下看到Email.apk文件了。Android系统自带的App都放在这具目录下。另外,Android系统的一些可执行文件,例如C编译的可执行文件,放在out/target/product/generic/system/bin目录下,动态链接库文件放在out/target/product/generic/system/lib目录下,out/target/product/generic/system/lib/hw目录存放的是硬件抽象层(HAL)接口文件
编译好模块后,还要重新打包一下system.img文件,这样我们把system.img运行在模拟器上时,就可以看到我们的程序了。
~/Android$ make snod

~/Android$ emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir ./out/target/product/generic -system system.img -data userdata.img


参考: http://blog.csdn.net/luoshengyang/article/details/6559955
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值