Mac OS上进行android开发
1. 开机设置ok后,打开app store升级系统到10.9.1,好处是能免费获取那几款办公软件,嘿嘿!
2. 安装Xcode,打开终端,输入make之类的指令会提示安装command line tools,安装。jdk默认就有了,不用再装。
3. 安装homebrew,上其官网下载。homebre对于习惯了apt搞掂一切的人来说真是福音。使用方法brew help。
4. 从android网站上下载已经配置好的eclipse,叫ADT,安装到某位置。
5. 创建一个大小写敏感的分区镜像:
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg
其中40g是指大小,基本够用了。~/android.dmg指定生成镜像位置和名字,不过实际生成的镜像文件名字叫android.dmg.sparseimage
然后挂载:
hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android
实际的挂载点随自己喜欢了,将android源码移动到/Volumes/android中。
6. 确保安装了git,python,make(3.82)gnupg
7. 进入android4.4,编译,选择了aosp_arm-env
PS:
实际在将一份代码移动到/Volume/android时,我犯了错误。从大小写不敏感的分区到敏感分区,导致许多文件的丢失。
后来决定在此分区下载一份代码,结果历时8天。这么艰辛,所以想分享一些东西而让后来者少走弯路。
首先,除非网速很快,否则在合理的时间内同步完代码是不可能的。因为众所周知的原因,网络会周期性的断开,网上流传的循环脚本很低效。
android里面不是每个project都能断点续传的。比如framework/base,有1G多大小,需要保证很长时间的稳定网络,否则从新来过。
这样折腾之后,你会发现project目录下产生了大量的tmp开头的临时文件,这些都是垃圾。而每次都是百分之八九十就出错是很抓狂的,循环脚本根本无法解决这个问题。再者,由于网络不稳定,同步的进程经常会僵死。很多时候你挂机一晚上,早上起来一看,就那么不动了一晚上。这个循环脚本也无法解决。
那怎么解决的呢?vpn,代理,这些才是正道。
而进程僵死的问题,挂了vpn也还是会偶尔出现的,这就需要-j参数来限定线程数,经验而言线程越多死得越频繁,这个不知是网络原因还是python脚本问题。
另外,-c参数能使repo只同步你指定分支,所以能大大减少数据量,加快同步速度。
完成之后,repo forall -c git gc能优化git仓库文件,加上删除临时文件,最终同步完得代码大小时20G。
作为一个码农,这些是饭碗。我安分守纪,仅想靠劳动混口饭吃怎么就那么辛酸。
就为了一泄私愤,搞这些东西,浪费了电,浪费了带宽,更浪费了无价的时间。
所以,某党和某人,你们不得好死!
Pandaboard ES kernel
目前似乎还没有一个支持完整的内核配置,可能Pandaboard ES的有些驱动还在开发中吧。于是我使用目前开发中的内核,并使用其中的omap2plus_defconfig配置。这个配置似乎是涵盖了mach-omap2里面的所有设备的,所以应该是能启动起来的。
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
修改其中的Makefile中
ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-
这里有个疑虑,我使用的编译器是arm-2009q3的,不知能否支持ARMv7指令集呢,现不管,试下先。
mkdir ../build-image
make omap2plus_defconfig O=../build-image
make O=../build-image -j4
make O=../build-image uImage
此时提示找不到mkimage指令,赶紧到build-boot/tools目录(见前一篇文章)下拷贝mkimage到/usr/bin。然后再来,OK啦!输出如下:
Using /home/jc/panda/linux as source for kernel
GEN /home/jc/panda/build-image/Makefile
CHK include/linux/version.h
CHK include/generated/utsrelease.h
make[2]: “include/generated/mach-types.h”是最新的。
CALL /home/jc/panda/linux/scripts/checksyscalls.sh
CHK include/generated/compile.h
CHK kernel/config_data.h
Kernel: arch/arm/boot/Image is ready
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
Image Name: Linux-3.6.0-rc5-00315-g3f0c3c8-d
Created: Sun Sep 16 22:54:17 2012
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4065584 Bytes = 3970.30 kB = 3.88 MB
Load Address: 80008000
Entry Point: 80008000
Image arch/arm/boot/uImage is ready
将uImage丢到SD卡boot分区,插入Pandaboard上电,OK!
Uncompressing Linux... done, booting the kernel.
[ 0.000000] Booting Linux on physical CPU 0
[ 0.000000] Linux version 3.6.0-rc5-00315-g3f0c3c8-dirty (jc@debian) (gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67) ) #12
[ 0.000000] CPU: ARMv7 Processor [412fc09a] revision 10 (ARMv7), cr=10c53c7d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] Machine: OMAP4 Panda board
[ 0.000000] Reserving 16777216 bytes SDRAM for VRAM
[ 0.000000] Memory policy: ECC disabled, Data cache writealloc
[ 0.000000] OMAP4460 ES1.1
......
[ 2.475982] Kernel panic - not syncing: No init found. Try passing init= option to kernel. See Linux Documentation/init.t.
[ 2.489135] CPU1: stopping
[ 2.491973] [<c001cc08>] (unwind_backtrace+0x0/0xf4) from [<c001a9b4>] (handle_IPI+0x130/0x15c)
[ 2.501098] [<c001a9b4>] (handle_IPI+0x130/0x15c) from [<c00084f0>] (gic_handle_irq+0x58/0x60)
[ 2.510131] [<c00084f0>] (gic_handle_irq+0x58/0x60) from [<c05033e4>] (__irq_svc+0x44/0x5c)
[ 2.518859] Exception stack(0xee06ff88 to 0xee06ffd0)
[ 2.524169] ff80: 00008348 00000001 00000000 ee0660c0 ee06e000 c07ce448
[ 2.532714] ffa0: c050e4e8 c0755e20 00000000 412fc09a c0756040 00000000 00000001 ee06ffd0
[ 2.541290] ffc0: 00008349 c0015f54 20000113 ffffffff
[ 2.546569] [<c05033e4>] (__irq_svc+0x44/0x5c) from [<c0015f54>] (default_idle+0x20/0x44)
[ 2.555145] [<c0015f54>] (default_idle+0x20/0x44) from [<c00167a8>] (cpu_idle+0x9c/0x114)
[ 2.563690] [<c00167a8>] (cpu_idle+0x9c/0x114) from [<804fc274>] (0x804fc274)
因为SD卡的rootfs分区还是空的,内核跑到这无法启动init进程,接下来就是构建根文件系统了!
Pandaboard ES bootloader
Pandaboard ES使用SD卡作为存储介质,而非常用的NAND。它的omap4460 ROM code能够读取SD卡第一个FAT分区上的文件,因而只需把编译好的bootloader放进这个分区即可。不需要特别的烧录过程,挺方便的,但是频繁插拔卡还是有些麻烦,但是应为用的是u-boot,这个问题其实有解决的办法。
进入正题,首先SD卡的制作过程参见:http://omappedia.org/wiki/Minimal-FS_SD_Configuration 显然omap4460 ROM code对heads、sectors一些参数是有要求的,按照里面的流程做好就行。
然后是u-boot代码和编译了。现在u-boot主干已经支持omap4460了。
git clone git://git.denx.de/u-boot.git
cd u-boot
mkdir ../build-boot
make O=../build-boot omap4_panda_config
make O=../build-boot
如无意外,完成后在目录build-boot中有MLO和u-boot.img,把它们拷贝到SD卡的第一个分区中。然后把SD卡插入pandaboard,打开minicom,插上电源可看见如下信息:
Welcome to minicom 2.4
OPTIONS: I18n
Compiled on Sep 5 2010, 09:23:03.
Port /dev/ttyS0
Press CTRL-A Z for help on special keys
U-Boot SPL 2012.07-00135-ge66443f (Sep 01 2012 - 20:55:40)
OMAP4460 ES1.1
OMAP SD/MMC: 0
reading u-boot.img
reading u-boot.img
U-Boot 2012.07-00135-ge66443f (Sep 01 2012 - 20:55:40)
CPU : OMAP4460 ES1.1
Board: OMAP4 Panda
I2C: ready
DRAM: 1 GiB
MMC: OMAP SD/MMC: 0
Using default environment
In: serial
Out: serial
Err: serial
Net: No ethernet found.
Hit any key to stop autoboot: 0
reading boot.scr
** Unable to read "boot.scr" from mmc 0:1 **
reading uImage
** Unable to read "uImage" from mmc 0:1 **
至此,pandaboard的引导部分完成,下一步是制作uImage。
入手Pandaboard ES
今年早些时候入手的Pandaboard ES,很贵但很值得。这块板子如果不出故障够我玩好几年的了。
主要特性见官网:http://pandaboard.org/content/pandaboard-es
6410已经被果断抛弃了,只在某些时候验证问题用。因为软件支持上没有omap开放。