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
#指定编译模块的类型为APK,这将包含 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_SRC_FILES := service.cpp#指定模块需要链接的动态库
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
#指定编译模块的类型为APK,这将包含 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
#指定编译模块的类型为APK,这将包含 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)