• 源码编译运行android emulator


    source buile/envsetup.sh

    lunch sdk-eng

    make sdk -j2

    编译完之后,sdk安装在了下面的目录里

    ANDROIID_DIR/out/host/linux-x86/sdk

    在这个目录下有一个压缩包,里面就是我们从eclipse里下载的sdk的包。

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

    $ cd ANDROIID_DIR/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 &

    由于模拟器要启动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的根文件系统里面通常包含有以下内容:

    usr:最大的目录,存放应用程序和文件

    bin:常用的命令目录

    etc:系统相关配置文件目录

    dev:系统设备目录

    opt:主机额外安装的软件目录

    boot:存放系统启动时必须读取的配置文件,包括核心 (kernel) 在内

    home:普通用户家目录

    lib:系统使用库目录

    var:日志文件目录

    lost+found:系统不正常产生错误时,会将一些遗失的片段放置于此目录下

    mnt:外设的挂载点目录

    proc:虚拟文件目录,是系统信息的映射

    root:root用户家目录

    sbin:超级命令所在目录

    tmp:一般使用者或者是正在执行的程序暂时放置文件的地方

    而ramdisk.img这个映像,其实里面就是上述目录和一些基本配置文件的打包映像,ramdisk是将映像加载到内存里,然后将内存当做一个块设备(硬盘)来使用,所以说通常ramdisk.img通常比较小。当然,除了上面的FHS标准的Linux文件系统目录以外,android系统里,还增加了data,system目录。

    前面所述的userdata.img和system.img映像,其实就是挂载到data,system目录下的。

    我们可以通过下面的命令,来指定模拟器,启动哪个内核,使用哪些文件系统:

    ./emulator -avd mydroid -system ANDROIID_DIR/out/target/product/generic/system.img  -data ANDROIID_DIR/out/target/product/generic/userdata.img -ramdisk ANDROIID_DIR/out/target/product/generic/ramdisk.img  -kernel ANDROIID_DIR/prebuilt/android-arm/kernel/kernel-qemu-armv7
    -system指定system.img

    -data指定userdata.img

    -ramdisk指定ramdisk.img

    -kernel指定内核映像

    实验:对androd系统进行瘦身

    android系统抽屉里显示的应用存放在out/target/product/PRODUCT/system/app目录里,我们可以将一些不 常用的,不想用的apk文件删除,一来减小Android的体积,二来可以加快系统启动速度,因为在系统启动时,会扫描system/app目录下的 apk文件,对比有没有安装更新。

    删除一些apk,去掉计算器,日历,电话,短信

    $ rm -f ANDROIID_DIR/out/target/product/PRODUCT/system/app/Calculator.*

    $ rm -f ANDROIID_DIR/out/target/product/PRODUCT/system/app/Calendar.*

    $ rm -f ANDROIID_DIR/out/target/product/PRODUCT/system/app/Email.*

    $ rm -f ANDROIID_DIR/out/target/product/PRODUCT/system/app/Message.*

    $ rm -f ANDROIID_DIR/out/target/product/PRODUCT/system/app/Telephone.*

    删除了之后,执行下面的命令,只编译system.img,而不去检查依赖关系,这样很快就能编译完

    $ make snod

    注:上述命令必须要保证执行了source buile/envsetup.sh和lunch full-eng之后,以后只要是说make,都指已经执行了前述两步骤

    snod的意思是编译system imge no dependency

    然后,再重新启动模拟器,指定自己编译的system.img,查看抽屉里有没有我们删除的应用

    ./emulator -avd mydroid -system ANDROIID_DIR/out/target/product/generic/system.img  -data ANDROIID_DIR/out/target/product/generic/userdata.img -ramdisk ANDROIID_DIR/out/target/product/generic/ramdisk.img  -kernel ANDROIID_DIR/prebuilt/android-arm/kernel/kernel-qemu-armv7

    思考:我们能不能将全部的system/app下的apk删除掉,如果不能,哪些必须要保留,为什么?

  • 相关阅读:
    c#代码:使用假设的方法遍历解决“谁养鱼”问题(据说是爱因斯坦所出的一道推理题) 无为而为
    远洋地暖的使用步骤
    合伙人四大原则
    model y搭载60度磷酸铁锂电池的续航表现
    model3家用充电桩按220V还是380V区别?
    食用油的挑选标准
    职责链模式(Chain of Responsibility)
    通用数据链接(UDL)的用法
    Oracle REGEXP_INSTR 用法
    访问者模式(Visitor)
  • 原文地址:https://www.cnblogs.com/wxishang1991/p/5680297.html
Copyright © 2020-2023  润新知