记一次编译安卓模拟器镜像

背景

想要编译一个自己的framework,用来在系统api中插入自己的代码,监听一下应用的行为,比如获取imei,获取网络。最直接的想法就是,修改安卓源码,直接编译出一个系统镜像,给模拟器使用。

准备:

  1. 因为之前编译过android.jar,所以源码环境还有,直接开工,或者看以前编译的文章有讲。

  2. 修改代码,比如找到TelephonyManager.java,在getDeviceId()中插入自己的代码。

编译

1
2
3
4
source ./build/envsetup.sh
lunch sdk_phone_x86-userdebug
make update-api
make -j16 sdk sdk_repo

注意:下面的部分是官方写的,如何编译一个sdk给别人也能用。但我没有成功,make sdk_repo的时候,失败了

host/linux-x86/sdk/sdk_phone_x86下找到两个文件

  • sdk-repo-linux-system-images-eng.[username].zip
  • repo-sys-img.xml

将这两个文件放到你服务器可访问的位置,记下url。再将xml中的<sdk:url>替换成zip的url。

在SDK Manager中,点击 SDK Update Sites 添加你的xml的url。

我的操作:直接将zip下载下来解压,替换原来sdk对应的system-image,如/sdk/system-images/android-23/default/x86

说明

如果没有修改代码,是不需要make update-api的,但是有代码修改后,make过程中,会提示你使用make update-api。我在make sdk的过程中,还提示要make update-support-api(不大记得是update-support-api还是support-update-api),有需要系统会提示的,根据系统提示操作。

运行

  1. 缺少kernel-ranchu,复制一个解决
  2. 开机黑屏,AVD Manager下,点击编辑,Emulated Performance - Graphics:改为SoftWare(尚不清楚其它解决方案)。关于这个黑屏,尝试好多次,启动后也有日志提示EGL_emulation: tid 1232: eglCreateImageKHR(1206): error 0x300c E/GLConsumer: error creating EGLImage: 0x300c,我一直以为是镜像的问题,试了几个版本,一直不行,最后几经搜索才找到改Graphics的方案,很是郁闷。

记录

  1. error: ro.build.fingerprint cannot exceed 91 bytes:

    1
    error: ro.build.fingerprint cannot exceed 91 bytes:

    编辑build/tools/post_process_props.py。更改行,如下所示:

    1
    2
    3
    PROP_NAME_MAX = 31
    # PROP_VALUE_MAX = 91
    PROP_VALUE_MAX = 128

    编辑bionic/libc/include/sys/system_properties.h。更改行,如下所示:

    1
    2
    3
    #define PROP_NAME_MAX   32
    // #define PROP_VALUE_MAX 92
    #define PROP_VALUE_MAX 128
    1
    2
    make clobber
    make sdk sdk_repo
  2. jack服务错误,因为我是在6.0的源码上编译,还是使用的jack,报了两次服务没启动后,我就直接关了,修改为下面的SERVER=false

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    vi ~/.jack

    # Server settings
    SERVER=false
    SERVER_PORT_SERVICE=8072
    SERVER_PORT_ADMIN=8073
    SERVER_COUNT=1
    SERVER_NB_COMPILE=4
    SERVER_TIMEOUT=60
    SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}
    JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}
    # Internal, do not touch
    SETTING_VERSION=2
  3. make sdk_repo错误,生成的xml中值校验不通过。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Building SDK repository package system-images from android-sdk_eng.root_linux-x86.zip
    ## Using xmlns:sdk=http://schemas.android.com/sdk/android/addon/2
    ## Using root element sdk-addon
    ## Add support/linux archive out/host/linux-x86/sdk/sdk_phone_x86//sdk-repo-linux-support-eng.root.zip
    ## Validate XML against schema
    <?xml version="1.0"?>
    <sdk:sdk-addon xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sdk="http://schemas.android.com/sdk/android/addon/2">
    <sdk:extra>
    <sdk:revision>23.0.1</sdk:revision>
    <sdk:vendor>android</sdk:vendor>
    <sdk:path>support</sdk:path>
    <sdk:archives>
    <sdk:archive os="linux">
    <sdk:size>5504615</sdk:size>
    <sdk:checksum type="sha1">d7d984cfe9288f2cd32bb1601a138de32724faa2</sdk:checksum>
    <sdk:url>sdk-repo-linux-support-eng.root.zip</sdk:url>
    </sdk:archive>
    </sdk:archives>
    </sdk:extra>
    </sdk:sdk-addon>
    out/host/linux-x86/sdk/sdk_phone_x86/repo-extras.xml:6: element revision: Schemas validity error : Element '{http://schemas.android.com/sdk/android/addon/2}revision': '23.0.1' is not a valid value of the atomic type 'xs:positiveInteger'.
    out/host/linux-x86/sdk/sdk_phone_x86/repo-extras.xml fails to validate
    make: *** [out/host/linux-x86/sdk/sdk_phone_x86/repo-extras.xml] 错误 3
    make: *** 正在删除文件“out/host/linux-x86/sdk/sdk_phone_x86/repo-extras.xml”

    应该是xml中revision不是整数的问题。这个我就很郁闷,明明xml是自己生成的,偏偏校验不通过,make文件在development/build/tools/mk_sdk_repo_xml.sh里,xsd的文件在prebuilts/devtools/repository找到了,后续我也没改,直接把zip拿来用了。有兴趣的可以自己试试。