android源码编译的小小总结
android源码相当大,全部编译会相当的花时间。其编译的主要规则就是,找到所有的 Android.mk 进行编译。
一、编译流程:
1、执行 source build/envsetup.sh 或者 ./build/envsetup.sh ,设定android的编译环境
2、lunch 选择编译目标(硬件平台,eng或者user等)
You're building on Linux
Lunch menu... pick a combo:
1. generic-eng
2. simulator
3. full_dream-userdebug
4. full_passion-userdebug
5. full_sapphire-userdebug
如下面是选择好的平台打印信息:
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.2
TARGET_PRODUCT=bcm7125
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=mips
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=MASTER
============================================
即利用sh中的脚本: printconfig - Prints the current configuration as set by the lunch and choo易做图bo commands.
可以重新编写: AndroidProducts.mk 复写如下的定义:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic.mk)
#
# Overrides
PRODUCT_NAME := bcm${BCHP_CHIP}
PRODUCT_DEVICE := bcm${BCHP_CHIP}
3、最后执行make -j n (cpu 数目,多核同时编译,提高速度)
二、编译方法选择
make 不带任何参数,单核编译,花费时间相当长,2.2版本大约是4个小时,2.3会稍微更长一点。
make 模块名称 , 会将所有依赖的其它模块一起编译,非常适合初次编译
mmm 完整目录路径 , 编译指定目录下的目标模块,不编译所依赖的模块,非常适合整体编译完,调试时使用
mm 进行带有 Android.mk的目录下进行编译,只能编译当前目录下的模块,非常适合整体编译完,调试时使用
各种实用参数,以上方法都可以增加使用:
-j Ncpu 【编译时间:基本上是单核总时间/N】
-B 【默认只编译发生为化的目标文件,加上此选项则强制重新编译所有目标文件】
这两个参数非常好用,请多多使用之
三、动态库依赖关系
原则: 先后依赖,即makefile一般的规则是先编目标的依赖再编译本目标文件
碰到的问题:
make: *** 没有规则可以创建“out/target/product/generic/system/bin/demux_test”需
要的目标“out/target/product/generic/system/lib/libhalcommon.so”。 停止。
首先 hardware\libdtv\Android.mk 下面的文件需要编写正确:
common_dtv_dirs :=libhalcommon
libtuner libdemux libtest libavdec libavenc libdisplay libsmartcard
include $(call all-named-subdir-makefiles,$(common_dtv_dirs))
这里写的是子目录下的 目录名,这里必须与子目录中的名字一一对应,否则不予编译
这里的子目录是: hardware\libdtv\libhalcommon
然后在hardware\libdtv\libhalcommon\Android.mk中需要增加:
LOCAL_MODULE_TAGS :=eng
否则不会安装到system/lib下面
摘自 andyhuabing的专栏
补充:移动开发 , Android ,