<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=Android.mk%E6%96%87%E4%BB%B6%E9%87%8A%E7%96%91</id>
	<title>Android.mk文件释疑 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=Android.mk%E6%96%87%E4%BB%B6%E9%87%8A%E7%96%91"/>
	<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=Android.mk%E6%96%87%E4%BB%B6%E9%87%8A%E7%96%91&amp;action=history"/>
	<updated>2026-09-01T05:28:24Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://www.mywiki.cn/Hovercool/index.php?title=Android.mk%E6%96%87%E4%BB%B6%E9%87%8A%E7%96%91&amp;diff=866&amp;oldid=prev</id>
		<title>2015年5月6日 (三) 12:22 Hovercool</title>
		<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=Android.mk%E6%96%87%E4%BB%B6%E9%87%8A%E7%96%91&amp;diff=866&amp;oldid=prev"/>
		<updated>2015-05-06T12:22:45Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=== 一、hardware\led\led\Android.mk ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LOCAL_PATH := $(call my-dir)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
首先需要指定LOCAL_PATH变量，用于查找源文件&lt;br /&gt;
&lt;br /&gt;
上面的语句的意思是将LOCAL_PATH变量定义成本文件所在目录路径，这句必须放在 include $(CLEAR_VARS)前面，否则编译会报错。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Android.mk中可以定义多个编译模块，每个编译模块都是以include $(CLEAR_VARS)开始，以include $(BUILD_XXX)结束。&lt;br /&gt;
include $(CLEAR_VARS) #开始&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
问： CLEAR_VARS是什么？？&lt;br /&gt;
&lt;br /&gt;
答： CLEAR_VARS由编译系统提供，指定让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量，如LOCAL_MODULE，LOCAL_SRC_FILES，LOCAL_SHARED_LIBRARIES，LOCAL_STATIC_LIBRARIES等。    &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LOCAL_C_INCLUDES += \&lt;br /&gt;
hardware/led/include/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
包含的头文件&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LOCAL_PRELINK_MODULE := false  # :=是赋值的意思&lt;br /&gt;
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
LOCAL_MODULE_PATH: 最后的目标安装路径&lt;br /&gt;
    &lt;br /&gt;
问： TARGET_OUT_SHARED_LIBRARIES是什么？&lt;br /&gt;
&lt;br /&gt;
答： 在build/core/envsetup.mk中定义。TARGET_OUT_SHARED_LIBRARIES:= $(TARGET_OUT)/lib&lt;br /&gt;
&lt;br /&gt;
*TARGET_ROOT_OUT：表示根文件系统。&lt;br /&gt;
*TARGET_OUT：表示system文件系统。&lt;br /&gt;
*TARGET_OUT_DATA：表示data文件系统。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LOCAL_SHARED_LIBRARIES := liblog  #LOCAL_SHARED_LIBRARIES中加入所需要链接的动态库（*.so）的名称&lt;br /&gt;
LOCAL_SRC_FILES := led.cpp&lt;br /&gt;
LOCAL_MODULE :=led.default   #LOCAL_MODULE表示模块最终的名称，led后面跟有default，led.default能够保证我们的模块总能被硬象抽象层加载到&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*LOCAL_SRC_FILES中加入源文件路径，LOCAL_C_INCLUDES 中加入所需要包含的头文件路径，&lt;br /&gt;
*LOCAL_STATIC_LIBRARIES加入所需要链接的静态库（*.a）的名称，&lt;br /&gt;
*LOCAL_SHARED_LIBRARIES中加入所需要链接的动态库（*.so）的名称，&lt;br /&gt;
*LOCAL_MODULE表示模块最终的名称&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LOCAL_MODULE_TAGS := eng&lt;br /&gt;
include $(BUILD_SHARED_LIBRARY) # 结束&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*include $(BUILD_STATIC_LIBRARY)表示编译成静态库&lt;br /&gt;
*include $(BUILD_SHARED_LIBRARY)表示编译成动态库。&lt;br /&gt;
*include $(BUILD_EXECUTABLE)表示编译成可执行程序&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
=== 二、frameworks\base\services\forlinx_led_jni\Android.mk ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LOCAL_PATH:= $(call my-dir)&lt;br /&gt;
include $(CLEAR_VARS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
LOCAL_PATH变量定义成本文件所在目录路径&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# [optional, user, eng] &lt;br /&gt;
# eng = required&lt;br /&gt;
# optinal = no install on target&lt;br /&gt;
LOCAL_MODULE_TAGS := eng&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
LOCAL_MODULE_TAGS :=optional --&amp;gt;&amp;gt; out/target/product/OK6410/symbols/system/&lt;br /&gt;
&lt;br /&gt;
LOCAL_MODULE_TAGS :=eng    --&amp;gt;&amp;gt; out/target/product/Ok6410/system/&lt;br /&gt;
&lt;br /&gt;
LOCAL_MODULE_TAGS defines in which build flavor this module should be installed.&lt;br /&gt;
Just give &amp;quot;user&amp;quot; tag, if you want the module to be installed in all of (user, userdebug, eng)&lt;br /&gt;
&lt;br /&gt;
You can find full document [http://www.kandroid.org/online-pdk/guide/build_system.html here]&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
eng     This is the default flavor. A plain make is the same as make eng.&lt;br /&gt;
&lt;br /&gt;
* Installs modules tagged with: eng, debug, user, and/or development.&lt;br /&gt;
* Installs non-APK modules that have no tags specified.&lt;br /&gt;
* Installs APKs according to the product definition files, in addition to tagged APKs.&lt;br /&gt;
* ro.secure=0&lt;br /&gt;
* ro.debuggable=1&lt;br /&gt;
* ro.kernel.android.checkjni=1&lt;br /&gt;
* adb is enabled by default. &lt;br /&gt;
&lt;br /&gt;
user    make user&lt;br /&gt;
&lt;br /&gt;
This is the flavor intended to be the final release bits.&lt;br /&gt;
&lt;br /&gt;
* Installs modules tagged with user.&lt;br /&gt;
* Installs non-APK modules that have no tags specified.&lt;br /&gt;
* Installs APKs according to the product definition files; tags are ignored for APK modules.&lt;br /&gt;
* ro.secure=1&lt;br /&gt;
* ro.debuggable=0&lt;br /&gt;
* adb is disabled by default.&lt;br /&gt;
&lt;br /&gt;
userdebug   make userdebug&lt;br /&gt;
&lt;br /&gt;
The same as user, except:&lt;br /&gt;
&lt;br /&gt;
* Also installs modules tagged with debug.&lt;br /&gt;
* ro.debuggable=1&lt;br /&gt;
* adb is enabled by default. &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Using user tag is no longer recommended.&lt;br /&gt;
&lt;br /&gt;
Instead,&lt;br /&gt;
&lt;br /&gt;
Add &amp;quot;LOCAL_MODULE_TAGS := optional&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Then add &amp;quot;LOCAL_MODULE&amp;quot; value to PRODUCT_PACKAGES section of product makefile(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;build/target/product/core.mk&amp;lt;/span&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;    &lt;br /&gt;
LOCAL_MODULE:= libforlinx_runtime&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This is the target being built.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Target install path.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LOCAL_SRC_FILES:= \&lt;br /&gt;
    LedService.cpp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
All of the source files that we will compile.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LOCAL_SHARED_LIBRARIES := \&lt;br /&gt;
    libandroid_runtime \&lt;br /&gt;
    libcutils \&lt;br /&gt;
    libhardware \&lt;br /&gt;
    libhardware_legacy \&lt;br /&gt;
    libnativehelper \&lt;br /&gt;
    libsystem_server \&lt;br /&gt;
    libutils \&lt;br /&gt;
    libui \&lt;br /&gt;
    libsurfaceflinger_client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
All of the shared libraries we link against.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LOCAL_C_INCLUDES += \&lt;br /&gt;
    $(JNI_H_INCLUDE) \&lt;br /&gt;
        hardware/led/include&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Also need the JNI headers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LOCAL_CFLAGS +=&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
No special compiler flags.&lt;br /&gt;
*LOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arrays&lt;br /&gt;
&lt;br /&gt;
通过设定编译器操作，优化级别，-O0表示没有优化,-O1为缺省值，-O3优化级别最高&lt;br /&gt;
&lt;br /&gt;
*LOCAL_CFLAGS += -W -Wall&lt;br /&gt;
*LOCAL_CFLAGS += -fPIC -DPIC&lt;br /&gt;
*LOCAL_CFLAGS += -O2 -g -DADB_HOST=1 -Wall -Wno-unused-parameter&lt;br /&gt;
*LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE -DSH_HISTORY&lt;br /&gt;
*LOCAL_CFLAGS += -DUSEOVERLAY2&lt;br /&gt;
&lt;br /&gt;
根据条件选择相应的编译参数&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LOCAL_PRELINK_MODULE := false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Don&amp;#039;t prelink this library.  For more efficient code, you may want to add this library to the prelink map and set this to true.&lt;br /&gt;
&lt;br /&gt;
Prelink利用事先链接代替运行时链接的方法来加速共享库的加载，它不仅可以加快起动速度，还可以减少部分内存开销，是各种Linux架构上用于减少程序加载时间、缩短系统启动时间和加快应用程序启动的很受欢迎的一个工具。&lt;br /&gt;
&lt;br /&gt;
程序运行时的动态链接尤其是重定位(relocation)的开销对于大型系统来说是很大的。动态链接和加载的过程开销很大，并且在大多数的系统上, 函数库并不会常常被更动, 每次程序被执行时所进行的链接动作都是完全相同的，对于嵌入式系统来说尤其如此。因此，这一过程可以改在运行时之前就可以预先处理好，即花一些时间利用Prelink工具对动态共享库和可执行文件进行处理，修改这些二进制文件并加入相应的重定位等信息，节约了本来在程序启动时的比较耗时的查询函数地址等工作，这样可以减少程序启动的时间，同时也减少了内存的耗用。 &lt;br /&gt;
&lt;br /&gt;
Prelink的这种做法当然也有代价：每次更新动态共享库时，相关的可执行文件都需要重新执行一遍Prelink才能保证有效，因为新的共享库中的符号信息、地址等很可能与原来的已经不同了，这就是为什么 android framework代码一改动，这时候就会导致相关的应用程序重新被编译。这种代价对于嵌入式系统的开发者来说可能稍微带来一些复杂度，不过好在对用户来说几乎是可以忽略的。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
include $(BUILD_SHARED_LIBRARY)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
编译成library&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
参考资料：&lt;br /&gt;
&lt;br /&gt;
http://www.cnblogs.com/langlang/archive/2012/04/23.html&lt;br /&gt;
&lt;br /&gt;
http://stackoverflow.com/questions/9496284/what-is-the-use-of-local-module-tags&lt;br /&gt;
&lt;br /&gt;
还可查看 http://hi.baidu.com/kenny_wju/item/042603c7f4f66d78ced4f83b&lt;/div&gt;</summary>
		<author><name>Hovercool</name></author>
	</entry>
</feed>