美文网首页
Android源码编译过程及原理(三)

Android源码编译过程及原理(三)

作者: 狗钱偷生 | 来源:发表于2018-08-13 15:27 被阅读0次

    我们应该记住生命中不期而遇的温暖,也应该记住大雨磅礴没有伞的日子。


    主要内容

    1. config.mk的基本解析
    2. Android.mk的基本语法

    1. config.mk的基本解析

    1.1. 定义了一些路径变量

    SRC_HEADERS := \
          $(TOPDIR)system/core/include \
          $(TOPDIR)system/media/audio/include \
          $(TOPDIR)hardware/libhardware/include \
          $(TOPDIR)hardware/libhardware_legacy/include \
          $(TOPDIR)hardware/ril/include \
          $(TOPDIR)libnativehelper/include \
          $(TOPDIR)frameworks/native/include \
          $(TOPDIR)frameworks/native/opengl/include \
          $(TOPDIR)frameworks/av/include \
          $(TOPDIR)frameworks/base/include
    
      1. 包含了pathmap.mk 这个文件中定义了一些路径变量
    include $(BUILD_SYSTEM)/pathmap.mk
    

    1.3. 定义了各种编译所用到的宏,下面是几个常用的

    编译为APK
    BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
    编译为静态库
    BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
    编译为动态库
    BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
    

    1.4. 包含了envsetup.mk,该文件会完成环境变量的配置,同时它还包含了product_config.mk文件,在product_config.mk中又包含了product.mk,product.mk会扫描device和vendor的AndroidProduct.mk文件,为系统添加不同的product。选择之后,就会设置对应的环境变量,如输出路径等,输出路径是和产品相关的。
    1.5. 定义各种工具所对应的命令宏

    ACP := $(HOST_OUT_EXECUTABLES)/acp
    AIDL := $(HOST_OUT_EXECUTABLES)/aidl
    AAPT := $(HOST_OUT_EXECUTABLES)/aapt
    AAPT2 := $(HOST_OUT_EXECUTABLES)/aapt2
    

    2. Android.mk基本语法:

    以android系统中luncher为例

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    
    LOCAL_MODULE_TAGS := optional
    
    LOCAL_STATIC_JAVA_LIBRARIES := android-common android-support-v13
    
    LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
    LOCAL_SDK_VERSION := current
    
    LOCAL_PACKAGE_NAME := Launcher2
    LOCAL_CERTIFICATE := shared
    LOCAL_PRIVILEGED_MODULE := true
    
    LOCAL_OVERRIDES_PACKAGES := Home
    
    LOCAL_PROGUARD_FLAG_FILES := proguard.flags
    
    include $(BUILD_PACKAGE)
    

    LOCAL_PATH :子项目的绝对路径,可以由系统定义的my-dir获取
    CLEAR_VARS:清除除了LOCAL_PATH的所有变量值
    LOCAL_MODULE_TAGS:子项目的标签。是由系统定义好的,这和编译系统时所选择的产品类型相关。产品的类型有user,eng,debug。而子项目的标签有user,eng,debug,optional。当我们编译的产品类型是user时,就会包含标签是user或者optional的所有子项目。其实无论产品的类型是什么optional标签的子项目都会被包含进去。一般来说user是厂商私有项目的标签,会和厂商的硬件相关联。
    LOCAL_STATIC_JAVA_LIBRARIES :该项目所依赖的静态库
    LOCAL_SRC_FILES :源文件,java,renderscript可以根据对应的函数获取,如果是.cpp或者.c等就需要指定该源文件的路径。
    LOCAL_PACKAGE_NAME :子项目的名称,用于java项目。如果是c/c++则使用LOCAL_MODULE。也是我们make时的target名。
    LOCAL_CERTIFICATE:签名,我常用的是platform,让项目可享受系统级别的待遇。
    LOCAL_PRIVILEGED_MODULE:指明编译后的结果安装的位置,如果不设置或为false,则在out/target/../system/app下,如果为true则安装在out/target/../system/priv-app/。
    LOCAL_OVERRIDES_PACKAGES:是某模块不加入编译系统,不会生成对应的输出文件
    LOCAL_PROGUARD_FLAG_FILES:指定混淆配置文件,在Android.mk同级目录下创建proguard.flags,指定不被混淆的类。
    BUILD_PACKAGE:指明编译结果为apk.这些在config.mk中都有配置

    相关文章

      网友评论

          本文标题:Android源码编译过程及原理(三)

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