记一次编译安卓模拟器镜像
背景
想要编译一个自己的framework,用来在系统api中插入自己的代码,监听一下应用的行为,比如获取imei,获取网络。最直接的想法就是,修改安卓源码,直接编译出一个系统镜像,给模拟器使用。
准备:
因为之前编译过android.jar,所以源码环境还有,直接开工,或者看以前编译的文章有讲。
修改代码,比如找到TelephonyManager.java,在getDeviceId()中插入自己的代码。
编译
1 | source ./build/envsetup.sh |
注意:下面的部分是官方写的,如何编译一个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),有需要系统会提示的,根据系统提示操作。
运行
- 缺少kernel-ranchu,复制一个解决
- 开机黑屏,AVD Manager下,点击编辑,Emulated Performance - Graphics:改为SoftWare(尚不清楚其它解决方案)。关于这个黑屏,尝试好多次,启动后也有日志提示
EGL_emulation: tid 1232: eglCreateImageKHR(1206): error 0x300c E/GLConsumer: error creating EGLImage: 0x300c
,我一直以为是镜像的问题,试了几个版本,一直不行,最后几经搜索才找到改Graphics的方案,很是郁闷。
记录
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
3PROP_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 1281
2make clobber
make sdk sdk_repojack服务错误,因为我是在6.0的源码上编译,还是使用的jack,报了两次服务没启动后,我就直接关了,修改为下面的SERVER=false
1
2
3
4
5
6
7
8
9
10
11
12
13vi ~/.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=2make 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
24Building 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拿来用了。有兴趣的可以自己试试。