《android源代码情景分析》读后感(一)

来源:互联网 发布:淘宝皮草品牌 编辑:程序博客网 时间:2024/04/30 07:07

本文是阅读《android源代码情景分析》中 第一章“准备知识” 后的感想。


本章首先介绍Linux内核和android应用程序参考书籍,果断一扫而过。之后介绍了“下载、编译、运行android源代码”、“下载、编译、运行android内核源代码”、开发应用程序后单独编译和打包 三个大部分。

首先让我意识到,android源代码、内核源代码是分开的。。。

一、android 源代码的下载、编译、运行

1.下载

下载源代码使用repo工具(本质是git,只是对其封装了),具体步骤这里不赘述。为方便理解,将源码下载到~/android目录中。

2.编译、打包

下载后,首先对源代码进行整体编译,在源代码所在的目录,执行make命令。编译结束后,生成/out/target/product/$(TARGET_PRODUCT)目录,其中$(TARGET_PRODUCT)是个环境变量,若没配置,默认为generic。

~/android$make
为了开发android应用程序,还需要打包成SDK。使用命令make sdk 命令即可。有了SDK包之后,我们就可以在IDE环境中开发android应用程序了。不过在实际工作中都是单独下载安装android sdk的。

~/android$make sdk

3.运行

android模拟器在源代码路径中/out/host/linux-x86-bin中,使用emulator命令可以将其运行起来。为方便,一般将该路径添加到PATH中。

emulator运行所需要的四个文件:zImage----linux内核镜像文件,如不指定,默认为out/host/linu-x86/bin中的内核。三个android系统镜像文件:system.imguserdata.imgramdisk.img这三个文件默认使用ANDROID_PRODUCT_OUT所规定的目录中,若该项不设置,需要在emulator命令中加参数指定。如,自定义emulated参数(使用源码中自带的zImage,编译出的system.img/userdata.img/ramdisk.img):~Android$ emulater -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir ./out/target/product/generic -system system.img -data userdata.img -ramdisk ramdisk.img
平时安装在Windows中的android SDK中也带了模拟器,默认也配置好了,所以日常使用时涉及不到。


二、Linux内核的下载、编译、运行

1.下载

内核文件放在android源码目录中的kernel文件夹(没有的话,需要新建),使用git命令下载,这里不详述了。

2.编译

编译之前,需要配置Makefile文件。

a)  ARCH

android模拟器所使用的cpu架构是arm的,ARCH的值需要设置为arm,表示编译的Linux内核适用于arm体系结构:

ARCH         ?= arm

b)  CROSS_COMPILE

交叉编译工具。我们是在PC上编译android内核的,所以需要指定交叉编译工具。

android源代码中自带了适用于android模拟器内核的交叉编译工具,路径为android源代码目录下prebuilt/linux-x86/toolchain子目录中。

设置交叉编译工具的值为arm-eabi-表示交叉编译工具的名称是以”arm-eabi-“打头。

CROSS_COMPILE    ?= arm-eabi-

编译Linux内核,需要三个步骤:

首先,将交叉编译工具加入PATH

其次,修改硬件配置文件goldfish_defconfig

最后,执行make命令

~/android/kernel/goldfish$ export PATH: ~/android/prebuilt/linux-86/toolchain/arm-eabi-4.4.3.bin~/android/kernel/goldfish$ make goldfish_defconfig~/android/kernel/goldfish$ make

编译成功后,会给出如下提示:
OBJCOPY arch/arm/boot/zImagekernerl:   arch/arm/boot/zImakge is ready

3.使用编译好的Linux内核运行android模拟器

使用emulator命令,规定-kernel为自己编译好的kernel:

~/android$ emulator -kernel ./kernel/goldfish/arch/boot/zImage &

&符号表示要在后台启动android模拟器,这样就可以在同一个命令终端中,使用adb命令来连接android模拟器了。

可以通过adb shell 、cd proc、cat version三个命令的顺序执行来查看kernel是否为自己编译的kernel。


三、单独编译android应用程序模块

使用mmm命令来单独编译应用程序模块,之后使用make snod命令来重新打包system.img文件。这样再通过emulator启动的模拟器中就包含了新添加的应用程序。

1.应用程序源代码加入android源代码中

一个应用程序一个文件夹,拷贝到android源码中packages/experimntal文件夹中,应用程序文件夹一般包含:

androidManifest.xml文件:配置文件

src文件夹:代码文件

res文件夹:资源文件

android.mk文件:编译脚本文件。文件中需要指定应用程序的名字。LOCAL_PACKAGE_NAME字段。

2.导入mmm命令

默认情况下,该命令不可用。需要在当前终端执行如下命令:

~/android$ source ./build/envsetup.sh

3.单独编译android应用程序模块

~/android$ mmm ./package/expeeimetal/HelloAndroid
这是对HelloAndroid程序进行单独编译的命令。编译结束后,在out/target/product/generic/system/app目录中可以看到HelloAndroid.apk文件。

单独编译出的:

应用目录:out/target/product/generic/system/app

C可执行文件/动态链接库文件所在目录:out/target/product/generic/system/bin或者out/target/product/generic/system/lib

若动态连接库文件是硬件抽象层模块文件,所在目录为:out/target/product/generic/system/lib/hw

4. 重新打包android系统镜像文件system.img

直接执行make snod命令即可。重新生成的system.img位于out/target/product/generic目录中(即覆盖了之前全编译生成的system.img文件)。

当然,平时使用android SDK和IDE工具开发出的应用,通过adb install也可以装入模拟器,而且通常我也是这么做的。


以上为android源码、kernel源码下载、编译、运行,以及android模拟器的使用方法总结,通过阅读和总结,梳理、明确了android的源码和运行相关知识,改善了平时使用android源码时的糊里糊涂。


0 0