• 系统编译方式和流程

1.source build/envsetup.sh 脚本
设置编译环境,加载一些编译方法例如 m、mm、mmm、lunch等
2.lunch 指定要编译的那一套源码
3.make -j8 开始编译
开始编译从源码根目录的makefile文件开始,makefile中引用了 include build/core/main.mk文件
在main.mk文件中引入了大量的mk文件,引用了源码的模块mk,这是系统编译的基石,其他模块的mk配置都是在这个基础上衍生的。
4.android系统编译的mk大致分为三种,一种就是上述的编译系统的模块,第二种就是各大厂商配置的一般在devices目录下(之前是在vendor目录下)对于不同厂商的模块的编译主要是从AndroidProduct.mk文件开始的,因为AndroidProduct.mk文件是在main.mk文件下进行全局搜索的。所以我们在配置好我们自己厂商的文件夹之后就要加一个AndroidProduct.mk文件,在这个文件中配置我们自己源码的mk文件配置,这是各大厂商源码模块的入口。
第三种编译就是每个单独的项目的编译,每个项目都有一个mk文件等待系统加载,文件主要以Android.mk命名,因为在android开始编译的时候回去搜索所有的一Android.mk命名的mk文件并include到编译流程中。

一个编译配置问题:

在android系统源码开发中,在一个模块中添加新的模块,比如在vendor下面添加一个新的项目类型的模块,如 通信类型、多媒体类型、其他类型等。每种类型下面肯定有多个apk/module组成,为了降低代码耦合,让不同类型的模块,在项目编译的时候配置独立的.mk文件。每种类型都有一个总的mk文件管理当前类型下的所有mk文件。注意:总的mk文件名字不能用 Android.mk,因为Android.mk系统在编译的时候会自动搜索所有目录下的Android.mk,总的mk文件里面由于用到了 PRODUCT_PACKAGES += XXX 这种是只能读的类型,所以在编译的时候就会报错。

当配置好所有目录下的mk时候,这个总的mk 在系统编译的时候,并不能直接被编译到系统中。必须要把当前mk配置到,系统编译流程中的某个mk文件中去例如:

在build/make/tagart/product/config.mk中加入 include $(TOPDIR)vendor/thundersoft/t/preTest.mk 引用配置的总的mk。总的mk中在去引用单个apk/module 中的mk文件,以 PRODUCT_PACKAGES += XXXNAME 加载。

源码编译涉及到不存在的jar/aar/so文件配置mk文件

1.使用的mk文件里面配置:LOCAL_STATIC_JAVA_LIBRARIES := abc/LOCAL_STATIC_JAVA_AAR_LIBRARIES += abc

集成aar文件mk:

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_STATIC_JAVA_AAR_LIBRARIES := abc

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := abc:abc.aar /LOCAL_STATIC_JAVA_LIBRARIES

include $(BUILD_MULTI_PREBUILT)

2.加载.so文件

include $(CLEAR_VARS)
LOCAL_MODULE            := Transport.so
LOCAL_MODULE_TAGS        := eng optional
LOCAL_MODULE_CLASS      := ETC
LOCAL_MODULE_PATH        := $(TARGET_OUT_SHARED_LIBRARIES)
LOCAL_SRC_FILES_arm      := $(LOCAL_MODULE)
LOCAL_SRC_FILES_arm64    := $(LOCAL_MODULE)
LOCAL_PROPRIETARY_MODULE := true
LOCAL_MODULE_OWNER      := 随便写(thundso)
LOCAL_MODULE_TARGET_ARCH := arm arm64
include $(BUILD_PREBUILT)

引用:

PRODUCT_PACKAGES+=Transport

PRODUCT_PACKAGES+=Transport.so

3.编译好的apk 加载so

include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := Test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PREBUILT_JNI_LIBS := \
@lib/armeabi/libtest.so \
@lib/armeabi/libtest2.so
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)