一、前述
SystemUI在系统的framework层,属于系统级源码,它依赖于系统很多自带的类库,不能导出直接编译,当然你在系统里可以 直接编译,如常见命令:mmm/mm等,今天我们着手来分析下如何将SystemUI源码导入Eclipse IDE来编译生成apk。
二、导入SystemUI源码
SystemUI系统源码所在目录为:frameworks\base\packages\SystemUI
系统app源码编译一般都是通过编译Android.mk文件,我们来看一下Android.mk文件内容:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
src/com/android/systemui/EventLogTags.logtags
LOCAL_STATIC_JAVA_LIBRARIES := Keyguard
LOCAL_JAVA_LIBRARIES := telephony-common
LOCAL_PACKAGE_NAME := SystemUI
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
LOCAL_RESOURCE_DIR := \
frameworks/base/packages/Keyguard/res \
$(LOCAL_PATH)/res
LOCAL_AAPT_FLAGS := --auto-add-overlay --extra-packages com.android.keyguard
ifneq ($(SYSTEM_UI_INCREMENTAL_BUILDS),)
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_JACK_ENABLED := incremental
endif
include frameworks/base/packages/SettingsLib/common.mk
include $(BUILD_PACKAGE)
ifeq ($(EXCLUDE_SYSTEMUI_TESTS),)
include $(call all-makefiles-under,$(LOCAL_PATH))
endif
通过上述内容,我们发现SystemUI依赖系统几个类库,有静态的类库,也有非静态的类库。LOCAL_STATIC_JAVA_LIBRARIES为静态类库,有Keyguard;LOCAL_JAVA_LIBRARIES为非静态类库,有telephony-common。另外,LOCAL_AAPT_FLAGS := --auto-add-overlay --extra-packages com.android.keyguard 这句脚本说明SystemUI还依赖Keyguard这个包含res的项目工程;include frameworks/base/packages/SettingsLib/common.mk这句说明SystemUI也依赖SettingLib这个包含res的项目工程。
从上述Android.mk文件我们得出:
1、Keyguard和SettingLib是包含res的项目工程,不能以jar包的形式导入。
2、SystemUI依赖Keyguard和SettingLib两个工程,同时它也依赖于telephony-common这个jar包。
三、导入SettingLib源码
1、SettingLib的源码目录为:frameworks\base\packages\SettingsLib
2、导入SettingLib源码前我们先做一步小小的工作,在SystemUI目录下新建一个文件夹,用来存放要用到系统类库,如下所示:
我们将extlibs下的jar对应的源码目录一一写出来:
com.broadcom.bt.jar包对应的目录是:out\target\common\obj\JAVA_LIBRARIES\com.broadcom.bt_intermediates
framework.jar包对应的目录是:out\target\common\obj\JAVA_LIBRARIES\framework_intermediates
libcore.jar包对应的目录是:out\target\common\obj\JAVA_LIBRARIES\core-libart_intermediates
telephony-common.jar包对应的目录是:out\target\common\obj\JAVA_LIBRARIES\telephony-common_intermediates
上述的目录下肯定找不到对应名字的jar包,它都是classes.jar,改成对应的名字即可。
3、第2步工作完成之后,我们就可以来导入SettingLib源码,根据import相关报错,我们以User Libraries的方式来导入相关jar包并且需要将此包Top一下,以让它成为第一引用编译,导入完成后如下图所示:
最后把SettingsLib设置成Is Library。
四、导入Keyguard源码
1、Keyguard源码目录:frameworks\base\packages\Keyguard
2、同上导入framework.jar包。
3、根据报错我需要引用SettingLib项目工程。
4、将AndroidManefest.xml中的minSdkVersion和targetSdkVersion修改成23。
其中,导入完后的包结构如下:
最后把Keyguard设置成Is Library。
五、SystemUI配置
1、相关包导入同上的方法,这里不再一一详述。
2、引用Keyguard和SettingLib两个Library。
3、所有报错解决后,我们Clean下SystemUI工程,然后Run Android Application 即可生成Apk,如图所示:
六、总结
是不是很简单?它确实很简单。以上博客写得不对的地方还希望大牛多批评指正,谢谢!