《Android深度探索卷一》读书笔记四
下载,编译和测试Android源代码
1.配置Android源代码下载环境
下载之前必须先在Linux终端执行一些命令配置环境。
创建存放脚本文件的目录“mkdir ~/bin””PATH=~/bin:$PATH”;下载repo脚本文件“curl 地址 > ~/bin/repo””chmod a+x ~/bin/repo”;创建存放Android源代码的目录“mkdir android_source”“cd android_source”;初始化“repo init -u 地址”;
2.开始下载Android源代码
“repo sync”下载时占带宽,且会有4h或更长时间,也依机器性能而定。
Android源代码目录:
3.下载指定工程:
方法1.“repo sync platfrom/工程名”。
其中获取相关信息通过文件manifest.xml:其中每一行代表一个工程,path表示工程路径,name表示工程名。还可知道当前源代码相关信息。
方法2.“git clone 地址<工程名>”。
4.编译Android源代码
编译之前进入源代码根目录。
4.1.初始化编译环境“source build/envsetup.sh”envsetup.sh脚本文件用来初始化编译命令,其中定义了一些shell函数。“mm”和“mmm”可以编译Android源代码中指定的工程。
4.2.选择目标:“lunch full-eng”选择针对所有移动设备,Android模拟器有效,并打开所有调试选项。默认“full-eng”,可用序号选择其他。
4.3.编译Android源代码“make”,4核可用“make -j4”。时间会长,编译成功后,在Android源代码根目录会生成out目录,所有编译的目标文件都在这个目录中。
4.4.out文件夹目录结构如下所示:
out/
-- CaseCheck.txt
-- casecheck.txt
-- host
-- common
-- linux-x86/darwin-x86
-- target(如果编译时候定义TARGET_STRIP_MODULE=false的话,这个目录为debug/target)
-- common
-- product
主要的两个目录为host和target,前者表示在主机(x86)生成的工具,后者表示目标机(模认为ARMv5)运行的内容。
host目录的结构如下所示:
out/host/
-- common
-- obj(Java库)
-- linux-x86/darwin-x86
-- bin(二进制程序)
-- framework(JAVA库,*.jar文件)
-- lib(共享库*.so)
-- obj(中间生成的目标文件)
host目录是一些在主机上用的工具,有一些是二进制程序,有一些是JAVA的程序。
target目录的结构如下所示:
out/target/
-- common
-- R (资源文件)
-- docs
-- obj (目标文件)
-- APPS(包含了JAVA应用程序生成的目标,每个应用程序对应其中一个子目录,将结合每个应用程序的原始文件生成Android应用程序的APK包)
-- JAVA_LIBRARIES(包含了JAVA的库,每个库对应其中一个子目录)
-- product
-- generic
-- android-info.txt
-- clean_steps.mk
-- data(存放数据的文件系统)
-- obj
-- APPS(包含了各种JAVA应用,与common/obj/APPS相对应,但是已经打成了APK包)
-- SHARED_LIBRARIES(存放所有动态库)
-- STATIC_LIBRARIES(存放所有静态库)
-- ramdisk.img(内存盘的根文件系统映像)
-- root
-- symbols
-- system(存放主要的文件系统)
-- system.img(文件系统的映像)
-- userdata-qemu.img(模拟器使用的数据文件)
-- userdata.img(数据内容映像)
5.将自己的APK作为Android内置程序发布
apk是zip格式,odex格式文件是分离apk和classes.dex文件得到。复制工程目录到Android源代码目录/packagea/apps,在终端执行“mm”编译,成功后会在system/app目录中生成.apk和.odex文件。
6.用模拟器测试system.img文件
添加了新新程序,需新生成system.img文件。在<Android源代码目录>/out/target/product/generic目录下,执行“mkyaffs2image system system.img”生成新的system.img文件。
在PATH中添加<Android SDK根目录>/tools目录,打开AVD,执行“emulator -avd myavd -system system.img -data userdata.img”,Android模拟器会用新的数据启动。该程序是嵌入了Android系统中,无法常规卸载。除非删除.apk和.odex文件,重新生成system.img文件启动Android模拟器。