Android源码分析(一)-----如何快速掌握Android编译文件
一 : Android.mk文件概述
主要向编译系统指定相应的编译规则。会被解析一次或多次。因此尽量减少源码中声明变量,因为这些变量可能会被多次定义从而影响到后面的解析。这个文件的语法会把源代码组织成模块,每个模块属于下列类型之一:
- APK程序:一般的Android程序,编译打包生成apk文件。
- JAVA库:java类库,编译打包生成jar包文件。
- C\C++应用程序:可执行的C/C++应用程序。
- C\C++静态库:编译生产C/C++静态库,并打包成.a文件。
- C\C++共享库:编译生成共享库,并打包成.so文件,有且只有共享库才能被安装/复制到APK包中。
二 : 系统变量####
- LOCAL_PATH:这个变量用于给出当前文件的路径,必须在Android.mk的开头定义,可以这样使用LOCAL_PATH := $(call my-dir),这样这个变量不会被$(CLEAR_VARS)清除,因为每个Android.mk只需要定义一次(即使一个文件中定义了多个模块的情况下)。
- LOCAL_SRC_FILES:当前模块包含的所有源代码文件。
- LOCAL_MODULE:当前模块的名称,这个名称应当是唯一的,并且不能包含空格。模块间的依赖关系就是通过这个名称来引用的。
- LOCAL_MODULE_CLASS:标识所编译模块最后放置的位置。ETC表示放置在/system/etc.目录下,APPS表示放置在/system/app目录下,SHARED_LIBRARIES表示放置在/system/lib目录下。如果具体指定,则编译的模块不会放到编译系统中,最后会在out对应product的obj目录下的对应目录中。
- LOCAL_SRC_FILES:这是要编译的源代码文件列表。只要列出要传递给编译器的文件即可,编译系统会自动计算依赖关系。源代码文件路径都是相相对于LOCAL_PATH的,因此可以使用相对路径进行描述。
- LOCAL_JAVA_LIBRARIES:当前模块依赖的Java共享库,也叫Java动态库。例如framework.jar包。
- LOCAL_STATIC_JAVA_LIBRARIES:当前模块依赖的Java静态库,在Android里,导入的jar包和引用的第三方工程都属于Java静态库。
- LOCAL_STATIC_LIBRARIES:当前模块在运行时依赖的静态库的名称。
- LOCAL_SHARED_LIBRARIES:当前模块在运行时依赖的动态库的名称。
- LOCAL_C_INCLUDES:c或c++语言需要的头文件的路径。
- LOCAL_CFLAGS:提供给C/C++编译器的额外编译参数。
- LOCAL_PACKAGE_NAME:当前APK应用的名称。
- LOCAL_CERTIFICATE:签署当前应用的证书名称。
- LOCAL_MODULE_TAGS:当前模块所包含的标签,一个模块可以包含多个标签。标签的值可能是eng、user、debug、development、optional。其中,optional是默认标签。
- LOCAL_DEX_PREOPT:apk的odex优化开关,默认是false。
三 : mk文件模板####
- 编译C/C++应用程序的模板:
#Test Exe
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= main.c
LOCAL_MODULE:= test_exe
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_EXECUTABLE)
BUILD_EXECUTABLE表示以一个可执行程序的方式进行编译。补充说明:include $(BUILD_PACKAGE)则是编译出一个apk,include $(BUILD_STATIC_JAVA_LIBRARY)则是编译出jar包。
- 编译静态库的模板:
`#Test Static Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
helloworld.c
LOCAL_MODULE:= libtest_static
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_STATIC_LIBRARY)
一般的和上面相似,BUILD_STATIC_LIBRARY表示编译一个静态库.a文件。静态库不会复制到的APK包中,但是能够用于编译共享库。
- 编译动态库的模板:
#Test Shared Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
helloworld.c
LOCAL_MODULE:= libtest_shared
TARGET_PRELINK_MODULES := false
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_SHARED_LIBRARY)
一般的和上面相似,BUILD_SHARED_LIBRARY表示编译一个动态库。
以上三者的生成结果分别在如下,generic依具体target会变:
out/target/product/generic/obj/EXECUTABLE
out/target/product/generic/obj/STATIC_LIBRARY
out/target/product/generic/obj/SHARED_LIBRARY
每个模块的目标文件夹分别为:
可执行程序:XXX_intermediates
静态库: XXX_static_intermediates
动态库: XXX_shared_intermediates
另外,在Android.mk文件中,还可以指定最后的目标安装路径,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH来指定。不同的文件系统路径用以下的宏进行选择:
- TARGET_ROOT_OUT:表示根文件系统out/target/product/xxxxx/root。
- TARGET_OUT:表示system文件系统out/target/product/xxxx/system。
- TARGET_OUT_DATA:表示data文件系统out/target/product/xxxx/data。
- TARGET_OUT_SHARED_LIBRARIES:表示out/target/product/xxxx/system/lib
- TARGET_OUT_APPS:表示out/target/product/xxxx/system/app
- ANDROID_PRODUCT_OUT:out/target/product/xxxx/
- TARGET_OUT_JAVA_LIBRARIES:out/target/product/xxxx/system/framework
四 : 常用函数####
- $(call my-dir):获取当前文件夹的路径。
- $(call all-java-files-under, <src>):获取指定目录下的所有java文件。
- $(call all-c-files-under, <src>):获取指定目录下的所有c文件。
- $(call all-Iaidl-files-under, <src>):获取指定目录下的所有AIDL文件。
- $(call all-makefiles-under, <folder>):获取指定目录下的所有Make文件。
- $(call intermediates-dir-for, <class>, <app_name>, <host or target>, <common?>):获取Build输入的目标文件夹路径。
五 : Settings模块Android.mk文件分析####
# 当前文件的路径
LOCAL_PATH:= $(call my-dir)
# 清除变量
include $(CLEAR_VARS)
# 列举所有需要编译的源文件
LOCAL_SRC_FILES := \
$(call all-logtags-files-under, src)
# 模块名称--唯一
LOCAL_MODULE := settings-logtags
#依赖的java静态库
include $(BUILD_STATIC_JAVA_LIBRARY)
# Build the Settings APK
include $(CLEAR_VARS)
#依赖的java库
LOCAL_JAVA_LIBRARIES := bouncycastle core-oj telephony-common ims-common
#依赖的jar包,包括系统的和第三方的(放在libs目录)jar包
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-v4 \
android-support-v13 \
android-support-v7-recyclerview \
android-support-v7-preference \
android-support-v7-appcompat \
android-support-v14-preference \
jsr305 \
settings-logtags
#user: 指该模块只在user版本下才编译
#eng: 指该模块只在eng版本下才编译
#tests: 指该模块只在tests版本下才编译
#optional:指该模块在所有版本下都编译
LOCAL_MODULE_TAGS := optional
#列举所有需要编译的源文件
LOCAL_SRC_FILES := \
$(call all-java-files-under, src)
#列举所有需要的资源文件夹
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \
frameworks/support/v7/preference/res \
frameworks/support/v14/preference/res \
frameworks/support/v7/appcompat/res \
frameworks/support/v7/recyclerview/res
#打包成apk的名称--包名
LOCAL_PACKAGE_NAME := Settings
#用于指定签名时使用的KEY
LOCAL_CERTIFICATE := platform
#编译后在ROM中的安装位置
#true,安装位置为system/priv-app
#false,安装位置为system/app
LOCAL_PRIVILEGED_MODULE := true
#混淆文件名
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
LOCAL_AAPT_FLAGS := --auto-add-overlay \
--extra-packages android.support.v7.preference:android.support.v14.preference:android.support.v17.preference:android.support.v7.appcompat:android.support.v7.recyclerview
ifneq ($(INCREMENTAL_BUILDS),)
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_JACK_ENABLED := incremental
LOCAL_DX_FLAGS := --multi-dex
LOCAL_JACK_FLAGS := --multi-dex native
endif
#包含的其他mk文件
include frameworks/opt/setupwizard/library/common-full-support.mk
include frameworks/base/packages/SettingsLib/common.mk
#打包成apk
include $(BUILD_PACKAGE)
# Use the following include to make our test apk.
ifeq (,$(ONE_SHOT_MAKEFILE))
#获取当前目录下的所有Make文件
include $(call all-makefiles-under,$(LOCAL_PATH))
endif
Android源码分析(一)-----如何快速掌握Android编译文件的更多相关文章
- Android源码分析(十二)-----Android源码中如何自定义TextView实现滚动效果
一:如何自定义TextView实现滚动效果 继承TextView基类 重写构造方法 修改isFocused()方法,获取焦点. /* * Copyright (C) 2015 The Android ...
- Android源码分析(六)-----蓝牙Bluetooth源码目录分析
一 :Bluetooth 的设置应用 packages\apps\Settings\src\com\android\settings\bluetooth* 蓝牙设置应用及设置参数,蓝牙状态,蓝牙设备等 ...
- Android源码分析(十七)----init.rc文件添加脚本代码
一:init.rc文件修改 开机后运行一次: chmod 777 /system/bin/bt_config.sh service bt_config /system/bin/bt_config.sh ...
- Android源码分析(十六)----adb shell 命令进行OTA升级
一: 进入shell命令界面 adb shell 二:创建目录/cache/recovery mkdir /cache/recovery 如果系统中已有此目录,则会提示已存在. 三: 修改文件夹权限 ...
- Android源码分析(十五)----GPS冷启动实现原理分析
一:原理分析 主要sendExtraCommand方法中传递两个参数, 根据如下源码可以知道第一个参数传递delete_aiding_data,第二个参数传递null即可. @Override pub ...
- Android源码分析(十四)----如何使用SharedPreferencce保存数据
一:SharedPreference如何使用 此文章只是提供一种数据保存的方式, 具体使用场景请根据需求情况自行调整. EditText添加saveData点击事件, 保存数据. diff --git ...
- Android源码分析(十三)----SystemUI下拉状态栏如何添加快捷开关
一:如何添加快捷开关 源码路径:frameworks/base/packages/SystemUI/res/values/config.xml 添加headset快捷开关,参考如下修改. Index: ...
- Android源码分析(十一)-----Android源码中如何引用aar文件
一:aar文件如何引用 系统Settings中引用bidehelper-1.1.12.aar 文件为例 源码地址:packages/apps/Settings/Android.mk LOCAL_PAT ...
- Android源码分析(十)-----关机菜单中如何添加飞行模式选项
一:关机菜单添加飞行模式选项 源码路径:frameworks/base/core/res/res/values/config.xml 增加<item>airplane</item&g ...
- Android源码分析(九)-----如何修改Android系统默认时间
一 : 修改Android系统默认时间 源码路径:frameworks/base/services/java/com/android/server/SystemServer.java 主要变量EARL ...
随机推荐
- java:数据结构(四)二叉查找树以及树的三种遍历
@TOC 二叉树模型 二叉树是树的一种应用,一个节点可以有两个孩子:左孩子,右孩子,并且除了根节点以外每个节点都有一个父节点.当然这种简单的二叉树不能解决让树保持平衡状态,例如你一直往树的左边添加元素 ...
- redis分享
Redis介绍 ´Redis是一种基于键值对的NoSQL数据库. ´Redis基于内存来存放数据. ´速度快,官方给出读写性能可达到10万/秒(数据存内存,C语言实现,单线程架构). ´丰富的数据结构 ...
- [20190523]修改参数后一些细节注意2.txt
[20190523]修改参数后一些细节注意2.txt --//上午想模拟链接遇到的情况,链接http://blog.itpub.net/267265/viewspace-2645262/--//就是修 ...
- 9-SQL视图
(1) 如何创建,更新和删除视图 视图作为一张虚拟表,帮我们封装了底层与数据表的接口.它相当于是一张表或多张表的数据结果集.视图的这一特点,可以帮我们简化复杂的 SQL 查询,比如在编 ...
- SRDC - ORA-1628: Checklist of Evidence to Supply (Doc ID 1682729.1)
SRDC - ORA-1628: Checklist of Evidence to Supply (Doc ID 1682729.1) Action Plan 1. Execute srdc_db_u ...
- Linux—使用man命令:man:command not found
# 用echo $PATH查看该环境变量.这种问题一般是环境变量PATH不对的问题. [root@localhost ~]# echo $PATH # 用whereis命令查看,该指令的位置. [ro ...
- 动态链接库(Dynamic Link Library)
DLL INTRODUCTION A DLL is a library that contains code and data that can be used by more than one pr ...
- 02day-webpack
<!--14 第一种方式 自动打开浏览器 端口号 指定托管的跟目录 启动热刷新 这种是在webpack.json中去配置的 直接在package中 写 将“script”:{ "dev ...
- 8.Java基础_if-else和switch选择语句
/* 选择语句(基本与C++相同) if-else语句: 格式一: if(关系式){ 语句体; } 格式二: if(关系式){ 语句体; } else{ 语句体; } 格式三: if(关系式){ 语句 ...
- 数据仓库001 - 复习Linux shell命令 - pwd mkdir mv tail -f xxx.log 和 ail -F xxx.log
1. [root@localhost ~]# 的含义 ? [登录的用户 机器的名称 家目录] 2. 查看当前光标所在的目录 pwd [root@localhost ~]# pwd /roo ...