Linux下编译和安装android系统
上一篇文章说到我们已经下载好了android源码并解压,接下来我们terminal进到解压后的目录。利用make命令,开始编译android系统。
1.编译android系统
结果报错了:Your version is: java version "1.6.0_24". The correct version is: Java SE 1.6。原来是需要1.6的jdk,我之前安装的是1.7的。解决办法如下:
$sudo add-apt-repository
"deb http://security.ubuntu.com/ubuntu hardy-security main multiverse"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk
在终端中执行:make -j4
-j4:表示用四个线程来编译,这样相对能快点:
恩,不错,开始编译了。编译时间比较长,我们可以去睡个觉。编译好的东西放在这个目录下
larson@larson-pc ~/Android_Dev/Android4_4source/out/target/product/generic $ ls
android-info.txt cache.img data fake_packages obj ramdisk.img symbols system.img
cache clean_steps.mk dex_bootjars installed-files.txt previous_build_config.mk root system userdata.img
PS:经过多次测试之后,我发现这个make编译可以断点续编,因此如果突然断电,没有关系,继续编译就好了,总有一天会编译成功的!完了以后我这里出现了个这:
+ echo make_ext4fs -S out/target/product/generic/root/file_contexts -l 69206016 -a cache out/target/product/generic/cache.img out/target/product/generic/cache
make_ext4fs -S out/target/product/generic/root/file_contexts -l 69206016 -a cache out/target/product/generic/cache.img out/target/product/generic/cache
+ make_ext4fs -S out/target/product/generic/root/file_contexts -l 69206016 -a cache out/target/product/generic/cache.img out/target/product/generic/cache
Creating filesystem with parameters:
Size: 69206016
Block size: 4096
Blocks per group: 32768
Inodes per group: 4224
Inode size: 256
Journal blocks: 1024
Label:
Blocks: 16896
Block groups: 1
Reserved block group size: 7
Created filesystem with 11/4224 inodes and 1302/16896 blocks
+ '[' 0 -ne 0 ']'
out/target/product/generic/cache.img maxsize=70654848 blocksize=2112 total=69206016 reserve=713856
代表编译成功,恭喜恭喜!
2.安装编译好的Android镜像到模拟器上
2.1设置环境变量
$export PATH=$PATH:~/Android_Dev/android4_4source/out/host/linux-x86/bin
$export ANDROID_PRODUCT_OUT=~/Android_Dev/android4_4source/out/target/product/generic
其中,~/Android_Dev/android4_4source/out/host/linux-x86/bin
有我们要执行的emulator命令 ,而~/Android_Dev/android4_4source/out/target/product/generic
是Android镜像存放目录, 下面执行emulator命令时会用到。
2.2运行模拟器
模拟器运行需要四个文件,分别是Linux
Kernel镜像zImage和Android镜像文件system.img、userdata.img和ramdisk.img。执行emulator
命令时,如果不带任何参数,即只输入emulator命令,则Linux
Kernel镜像默认使用~/Android/prebuilt/android-arm/kernel目录下的kernel-qemu文件,而
Android镜像文件则默认使用ANDROID_PRODUCT_OUT目录下的system.img、userdata.img和ramdisk.img,
也就是我们刚刚编译出来的镜像问题。
我们也可以以指定的镜像文件来运行模拟器,即运行emulator时,即:
$emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir./out/target/product/generic -system system.img -data userdata.img -ramdisk ramdisk.img
不同版本的android源码的kenel文件可能在不同位置,上面那个是android2.3的,而4.0的则是这样的:
$ emulator -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu -sysdir ./out/target/product/generic -system system.img -data userdata.img -ramdisk ramdisk.img
执行之后,我这里报了一个错误:
qemu: could not load initrd 'ramdisk.img'
于是,我按照网上说的办法,把-ramdisk ramdisk.im去掉,模拟器果然跑起来了,可是进不去系统,然后呢。。。我又百度,然后说需要chmod 777 generic/,执行之,有个系统分区太小的错误
emulator: WARNING: system partition size adjusted to match image file (550 MB > 200 MB)
然后我百度找到的答案是,emulator 加入参数 -partition-size 1024 ,即:
emulator -partition-size 1024 -system sytem.img -data userdata.img -ramdisk ramdisk.img
还是不行,然后我又修改成除了chmod 777 外,还需要执行时加上绝对路径,最终执行的代码如下:
$ emulator -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7 -sysdir ./out/target/product/generic -partition-size 1024 -system system.img -data userdata.img -ramdisk ./out/target/product/generic/ramdisk.img
到了这里,我们已经指定内核运行我们编译好的安卓系统了,有没有很开心啊?有啊 有啊。