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個工作日,其中包括處理一些發現問題和原有功能移植。每次移植都是一次對整體架構的梳理可以幫助我們更深入理解項目。整個過程需要講究方式和步驟如果沒有方式方法東一塊西一塊的很容易搞錯各種問題導致人失去耐心,上面總結也是爲了讓其他人看到能多少有個頭緒,節省時間。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章