Android的支持库 && app/apk包进系统 && 预置so库进系统 && 预置文件和文件夹进系统
来源:互联网 发布:网络语言凸是什么意思 编辑:程序博客网 时间:2024/04/30 14:17
C语言底层库libcutils:这是Android本地中最为基础的库,基本上Android中所有的本地的库和程序都连接了这个库。头文件的路径:system/core/include/cutils,库的路径
system/core/libcutils,编译的结果是:libcutils.so。libcutil 中主要的头文件:threads.h:线程;sockets.h:Android的套接字;properties.h:Android的属性;log.h :log 信息;array.h:数组;ashmem.h:匿名共享内存;atomic.h:原子操作;mq.h:消息队列。
Shell工具:Android系统的启动后,提供了基本shell界面供开发调试使用。需要启动了一个名称为console的服务,实际上执行的程序:/system/bin/sh,sh代码的路径:
system/core/sh。
C++工具库libutils:libutils 是Android的底层库,这个库以C++实现,它提供的API也是C++的。Android的层次的C语言程序和库,大都基于libutils 开发。头文件的路径:
frameworks/base/include/utils,库的路径frameworks/base/libs/utils,编译的结果是:libutils.so。
===============================app/apk包进系统=======================================
有些APP应用或者工程,如果我们想把它放进android的CODEBASE中编译,想让生成的apk直接就在system/app中,这个时候就需要用到如何把一个app编译进工程。
(1)对APP工程,首先在packages/app目录下新建工程名,比如xxxx,然后移入工程的src,res,androidmanifest.xml即可(要删除bin跟gen,易造成冲突)。配以对应的android.mk文件(也可参照现成)。内容是:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_JAVA_LIBRARIES := mediatek-frameworkLOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_PACKAGE_NAME :=<span style="color: rgb(255, 0, 0);"> </span><span style="color:#330033">xxxx</span>LOCAL_CERTIFICATE := platformLOCAL_PROGUARD_ENABLED := full#LOCAL_PROGUARD_FLAG_FILES := proguard.flagsinclude $(BUILD_PACKAGE)# Use the following include to make our test apk.include $(call all-makefiles-under,$(LOCAL_PATH))
修改了对应的工程名就行。然后运行./mk mm xxxx,即可在out\target\product\xxxx\system\app\下生成对应的apk。 注意:一些常用名字的解释
LOCAL_MODULE :
指定 拷贝后的apk的名字(全名),这个变量里可以有路径,但路径也会被拷贝,创建,如果是编译整个android的源码,这个apk必须已经添加到了PRODUCT_PACKAGES 变量里,否则 不会拷贝到相应的位置
LOCAL_MODULE_TAGS :
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译
LOCAL_SRC_FILES :
指定源,如果是apk或者so,指定原名;如果是apk包,指定代码路径
LOCAL_MODULE_PATH :
指定要拷贝到的路径,如果路径不存在会自己创建。如果APK要求能卸载,改成LOCAL_MODULE_PATH:=$(TARGET_OUT_DATA_APPS),或者直接把APK放在vendor/mediatek/${Project}/artifacts/out/target/product/${Project}/data/app/下面。
LOCAL_CERTIFICATE :
PRESIGNED :表示 这个apk已经签过名了,系统不需要再次 签名;如果要求内置的APK可以升级,则需要修改LOCAL_CERTIFICATE := PRESIGNED。
LOCAL_MODULE_CLASS :
指定文件类型,apk文件用APPS,并且会检查是否是apk文件,动态库so文件用SHARED_LIBRARIES ,bin文件用EXECUTABLES,其他文件用ETC
LOCAL_PRIVILEGED_MODULE :
为true,表示该app会放入权限较高的priv-app目录中。
LOCAL_PATH := $(my-dir)
include $(call all-makefiles-under,$(LOCAL_PATH))
索引同级或者子目录下的其它mk
可根据具体需求修改。另外,如果有些app工程带自身的jar包,参见http://blog.csdn.net/gieghia007/article/details/5662220。
(2)对APP已经是一个现成的apk了,要放进系统中。新建一个目录,把apk跟android.mk放在一起,mk内容(也可参照现成)是:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# Module name should match apk name to be installedLOCAL_MODULE := xxxxLOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := $(LOCAL_MODULE).apkLOCAL_MODULE_CLASS := APPSLOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_MODULE_PATH := $(TARGET_OUT)/appLOCAL_CERTIFICATE := platforminclude $(BUILD_PREBUILT)
若是被预置的apk里有so库,需要将so库也预置到系统中。比如在内置skype这个apk时,一开机就提示“unfortunately,skype has stopped”,且该提示框一直存在导致平台无法操作。后来找到解决方法,是因为有些apk包含so库:把skype这个apk以ZIP的方式解压,将其中的Lib文件夹下的so库,拷贝到alps/vendor/mediatek/${Project}/artifacts/out/target/product/${Project}/system/lib/目录下,执行systemimage命令,之后在out\target\product\soyo\system\lib\下即可找到对应的库。重新烧录系统,就没有此问题了。
(3)以上两个过程,都要在对应的系统mk文件中给PRODUCT_PACKAGES赋值。我的路径是build\target\product\common.mk,里面的
PRODUCT_PACKAGES := \ AccountAndSyncSettings \ DeskClock \
在后面跟上APK包名就行了(包名跟apk名保持一致,否则会包不上)。只需要执行systemimage就行了,不需要编译安卓。
===============================预置so库进系统===================================
预置so库到系统中
(1)预置单个so,同级目录下的Android.mk这么写
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_PREBUILT_LIBS := hwcomposer.rk30board.soLOCAL_MODULE_TAGS := optionalLOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)include $(BUILD_MULTI_PREBUILT)(2)预置多个so。比如当前目录下有gralloc.rk30board.so和hwcomposer.rk30board.so两个文件,同目录下的Android.mk这么写即可:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_PREBUILT_LIBS := hwcomposer.rk30board.soLOCAL_MODULE_TAGS := optionalLOCAL_MODULE_PATH := $(TARGET_OUT)/libinclude $(BUILD_MULTI_PREBUILT)include $(CLEAR_VARS)LOCAL_PREBUILT_LIBS := gralloc.rk30board.soLOCAL_MODULE_TAGS := optionalLOCAL_MODULE_PATH := $(TARGET_OUT)/libinclude $(BUILD_MULTI_PREBUILT)默认预置到system/lib/ 。Android提供了Prebuilt编译方法,两个文件prebuilt.mk和multi_prebuilt.mk,对应的方法宏是BUILD_PREBUILT和 BUILD_MULTI_PREBUILT。
prebuilt.mk就是prebuilt的具体实现,它是针对独立一个文件的操作,multi_prebuilt.mk 可以针对多个文件的,它对多个文件进行判断,然后调用prebuilt对独立一个文件进行处理。
大量预置同级目录下的.so,比如多达几十个到system/lib中,Android.mk这样写
LOCAL_PATH := $(my-dir)include $(CLEAR_VARS)libs := $(patsubst $(LOCAL_PATH)/%,%,$(wildcard $(LOCAL_PATH)/*.so))$(foreach i,$(libs),\ $(eval m := $(basename $(patsubst lib/%,%,$(i)))) \ $(eval LOCAL_PREBUILT_LIBS += $(m):$(i)) \ $(eval $(ALL_PREBUILT):$(m)) \ $(eval m := ) \)LOCAL_MODULE_TAGS := optionalinclude $(BUILD_MULTI_PREBUILT)
(3)如果预置某个文件夹下的so,假设是armeabi文件夹下的so到system/lib中,同级目录下的xxx.mk可以写
CUR_PATH := device/rockchip/rkpx2/carbitsf_lib_files := $(shell ls $(CUR_PATH)/armeabi | grep .so)PRODUCT_COPY_FILES += \ $(foreach file, $(sf_lib_files), $(CUR_PATH)/armeabi/$(file):system/lib/$(file))上一级的Android.mk写
LOCAL_PATH := $(call my-dir)include $(call all-makefiles-under,$(LOCAL_PATH))直接调用各自的.mk。
============================预置文件和文件夹进系统===============================================
续上,如果简单的把文件夹和文件,内置到system的某个目录中,假设
同级的carbit.mk如下
CUR_PATH := device/rockchip/rkpx2/carbit$(shell cp -af $(CUR_PATH)/carbit $(ANDROID_PRODUCT_OUT)/system/)PRODUCT_COPY_FILES += \ $(CUR_PATH)/adb-ec/adb-ec:root/sbin/adb-ec \ $(CUR_PATH)/adb-ec/usb_modeswitch-ec:root/sbin/usb_modeswitch-ec\ $(CUR_PATH)/init.carbit.sh:system/bin/init.carbit.sh内置文件用PRODUCT_COPY_FILES宏,内置文件夹用sh执行拷贝命令
参考原文:http://www.2cto.com/kf/201211/169358.html
参考原文:http://blog.csdn.net/yinwei520/article/details/6598476
参考原文:http://blog.csdn.net/gieghia007/article/details/5662220
- Android的支持库 && app/apk包进系统 && 预置so库进系统 && 预置文件和文件夹进系统
- mt65xx系统预置apk
- android 预置apk so库 jar包等
- 在android系统源码中预置apk
- 在android系统源码中预置apK
- 带有源码的apk预置到系统
- android 预置apk so库等
- Android 6.0 预置so库 apk
- Android 6.0 预置so库 apk
- Android的源代码结构 && 一些常用术语 && Android的支持库 && app/apk包进系统
- 带源码的APK预置进系统时所遇到的问题
- [FAQ19857]采用Signature Scheme v2签名方式的APK预置进系统失败
- Android系统预置flash插件
- android 源码中预置带.so文件的APK
- Android如何预置apk,jar,lib等任意文件到系统中
- 如何将APP预置为系统应用
- iReport预置系统变量
- 预置系统contacts
- 选择文件、选择目录
- 新浪博客HtmlEditor说明、在线演示、下载
- 大对象,小对象
- 从今天起开始SQL 2005的学习
- GridView行选择事件,单击GridView中某一行任意位置提出这条记录
- Android的支持库 && app/apk包进系统 && 预置so库进系统 && 预置文件和文件夹进系统
- 第四天
- 急求AT89S51八人智能抢答器程序及图片!谢谢!!
- 面试当中的等消息
- 对《sql server 2005实现与维护》的评价
- 医学图像增强3
- Oracle完全卸载步骤
- Sql server同表内嵌套查询
- 用DataAdapter读取数据并写入ComboBox控件