美文网首页
Android.mk 使用 环境 小结

Android.mk 使用 环境 小结

作者: liz0403 | 来源:发表于2017-10-18 15:23 被阅读0次

    转载:http://blog.csdn.net/wh_19910525/article/details/8265824

    一、将无源码的 APK 和它 依赖的库预置进系统,此apk可以升级

    二、

    ++++++++++++++++++++++++++++++

    一、将无源码的 APK 和它 依赖的库预置进系统,此apk可以升级

    ---------- cut here ------------------LOCAL_PATH := $(call my-dir)#预置aliuyi.apkinclude $(CLEAR_VARS)LOCAL_MODULE := wwwa.apk

    LOCAL_SRC_FILES := aliuyi.apkLOCAL_MODULE_TAGS:= optionalLOCAL_MODULE_CLASS :=APPSLOCAL_CERTIFICATE :=PRESIGNEDLOCAL_MODULE_PATH := $(TARGET_OUT)/appinclude $(BUILD_PREBUILT)#方法一:预置so等资源文件include $(CLEAR_VARS)LOCAL_MODULE := wanghai.soLOCAL_SRC_FILES := wanghai.soLOCAL_MODULE_TAGS := optionalLOCAL_MODULE_CLASS :=SHARED_LIBRARIESLOCAL_MODULE_PATH := $(TARGET_OUT)/lib/include $(BUILD_PREBUILT)#方法二:预置so等资源文件

    include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_PREBUILT_LIBS:= sdfapk.so sdffff.soinclude $(BUILD_MULTI_PREBUILT)

    #方法三:

    预置so等资源文件,在Android.mk里 添加 这样一句,注意:这样的方式 如果路径不存在,这条指令 执行 失败,但 不会 报错!

    $(shellcp -rf $(LOCAL_PATH)/libs/*.so $(TARGET_OUT)/lib)

    ---------- cut here ------------------

    解释:

    LOCAL_MODULE指定 拷贝后的apk的名字(全名),这个变量里可以有路径,但路径也会被拷贝,创建如果

    是在编译整个android的源码,这个apk必须已经添加到了PRODUCT_PACKAGES 变量里,否则 不会拷贝到,相应的位置,

    LOCAL_MODULE_PATH指定拷贝的路径,如果路径不存在自己创建

    LOCAL_SRC_FILES指定 源apk

    LOCAL_CERTIFICATE:= PRESIGNED表示 这个apk已经签过名了,系统不需要再次 签名;

    LOCAL_MODULE_CLASS指定文件类型,apk文件用APPS,并且 会检查 是否是apk文件,动态库so文件用SHARED_LIBRARIES,bin文件用EXECUTABLES,其他文件 用ETC

    注意:若是被预置的apk里有so库,需要将从Test.apk的 so库拷贝到 out/target/product/xxx/system/lib/目录下,若无 so 库,则去掉此步;

    方法一 只能针对 一个文件,方法二 可以 针对多个文件,但 只能 把 文件 拷贝到 system/lib/ 下,

    Android提供了Prebuilt编译方法,两个文件prebuilt.mk和multi_prebuilt.mk,对应的方法宏是BUILD_PREBUILT和 BUILD_MULTI_PREBUILT。

    prebuilt.mk就是prebuilt的具体实现,它是针对独立一个文件的操作,multi_prebuilt.mk 可以针对多个文件的,它对多个文件进行判断,然后调用prebuilt对独立一个文件进行处理。

    http://www.cnblogs.com/langlang/archive/2012/04/23/2467037.html

    LOCAL_PATH := $(call my-dir)

    {

    首先需要指定LOCAL_PATH变量,用于查找源文件

    上面的语句的意思是将LOCAL_PATH变量定义成本文件所在目录路径

    }

    #Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始

    #以include $(BUILD_XXX)结束。

    include $(CLEAR_VARS)//开始

    {

    问: CLEAR_VARS是什么??

    答: CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,

    如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。

    }

    #包含的头文件

    LOCAL_C_INCLUDES += \

    hardware/led/include/

    LOCAL_PRELINK_MODULE :=false//:=是赋值的意思

    LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw

    {

    //LOCAL_MODULE_PATH: 最后的目标安装路径

    问: TARGET_OUT_SHARED_LIBRARIES是什么?

    答: 在build/core/envsetup.mk中定义。TARGET_OUT_SHARED_LIBRARIES:= $(TARGET_OUT)/lib

    TARGET_ROOT_OUT:表示根文件系统。

    TARGET_OUT:表示system文件系统。

    TARGET_OUT_DATA:表示data文件系统。

    }

    LOCAL_SHARED_LIBRARIES := liblog//LOCAL_SHARED_LIBRARIES中加入所需要链接的动态库(*.so)的名称

    LOCAL_SRC_FILES := led.cpp

    LOCAL_MODULE :=led.default//LOCAL_MODULE表示模块最终的名称

    #LOCAL_MODULE的定义规则,led后面跟有default,led.default能够保证我们的模块总能被硬象抽象层加载到

    LOCAL_MODULE_TAGS := eng

    include $(BUILD_SHARED_LIBRARY)//结束

    {

    include $(BUILD_STATIC_LIBRARY)表示编译成静态库

    include $(BUILD_SHARED_LIBRARY)表示编译成动态库。

    include $(BUILD_EXECUTABLE)表示编译成可执行程序

    }

    LOCAL_SRC_FILES中加入源文件路径,LOCAL_C_INCLUDES 中加入所需要包含的头文件路径,

    LOCAL_STATIC_LIBRARIES加入所需要链接的静态库(*.a)的名称,

    LOCAL_SHARED_LIBRARIES中加入所需要链接的动态库(*.so)的名称,

    LOCAL_MODULE表示模块最终的名称,BUILD_EXECUTABLE表示以一个可执行程序的方式进行编译。

    hardware\led\Android.mk

    include $(call all-subdir-makefiles)

    frameworks\base\services\forlinx_led_jni\LedService.cpp

    frameworks\base\services\forlinx_led_jni\Android.mk

    {

    LOCAL_PATH:= $(call my-dir)//LOCAL_PATH变量定义成本文件所在目录路径

    include $(CLEAR_VARS)

    # [optional, user, eng]

    # eng = required

    # optinal = no install on target

    LOCAL_MODULE_TAGS := eng

    {

    LOCAL_MODULE_TAGS :=optional -->>out/target/product/OK6410/symbols/system/

    LOCAL_MODULE_TAGS :=eng    -->>out/target/product/Ok6410/system/

    }

    # Thisisthe target being built.

    LOCAL_MODULE:= libforlinx_runtime

    # Target install path.

    LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)

    # All of the source files that we will compile.

    LOCAL_SRC_FILES:= \

    LedService.cpp

    # All of the shared libraries we link against.

    LOCAL_SHARED_LIBRARIES := \

    libandroid_runtime \

    libcutils \

    libhardware \

    libhardware_legacy \

    libnativehelper \

    libsystem_server \

    libutils \

    libui \

    libsurfaceflinger_client

    # Also need the JNI headers.

    LOCAL_C_INCLUDES += \

    $(JNI_H_INCLUDE) \

    hardware/led/include

    # No specia compiler flags.

    LOCAL_CFLAGS +=

    {

    LOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arrays

    通过设定编译器操作,优化级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

    LOCAL_CFLAGS += -W -Wall

    LOCAL_CFLAGS += -fPIC -DPIC

    LOCAL_CFLAGS += -O2 -g -DADB_HOST=1-Wall -Wno-unused-parameter

    LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE -DSH_HISTORY

    LOCAL_CFLAGS += -DUSEOVERLAY2

    根据条件选择相应的编译参数

    }

    # Don't prelink this library.  For more efficient code, you may want

    # to addthislibrary to the prelink map andsetthistotrue.

    LOCAL_PRELINK_MODULE :=false

    {

    Prelink利用事先链接代替运行时链接的方法来加速共享库的加载,它不仅可以加快起动速度,还可以减少部分内存开销,

    是各种Linux架构上用于减少程序加载时间、缩短系统启动时间和加快应用程序启动的很受欢迎的一个工具。程序运行时的

    动态链接尤其是重定位(relocation)的开销对于大型系统来说是很大的。

    动态链接和加载的过程开销很大,并且在大多数的系统上, 函数库并不会常常被更动, 每次程序被执行时所进行的链接

    动作都是完全相同的,对于嵌入式系统来说尤其如此。因此,这一过程可以改在运行时之前就可以预先处理好,即花一些时间

    利用Prelink工具对动态共享库和可执行文件进行处理,修改这些二进制文件并加入相应的重定位等信息,节约了本来在程序

    启动时的比较耗时的查询函数地址等工作,这样可以减少程序启动的时间,同时也减少了内存的耗用。

    Prelink的这种做法当然也有代价:每次更新动态共享库时,相关的可执行文件都需要重新执行一遍Prelink才能保

    证有效,因为新的共享库中的符号信息、地址等很可能与原来的已经不同了,这就是为什么 android framework代码一改动,

    这时候就会导致相关的应用程序重新被编译。

    这种代价对于嵌入式系统的开发者来说可能稍微带来一些复杂度,不过好在对用户来说几乎是可以忽略的。

    }

    include $(BUILD_SHARED_LIBRARY)

    }

    相关文章

      网友评论

          本文标题:Android.mk 使用 环境 小结

          本文链接:https://www.haomeiwen.com/subject/egceuxtx.html