CCCache 提高编译速度
#export USE_CCCache = 1
#export CCCACHE_DIR = /<path_of_your_choice>/.cccache
#prebuilts/misc/linux-x86/cccache/cccache -M 50G
模拟器编译:
. build/envsetup.sh
lunch sdk-eng
make
emulator
启动模拟器前,先运行下intelhaxm可执行文件,会提高模拟器运行速度
模块编译:
#设置LOCAL_PATH为当前目录
LOCAL_PATH:= $(call my-dir)
#清空除LOCAL_PATH外所有的LOCAL_变量
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
$(call all-logtags-files-under, src)
LOCAL_MODULE := settings-logtags
include $(BUILD_STATIC_JAVA_LIBRARY)
# Build the Settings APK
include $(CLEAR_VARS)
#指定依赖的共享java类库
LOCAL_JAVA_LIBRARIES := bouncycastle core-oj telephony-common ims-common telephony-ext
#指定依赖的静态java类库
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-v4 \
android-support-v13 \
android-support-v7-recyclerview \
android-support-v7-preference \
android-support-v7-appcompat \
android-support-v14-preference \
jsr305 \
settings-logtags
#定义模块的标签为optional
LOCAL_MODULE_TAGS := optional
#定义源文件列表
LOCAL_SRC_FILES := \
$(call all-java-files-under, src) \
src/com/android/settings/EventLogTags.logtags
LOCAL_SRC_FILES += src/org/codeaurora/wfcservice/IWFCService.aidl \
src/org/codeaurora/wfcservice/IWFCServiceCB.aidl
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \
frameworks/support/v7/preference/res \
frameworks/support/v14/preference/res \
frameworks/support/v7/appcompat/res \
frameworks/support/v7/recyclerview/res
#指定模块名称
LOCAL_PACKAGE_NAME := Settings
#指定模块使用platform签名
LOCAL_CERTIFICATE := platform
#4.4新标志,为true表示将此apk安装到priv-app目录下
LOCAL_PRIVILEGED_MODULE := true
#指定混淆的标志
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
#指定AAPT的属性
LOCAL_AAPT_FLAGS := --auto-add-overlay \
--extra-packages android.support.v7.preference:android.support.v14.preference:android.support.v17.preference:android.support.v7.appcompat:android.support.v7.recyclerview
#指定编译模块的类型为APK,这将包含
include $(BUILD_PACKAGE)
#将源码余下的Android.mk都包含进来
include $(call all-makefiles-under,$(LOCAL_PATH))
常用模块编译实例:
1.编译一个apk文件
#设置LOCAL_PATH为当前目录
LOCAL_PATH:= $(call my-dir)
#清空除LOCAL_PATH外所有的LOCAL_变量
include $(CLEAR_VARS)
#指定依赖的共享java类库
LOCAL_JAVA_LIBRARIES := bouncycastle core-oj telephony-common ims-common telephony-ext
#指定依赖的静态java类库
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-v4
LOCAL_SRC_FILES := \
$(call all-java-files-under, src)
#定义模块的标签为optional
LOCAL_MODULE_TAGS := optional
#指定模块名称
LOCAL_PACKAGE_NAME := Settings
#指定模块使用platform签名
LOCAL_CERTIFICATE := shared
#指定模块名称
LOCAL_PACKAGE_NAME := Settings
#指定模块使用platform签名
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
2.编译一个java共享库
#设置LOCAL_PATH为当前目录
LOCAL_PATH:= $(call my-dir)
#清空除LOCAL_PATH外所有的LOCAL_变量
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
$(call all-java-files-under, src)
#定义模块的标签为optional
LOCAL_MODULE_TAGS := optional
#定义模块的名称
LOCAL_MODULE := javadynamiclib
#指定编译模块的类型为APK,这将包含
include $(BUILD_JAVA_LIBRARY)
3.编译一个java静态库
#设置LOCAL_PATH为当前目录
LOCAL_PATH:= $(call my-dir)
#清空除LOCAL_PATH外所有的LOCAL_变量
include $(CLEAR_VARS)
#定义源文件列表
LOCAL_SRC_FILES := \
$(call all-java-files-under, src)
#定义模块的名称
LOCAL_MODULE := javastaticlib
#指定编译模块的类型为APK,这将包含
include $(BUILD_STATIC_JAVA_LIBRARY)
4.编译一个java资源包文件,资源包也是一个apk文件,类似framewor_res.apk
#设置LOCAL_PATH为当前目录
LOCAL_PATH:= $(call my-dir)
#清空除LOCAL_PATH外所有的LOCAL_变量
include $(CLEAR_VARS)
#指定依赖的静态java类库
LOCAL_NO_STANDARD_LIBRARIES := true
#定义模块的标签为user
LOCAL_MODULE_TAGS := user
#指定模块使用platform签名
LOCAL_CERTIFICATE := platform
#定义模块的名称
LOCAL_PACKAGE_NAME := javareslib
#指定AAPT的属性
LOCAL_AAPT_FLAGS := -x、
#指定模块的安装路径
LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES)
#值为true时,其他的apk模块能引用本模块的资源
LOCAL_EXPORT_PACKAGE_RESOURCES := true
#指定编译模块的类型
include $(BUILD_PACKAGE)
5.编译一个可执行文件
#设置LOCAL_PATH为当前目录
LOCAL_PATH:= $(call my-dir)
#清空除LOCAL_PATH外所有的LOCAL_变量
include $(CLEAR_VARS)
#指定模块需要链接的动态库
LOCAL_SHARED_LIBRARIES := libutils libbinder
#指定编译标志
ifeq($(TARGET_OS), linux)
LOCAL_CFLAGS += -DEP_UNIX
endif
#指定编译模块的名称
LOCAL_MODULE := service
#指定编译模块的类型
include $(BUILD_EXECUTABLE)
6.编译一个native 共享库
#设置LOCAL_PATH为当前目录
LOCAL_PATH:= $(call my-dir)
#清空除LOCAL_PATH外所有的LOCAL_变量
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
#指定编译模块的名称
LOCAL_MODULE := libnativedynamic
#指定编译模块的源文件LOCAL_SRC_FILES := \
nativedynamic.cpp
#指定模块需要链接的动态库
LOCAL_SHARED_LIBRARIES := \
libutils \
libcutils
#指定模块依赖的静态库
LOCAL_STATIC_LIBRARIES := libnativestatic
#指定头文件的查找路径
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE) \
$(LOCAL_PATH)/ ../include
#定义编译标志
LOCAL_CFLAGS += -O
#指定编译模块的类型
include $(BUILD_SHARED_LIBRARIES)
7.编译一个native静态库
#设置LOCAL_PATH为当前目录
LOCAL_PATH:= $(call my-dir)
#清空除LOCAL_PATH外所有的LOCAL_变量
include $(CLEAR_VARS)
#指定编译模块的标签
LOCAL_MODULE_TAGS := optional
#指定编译模块的名称
LOCAL_MODULE := libnativedynamic
LOCAL_SRC_FILES := \
nativestatic.cpp
#指定编译标志LOCAL_C_INCLUDES +=
LOCAL_CFLAGS += -O
include $(BUILD_STATIC_LIBRARIES)
定义一个预编译模块
定义一个预编译模块和定义一个普通的编译模块格式相似,不同的是LOCAL_SRC_FILES变量指的不是源文件,而是二进制文件的路径,同时还要通过LOCAL_MODULE_CLASS来指定模块的类型,最后include的是BUILD_PREBUILT。
1. 定义apk文件目标
include $(CLEAR_VARS)
#这里可以是任何字符串,但必须是唯一的目标
LOCAL_MODULE := ThemeManager.apk
#定义源文件列表LOCAL_SRC_FILES := app\$(LOCAL_MODULE)
#定义模块的标签为optional
LOCAL_MODULE_TAGS := optional
#这里的值是APPS
LOCAL_MODULE_CLASS := APPS
#指定模块使用platform签名
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)
2.定义静态jar包目标
include $(CLEAR_VARS)
#这里可以是任何字符串,但必须是唯一的目标
LOCAL_MODULE := libfirewall.jar
#定义源文件列表LOCAL_SRC_FILES := app\$(LOCAL_MODULE)
#定义模块的标签为optional
LOCAL_MODULE_TAGS := optional
#这里的值是JAVA_LIBRARIES
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
#指定模块使用platform签名
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)
3.定义动态库文件目标
include $(CLEAR_VARS)
#这里可以是任何字符串,但必须是唯一的目标
LOCAL_MODULE := libglobaltheme_jni.so
LOCAL_MODULE_OWNER :=
#定义源文件列表LOCAL_SRC_FILES := lib\$(LOCAL_MODULE)
#定义模块的标签为optional
LOCAL_MODULE_TAGS := optional
#这里的值是JAVA_LIBRARIES
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
#指定编译模块的类型为APK,这将包含
include $(BUILD_PREBUILT)4. 定义可执行文件目标
include $(CLEAR_VARS)
#这里可以是任何字符串,但必须是唯一的目标
LOCAL_MODULE := bootanimation
LOCAL_MODULE_OWNER :=
#定义源文件列表LOCAL_SRC_FILES := bin\bootanimation
#定义模块的标签为optional
LOCAL_MODULE_TAGS := optional
#这里的值是JAVA_LIBRARIES
LOCAL_MODULE_CLASS := EXECUTABLE
#还可以指定复制到的目录
LOCAL_MODULE_PATH := $(TARGET_OUT)/bin
#指定编译模块的类型为APK,这将包含
include $(BUILD_PREBUILT)5. 定义xml 文件目标
include $(CLEAR_VARS)
#这里可以是任何字符串,但必须是唯一的目标
LOCAL_MODULE := apns-conf-cu.xml
LOCAL_MODULE_OWNER :=
#定义源文件列表LOCAL_SRC_FILES := etc\$(LOCAL_MODULE)
#定义模块的标签为optional
LOCAL_MODULE_TAGS := optional
#etc表示文件将复制到/system/etc下
LOCAL_MODULE_CLASS := ETC
#指定编译模块的类型为APK,这将包含
include $(BUILD_PREBUILT)6. 定义host平台下的jar包
将系统编译时用到的sigapk.jar预编译,然后复制到out目录中,这样,Build系统将能够使用这个文件来给其他文件签名
nclude $(CLEAR_VARS)
#这里可以是任何字符串,但必须是唯一的目标
LOCAL_MODULE := signapk
LOCAL_PREBIULT_JAVA_LIBRARIES := lib/$(LOCAL_MODULE).jar
#指定编译模块的类型为BUILD_HOST_PREBUILT,这将包含
include $(BUILD_HOST_PREBUILT)