Android 关于prebuilt编译学习笔记
来源:互联网 发布:软件自学网 下载 编辑:程序博客网 时间:2024/05/28 19:24
一、问题背景
在进行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 关于prebuilt编译学习笔记
- 关于Android.mk中PREBUILT的问题
- android prebuilt
- android ndk Using Prebuilt Libraries
- android提供的共享库(Prebuilt)
- android 学习笔记三(android 源码编译)
- android学习笔记---android项目编译过程
- android学习笔记 ----关于IME
- Android学习笔记-关于Log
- 关于inflate---Android学习笔记
- 【学习anroid编译】关于运行android模拟器
- Android学习笔记之cyanogenmod编译篇
- Android学习笔记之cyanogenmod编译篇
- Android openplatform 编译系统粗略学习笔记
- Android学习笔记(5)--系统编译
- Android编译和运行原理学习笔记
- Tiny4412 Android 5.0 编译系统学习笔记
- Android学习笔记之编译系统(一)编译框架一
- PHP:JSON函数json_encode详解
- 图论(六)--最小生成树
- Storm与Spark streaming的比较
- MySQL修改root密码的多种方法
- Android使用Webview播放Swf文件,实现与Flash数据交互
- Android 关于prebuilt编译学习笔记
- python 读取utf-16时缺少字节的处理
- C/C++之回调函数
- Ubuntu 16.04 添加新用户及修改权限相关问题
- Spark-Streaming入门例子
- Winform获取文件路径
- android 跳转到其他应用的特殊方法
- 疯狂Android讲义——P59-60帧布局下的霓虹灯效果(实现)
- iOS UI设计 ------- 物理分辨率 逻辑分辨率