- Android核心原理与系统级应用高效开发
- 韩超等
- 2298字
- 2020-08-28 23:36:12
1.2 Android的开发环境
↘ 1.2.1 开发环境
Android的Linux开发环境一般使用Ubuntu主机。在基于Ubuntu的主机环境中,开发Android主机环境包括以下需求:git工具、repo工具、Java的JDK、主机编译工具等几个方面。编译过程中的主要目标机的编译工具则在Android的源代码包中自带。
Java 6开发包(SUN标准的JDK 6)的安装方式如下所示:
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" $ sudo apt-get update $ sudo apt-get install sun-java6-jdk
Java 5开发包(SUN标准的JDK 5)的安装方式如下所示:
$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy main multiverse" $ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy-updates main multiverse" $ sudo apt-get update $ sudo apt-get install sun-java5-jdk
在Android 1.6至Android 2.2发布版本中,Android系统要求使用Java 5来编译系统;Android 2.3.x之后要求使用Java 6进行编译。
配置Java运行环境和javac编译器的方法如下所示:
$ update-alternatives --config java $ update-alternatives --config javac
● 提示:不同版本的JDK可以共存,可以通过update-alternatives进行配置选择。
Android系统在编译的过程中需要编译主机的工具,因此需要使用主机的GCC工具链。而对于编译目标机文件,Android在prebuilt目录中集成了GCC交叉编译工具链。
新版本Android源代码编译应当使用64位的主机环境,配置方式如下所示:
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \ x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \ libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \ libxml2-utils
而32位的主机开发环境,配置方式如下所示:
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev \ libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown \ libxml2-utils
repo是调用git封装的工具,安装repo的准备工作如下所示:
$ mkdir ~/bin $ PATH=~/bin:$PATH
repo工具同样可以在Android的网站上获得,方法如下所示:
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo $ chmod a+x ~/bin/repo
repo是一个由Google提供的工具,本质上是一个脚本,它可能随时更新,因此应当从Google的相应地址获得最新的repo,复制到本地之后更改权限来使用。
↘ 1.2.2 源代码获取
获取Android完全的源代码方法包括初始化代码仓库和获取代码两个步骤,每个步骤可以增加不同的参数。
对于Android的代码仓库,初始化代码仓库的一般方法如下所示:
$ repo init -u https://android.googlesource.com/platform/manifest
此时得到的是代码仓库中Master分支(主分支)的最新版本。
● 提示:Google更新了源代码仓库的uri,不再使用从前的android.git.kernel.org。
在经过repo init之后,可以使用repo获取Android的全部代码,方法如下所示:
$ repo sync
在repo init时,使用-b选项可指定初始化版本的方法如下所示:
$ repo init -u https://android.googlesource.com/platform/manifest -b android-2.2_r1 $ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
使用repo sync时,也可以同步一个单个工程的内容,需要使用工程的名称作为repo sync的参数,工程的名称可以从manifest.xml获得。使用方法如下。
$ repo sync {project_name}
↘ 1.2.3 编译Android源代码
编译Android系统的方法比较简单:在Android源代码的根目录中有一个Makefile,直接执行make即可,此时表示进行默认产品的全系统构建。可以增加-j N等参数指定并行编译的线程,加快编译的速度。
Android系统编译过程的片断如下所示:
$ make # ……编译过程 Combining NOTICE files: out/target/product/generic/obj/NOTICE.html Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_ unopt_intermediates/system.img Install system fs image: out/target/product/generic/system.img Installed file list: out/target/product/generic/installed-files.txt
在一般情况下,根据编译过程的输出信息,system.img和installed-files.txt生成后,表示整个系统已经成功编译完成。
↘ 1.2.4 仿真器运行
使用Android Emulator可以模拟Android整个系统的运行,在运行过程中,可以指定内核、主文件系统、用户文件系统等。
Android是基于Linux的系统,具有自己的Linux内核映像文件。默认情况下,使用的源代码包中提供的二进制内核路径如下所示:prebuilt/android-arm/kernel/。
kernel-qemu文件为ARMv5体系结构的Linux内核。预编译的内核还有kernel-qemu-armv7文件,它是ARMv7的体系结构。
模拟器运行之前需要配置ANDROID_PRODUCT_OUT环境变量:
$declare -x ANDROID_PRODUCT_OUT ="{Android根目录}/out/target/product/generic"
ANDROID_PRODUCT_OUT宏表示的是产品的目录,模拟器运行时,需要从这个目录中找到几个映像文件。
运行模拟器时,同时得到一个shell终端的方式如下所示:
$ ./out/host/linux-x86/bin/emulator -shell
在仿真器环境中使用SD卡的方式如下所示:
$ ./out/host/linux-x86/bin/emulator –shell –sdcard <image_file>
在仿真器环境中指定不同分辨率的方法如下所示:
$ ./out/host/linux-x86/bin/emulator –shell –skin 800x480
↘ 1.2.5 使用工具
在Linux主机环境中,如果对Android的源代码进行了完整的编译,各种Linux的主机中工具生成在{源代码根目录}/out/host/linux-x86/bin/目录中。可以使用这个目录中的各种工具。
adb全称Android Debug Bridge(Android调试桥)。使用adb工具可以直接操作管理Android模拟器或者真实的Android设备。adb工具中几个通用的基本命令如下所示:
$ adb devices # 查看当前连接的设备(仿真器和真实设备) $ adb connect <ip>:5555 # 连接到某个网络端口 $ adb start-server # 启动adb服务器进程 $ adb kill-server # 终止adb服务器进程
adb得到目标信息的几个命令如下所示:
$ adb get-product # 得到设备的id $ adb get-serialno # 得到设备的序列号 $ adb get-state # 得到设备的状态
使用adb连接目标系统终端的方式如下所示:
$ adb shell
在shell后面可以直接附加目标机的命令行程序,表示直接执行一个命令。
使用adb抓取目标系统的log的方法如下所示:
$ adb logcat
使用adb安装应用程序的方法如下所示:
$ adb install XXX.apk $ adb uninstall {应用程序的包名}
如果需要更新已经安装的包,也就是重新安装包,需要增加-r参数。使用-s则表示安装到SD卡,不使用表示安装到内部存储器。
使用adb在主机和目标机之间传送文件的方法如下所示:
$ adb push {host_path} {target_path} $ adb pull {target_path} {host_path}
push表示从主机向目标机传送文件,pull表示从目标机向主机传送文件,二者的参数都是源对象在前,目的对象在后。
当已经有多个设备连接到主机时,可以使用-s参数进行选择,方法如下所示:
$ adb -s <设备> <命令>
其中,<设备>为adb devices列出的内容,<命令>为任意可执行的命令。除此之外,-d表示只通过USB连接,-e表示只连接仿真器。
fastboot则是一个具有特殊功能的协议,它是一个连接重新烧写系统的工具。fastboot通常需要Android设备方面的BootLoader中具有fastboot协议的支持。
fastboot几个控制命令如下所示:
$ fastboot devices # 查看当前连接的设备 $ fastboot reboot # 正常重新启动系统 $ fastboot reboot-bootloader # 重新启动系统到BootLoader阶段
fastboot几个和烧写有关的命令如下所示:
$ fastboot flashall # 烧写所有的分区 $ fastboot flash <partition> [ <filename> ] # 指定烧写一个分区 $ fastboot erase <partition> # 擦除一个分区
fastboot也可以通过-s参数指定操作某个连接的设备。
mksdcard命令帮助创建磁盘映像(disk image),可以在模拟器环境下使用磁盘映像来模拟外部存储卡(如SD卡)。例如,创建一个256MB映像文件的方法如下所示:
$ mksdcard 256M mmc_disk
mksdcard创建的是fat32格式的磁盘映像,这个磁盘映像可以作为启动仿真器时的-sdcard后面指定的参数。
aapt为Android资产打包工具(Android Asset Packaging Tool),用于查看和生成zip格式的包;aidl工具则用于自动将Android中特定的aidl接口描述文件生成Java代码;zipalign用于优化Android中应用程序包。它们都是在编译的过程中被编译系统自动调用的。
性能跟踪工具(Traceview),Dalvik调试监视器服务(Dalvik Debug Monitor Service)和层级观察器(Hierarchy Viewer)提供了图形化的界面,是较为复杂的工具。