命令行获取页面
手机处于launcher首页
adb shell dumpsys window | findstr mCurrentFocus
输出
mCurrentFocus=Window{9afb34d u0 com.android.launcher3/com.android.launcher3.Launcher}
找到源码路径
packages/apps/Launcher3/
Android10源码 搜索控件
grep -r -n AppsSearchContainerLayout
跳转:Ctrl+左键
使用AS的Layout Inspector神器
查找手机中的路径
adb shell pm path com.android.launcher3
编译
mm -j8 WITH_DEXPREOPT=false
out/target/product/nanopc-t4/product/priv-app/Launcher3QuickStep/Launcher3QuickStep.apk
提取手机APK
adb pull /product/priv-app/Launcher3QuickStep/Launcher3QuickStep.apk
反编译验证
应用变体
推送
注意手机系统是推送这个,不是上面说的
out/target/product/nanopc-t4/product/priv-app/Launcher3QuickStep/Launcher3QuickStep.apk
而是Launcher3.apk
命令行打开源码位置
上传123
如果推送后无效果可以试着将如下文件夹删除后重启
效果如下
探究mm指令
#
# Copyright (C) 2013 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# 设置当前目录路径
LOCAL_PATH := $(call my-dir)
#
# 构建插件库的规则(需要编写插件)。
#
include $(CLEAR_VARS) # 清除之前的变量设置
LOCAL_USE_AAPT2 := true # 使用 AAPT2 工具
LOCAL_AAPT2_ONLY := true # 仅使用 AAPT2
LOCAL_MODULE_TAGS := optional # 模块标记为可选
LOCAL_STATIC_JAVA_LIBRARIES := PluginCoreLib # 静态 Java 库依赖
# 指定源文件,递归查找 src_plugins 目录下的所有 Java 文件
LOCAL_SRC_FILES := \
$(call all-java-files-under, src_plugins)
LOCAL_SDK_VERSION := current # 当前 SDK 版本
LOCAL_MIN_SDK_VERSION := 28 # 最小 SDK 版本
LOCAL_MODULE := LauncherPluginLib # 模块名称
include $(BUILD_STATIC_JAVA_LIBRARY) # 构建静态 Java 库
#
# 构建 Launcher3 依赖库的规则。
#
include $(CLEAR_VARS) # 清除之前的变量设置
LOCAL_USE_AAPT2 := true # 使用 AAPT2 工具
LOCAL_AAPT2_ONLY := true # 仅使用 AAPT2
LOCAL_MODULE_TAGS := optional # 模块标记为可选
# 静态 Android 库依赖
LOCAL_STATIC_ANDROID_LIBRARIES := \
androidx.recyclerview_recyclerview \
androidx.dynamicanimation_dynamicanimation \
androidx.preference_preference \
iconloader_base
LOCAL_STATIC_JAVA_LIBRARIES := LauncherPluginLib # 静态 Java 库依赖
# 指定源文件,查找 protos 和 proto_overrides 目录下的所有 proto 文件
# 以及 src_build_config 目录下的所有 Java 文件
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 # 禁用 Proguard
LOCAL_PROTOC_OPTIMIZE_TYPE := nano # Protobuf 优化类型
LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/protos/ --proto_path=$(LOCAL_PATH)/proto_overrides/ # Protobuf 编译选项
LOCAL_PROTO_JAVA_OUTPUT_PARAMS := enum_style=java # Protobuf Java 输出参数
LOCAL_SDK_VERSION := current # 当前 SDK 版本
LOCAL_MIN_SDK_VERSION := 21 # 最小 SDK 版本
LOCAL_MODULE := Launcher3CommonDepsLib # 模块名称
LOCAL_PRIVILEGED_MODULE := true # 特权模块
LOCAL_MANIFEST_FILE := AndroidManifest-common.xml # 清单文件
include $(BUILD_STATIC_JAVA_LIBRARY) # 构建静态 Java 库
#
# 构建 Launcher3 应用的规则。
#
include $(CLEAR_VARS) # 清除之前的变量设置
LOCAL_USE_AAPT2 := true # 使用 AAPT2 工具
LOCAL_MODULE_TAGS := optional # 模块标记为可选
# 静态 Android 库依赖
LOCAL_STATIC_ANDROID_LIBRARIES := \
Launcher3CommonDepsLib \
SecondaryDisplayLauncherLib
# 指定源文件,查找 src 目录下的所有 Java 文件
# 以及 src_shortcuts_overrides 和 src_ui_overrides 目录下的所有 Java 文件
LOCAL_SRC_FILES := \
$(call all-java-files-under, src) \
$(call all-java-files-under, src_shortcuts_overrides) \
$(call all-java-files-under, src_ui_overrides) \
$(call all-java-files-under, src_flags)
LOCAL_PROGUARD_FLAG_FILES := proguard.flags # Proguard 配置
最后
保持耐心,多次尝试,学习是一个渐进的过程,不要气馁,做好笔记
其他
https://juejin.cn/post/7107239279432040478#heading-14