`

Android编译系统

 
阅读更多
上次翻译了官方的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都使用。
分享到:
评论

相关推荐

    android编译系统分析.pdf

    "Android编译系统分析" Android编译系统分析是Android系统中一个非常重要的组件,它负责将Android应用程序代码编译成能够在Android设备上运行的机器代码。下面是Android编译系统分析的详细知识点: 一、Android...

    Android编译系统分析

    Android编译系统分析,odt格式的,用openoffice打开,介绍分析了Android的编译系统:原理和如何添加本地模块编译,怎样编译成动态库,静态库,可执行程序。

    android编译系统分析(很详细)

    Android 编译系统分析 Android 编译系统是 Android 操作系统的核心组件之一,它负责将源代码编译成可执行文件。Android 编译系统的分析对于Android 开发者来说非常重要,因为它可以帮助开发者更好地理解 Android 的...

    Android编译系统分析-转

    Android编译系统是Android操作系统的核心组成部分,负责将源代码转换为可在设备上运行的二进制文件。它是一个复杂的构建系统,涉及多个层次的配置、编译和打包过程。本文将深入探讨Android编译系统的结构和工作原理...

    Android编译系统(四)Android编译系统框架分析及main.mk 分析

    然而,Android编译系统相对集中,位于Android源码的build/core目录下,包含了大量的makefile(*.mk)文件和shell脚本。Google为了满足多目标(MultipleTargets)、非递归构建(Non-RecursiveMake)、快速编译测试...

    android编译系统详解

    要完全理解Android编译系统,首先需要掌握以下几个方面的知识点: 1. Make工具:Make是一个命令行工具,它根据Makefile中的规则来编译程序。Makefile是Make的配置文件,其中记录了编译过程中的依赖关系和相应的编译...

    Android的编译系统.pdf

    通过上述内容,我们可以看到Android编译系统的复杂性和灵活性,它能够根据不同的需求定制化构建出适合特定设备和应用场景的操作系统。对于初学者来说,掌握这些基础概念和流程是理解和开发Android系统的关键。

    android编译系统框架分析及main.mk分析

    ### Android编译系统框架分析及main.mk解析 #### 一、引言 自从Android源代码公开以来,它在嵌入式行业中引发了巨大的关注与兴趣。众多开发者被Android的强大功能所吸引,纷纷尝试下载源代码进行编译和移植。尽管...

    Android编译系统组成

    Android编译系统组成

    android编译系统makefile(Android.mk)写法.pdf

    Android 编译系统 Makefile (Android.mk) 写法 Android 编译系统使用 Makefile 文件来编译和构建 Android 系统中的模块。其中,Android.mk 文件是编译系统的核心配置文件,用于指定编译模块的源文件、编译器选项和...

    Android 编译系统分析.doc

    Android编译系统是Android操作系统开发的关键组成部分,负责将源代码转化为可在不同设备上运行的可执行文件和库。本文将深入解析Android编译系统的结构和工作原理,重点关注四种类型的Make文件及其作用。 首先,...

    android编译系统

    ### Android编译系统详解 #### 一、Android编译系统简介 Android的编译系统是其核心组件之一,为开发者提供了高效且稳定的编译环境。该系统不仅支持Android平台本身的编译,还能够编译主机平台上的工具以及各种SDK...

    android编译系统makefileAndroidmk写法.pdf

    Android编译系统中的Makefile文件,通常以Android.mk的形式存在,是Android构建系统的关键组成部分,用于指导编译过程。这篇文档主要讲解了如何编写Android.mk文件来控制Android编译系统的行为。 1. **LOCAL_PATH的...

    android编译系统makefile(Android.mk)写法参照.pdf

    Android.mk文件是Android编译系统中的一个关键组件,用于指定如何构建特定的模块。下面将详细讲解Android.mk文件的写法和其中涉及的关键概念。 1. **LOCAL_PATH变量**:LOCAL_PATH变量是用来定位源代码的位置。通常...

    android编译系统makefile(Android.mk)写法扫描.pdf

    本篇将深入探讨`Android.mk`的写法及其在Android编译系统中的作用。 1. **LOCAL_PATH变量**: 在`Android.mk`文件中,`LOCAL_PATH`变量是用来指示当前Makefile所在的目录,通常在文件开头设置。通过`$(call my-dir...

    Android项目编译系统

    Android编译系统使用了一套专门的编译工具,包括Java编译器、Android Asset Packaging Tool (AAPT)、Android NDK等。 一、编译系统的主要组成部分: 1. Java编译器:负责将Java源文件编译成.class字节码文件,然后...

    android编译系统makefile(Android.mk)写法

    在Android开发中,构建系统是至关重要的,它负责编译、链接和打包应用程序或系统组件。其中,`Android.mk`文件是Android构建系统的核心部分,它是一个Makefile,用于指导NDK(Native Development Kit)如何处理C/C++...

Global site tag (gtag.js) - Google Analytics