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)