zoukankan      html  css  js  c++  java
  • Android.mk入门(一)

    Android.mk是Android工程管理文件,其作用基本等同于Linux环境中的Makefile,在语法上,Android.mk和普通Makefile略有不同,主要区别是Android.mk包含一些Android编译系统的公共的宏
    Android.mk中选项参考以下文件路径:
    build/core/config.mk
    各个选项的默认值在以下文件中定义:
    build/core/base_rules.mk
     
    1、Android.mk文件只处理从根目录开始找到的第一个Android.mk文件,如果需要递归。需要在当前目录的Android.mk文件中做如下处理:
    include $(call all-makefiles-under,$(LOCAL_PATH))
     
    在一个Android.mk中也可以生成多个目标:可执行程序,动态库,静态库或者Android用用程序包
    Android.mk文件可以处理多个内容:
     
    include $(CLEAR_VARS) //清理变量
    #处理第一个内容
    include $(CLEAR_VARS)
    #处理第二个内容
     
    现在我们来讨论对于各种目标的构建方式
    1、可执行程序
    LOCAL_PATH :=$(my_dir) //本地路径,当前目录
    Text EXe
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES := eng
    LCAOL_SRC_FILES :=
    main.c
    LOCAL_MODULE := text_exe
    LOCAL_C_INCLUDES :=
    LOCAL_STATIC_LIBRARIES :=
    LOCAL_SHARED_LIBRARIES := libc
    include $(BUILD_EXECUTABLE)
     
    注:编译一个可执行程序,需要在LOCAL_SRC_FILES 中假如远见路径(相对于当前Android.mk目录的路径),
    在LOCAL_C_INCLUDES中假如所需要包含的头文件路径;
    在LOCAL_STATIC_LIBRARIES 中假如所需要链接的静态库(*.a)的名称
    在LOCAL_SHARED_LIBRARIES中假如所需要链接的动态库(*.so)的名称
    LOCAL_MODULE标示模块最终的名称,最后使用include$(build_executable)
    表示以一个可执行程序的方式进行编译,在本例中,LOCAL_MODULE被定义为test_exe,
    因此最终生成可执行程序的名称是test_exe
    一个可执行程序编译后生成独立的目标目录在out/target/product/中,路径如下所示:
    <TARGET_PRODUCT>/obj/EXECUTABLES/<LOCAL_MODULE>
     
    2、静态库
    静态库,也称之为归档文件,在Linux中扩展名通常为.a,在Android.mk中编译一个静态库(归档文件)的模板如下所示
    LOCAL_PATH :=$(my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE_TAGS := eng
    LOCAL_SRC_FILES :=
    hello.c
    LOCAL_C_INCLUDES :=
    LOCAL_STATIC_LIBARIES :=
    LOCAL_SHARED_LIBRARAIES := libc
    include $(BUILD_STATIC_LIBRARY)
     
    在编译静态库,基本的内容和编译可执行程序相似,区别在于include$(BUILD_STATIC_LIBRARY) 标示编译静态库。在本例中,LOCAL_MODULE被定义为libtest_static,因此最终生成的静态库的名称是libtest_static.a
     
    3、动态库
    动态库 也称之为共享库,是linux标准的elf格式文件的一种,在Linux中扩展名通常为.so在Android中编译一个动态库(共享库)的模板如下:
    LOCAL_PATH := $(my-dir)
    include $ (CLEAR_VARS)
    LOCAL_MODULE_TAGS :=eng
    LOCAL_SRC_FILES :=
    hello.c
    LOCAL_MODULE := libtest_stared
    TARGET_PRELINK_MODULE := false
    LOCAL_C_INCLUDES :=
    LOCAL_STATIC_LIBRARIES :=
    LOCAL_SHARED_LIBRARIES := libc
    include $ (BUILD_SHARED_LIBRARY)
    编译一个动态库,基本的内容和编译可执行程序、静态库相似,区别在于使用include$(BUILD_SHARED_LIBRARY)
    表示编译动态库。在本例中,LOCAL_MODULE被定义为libtest_shared,因此最终生成的动摇库的名称是libtest_shared.so
    一个动态库编译后生成的独立的目标目录在out/target/product/中,路径如下所示
    <TARGET_PRODUCT>/obj/STATIC_LIBRARIES/<LOCAL_MODULE>
     
    Android 应用程序包是一种特殊的文件,通常以apk为扩展名。在Android.mk中编译
    一个应用程序包的模板如下所示:
    LOCAL_PATH := $(CALL my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE_TAGS := eng
    LOCAL_PACKAGE_NAME := TestApplication
    include $(BUILD_PACKAGE)
    这里使用BUILD_PACKAGE宏表示编译apk,而LOCAL_SRC_FILES 使用自动查找的方法,将找打所有的java文件进行编译
    在源代码环境中编译和在SDK中编译应用程序包略有不同,涉及的目录主要有一下两个。
    out/target/common/obj/APPS: 通用java字节码目录
    out/target/product/<TARGET_PRODUCT>obj/APPS:Android 应用包目录
    每个包在两个目录中均具有名为{LOCAL_PACKAGE_NAME}_intermediates/的独立目录
    例如,对于SkeletonApp包编译,公共目录的生成结构如下所示:
    关于在编译应用程序的时候,有一个额外的宏可以控制编译的行为,如下所示:
    WITH_DEXPREOPT := true
    如果WITH_DEXPREOPT 被定义为true,一个应用程序将由两个部分组成:一个是不包含java字节码classes.dex的apk文件,一个是名称为classes.odex的字节码文件。
    两个文件同时预制在系统中依然可以构成能运行的应用程序。但是,这种生成的结构就不能在进行动态的安装了。
    Android4.x以上默认为true
     
  • 相关阅读:
    Silverlight 3 Beta版的变化
    路由事件[转]
    使用Live writer写博客(转)
    Silverlight 3.0正式版RTW的发布日期
    向NBA神化人物们致敬
    英语新闻网站大全
    《Silverlight开发者期刊第一期》Silverlight开发者团队(银客帝国)
    逻辑树与可视树[转]
    微软下载中心使用Silverlight搜索
    DeskViewer基于Silverlight 2.0开发的个性相册展示系统
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/7401698.html
Copyright © 2011-2022 走看看