文档章节

Android系统源码学习——编译并运行模拟器

 幸福阶梯
发布于 2017/04/23 21:20
字数 1093
阅读 8
收藏 0

编译Android模拟器:

在Ubuntu下,我们可以在源码里编译出自己的模拟器及SDK等编译工具,当然这个和windows里下载的看起来没有什么区别。

编译Android模拟器的步骤和编译Android系统很相似:

Ø source build/envsetup.sh

Ø lunch sdk-eng

Ø make sdk

在每次执行make的时候,编译系统会自动的验证上次编译项和这次编译项,如果两次不一样,会删除所有的目标代码,其实现在./build/core/main.mk。

71 # This allows us to force a clean build - includedafter the config.make  

72 # environment setup is done, but before we generateany dependencies.  This  

73 # file does the rm -rf inline so the deps which areall done below will  

74 # be generated correctly  

75 include $(BUILD_SYSTEM)/cleanbuild.mk  

我们将第75行注释掉,这样就不会每次都自动删除上次编译的中间代码重新编译了。

编译完之后效果如下图所示:

 

sdk安装在了下面的目录里:android_source/out/host/linux-x86/sdk

在该目录下有一个压缩包,里面就是我们从eclipse里更新下载指定Target的sdk包。

如果你做过app开发都会知道,我们只有下载了不同版本的sdk之后才能创建不同版本的模拟器。当我们编译完sdk之后就可以创建并运行Android4.0的模拟器了。

$ cd android_source/out/host/linux-x86/sdk/android-sdk_eng.linux_linux-x86/tools  

首先,查看当前编译出来的sdk的id号,用于创建一个模拟器:

$ android list targets

Available Android targets:  

----------  

id: 1 or "android-14"  

     Name:Android 4.0  

     Type:Platform  

     API level:14  

     Revision: 2  

     Skins:WXGA800, WQVGA400, WXGA720, HVGA, WVGA854, WQVGA432, WVGA800 (default), QVGA,WSVGA  

ABIs : no ABIs.  

创建一个模拟器:

$ android create avd -n mydroid -t 1  

注:-n 表示指定模拟器的名字, -t表示指定创建模拟的版本id

启动模拟器:

$ emulator -avd mydroid &

由于模拟器要启动android系统,它要使用几个映像文件,分别是:kernel-qemu , system.img, userdata.img, ramdisk.img

kernel-qemu:内核映像文件,它是Linux操作系统针对qemu模拟器编译的内核文件,里面安装有qemu的仿真硬件驱动,如果将来在开发板或手机上移植android,那么,第一步就是要先make出一个支持开发板或手机的kernel来。

system.img:是android系统的文件系统,里面包含了android系统的应用程序(apk),系统用到的各种库(jar, so, a)和资源,配置文件(etc目录下),系统命令(bin,usr/bin, xbin),该映像文件是由out/target/product/generic/system目录打包生成的,我们可以对这个目录里的东西进行定制化,比如,你要想让android系统默认为安装一个应用程序,那么可以将要安装的apk文件拷贝到out/target/product/PRODUCT/system/app目录下。

userdata.img:用户数据映像,里面包含有程序安装信息,好比如是windows的C:/Program Files/目录。

ramdisk.img:内存磁盘映像,这个文件对于没有做过Linux移植的人来说,不好理解,linux内核启动起来,要挂载一个文件系统作为自己的根文件系统,通常文件系统是存放在块设备上的,也就是硬盘或flash上的,里面含有Linux内核启动过程中依赖的一些程序和配置文件,前面所述的userdata.img和system.img映像,在linux系统启动起来后挂载到其data,system目录下。

我们可以通过下面的脚本run_emulator.sh,来指定Android模拟器来加载指定的映像文件:

#!/bin/bash  

PWD_PATH=`pwd`  

IMG_PATH=$PWD_PATH/out/target/product/generic  

export PATH=$PWD_PATH/out/host/linux-x86/sdk/android-sdk_eng.linux_linux-x86/tools:$PATH  

export ANDROID_PRODUCT_OUT=$PWD_PATH/out/target/product/generic  

export ANDROID_SWT=$PWD_PATH/out/host/linux-x86/framework  

emulator -kernel $PWD_PATH/kernel/goldfish/arch/arm/boot/zImage  

注:

ANDROID_PRODUCT_OUT:环境变量必须指定,emulator就是从该环境变量下查找所有的映像文件的

-kernel:指定内核映像

当然也可以分别指定每个映像文件,通过下面的命令:

$ emulator -kernel $PWD_PATH/kernel/goldfish/arch/arm/boot/zImage \  

-image $IMG_PATH/system.img \  

-data $IMG_PATH/userdata.img \  

-ramdisk $IMG_PATH/ramdisk.img  

注:

-system指定system.img

-data指定userdata.img

-ramdisk指定ramdisk.img

如果将来要运行adb shell连接模拟器的话,我们都要使用root权限,否则会出现:error:device not found的错误。

通过启动起来的Android系统->System Settings->About phone,可知使用的是我们自己编译的内核启动的。

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 92
码字总数 159283
作品 0
深圳
程序员
私信 提问
Android开发之 Android x86 高效android模拟器系统的搭建

有人问为什么Android虚拟机比iOS和WP7的虚拟机要慢很多呢?原因如下: 1. Android 模拟器模拟的是 ARM 的体系结构(arm-eabi),而 iOS 和 WP7 的模拟器的目标体系结构都是 x86 的,另外 iOS ...

长平狐
2012/08/29
263
0
打造自己的Android源码学习环境之六:运行Android模拟器

打造自己的Android源码学习环境之六:运行Android模拟器 0. 运行Android模拟器 接上一篇《打造自己的Android源码学习环境之五:编译Android源代码》。 如果是刚编译完,还没有退出Terminal,...

u013553529
2017/02/05
0
0
Windows环境下Android Studio系列7—ADB

Android开发环境中,ADB是我们进行经常要用的调试工具,它的使用当然是我们Android开发者必须要掌握的。 1. ADB概述 Android Debug Bridge,Android调试桥接器,简称adb,是用于管理模拟器或...

一配
2015/07/22
0
0
让你的模拟器不再卡:VirtualBox安裝 Android-x86 4.0

为什么Android虚拟机比iOS和WP7的虚拟机要慢很多呢?原因如下: 1. Android 模拟器模拟的是 ARM 的体系结构(arm-eabi),而 iOS 和 WP7 的模拟器的目标体系结构都是 x86 的,另外 iOS 的模拟器...

长平狐
2012/10/09
434
0
android 内核编译 无法启动模拟器

Android源码,编译也通过了,可以正常启动模拟器。但是Android源码内是不包含kernel源码的模拟器,添加自己新编译的内核就启动不了 启动新编译的内核的模拟器的命令如下: 但是就是启动不了,...

andy521zhu
2014/05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

jenkins安装

https://my.oschina.net/u/593517/blog/1797968 jenkins 安装 https://my.oschina.net/u/593517/blog/3028175 GIT 安装 https://my.oschina.net/u/593517/blog/3028179 maven 安装 插件安装 ......

Gm_ning
31分钟前
2
0
小言服务端解决方案-监控

框架保证方向,整体包容细节 为保证服务端运行平稳正常,owner应使得系统应保有相应的监控:系统监控,业务监控。而服务运行的平稳高效是否有保障跟监控粒度又成直接的正比关系。本文仅针对开...

重城重楼
42分钟前
2
0
搜索引擎(Elasticsearch搜索详解)

学完本课题,你应达成如下目标: 掌握ES搜索API的规则、用法。 掌握各种查询用法 搜索API 搜索API 端点地址 GET /twitter/_search?q=user:kimchy GET /twitter/tweet,user/_search?q=user:...

这很耳东先生
今天
7
0
浅谈如何减少GC的次数

GC会stop the world。会暂停程序的执行,带来延迟的代价。所以在开发中,我们不希望GC的次数过多。 本文将讨论如何在开发中改善各种细节,从而减少GC的次数。 (1)对象不用时最好显式置为 Nu...

浮躁的码农
今天
1
0
jpa 自定义返回对象

任何ORM框架都少不了开放自定义sql的问题。jpa自然也不例外,很多场景需要写复杂sql的。 首先定义一个方法签名,然后打上@Query注解。像下面这样,需要注意nativeQuery,这个表示query中的字...

朝如青丝暮成雪
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部