- 浏览: 43542 次
- 性别:
- 来自: 济南
文章分类
最新评论
上次翻译了官方的Android编译系统手册(http://blog.csdn.net/a345017062/archive/2010/12/24/6096795.aspx),原文比较简洁,原样翻译下来之后,实际工作中使用时有了更深入的理解,在这里详细地记录一下,用到什么记什么。
LOCAL_MODULE_TAGS
它可能的值有四个:user,eng,tests,optional,这个值决定了模块会在哪种编译模式下被编译。
当编译一个模块时(无论C/C++还是JAVA),如果想让它只在user/eng/tests这三种模式中的一种被编译的话,就取这三个值中的一个。如果想让它在任何模式下都被编译,就让它的值取optional
如果使用optional的话,需要在/build/target/product/core.mk中添加模块名字。
lOCAL_C_INLUDES
为include中的头文件增加搜索目录,这样,只需要在include里面指定文件名就可以了。比如,FlyingSurface.cpp中引用的SkCanvas
LOCAL_PRELINK_MODULE
该动态库是否进行prelink。如果自己编译一个Android没有.so库的话,这个属性必须得加上。关于这个属性的详细解释,先看一下这一篇文件http://blog.csdn.net/ccskyer/archive/2010/06/18/5677553.aspx,再参考/build/core/prelink-linux-arm.map文件。应该可以很快弄明白。
关于prelink更详细的机制,可以参考这篇文件http://www.eefocus.com/article/09-04/71629s.html
补充于2011.5.26
这里有篇文章,对CFLAGS、LDFLAGS和CPPFLAGS讲解的比较我点,更多的是优化建议:
http://blog.csdn.net/eroswang/archive/2007/12/25/1966640.aspx
补充于2011.5.27
在Android2.3.1上面工作时,发现LOCAL_MODULE_TAGS有所变化。
对于在旧版本系统中有的模块,还可以使用user,eng,tests,optional这四个中的一个。但新版本系统中特有的模块,只能使用optional,debug,tests,eng,samples五个中的一个。
补充于2011.6.9
LOCAL_SYSTEM_SHARED_LIBRARIES
如果编译时没有提供这个选项,系统编译时,会默认链接一些库,一般是libc libstdc++ libm,可以参考/build/core/combo/TARGET_linux-x86.mk中的DEFAULT_SYSTEM_SHARED_LIBRARIES这个变量的值。
如果编译时提供了这个选项,且值不是none或者空,系统编译时就不会链接默认的这几个库。比如编译libc本身时。关于这个逻辑的判断,可以参考/build/core/binary.mk。
这样链接已经编译好的第三方库,
LOCAL_PREBUILT_LIBS := liba.so libb.so
include $(BUILD_MULTI_PREBUILT)
liba.so和libb.so放到与Android.mk同一目录下,编译时,会被安装到/system/lib目录下。
参考这里:
Android编译加入第三方动态链接库文件的方法
http://zhuwenhao.com/824/%E6%8A%80%E6%9C%AF/%E8%87%AA%E7%94%B1%E8%BD%AF%E4%BB%B6%E7%A4%BE%E5%8C%BA/android/android%E7%BC%96%E8%AF%91%E5%8A%A0%E5%85%A5%E7%AC%AC%E4%B8%89%E6%96%B9%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95/
补充于2011.6.21:
LOCAL_CFLAGS
-D,增加全局宏定义。
LOCAL_CFLAGS := -DUSE_JSC
相当于在所有源文件中增加一个
#define USE_JSC
LOCAL_CFLAGS := -DUSE_COPY_BIT=1
相当于在所有源文件中增加一个
#define USE_COPY_BIT 1
还有其它的像-W等,都是传递给编译使用的。
补充于2012.4.28
使用NDK编译时碰到的一些常见问题
Q:
Android NDK: Host 'awk' tool is outdated. Please define HOST_AWK to point to Gawk or Nawk !
A:
主要原因是NDK目录下的/android-ndk-r7/prebuilt/linux-x86/bin/awk 是64位版本的。这里可以将32位系统中的awk(我的Ubuntu下是gawk)复制/android-ndk-r7/prebuilt/linux-x86/bin/目录下
参考网址:
http://stackoverflow.com/questions/8116113/problems-with-android-ndk-7-and-awk
Q:
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
A:
源码和Android.mk等没有放在jni目录下
Q:
在LOCAL_SRC_FILES中使用wildcard函数
A:
MY_FILES := $(wildcard $(LOCAL_PATH)/foo/*.c)
MY_FILES := $(MY_FILES:$(LOCAL_PATH)/%=%)
LOCAL_SRC_FILES += $(MY_FILES)
参考网址:
http://www.meegozu.com/thread-1818-1-1.html
打印编译过程
ndk-build -n
使用自己的库
LOCAL_SHARED_LIBRARIES和LOCAL_STATIC_LIBRARIES
使用系统里面的库
在LOCAL_LDLIBS里面加-L和-l
LOCAL_CFLAGS只对.c使用,而LOCAL_CPPFLAGS对.c和.cpp都使用。
LOCAL_MODULE_TAGS
它可能的值有四个:user,eng,tests,optional,这个值决定了模块会在哪种编译模式下被编译。
当编译一个模块时(无论C/C++还是JAVA),如果想让它只在user/eng/tests这三种模式中的一种被编译的话,就取这三个值中的一个。如果想让它在任何模式下都被编译,就让它的值取optional
如果使用optional的话,需要在/build/target/product/core.mk中添加模块名字。
lOCAL_C_INLUDES
为include中的头文件增加搜索目录,这样,只需要在include里面指定文件名就可以了。比如,FlyingSurface.cpp中引用的SkCanvas
LOCAL_PRELINK_MODULE
该动态库是否进行prelink。如果自己编译一个Android没有.so库的话,这个属性必须得加上。关于这个属性的详细解释,先看一下这一篇文件http://blog.csdn.net/ccskyer/archive/2010/06/18/5677553.aspx,再参考/build/core/prelink-linux-arm.map文件。应该可以很快弄明白。
关于prelink更详细的机制,可以参考这篇文件http://www.eefocus.com/article/09-04/71629s.html
补充于2011.5.26
这里有篇文章,对CFLAGS、LDFLAGS和CPPFLAGS讲解的比较我点,更多的是优化建议:
http://blog.csdn.net/eroswang/archive/2007/12/25/1966640.aspx
补充于2011.5.27
在Android2.3.1上面工作时,发现LOCAL_MODULE_TAGS有所变化。
对于在旧版本系统中有的模块,还可以使用user,eng,tests,optional这四个中的一个。但新版本系统中特有的模块,只能使用optional,debug,tests,eng,samples五个中的一个。
补充于2011.6.9
LOCAL_SYSTEM_SHARED_LIBRARIES
如果编译时没有提供这个选项,系统编译时,会默认链接一些库,一般是libc libstdc++ libm,可以参考/build/core/combo/TARGET_linux-x86.mk中的DEFAULT_SYSTEM_SHARED_LIBRARIES这个变量的值。
如果编译时提供了这个选项,且值不是none或者空,系统编译时就不会链接默认的这几个库。比如编译libc本身时。关于这个逻辑的判断,可以参考/build/core/binary.mk。
这样链接已经编译好的第三方库,
LOCAL_PREBUILT_LIBS := liba.so libb.so
include $(BUILD_MULTI_PREBUILT)
liba.so和libb.so放到与Android.mk同一目录下,编译时,会被安装到/system/lib目录下。
参考这里:
Android编译加入第三方动态链接库文件的方法
http://zhuwenhao.com/824/%E6%8A%80%E6%9C%AF/%E8%87%AA%E7%94%B1%E8%BD%AF%E4%BB%B6%E7%A4%BE%E5%8C%BA/android/android%E7%BC%96%E8%AF%91%E5%8A%A0%E5%85%A5%E7%AC%AC%E4%B8%89%E6%96%B9%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95/
补充于2011.6.21:
LOCAL_CFLAGS
-D,增加全局宏定义。
LOCAL_CFLAGS := -DUSE_JSC
相当于在所有源文件中增加一个
#define USE_JSC
LOCAL_CFLAGS := -DUSE_COPY_BIT=1
相当于在所有源文件中增加一个
#define USE_COPY_BIT 1
还有其它的像-W等,都是传递给编译使用的。
补充于2012.4.28
使用NDK编译时碰到的一些常见问题
Q:
Android NDK: Host 'awk' tool is outdated. Please define HOST_AWK to point to Gawk or Nawk !
A:
主要原因是NDK目录下的/android-ndk-r7/prebuilt/linux-x86/bin/awk 是64位版本的。这里可以将32位系统中的awk(我的Ubuntu下是gawk)复制/android-ndk-r7/prebuilt/linux-x86/bin/目录下
参考网址:
http://stackoverflow.com/questions/8116113/problems-with-android-ndk-7-and-awk
Q:
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
A:
源码和Android.mk等没有放在jni目录下
Q:
在LOCAL_SRC_FILES中使用wildcard函数
A:
MY_FILES := $(wildcard $(LOCAL_PATH)/foo/*.c)
MY_FILES := $(MY_FILES:$(LOCAL_PATH)/%=%)
LOCAL_SRC_FILES += $(MY_FILES)
参考网址:
http://www.meegozu.com/thread-1818-1-1.html
打印编译过程
ndk-build -n
使用自己的库
LOCAL_SHARED_LIBRARIES和LOCAL_STATIC_LIBRARIES
使用系统里面的库
在LOCAL_LDLIBS里面加-L和-l
LOCAL_CFLAGS只对.c使用,而LOCAL_CPPFLAGS对.c和.cpp都使用。
发表评论
-
Android下屏保程序的开发
2014-01-09 17:08 0有时候,需要在程序中实现屏保相关的功能,如指定一段时间后,显示 ... -
Android command
2013-11-06 11:20 01. Android支持的linux command不多,在/ ... -
如何一个android工程作为另外一个android工程的lib
2013-10-19 17:01 0在实际使用中,我们可能会把一个android工程作为库,然后 ... -
Android属性(property)机制
2013-09-25 14:39 24991. 属性简介 Android里有很多属性(property ... -
1.把我调试好的NFC上层代码加入GIT服务器代码中,并创建编译开关。
2013-08-21 09:33 0之前遇到的问题:向系统发送一个长按触摸事件,再发送其他触摸事件 ... -
2013-01-10 10:47 android多国语言使用
2013-08-12 20:57 743多国语言:在res目录下建立不同名称的values文件来调用不 ... -
android中dip px sp度量单位
2013-08-06 15:24 0目前android默认的low=120 ... -
minicom的配置
2013-07-08 09:58 5401、在使用minicom之前,首先要保证你对串口有读/写的权限 ... -
Android扩展一个硬件模块
2013-06-19 13:30 0为Android扩展一个硬件模块需要做两件事: 1、硬件和内 ... -
Android修改默认浏览器为其他浏览器
2013-06-15 10:09 1311public class MainActivity exten ... -
Android::开放root权限
2013-05-31 12:59 0开放系统root权限,即使任何用户都可以执行su程序,以使得临 ... -
android 开机logo,和开机动画
2013-05-11 23:17 0一.设置LINUX内核启动LOGO 1、让内核 ... -
android 4.0读写HID装置
2013-05-03 18:31 0求解:android 4.0读写HID设备 大家好,从3.1开 ... -
JAVA 双向SSL,SOCKET客户端/服务端
2013-03-29 14:13 935JAVA 双向SSL,SOCKET客户端/服务端 实现技术: ... -
java 面向 Socket 操作,TCP 和 UDP 示例
2013-03-21 15:55 651TCP/IP 参考模型 应用层-->传输层--> ... -
Android系统Surface制的SurfaceFlinger服务的线程模型分析
2013-03-21 11:31 580在前面两篇文章中,我们分析了SurfaceFlinge ... -
C++ 代码创建虚拟机调用java方法
2013-03-21 11:28 838Java 和 C/C++代码的互相调用一般都是采用JNI的方法 ... -
android keycode 分发
2013-03-11 16:20 0******************************* ... -
android 获得当前活动的Acticity
2013-02-25 15:17 1530ActivityManager activityManager ... -
Android 4.0 截屏(Screenshot)代码流程小结
2013-02-25 13:55 0一、基本介绍 在Android 4. ...
相关推荐
"Android编译系统分析" Android编译系统分析是Android系统中一个非常重要的组件,它负责将Android应用程序代码编译成能够在Android设备上运行的机器代码。下面是Android编译系统分析的详细知识点: 一、Android...
Android编译系统分析,odt格式的,用openoffice打开,介绍分析了Android的编译系统:原理和如何添加本地模块编译,怎样编译成动态库,静态库,可执行程序。
Android 编译系统分析 Android 编译系统是 Android 操作系统的核心组件之一,它负责将源代码编译成可执行文件。Android 编译系统的分析对于Android 开发者来说非常重要,因为它可以帮助开发者更好地理解 Android 的...
Android编译系统是Android操作系统的核心组成部分,负责将源代码转换为可在设备上运行的二进制文件。它是一个复杂的构建系统,涉及多个层次的配置、编译和打包过程。本文将深入探讨Android编译系统的结构和工作原理...
然而,Android编译系统相对集中,位于Android源码的build/core目录下,包含了大量的makefile(*.mk)文件和shell脚本。Google为了满足多目标(MultipleTargets)、非递归构建(Non-RecursiveMake)、快速编译测试...
要完全理解Android编译系统,首先需要掌握以下几个方面的知识点: 1. Make工具:Make是一个命令行工具,它根据Makefile中的规则来编译程序。Makefile是Make的配置文件,其中记录了编译过程中的依赖关系和相应的编译...
通过上述内容,我们可以看到Android编译系统的复杂性和灵活性,它能够根据不同的需求定制化构建出适合特定设备和应用场景的操作系统。对于初学者来说,掌握这些基础概念和流程是理解和开发Android系统的关键。
### Android编译系统框架分析及main.mk解析 #### 一、引言 自从Android源代码公开以来,它在嵌入式行业中引发了巨大的关注与兴趣。众多开发者被Android的强大功能所吸引,纷纷尝试下载源代码进行编译和移植。尽管...
Android编译系统组成
Android 编译系统 Makefile (Android.mk) 写法 Android 编译系统使用 Makefile 文件来编译和构建 Android 系统中的模块。其中,Android.mk 文件是编译系统的核心配置文件,用于指定编译模块的源文件、编译器选项和...
Android编译系统是Android操作系统开发的关键组成部分,负责将源代码转化为可在不同设备上运行的可执行文件和库。本文将深入解析Android编译系统的结构和工作原理,重点关注四种类型的Make文件及其作用。 首先,...
### Android编译系统详解 #### 一、Android编译系统简介 Android的编译系统是其核心组件之一,为开发者提供了高效且稳定的编译环境。该系统不仅支持Android平台本身的编译,还能够编译主机平台上的工具以及各种SDK...
Android编译系统中的Makefile文件,通常以Android.mk的形式存在,是Android构建系统的关键组成部分,用于指导编译过程。这篇文档主要讲解了如何编写Android.mk文件来控制Android编译系统的行为。 1. **LOCAL_PATH的...
Android.mk文件是Android编译系统中的一个关键组件,用于指定如何构建特定的模块。下面将详细讲解Android.mk文件的写法和其中涉及的关键概念。 1. **LOCAL_PATH变量**:LOCAL_PATH变量是用来定位源代码的位置。通常...
本篇将深入探讨`Android.mk`的写法及其在Android编译系统中的作用。 1. **LOCAL_PATH变量**: 在`Android.mk`文件中,`LOCAL_PATH`变量是用来指示当前Makefile所在的目录,通常在文件开头设置。通过`$(call my-dir...
Android编译系统使用了一套专门的编译工具,包括Java编译器、Android Asset Packaging Tool (AAPT)、Android NDK等。 一、编译系统的主要组成部分: 1. Java编译器:负责将Java源文件编译成.class字节码文件,然后...
在Android开发中,构建系统是至关重要的,它负责编译、链接和打包应用程序或系统组件。其中,`Android.mk`文件是Android构建系统的核心部分,它是一个Makefile,用于指导NDK(Native Development Kit)如何处理C/C++...