Android q Launcher最近任务栏移植

一、介绍

因为从android p开始google就把最近任务栏功能移植到了Launcher应用模块中,所以Launcher应用升级到android q时最大的移植任务还是最近任务栏功能,最近任务栏和系统应用system ui有事件交互,例如导航栏相关的滑动相关事情都要传递到最近任务栏作为触发最近任务栏的事件。本次移植是从android p移植到android q版本,androd p版本时原生launcher有一个独立的目录quickstep这个就是最近任务栏模块代码,其中要依赖system ui相关代码android p时google已经将相关代码打包成sysui-shared.jar包并内置到quickstep/libs目录下,所以我们在做android p时不用考虑这种代码依赖。一般情况下研发为了方便编译调试都会使用android studio编译所以整个项目最好能独立不用依赖系统关联,当然在编译版本时这个代码是通过编写make脚本编译的android p代码用的也是sysui-shared.jar包。但android q Launcher最近任务栏代码中依赖system ui的代码没有像p一样把相关代码打包成jar包而且里面很多代码逻辑都改变了,为了能保证后期能通过android studio独立编译方便调试并不依赖整个项目代码,我们需要将相关依赖代码再次打包成独立jar包和p结构一样。另外对比了quickstep相关代码发现很多东西都改变了,如果只是替换jar包是无法使用的。

二、方案选择

有两种移植方案:

一、把Android q最近任务栏移植到Launcher然后把以前的功能移植到现有代码上

二、在Android p最近任务栏代码上修改代码做适配

综合两种方案我选择了第一种有以下几个理由:

1.android q原生最经任务栏代码整套移植可以避免很多莫名其妙的问题

2.我们做最近任务栏进步都是在界面上做修改不会修改整个框架更方便移植

3.google原生框架调整肯定有很多优化但我们无法看出来

4.如果这次不整套移植后期版本更新会和google代码差距越来越大更难维护

三、移植步骤

1.打包sysui-shared.jar

2.移植quickstep目录代码全部重新移植到Launcher

3.处理移植各种编译问题

4.编写make编译脚本实现android studio和make两种方式都能编译通过

5.顺利运行Android q最近任务栏保证原生功能正常使用

6.移植原有功能到最新最近任务栏

7.替换掉原生Launcher

1.替换sysui-shared.jar

移植过程中开始花了一些时间找sysui-shared.jar

原生Launcher引入sysui-shared.脚本方式

ifneq (,$(wildcard frameworks/base))
  LOCAL_STATIC_JAVA_LIBRARIES := SystemUISharedLib launcherprotosnano
  LOCAL_PRIVATE_PLATFORM_APIS := true
else
  LOCAL_STATIC_JAVA_LIBRARIES := libSharedSystemUI libLauncherProtos
  LOCAL_SDK_VERSION := system_current

根据上面脚本查找到out\target\common\obj\JAVA_LIBRARIES\SystemUISharedLib_intermediates目录下有相关jar包

最近任务栏与system ui相关代码在frameworks\base\packages\SystemUI\shared和frameworks\base\packages\SystemUI\plugin_core目录下,之前有考虑过直接把这些代码拷贝到quickstep目录下使用,但后来想到后期可能不好维护

取到上面jar包后替换原有的sysui-shared.jar包

android q sysui-shared.jar下载地址:https://download.csdn.net/download/zhuxingchong/12060385

2.移植quickstep目录代码

移植quickstep目录代码全部重新移植到Launcher这个过程很痛苦但为了后期更好维护我忍了,移植完成后当然就是要解决编译报错问题,先保证android studio编译通过,因为签名问题android studio编译的apk无法直接安装所以只能先用make方式编译通过系统编译出来apk再安装(可以提前系统签名方式替换掉android studio里面现有签名)。

这个过程发现android p的make脚本编译报错对比了原生Launcher发现了一些不同验证后发现在include $(CLEAR_VARS)后面添加
LOCAL_USE_AAPT2 := true
LOCAL_AAPT2_ONLY := true

3.运行apk保证原生最近任务栏功能可用

这一步很重要,因为如果我们还没保证原生最近任务栏可用的前提下就一直自研的功能会导致出现很多莫名其妙的问题很难排除,这个需要注意验证以下几点:

1.桌面上拉起最近任务栏,kill进程等功能

2.第三方应用界面拉起最近任务栏

3.第三方laucnher拉起最近任务栏

4.切换不同导航栏方式验证以上几种情况

注意;各种横竖屏,切换动画和task内容显示等细节

4.移植最近任务栏自己的修改

保证上面功能没有问题后再移植我们自己功能,这也是一个比较痛苦的过程,这个我们可以对比Android p的功能移植,最好做到移植一定功能后提交一个版本方便出现问题对比代码排除,有些情况下如果我们一次修改太多代码时发现问题很难排除什么时候什么代码引起的。

5.make脚本编译写法

因为我只需要编译带有最近任务栏的Launcher所以精简了make文件也方便大家借鉴

LOCAL_PATH := $(call my-dir)

#
# Build rule for Launcher3 Go app with quickstep and Go-specific
# version of recents for Android Go devices.
#
include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true
LOCAL_MODULE_TAGS := optional

#
# Build rule for Quickstep library.
#
include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true
LOCAL_AAPT2_ONLY := true
LOCAL_MODULE_TAGS := optional

#这里是对一些jar和so等库文件引入
include $(CLEAR_VARS)
LOCAL_MODULE := gson3
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_SRC_FILES := libs/gson-2.8.0.jar
LOCAL_UNINSTALLABLE_MODULE := true
#LOCAL_SDK_VERSION := current
LOCAL_PRIVATE_PLATFORM_APIS:=true
include $(BUILD_PREBUILT)


include $(CLEAR_VARS)
LOCAL_MODULE := libxypatch3
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES_32 := libs/armeabi/libxypatch.so
LOCAL_SRC_FILES_64 := libs/arm64-v8a/libxypatch.so
LOCAL_MULTILIB := both
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_SUFFIX := .so
include $(BUILD_PREBUILT)


#
# Build rule for plugin lib (needed to write a plugin).
#
include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true
LOCAL_AAPT2_ONLY := true
LOCAL_MODULE_TAGS := optional

ifneq (,$(wildcard frameworks/base))
    LOCAL_STATIC_JAVA_LIBRARIES:= PluginCoreLib
else
    LOCAL_STATIC_JAVA_LIBRARIES:= libPluginCore
endif

LOCAL_SRC_FILES := \
    $(call all-java-files-under, src_plugins)

LOCAL_SDK_VERSION := current
LOCAL_MIN_SDK_VERSION := 28
LOCAL_MODULE := LauncherPluginLib

include $(BUILD_STATIC_JAVA_LIBRARY)

#
# Build rule for Launcher3 dependencies lib.
#
include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true
LOCAL_AAPT2_ONLY := true
LOCAL_MODULE_TAGS := optional

LOCAL_STATIC_ANDROID_LIBRARIES := \
    android-support-compat \
    android-support-media-compat \
    android-support-core-utils \
    android-support-core-ui \
    android-support-fragment \
    android-support-v7-recyclerview \
    android-support-dynamic-animation \
    android-support-design \
	#iconloader_base

LOCAL_STATIC_JAVA_LIBRARIES := LauncherPluginLib

LOCAL_SRC_FILES := \
    $(call all-proto-files-under, protos) \
    $(call all-proto-files-under, proto_overrides) \
    $(call all-java-files-under, src_build_config) \

LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res

LOCAL_PROGUARD_ENABLED := disabled



LOCAL_PROTOC_OPTIMIZE_TYPE := nano
LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/protos/ --proto_path=$(LOCAL_PATH)/proto_overrides/
LOCAL_PROTO_JAVA_OUTPUT_PARAMS := enum_style=java

LOCAL_SDK_VERSION := current
LOCAL_MIN_SDK_VERSION := 21
LOCAL_MODULE := Launcher3CommonDepsLib
LOCAL_PRIVILEGED_MODULE := true
LOCAL_MANIFEST_FILE := AndroidManifest-common.xml

include $(BUILD_STATIC_JAVA_LIBRARY)


#
# Build rule for Quickstep library.
#
include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true
LOCAL_AAPT2_ONLY := true
LOCAL_MODULE_TAGS := optional

#最近任务栏sysui_shared相关代码引用
ifneq (,$(wildcard frameworks/base))
  LOCAL_STATIC_JAVA_LIBRARIES := SystemUISharedLib launcherprotosnano
  LOCAL_PRIVATE_PLATFORM_APIS := true
else
  LOCAL_STATIC_JAVA_LIBRARIES := libSharedSystemUI libLauncherProtos
  LOCAL_SDK_VERSION := system_current
  LOCAL_MIN_SDK_VERSION := 26
endif

#静态库引入有些重复地方省略
LOCAL_STATIC_JAVA_LIBRARIES += mplus ... objenesis2.13 gson3
LOCAL_JNI_SHARED_LIBRARIES += libxypatch3

#模块名
LOCAL_MODULE := Launcher3QuickStepLib
LOCAL_PRIVILEGED_MODULE := true
LOCAL_STATIC_ANDROID_LIBRARIES := \
    Launcher3CommonDepsLib 

#编译代码路径
LOCAL_SRC_FILES := \
    $(call all-java-files-under, src) \
    $(call all-java-files-under, quickstep/src) \
    $(call all-java-files-under, quickstep/recents_ui_overrides/src) \
	$(call all-java-files-under, iconloaderlib/src) \
	$(call all-java-files-under, iconloaderlib/src_full_lib) \
    $(call all-java-files-under, src_flags) \
    $(call all-java-files-under, src_ui_overrides)

#编译资源路径
LOCAL_RESOURCE_DIR := \
    $(LOCAL_PATH)/quickstep/res \
	$(LOCAL_PATH)/iconloaderlib/res \
    $(LOCAL_PATH)/quickstep/recents_ui_overrides/res
LOCAL_PROGUARD_ENABLED := disabled

#编译AndroidManifest.xml路径
LOCAL_MANIFEST_FILE := quickstep/AndroidManifest.xml
include $(BUILD_STATIC_JAVA_LIBRARY)


#
# Build rule for Quickstep app.
#
include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true
LOCAL_MODULE_TAGS := optional

LOCAL_STATIC_ANDROID_LIBRARIES := Launcher3QuickStepLib
LOCAL_PROGUARD_ENABLED := disabled

ifneq (,$(wildcard frameworks/base))
  LOCAL_PRIVATE_PLATFORM_APIS := true
else
  LOCAL_SDK_VERSION := system_current
  LOCAL_MIN_SDK_VERSION := 26
endif

#最终Launcher编译名
LOCAL_PACKAGE_NAME := Launcher3QuickStep
LOCAL_PRIVILEGED_MODULE := true
LOCAL_PRODUCT_MODULE := true
LOCAL_OVERRIDES_PACKAGES := Home Launcher2 Launcher3
LOCAL_REQUIRED_MODULES := privapp_whitelist_com.android.launcher3

#签名方式
LOCAL_CERTIFICATE := platform


LOCAL_RESOURCE_DIR := \
    $(LOCAL_PATH)/quickstep/res \
    $(LOCAL_PATH)/quickstep/recents_ui_overrides/res

LOCAL_FULL_LIBS_MANIFEST_FILES := \
    $(LOCAL_PATH)/AndroidManifest.xml \
    $(LOCAL_PATH)/AndroidManifest-common.xml

LOCAL_MANIFEST_FILE := quickstep/AndroidManifest.xml
LOCAL_JACK_COVERAGE_INCLUDE_FILTER := com.android.launcher3.*

include $(BUILD_PACKAGE)


include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true
# ==================================================
include $(call all-makefiles-under,$(LOCAL_PATH))

6.Android studio 编译build.gradle脚本

这个基本没有什么修改,主要是移植最近任务栏新增了几个目录需要引入

总结:

android p移植到androd q Launcher一个人总共花了大概10个工作日,其中包括处理一些发现问题和原有功能移植。每次移植都是一次对整体架构的梳理可以帮助我们更深入理解项目。整个过程需要讲究方式和步骤如果没有方式方法东一块西一块的很容易搞错各种问题导致人失去耐心,上面总结也是为了让其他人看到能多少有个头绪,节省时间。

发布了92 篇原创文章 · 获赞 27 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/zhuxingchong/article/details/103743848