Android系统移植与平台开发- 编译并运行Android4.0模拟器
来源:互联网 发布:淘宝卖假药 编辑:程序博客网 时间:2024/06/06 02:28
作者:唐攀,华清远见嵌入式培训讲师。
1. 编译Android模拟器
在Ubuntu下,我们可以在源码里编译出自己的模拟器及SDK等编译工具,当然这个和在windows里下载的看起来没有什么区别。(Android SDK开发环境搭建)
编译Android模拟器的步骤和编译Android系统很相似:
Ø build/envsetup.sh
Ø lunch sdk-eng
Ø make sdk
在每次执行make的时候,编译系统会自动的验证上次编译项和这次编译项,如果两次不一样,会删除所有的目标代码,其实现在./build/core/main.mk
[plain] view plaincopyprint?
1. 71 # This allows us to force a clean build - includedafter the config.make
2. 72 # environment setup is done, but before we generateany dependencies. This
3. 73 # file does the rm -rf inline so the deps which areall done below will
4. 74 # be generated correctly
5. 75 include $(BUILD_SYSTEM)/cleanbuild.mk
我们将第75行注释掉,这样就不会每次都自动删除上次编译的中间代码重新编译了。
编译完之后效果如下图所示:
sdk安装在了下面的目录里:
[plain] view plaincopyprint?
1. WORKING_DIRECTORY/out/host/linux-x86/sdk
在该目录下有一个压缩包,里面就是我们从eclipse里更新下载指定Target的sdk包。
如果你做过app开发都会知道,我们只有下载了不同版本的sdk之后才能创建不同版本的模拟器。当我们编译完sdk之后就可以创建并运行Android4.0的模拟器了。
[plain] view plaincopyprint?
1. $ cd WORKING_DIRECTORY/out/host/linux-x86/sdk/android-sdk_eng.linux_linux-x86/tools
首先,查看当前编译出来的sdk的id号,用于创建一个模拟器:
[plain] view plaincopyprint?
1. $ ./android list targets
2. Available Android targets:
3. ----------
4. id: 1 or "android-14"
5. Name:Android 4.0
6. Type:Platform
7. API level:14
8. Revision: 2
9. Skins:WXGA800, WQVGA400, WXGA720, HVGA, WVGA854, WQVGA432, WVGA800 (default), QVGA,WSVGA
10. ABIs : no ABIs.
创建一个模拟器
[plain] view plaincopyprint?
1. $ ./android create avd -n mydroid -t 1
注:-n 表示指定模拟器的名字, -t表示指定创建模拟的版本id
启动模拟器
[plain] view plaincopyprint?
1. $ ./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/PRODUCT/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模拟器来加载指定的映像文件:
[plain] view plaincopyprint?
1. #!/bin/bash
2. PWD_PATH=`pwd`
3. IMG_PATH=$PWD_PATH/out/target/product/generic
4. exportPATH=$PWD_PATH/out/host/linux-x86/sdk/android-sdk_eng.linux_linux-x86/tools:$PATH
5. exportANDROID_PRODUCT_OUT=$PWD_PATH/out/target/product/generic
6. export ANDROID_SWT=$PWD_PATH/out/host/linux-x86/framework
7. emulator-kernel$PWD_PATH/kernel/goldfish/arch/arm/boot/zImage
注:
ANDROID_PRODUCT_OUT:环境变量必须指定,emulator就是从该环境变量下查找所有的映像文件的
-kernel:指定内核映像
当然也可以分别指定每个映像文件,通过下面的命令:
[plain] view plaincopyprint?
1. $ emulator-kernel$PWD_PATH/kernel/goldfish/arch/arm/boot/zImage\
2. -image $IMG_PATH/system.img \
3. -data $IMG_PATH/userdata.img\
4. -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,可知使用的是我们自己编译的内核启动的。
推荐阅读:Android系统移植与平台开发- 准备Android开发环境
- 深入浅出 - Android系统移植与平台开发(三)- 编译并运行Android4.0模拟器
- Android系统移植与平台开发- 编译并运行Android4.0模拟器
- 深入浅出 - Android系统移植与平台开发(三)- 编译并运行Android4.0模拟器
- 深入浅出 - Android系统移植与平台开发(三)- 编译并运行Android4.0模拟器
- 深入浅出 - Android系统移植与平台开发(三)- 编译并运行Android4.0模拟器
- 编译并运行Android4.0模拟器
- 深入浅出 - Android系统移植与平台开发(五)- 定制手机模拟器ROM
- 深入浅出 - Android系统移植与平台开发(五)- 定制手机模拟器ROM
- 深入浅出 - Android系统移植与平台开发(五)- 定制手机模拟器ROM
- 深入浅出 - Android系统移植与平台开发(五)- 定制手机模拟器ROM
- 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统
- 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统
- 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统
- 深入浅出 - Android系统移植与平台开发
- 深入浅出 - Android系统移植与平台开发
- 深入浅出 - Android系统移植与平台开发(五)- 编译Android源码
- 深入浅出 - Android系统移植与平台开发(五)- 编译Android源码
- 深入浅出 - Android系统移植与平台开发(四)- 搭建Linux编译环境
- IE浏览器table中的TD无数据边框不显示问题
- iOS 6的Rotation 问题简述!
- 图片浏览程序初始设置
- struct和typedef struct彻底明白了
- HDU1026——Ignatius and the Princess I(BFS)
- Android系统移植与平台开发- 编译并运行Android4.0模拟器
- C++ 实现求二叉树的深度及遍历(递归与非递归算法)
- Kconfig文件结构
- 基于Android智能终端的远程控制系统
- 国家广电总局SARFT
- 各大IT公司待遇—公司更多,数据更加真实(最终版)
- 8 基本UDP套接字编程
- C++与LUA交互
- JTabbedPane的使用