关注微信号:javalearns   随时随地学Java

或扫一扫

随时随地学Java

本文比较详细地介绍了Android Make系统,通过手动Makefile编译Android来提高对Android系统的了解,以下是原文:

android make 系统

  • arch
  • board
  • device
  • product

Android.mk中的定义变量

  • include $(CLEAR_VARS)

它对应的是在./build/core/config.mk中的CLEAR_VARS:=$(BUILD_SYSTEM)/clear_vars.mk

  • include $(BUILD_PACKAGE)

它对应的是在./build/core/config.mk中的BUILD_PACKAGE:=$(BUILD_SYSTEM)/package.mk

  • 其它以此类推

main.mk中的模块

.PHONY:checkbuilt.PHONY:prebuilt.PHONY: files.PHONY: ramdisk.PHONY: systemimage.PHONY: userdataimage.PHONY: bootimage.PHONY: recoveryimage.PHONY: droidcore.PHONY: apps_only.PHONY: sdk.PHONY: clean.PHONY: clobber.PHONY: modules.PHONY: showcommands

makefile的文件结构

LOCAL_PATH:=$(call my-dir) //获取当前目录#include $(CLEAR_VARS) //make系统为子模块定义了很多的私有变量,这个调用是为了初始化所有的私有变量...//里面的内容根据不同的需要会出现不同的LOCAL变量...#include $(BUILD_XXX) //执行编译任务

编译apk

LOCAL_SRC_FILES:=$(call all-subdir-java-files)LOCAL_PACKAGE_NAME:=packageNameinclude $(BUILD_PACKAGE)

编译依赖静态java库的应用程序

LOCAL_STATIC_JAVA_LIBRARIES:=static-libraryLOCAL_SRC_FILES:=$(call all-subdir-java-files)LOCAL_PACKAGE_NAME:=packageNameinclude $(BUILD_PACKAGE)

编译一个需要用平台key签名的应用程序

LOCAL_SRC_FILES:=$(call all-subdir-java-files)LOCAL_PACKAGE_NAME:=packageNameLOCAL_CERTIFICATE:=platforminclude $(BUILD_PACKAGE)

编译一个需要特定key的应用程序

LOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_PACKAGE_NAME := LocalPackageLOCAL_CERTIFICATE := vendor/example/certs/appinclude $(BUILD_PACKAGE)

添加一个预编译应用程序

LOCAL_SRC_FILES := $(LOCAL_MODULE).apkLOCAL_MODULE := LocalModuleNameLOCAL_MODULE_CLASS := APPSLOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)include $(BUILD_PREBUILT)LOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_JAVA_LIBRARIES := android.test.runnerLOCAL_MODULE := sampleinclude $(BUILD_STATIC_JAVA_LIBRARY)

常用的mk分类

  • Android.mk 用来编译模块或者apk的,module对应native code,package对应于java
  • AndroidProducts.mk 设置product,设置系统包含了那些应用target_-.mk,host_-.mk,-.mk 针对不同的系统和CPU架框进行设置 +BoardConfig.mk 设置主板用的,比如driver的选择
  • ./build/core/Makefile 定义了image是如何生成的
  • frameworks/base/core/java 扩展SDK时,可以向里面添加自己的类

make参数

  • . build/envsetup.sh 可以设置环境,运行之后会支持mm命令,使make支持只编译一个模块
    用户也可以通过mm来编译指定模块,或者通过make clean-module_name来删除指定模块。
  • make ONE_SHOT_MAKEFILE=

通过CREATE_MODULE_INFO_FILE,build system会将所有的模块信息列在$(PRODUCT_OUT)/module-info.txt中

  • make CREATE_MODULE_INFO_FILE=true 产生单个的image文件,用以早期的硬件测试

HOST_BUILD_TYPE 和 TARGET_BUILD_TYPE 用来设置是debug还是release,debug的带有调试信息,这两个参数也可以在 buildspec.mk中进行设置以防止在别处被重复指定

  • 其它的一些变量
LOCAL_AAPT_FLAGSLOCAL_ACP_UNAVAILABLLOCAL_ADDITIONAL_JAVA_DIRLOCAL_AIDL_INCLUDESLOCAL_ALLOW_UNDEFINED_SYMBOLSLOCAL_ARM_MODELOCAL_ASFLAGSLOCAL_ASSET_DIRLOCAL_ASSET_FILES 在与BUILD_PACKAGE一起时有效,表示资源文件LOCAL_BUILT_MODULE_STEMLOCAL_C_INCLUDES 用来指定外面的头文件路径LOCAL_CC 可以指定C编译器LOCAL_JAR_MANIFESTLOCAL_JARJAR_RULESLOCAL_JAR_PATHLOCAL_SHARED_LIBRARIES 可链接动态库LOCAL_SRC_FILES 编译源文件LOCAL_STATIC_JAVA_LIBRARIESLOCAL_STATIC_LIBRARIES 可链接静态库LOCAL_UNINSTALLABLE_MODULELOCAL_WHOLE_STATIC_LIBRARIES 禁止在连接时删除库中的无用代码LOCAL_FORCE_STATIC_EXECUTABLE 如果编译的可执行程序要进行静态链接(执行时不依赖于任何动态库)LOCAL_JAVA_LIBRARIES 编译java应用程序和库的时候指定包含的java类库,目前有core和framework两种                     多数情况下定义成:LOCAL_JAVA_LIBRARIES := core framework                     注意LOCAL_JAVA_LIBRARIES不是必须的,而且编译APK时不允许定义(系统会自动添加)
  • envsetup.mk会读取由envsetup.sh写入环境变量中的一些变量来配置 编译过程中的输出目录
  • config.mk里面定义了各种module所需要的工具,以及如何来编译各个模块
CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mkBUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mkBUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mkBUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mkBUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mkBUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mkBUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mkBUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mkBUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mkBUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mkBUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mkBUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mkBUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mkBUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mkBUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mkBUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mkBUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mkBUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mkBUILD_KEY_CHAR_MAP := $(BUILD_SYSTEM)/key_char_map.mk以上的*.mk中都包含了base_rules.mk
  • products设置

./build/target/product/AndroidProducts.mk

  • module设置

native code和java的一些通用方法都在./build/core/definitions.mk中

BUILD_SHARE_xxx等变量在./build/core/config.mk中

  • Board设置

./build/target/board/$(TARGET_DEVICE)/BoardConfig.mk ./vendor/*/$(TARGET_DEVICE)/BoardConfig.mk

  • rules相关

与 LOCAL_MODULE_TAGS相关的定义

include $(BUILD_STATIC_LIBRARY) 编译成静态库include $(BUILD_SHARED_LIBRARY) 编译成动态库。include $(BUILD_EXECUTABLE) 编译成可执行程序

常用函数

call my-dircall all-subdir-java-filescall all-java-files-undercall all-makefiles-under,$(LOCAL_PATH)call all-clean-stepcall import-module,android/native_app_gluecall inherit-product,xxx.mkcall inherit-product-if-existscall device-testcall include-path-for,libpagemapcall dist-for-goals,dist_files,$(LOCAL_BUILT_MODULE)call _add-charger-image,$(_img)call libfilterfw-all-java-files-under,$(1)call libfilterfw_to_document,$(LOCAL_PATH)call intermediates-dir-for,EXECUTABLES,$(LOCAL_MODULE,true)call all-named-subdir-makefiles,$(legacy_modules)call RM;call MKDIRcall emugl-begin-host-shared-library,libEGL_translatorcall emugl-import,libOpenglOsUtilscall emugl-end-modulecall emugl-export,LDLIBS,-lGLcal emugl-export,LDFLAGS,$(GL_COMMON_LINKER_FLAGS)call emugl-set-shared-library-subpath,hwcall emugl-export,C_INCLUDES,$(intermediates)call all-makefiles-under,$(LOCAL_PATH) 这个和下面的区别还不清楚call all-subdis-makefiles这个是通常出现在整个makefile的尾部,以实现递归调用子目录中的makefile,使整个make系统成为一个树状结构

.................... 【.........阅读全文】

Java免费学习   Java自学网 http://www.javalearns.com

关注微信号:javalearns   随时随地学Java

或扫一扫

随时随地学Java


更多相关文章

  1. android EditText设置不可写
  2. android“设置”里的版本号
  3. android ndk编译x264开源(用于android的ffmpeg中进行软编码)
  4. [Android(安卓)NDK]Android(安卓)JNI开发例子 ---3 在JNI中实现o
  5. 在Fragment中设置控件点击方法,执行失败。
  6. Android(安卓)闹钟管理类的使用
  7. Android设置通知栏/状态栏透明改变通知栏颜色和app最上部分颜色
  8. android 设置中划线 下划线等
  9. Andorid Dialog 示例【慢慢更新】

随机推荐

  1. android开发中英文切换
  2. Android(安卓)音视频开发(四) -- CameraX
  3. adb命令——初始环境安装
  4. android studio中直接运行java程序
  5. Android多Module下的Application引用方式
  6. Android(安卓)Bitmap垂直翻转
  7. android4.3 截屏功能的尝试与失败分析
  8. Android命令行编译方法,不用Eclipse IDE
  9. Android中数据存储方式一:文件形式
  10. android开发-界面设计基本知识Ⅲ