Android6.0系统源码之SystemUI导入Eclipse IDE编译

一、前述

    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目录下新建一个文件夹,用来存放要用到系统类库,如下所示:

Android6.0系统源码之SystemUI导入Eclipse IDE编译_第1张图片

我们将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一下,以让它成为第一引用编译,导入完成后如下图所示:

Android6.0系统源码之SystemUI导入Eclipse IDE编译_第2张图片

最后把SettingsLib设置成Is Library。


四、导入Keyguard源码

    1、Keyguard源码目录:frameworks\base\packages\Keyguard

    2、同上导入framework.jar包。

    3、根据报错我需要引用SettingLib项目工程。

    4、将AndroidManefest.xml中的minSdkVersion和targetSdkVersion修改成23。

   其中,导入完后的包结构如下:

   Android6.0系统源码之SystemUI导入Eclipse IDE编译_第3张图片

    最后把Keyguard设置成Is Library。

 五、SystemUI配置

    1、相关包导入同上的方法,这里不再一一详述。

    2、引用Keyguard和SettingLib两个Library。

    3、所有报错解决后,我们Clean下SystemUI工程,然后Run Android Application 即可生成Apk,如图所示:

    Android6.0系统源码之SystemUI导入Eclipse IDE编译_第4张图片

六、总结

    是不是很简单?它确实很简单。以上博客写得不对的地方还希望大牛多批评指正,谢谢!



    





你可能感兴趣的:(Android系统)