ledflasher 工程目录分析

编者:厦门大学信息学院通信工程系2015级研究生陈增贤、张恒伟、曾文婷

ledflasher/weaved.conf文件

config文件中定义了设备名字,生产商,设备模式,路径等一系列配置信息.

ledflasher/sepolicy文件

/sepolicy 提供了Android平台中的安全策略源文件。SEAndroid安全机制中的安全策略是在安全上下文的基础上进行描述的,也就是说,它通过主体和客体的安全上下文,定义主体是否有权限访问客体。
/sepolicy目录中的所有以.te为后缀的文件经过编译后,就会生成一个sepolicy文件,这个sepolicy文件会打包在ROM中,并且保存在设备上的根目录下。
文件 ledflasher.te定义了brillo_domain的访问权限:

allow_crash_reporter(ledflasher)  
allow_call_weave(ledflasher)  
allow ledflasher example_led_service:service_manager find;

ledflasher/out文件

编译完成后,将在根目录中生成一个out文件夹,所有生成的内容均放置在这个文件夹中。
out文件夹目录结构如下所示:
out/
-- CaseCheck.txt
-- casecheck.txt
-- host
    -- common
    -- linux-x86/darwin-x86
-- target(如果编译时候定义TARGET_STRIP_MODULE=false的话,这个目录为debug/target)
    -- common
    -- product
主要的两个目录为host和target,前者表示在主机(x86)生成的工具,后者表示目标机(模认为ARMv5)运行的内容。

host目录的结构如下所示:
out/host/
-- common
    -- obj(Java库)
-- linux-x86/darwin-x86
    -- bin(二进制程序)
    -- framework(JAVA库,*.jar文件)
    -- lib(共享库*.so)
    -- obj(中间生成的目标文件)
host目录是一些在主机上用的工具,有一些是二进制程序,有一些是JAVA的程序。

target目录的结构如下所示:
out/target/
-- common
    -- R (资源文件)
    -- docs
    -- obj (目标文件)
        -- APPS(包含了JAVA应用程序生成的目标,每个应用程序对应其中一个子目录,将结合每个应用程序的原始文件生成Android应用程序的APK包)
        -- JAVA_LIBRARIES(包含了JAVA的库,每个库对应其中一个子目录)
-- product
    -- generic
        -- android-info.txt
        -- clean_steps.mk
        -- data(存放数据的文件系统)
        -- obj
            -- APPS(包含了各种JAVA应用,与common/obj/APPS相对应,但是已经打成了APK包)
            -- SHARED_LIBRARIES(存放所有动态库)
            -- STATIC_LIBRARIES(存放所有静态库)
        -- ramdisk.img(内存盘的根文件系统映像)
        -- root
        -- symbols
        -- system(存放主要的文件系统)
        -- system.img(文件系统的映像)
        -- userdata-qemu.img(模拟器使用的数据文件)
        -- userdata.img(数据内容映像)
其中common目录表示通用的内容,product中则是针对产品的内容。

ledflasher/AndroidProducts.mk

PRODUCT_MAKEFILES := $(LOCAL_DIR)/ledflasher.mk

文件中定义了Android产品文件ledflasher的路径。

ledflasher/ledflasher.mk

CFGTREE_ROOT := $(LOCAL_PATH)     //为当前模块的相对路径,必须出现在所有的编译模块之前。
include device/generic/brillo/brillo_base.mk    //引入该路径下的makefile文件  
PRODUCT_NAME := $(call get_product_name_from_file)
ifneq ($(PRODUCT_NAME),$(call cfgtree-get,name))
  $(error config/name, <name>.mk, and AndroidProducts.mk must all be updated together.)
endif
PRODUCT_BRAND := $(call cfgtree-get,brand)
PRODUCT_DEVICE := $(call cfgtree-get,device)
PRODUCT_MANUFACTURER := $(call cfgtree-get,manufacturer)
PRODUCT_PACKAGES += $(call cfgtree-get-if-exists,packages)
PRODUCT_COPY_FILES += $(addprefix $(LOCAL_PATH)/,$(call cfgtree-get-if-exists,copy_files))
BOARD_SEPOLICY_DIRS := $(BOARD_SEPOLICY_DIRS) $(LOCAL_PATH)/sepolicy
-include $(LOCAL_PATH)/extras.mk

ledflasher.mk中包含很多特定的产品变量。产品特定的变量被定义在产品说明文件(definition files)中。产品说明文件可以继承自其它的产品说明文件。这样将便于管理。
产品说明文件中可以包含如下变量:

Parameter Description
PRODUCT_NAME End-user-visible name for the overall product. Appears in the "About the phone" info.
PRODUCT_MODEL End-user-visible name for the end product
PRODUCT_LOCALES A space-separated list of two-letter language code, two-letter country code pairs that describe several settings for the user, such as the UI language and time, date and currency formatting. The first locale listed in PRODUCT_LOCALES is is used if the locale has never been set before.
PRODUCT_PACKAGES Lists the APKs to install.
PRODUCT_DEVICE Name of the industrial design
PRODUCT_MANUFACTURER Name of the manufacturer
PRODUCT_BRAND The brand (e.g., brillo) the software is customized for
PRODUCT_PROPERTY_OVERRIDES List of property assignments in the format "key=value"
PRODUCT_COPY_FILES List of words like source_path:destination_path. The file at the source path should be copied to the destination path when building this product. The rules for the copy steps are defined in config/Makefile
PRODUCT_OTA_PUBLIC_KEYS List of OTA public keys for the product
PRODUCT_TAGS list of space-separated words for a given product

ledflasher/Android.mk

LOCAL_PATH := $(call my-dir)   //Android.mk开始必须定义变量 LOCAL_PATH,它用来指定源文件的位置  
                                 my‐dir: 编译系统提供的'my‐dir'宏函数,被用来获取当前的目录
include $(CLEAR_VARS)          //模块开始
LOCAL_MODULE := ledservice
LOCAL_INIT_RC := ledservice.rc
LOCAL_SRC_FILES 
LOCAL_SHARED_LIBRARIES 
LOCAL_STATIC_LIBRARIES 
LOCAL_CLANG := true
LOCAL_C_INCLUDES := external/gtest/include
LOCAL_CFLAGS := -Wall -Werror
include $(BUILD_EXECUTABLE)     //模块结束标志

Android.mk基本组成:

  1. LOCAL_PATH 定义了当前模块的相对路径,必须出现在所有的编译模块之前。
  2. 每个编译模块由include $(CLEAR_VARS) 开始,由include $(BUILD_XXX) 结束。
  3. include $(CLEAR_VARS) 是一个编译模块的开始,它会清空除LOCAL_PATH之外的所有LOCA_XXX变量。
  4. include $(BUILD_XXX) 描述了编译目标。
  5. LOCAL_SRC_FILES 定义了本模块编译使用的源文件,采用的是基于LOCAL_PATH的相对路径。
  6. LOCAL_MODULE 定义了本模块的模块名。
  7. LOCAL_STATIC_LIBRARIES 表示编译本模块时需要链接的静态库。
  8. LOCAL_C_INCLUDES 表示了本模块需要引用的include文件。

编译acp还需要了几个可选的变量:

  1. LOCAL_PATH 定义了当前模块的相对路径,必须出现在所有的编译模块之前。
  2. LOCAL_C_INCLUDES 表示了本模块需要引用的include文件。
  3. LOCAL_ACP_UNAVAILABLE 表示是否支持acp,如果支持acp,则使用acp进行拷贝,否则使用linux cp拷贝,本模块编译acp,当然是不支持acp了。

参考链接

1.Android.mk 常用宏和变量
http://jingyan.baidu.com/article/37bce2be1659c81002f3a2b
2.Android.mk文件语法规范及使用模板
http://www.cnblogs.com/leaven/archive/2011/01/25/1944688.htm
3.Android Makefile 文件分析
http://blog.csdn.net/wh_19910525/article/details/7993266
4.Android 编译 out文件分析
http://blog.csdn.net/guiwang2008/article/details/7353442
5.Application makefile文件编写规则
http://blog.csdn.net/fengbingchun/article/details/38705519

results matching ""

    No results matching ""