Makefile 等作出改动,只需要增加自己的目录就可以了,核心的内容是一个Android.mk 的 文件。
I 编译可执行程序
编译可执行程序是最简单的,用一个小程序可以很方便开发中的测试。建立一个目录包含两个文件,目录的名称为test_exe ,两个文件为Android.mk 和main.c
这个目录放在Android 下 面的任意目录编译的结果都是一样的,例如,原本build 目录中的东西是不会被编译的,但是如果这 个子目录放在build 目录中也会被编译,这是因为编译的过程只是寻找Android.mk 文件。
Android.mk:
out/target/product/generic/obj/EXECUTABLES 目录中,名称为test_exe_intermediates 。
test_exe_intermediates
|-- LINKED
| `-- test_exe (没有 stripped 过的可执行程序)
|-- main.P (文本文件,编译的路径信息)
|-- main.o (目 标文件)
`-- test_exe (stripped 过 的可执行程序)
II 编译静态库和动态库
静态库和动态库 的编译方法和可执行程序类似,只需要改动几个宏就可以:
静态库:
动态库:
注意可以使用宏TARGET_PRELINK_MODULE := false ,禁止Prelink
静态库生成的目标路径:
out/target/product/generic/obj/SHARED_LIBRARIES
libtest_static_intermediates
|-- helloworld.P
|-- helloworld.o
`-- libtest_static.a
(静态库没有是否剥离符号的问题)
动态库生成的目标路径:
out/target/product/generic/obj/STATIC_LIBRARIES
libtest_shared_intermediates
|-- LINKED
| `-- libtest_shared.so
|-- helloworld.P
`-- helloworld.o
编译模板的区别如下所示:
目标的模板:可执行程序,动态库,静态库
include $(BUILD_EXECUTABLE)
include $(BUILD_SHARED_LIBRARY)
include $(BUILD_STATIC_LIBRARY)
如果编译本地的:可执行程序,动态库,静态库
include $(BUILD_HOST_EXECUTABLE)
include $(BUILD_HOST_SHARED_LIBRARY)
include $(BUILD_HOST_STATIC_LIBRARY)
安 装路径的问题
LOCAL_MODULE_PATH 和LOCAL_UNSTRIPPED_PATH 增加以下可以安装到不同的文件系统:
LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED)
文件系统的 选择:
TARGET_ROOT_OUT : 表示根文件系统out/target/product/generic/root
TARGET_OUT : 表示system 文 件系统out/target/product/generic/system
TARGET_OUT_DATA : 表示data 文件系统out/target/product/generic/data
更多的选项参考以下文件:
build/core/config.mk
默 认的值在以下文件中定义:
build/core/base_rules.mk
III 只安装的情况
另一种情况就是不需要编译,只需要复制安装。如下所示:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
copy_from := /
A.txt /
B.txt
copy_to := $(addprefix $(TARGET_OUT)/txt/,$(copy_from))
$(copy_to) : PRIVATE_MODULE := txt
$(copy_to) : $(TARGET_OUT)/txt/% : $(LOCAL_PATH)/% | $(ACP)
$(transform-prebuilt-to-target)
ALL_PREBUILT = $(copy_to)
# create some directories
DIRS := $(addprefix $(TARGET_OUT)/, /
txt /
)
$(DIRS):
@echo Directory: $@
@mkdir -p $@
以上实际上包含了两各方面的内容一个复制文件,一个是创建目录。
执行后,就会生成以下的内容:
system/txt
|-- A.txt
`-- B.txt