西安列举网 > 教育培训 > 电脑/网络 > 西安Android开发编译系统有哪些
西安
[切换城市]

西安Android开发编译系统有哪些

更新时间:2016-05-18 11:32:38 浏览次数:43次
区域: 西安 > 高新 > 高新路
类别:软件工程师培训
地址:高新路与科技二路十字水晶城B座7层
编译系统

Android 编译系统是Android源码的一部分,用于编译Android系统,Android SDK以及相关文档。该编译系统是由Make文件、Shell以及Python脚本共同组成,其中为重要的便是Make文件。关于编译系统可参考 理解 Android Build 系统。

3.1 Makefile分类

整个Build系统的Make文件分为三大类:

系统核心的Make文件:定义了Build系统的框架,文件全部位于路径/build/core,其他Make文件都是基于该框架编写的;
针对产品的Make文件:定义了具体某个型号手机的Make文件,文件路径位于/device,该目录下往往又以公司名和产品名划分两个子级目录,比如/device/qcom/msm8916;
针对模块的Make文件:整个系统分为各个独立的模块,每个模块都一个专门的Make文件,名称统一为”Android.mk”,该文件定义了当前模块的编译方式。Build系统会扫描整个源码树中名为”Android.mk”的问题,并执行相应模块的编译工作。
3.2 编译产物

经过make编译后的产物,都位于/out目录,该目录下主要关注下面几个目录:

/out/host:Android开发工具的产物,包含SDK各种工具,比如adb,dex2oat,aapt等。
/out/target/common:通用的一些编译产物,包含Java应用代码和Java库;
/out/target/product/[product_name]:针对特定设备的编译产物以及平台相关C/C++代码和二进制文件;
在/out/target/product/[product_name]目录下,有几个重量级的镜像文件:

system.img:挂载为根分区,主要包含Android OS的系统文件;
ramdisk.img:主要包含init.rc文件和配置文件等;
userdata.img:被挂载在/data,主要包含用户以及应用程序相关的数据;
当然还有boot.img,reocovery.img等镜像文件,这里就不介绍了。

3.3 Android.mk解析

在源码树中每一个模块的所有文件通常都相应有一个自己的文件夹,在该模块的根目录下有一个名称为“Android.mk” 的文件。编译系统正是以模块为单位进行编译,每个模块都有的模块名,一个模块可以有依赖多个其他模块,模块间的依赖关系就是通过模块名来引用的。也就是说当模块需要依赖一个jar包或者apk时,必须先将jar包或apk定义为一个模块,然后再依赖相应的模块。

对于Android.mk文件,通常都是以下面两行

LOCAL_PATH := $(call my-dir) //设置当编译路径为当前文件夹所在路径
include $(CLEAR_VARS) //清空编译环境的变量(由其他模块设置过的变量)
为方便模块编译,编译系统设置了很多的编译环境变量,如下:

LOCAL_SRC_FILES:当前模块包含的所有源码文件;
LOCAL_MODULE:当前模块的名称(具有性);
LOCAL_PACKAGE_NAME:当前APK应用的名称(具有性);
LOCAL_C_INCLUDES:C/C++所需的头文件路径;
LOCAL_STATIC_LIBRARIES:当前模块在静态链接时需要的库名;
LOCAL_SHARED_LIBRARIES:当前模块在运行时依赖的动态库名;
LOCAL_STATIC_JAVA_LIBRARIES:当前模块依赖的Java静态库;
LOCAL_JAVA_LIBRARIES:当前模块依赖的Java共享库;
LOCAL_CERTIFICATE:签署当前应用的证书名称,比如platform。
LOCAL_MODULE_TAGS:当前模块所包含的标签,可以包含多标签,可能值为debgu,eng,user,development或optional(默认值)
针对这些环境变量,编译系统还定义了一些便捷函数,如下:

$(call my-dir):获取当前文件夹路径;
$(call all-java-files-under, ):获取指定目录下的所有Java文件;
$(call all-c-files-under, ):获取指定目录下的所有C文件;
$(call all-Iaidl-files-under, ) :获取指定目录下的所有AIDL文件;
$(call all-makefiles-under, ):获取指定目录下的所有Make文件;
示例:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

# 获取所有子目录中的Java文件
LOCAL_SRC_FILES := $(call all-subdir-java-files)

# 当前模块依赖的动态Java库名称
LOCAL_JAVA_LIBRARIES := com.gityuan.lib

# 当前模块的名称
LOCAL_MODULE := demo

# 将当前模块编译成一个静态的Java库
include $(BUILD_STATIC_JAVA_LIBRARY)
蓝鸥西安分中心是蓝鸥科技的第六家分中心,专注于Android开发,师资力量强大,教学经验丰富,环境优美,交通便利,始终坚持让教育回归本质的教学理念,学习Android开发,就来蓝鸥科技!
西安电脑/网络相关信息
2023-10-19
2023-09-08
2023-08-29
注册时间:2016年05月04日
UID:290385
---------- 认证信息 ----------

查看用户主页