Android 关于prebuilt编译学习笔记

一、问题背景
在进行Android源码编译的时候,执行make命令,有些prebuilt方式集成的so库总是无法自动编译出来,需要手动执行mmm命令才行。所以研究一下问题在哪。
prebuilt方式把无源码的so, apk或者可执行文件直接编译进系统,一般可采用PRODUCT_COPY_FILES或者PRODUCT_PACKAGES方式集成, 可参考:http://blog.csdn.net/victoryckl/article/details/8034005

二、理解编译框架
当我们执行make命令的时候,编译系统开始收集系统的.mk文件,如下所示:
including ./xxx/xxx/Android.mk ….
……

注意 ,这里只是收集,确定其中 的LOCAL_MODULE, 并没有决定是否对这些LOCAL_MODULE进行编译。哪些LOCAL_MODULE要被编译,需要另外声明。在哪里声明呢?一般有两个文件:
device/mycompany/common/device.mk
device/mycompany/myproduct/device.mk

比如,要编译一个so,在这两个mk文件中,可以这样声明:
PRODUCT_PACKAGES += libmyapp

然后编译系统会从including时收集到的所有的LOCAL_MODULE查找相应的Android.mk文件进行编译。

假设定义的Android.mk文件如下所示:

LOCAL_MODULE := libmyapp
LOCAL_MODULE _SUFFIX := .so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_SRC_FILES := libmyapp.so

编译系统就根据此规则进行编译了,生成libmyapp.so放在out/……/system/lib目录下。

三 解决问题

根据上述理解,需要注意的是,LOCAL_MODULE定义的名称与PRODUCT_PACKAGES写得名称一定要完全匹配。
这里就解决了我的问题,因为我的PRODUCT_PACKAGES用得是libmyapp.so, 而LOCAL_MODULE写得是libmyapp, 这里就不匹配了,名称中多了.so就无法匹配上了, 所以make时无法自动找到。而使用mmm相当于显式指定,当然可以直接编译了。

还有一个细节:LOCAL_MODULE _SUFFIX := .so
如果LOCAL_MODULE后不加这名,生成的动态库文件就没有.so后缀了。如果不加LOCAL_MODULE _SUFFIX := .so
这名,直接写LOCAL_MODULE := libmyapp.so, 生成的结果是有.so后缀,但此时LOCAL_MODULE现在就变成libmyapp.so整个名称了, 在PRODUCT_PACKAGES中就要写libmyapp.so才算匹配了。

四 prebuilt集成的copy方法

如果仅仅是prebuilt,PRODUCT_PACKAGES相对麻烦,采用copy的方法更简便,见上面的参考文章:
RODUCT_COPY_FILES += \
device/ti/panda/my/app/my.apk:system/app/my.apk \
device/ti/panda/my/bin/my.sh:system/bin/my.sh \
device/ti/panda/my/lib/libmy.so:system/lib/libmy.so

你可能感兴趣的:(android)