android12.0(S) Launcher3 导入 AndroidStudio 调试编译

article/2025/11/7 3:17:48

验证环境

aosp 12.0 源码,分支 android-12.0.0_r3 可以参考之前写的 android12.0(S) Pixel 3XL (QCOM 845) 编译刷机

AndroidStudio 版本 Android Studio Arctic Fox | 2020.3.1 Patch 4

gradle 版本 gradle-7.0.2-bin.zip gradle:7.0.4

二手 Pixel 3 XL一台可直接烧写上面编译的 rom(没有真机也可用模拟器)

源码链接

完整的 Launcher3 可直接运行调试源码已经上传 GitHub

分析流程

aosp 中 Launcher3 源码路径为 packages/apps/Launcher3

整体源码结构如下

pSNvtB9.png

乍一看还是有些复杂的,万变不离其宗,我们找准切入点即可。源码中的app编译规则都在根目录 Android.bp 或者 Android.mk中,

可以看到 Launcher3 中两个都有,打开 bp 文件查看并未找到编译 apk 的规则,那必定是在 mk 中。

mk 中信息量有点大,定义了编译3个 apk

LOCAL_PACKAGE_NAME := Launcher3Go

LOCAL_PACKAGE_NAME := Launcher3QuickStep

LOCAL_PACKAGE_NAME := Launcher3QuickStepGo

我们首先需要确认当前设备中使用哪一个 apk,可以通过指令 adb shell pm path com.android.launcher3

xMvcM4.png

通过指令确认目前设备中运行 Launcher3 对应apk为 Launcher3QuickStep.apk

再回到 mk 中对应编译规则为

packages\apps\Launcher3\Android.mk

#
# Build rule for Quickstep app.
#
include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true
LOCAL_MODULE_TAGS := optional
# 依赖静态android类库 Launcher3QuickStepLib  可以理解为ASmodule
LOCAL_STATIC_ANDROID_LIBRARIES := Launcher3QuickStepLib
LOCAL_PROGUARD_ENABLED := disabledifneq (,$(wildcard frameworks/base))LOCAL_PRIVATE_PLATFORM_APIS := true
elseLOCAL_SDK_VERSION := system_currentLOCAL_MIN_SDK_VERSION := 26
endif
# 指定编译产物 apk 名称
LOCAL_PACKAGE_NAME := Launcher3QuickStep
# 编译产物路径是否在 priv-app 下
LOCAL_PRIVILEGED_MODULE := 
# 编译产物路径是否在 system_ext 下
LOCAL_SYSTEM_EXT_MODULE := true
# 覆盖编译,编译 Launcher3QuickStep 就会忽略 Home Launcher2 Launcher3,不生成对应 apk
LOCAL_OVERRIDES_PACKAGES := Home Launcher2 Launcher3
# 依赖 frameworks/base/data/etc/com.android.launcher3.xml 
LOCAL_REQUIRED_MODULES := privapp_whitelist_com.android.launcher3
# 资源文件源码
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/quickstep/res#网上没找到准确的解释,根据编译得到 apk 中的 xml 查看后猜测最终是将这里定义的两个 xml 和下面 quickstep/AndroidManifest.xml 合并
LOCAL_FULL_LIBS_MANIFEST_FILES := \$(LOCAL_PATH)/quickstep/AndroidManifest-launcher.xml \$(LOCAL_PATH)/AndroidManifest-common.xmlLOCAL_MANIFEST_FILE := quickstep/AndroidManifest.xml
LOCAL_JACK_COVERAGE_INCLUDE_FILTER := com.android.launcher3.*LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
LOCAL_LICENSE_CONDITIONS := notice
LOCAL_NOTICE_FILE := $(LOCAL_PATH)/NOTICE
include $(BUILD_PACKAGE)

小结一下

Launcher3QuickStep.apk||需要android类库 Launcher3QuickStepLib

看完对应 mk 发现仅仅只依赖 Launcher3QuickStepLib 接下来看看这家伙是何方神圣,同样也定义在 Android.mk

packages\apps\Launcher3\Android.mk

#
# Build rule for Quickstep library.
#
include $(CLEAR_VARS)
LOCAL_USE_AAPT2 := true
LOCAL_AAPT2_ONLY := true
LOCAL_MODULE_TAGS := optional
# 依赖静态java库,最终打包到 apk 中  可以理解为AS中 libs 下 jar
LOCAL_STATIC_JAVA_LIBRARIES := \SystemUI-statsd \SystemUISharedLib
ifneq (,$(wildcard frameworks/base))LOCAL_PRIVATE_PLATFORM_APIS := true
elseLOCAL_SDK_VERSION := system_currentLOCAL_MIN_SDK_VERSION := 26
endif
LOCAL_MODULE := Launcher3QuickStepLib
LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
LOCAL_LICENSE_CONDITIONS := notice
LOCAL_NOTICE_FILE := $(LOCAL_PATH)/NOTICE
LOCAL_PRIVILEGED_MODULE := true
# 依赖静态android类库 Launcher3CommonDepsLib
LOCAL_STATIC_ANDROID_LIBRARIES := Launcher3CommonDepsLib# java 源代码
LOCAL_SRC_FILES := \$(call all-java-files-under, src) \$(call all-java-files-under, quickstep/src) \$(call all-java-files-under, src_shortcuts_overrides)# 资源文件源码
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/quickstep/res
LOCAL_PROGUARD_ENABLED := disabledLOCAL_MANIFEST_FILE := quickstep/AndroidManifest.xml
include $(BUILD_STATIC_JAVA_LIBRARY)

小结一下

Launcher3QuickStep.apk||android类库-Launcher3QuickStepLib||静态java库-SystemUI-statsd|静态java库-SystemUISharedLib|android类库-Launcher3CommonDepsLib

好嘛,开始套娃了。接下来我们又要看 Launcher3CommonDepsLib 这家伙藏在哪里,在 android.bp 中被发现

packages\apps\Launcher3\Android.bp

//
// Build rule for Launcher3 dependencies lib.
//
android_library {name: "Launcher3CommonDepsLib",//对应Java源码srcs: ["src_build_config/**/*.java"],//又依赖 Launcher3ResLibstatic_libs: ["Launcher3ResLib"],sdk_version: "current",min_sdk_version: min_launcher3_sdk_version,//对应 xml 源码manifest: "AndroidManifest-common.xml",lint: {baseline_filename: "lint-baseline-common-deps-lib.xml",},
}// Library with all the dependencies for building Launcher3
android_library {name: "Launcher3ResLib",//没有java源码srcs: [ ],//对应资源文件源码resource_dirs: ["res"],//依赖静态java库static_libs: ["LauncherPluginLib","launcher_quickstep_log_protos_lite","androidx-constraintlayout_constraintlayout","androidx.recyclerview_recyclerview","androidx.dynamicanimation_dynamicanimation","androidx.fragment_fragment","androidx.preference_preference","androidx.slice_slice-view","androidx.cardview_cardview","iconloader_base",],manifest: "AndroidManifest-common.xml",sdk_version: "current",min_sdk_version: min_launcher3_sdk_version,lint: {baseline_filename: "lint-baseline-res-lib.xml",},
}java_library {name: "LauncherPluginLib",//依赖静态java库static_libs: ["PluginCoreLib"],srcs: ["src_plugins/**/*.java"],sdk_version: "current",min_sdk_version: min_launcher3_sdk_version,
}java_library_static {name: "launcher_quickstep_log_protos_lite",srcs: ["quickstep/protos_overrides/*.proto",],sdk_version: "current",proto: {type: "lite",local_include_dirs:["quickstep/protos_overrides",],},//依赖静态java库static_libs: ["libprotobuf-java-lite","launcher_log_protos_lite"],
}

卧底马,终于套娃结束了,来看下

最终结构

Launcher3QuickStep.apk||android类库-Launcher3QuickStepLib||静态java库-SystemUI-statsd|静态java库-SystemUISharedLib|android类库-Launcher3CommonDepsLib||android类库-Launcher3ResLib||静态java库-LauncherPluginLib||静态java库-PluginCoreLib																		|静态java库-launcher_quickstep_log_protos_lite||静态java库-libprotobuf-java-lite|静态java库-launcher_log_protos_lite||静态java库-libprotobuf-java-lite|android类库-androidx-constraintlayout_constraintlayout|android类库-androidx.recyclerview_recyclerview|android类库-androidx.dynamicanimation_dynamicanimation|android类库-androidx.fragment_fragment|android类库-androidx.preference_preference|android类库-androidx.slice_slice-view|android类库-androidx.cardview_cardview|静态java库-iconloader_base

静态java库从aosp12 源码编译 out 目录下搜索得到,一共 9 个 jar 文件

\192.168.123.100/share/Pixel12/alps/out/soong$ find ./ -name xxxx.jar

-rw-rw-r-- 1 cczheng cczheng 13164863 10月 3 15:33 framework.jar
-rw-rw-r-- 1 cczheng cczheng 126323 1月 26 09:41 iconloader_base.jar
-rw-rw-r-- 1 cczheng cczheng 190376 10月 3 15:53 launcher_log_protos_lite.jar
-rw-rw-r-- 1 cczheng cczheng 9223 10月 3 14:19 LauncherPluginLib.jar
-rw-rw-r-- 1 cczheng cczheng 18387 10月 3 14:21 launcher_quickstep_log_protos_lite.jar
-rw-rw-r-- 1 cczheng cczheng 478345 10月 3 15:53 libprotobuf-java-lite.jar
-rw-rw-r-- 1 cczheng cczheng 5057 10月 3 16:01 PluginCoreLib.jar
-rw-rw-r-- 1 cczheng cczheng 238871 10月 3 13:32 SystemUISharedLib.jar
-rw-rw-r-- 1 cczheng cczheng 6587 10月 3 13:29 SystemUI-statsd.jar

android类库 androidx 相关直接在 gradle 中引入即可, Launcher 相关的需要我们新建 module,一共 3 个 module

移植过程

1、在AS中新建 project Launcher3,选择 empty activity

pSUkVPJ.png

工程创建成功后,删除 androidTest 和 test 文件夹 和 res 文件夹 和 MainActivity.java

导入源码

导入资源文件

上面说到的三个 AndroidManifest.xml

quickstep/AndroidManifest-launcher.xml

AndroidManifest-common.xml

quickstep/AndroidManifest.xml

合并得到最终 AndroidManifest.xml,就将 application 中内容和外面权限合并

2、新建 module Launcher3QuickStepLib

pSUAs0K.png

module Launcher3QuickStepLib 创建成功后,删除 androidTest 和 test 文件夹

修改 app/build.gradle,增加依赖 Launcher3QuickStepLib

implementation project(path: ‘:Launcher3QuickStepLib’)

导入源码

将 src 、quickstep/src、src_shortcuts_overrides copy 到 Launcher3QuickStepLib/src/main/java 目录下

导入资源文件

将 quickstep/res 中文件 copy 到 app/src/main 目录下

导入 libs

SystemUI-statsd.jar 和 SystemUISharedLib.jar

修改 Launcher3QuickStepLib/build.gradle,增加依赖

implementation files(‘libs\SystemUI-statsd.jar’)
implementation files(‘libs\SystemUISharedLib.jar’)
implementation project(path: ‘:Launcher3CommonDepsLib’)

3、新建 module Launcher3CommonDepsLib

pSUE33d.png

module Launcher3CommonDepsLib 创建成功后,删除 androidTest 和 test 文件夹,并将 AndroidManifest.xml 中

package 修改为 com.android.launcher3.common 不然和 app 中报名冲突,编译会报错

导入源码

将 src_build_config copy 到 Launcher3CommonDepsLib/src/main/java 目录下

导入资源文件

4、新建 module Launcher3ResLib

pSUEsvn.png

module Launcher3ResLib 创建成功后,删除 androidTest 和 test 文件夹,并将 AndroidManifest.xml 中

package 修改为 com.android.launcher3.res 不然和 app 中报名冲突,编译会报错

修改 Launcher3CommonDepsLib/build.gradle,增加依赖 Launcher3ResLib

implementation project(path: ‘:Launcher3ResLib’)

导入源码

导入资源文件

将 res copy 到 Launcher3ResLib/src/main/ 目录下

导入 libs

LauncherPluginLib.jar

PluginCoreLib.jar

launcher_quickstep_log_protos_lite.jar

libprotobuf-java-lite.jar

launcher_log_protos_lite.jar

iconloader_base.jar

修改 Launcher3ResLib/build.gradle,增加依赖

    api files('libs\\iconloader_base.jar')api files('libs\\launcher_log_protos_lite.jar')api files('libs\\launcher_quickstep_log_protos_lite.jar')api files('libs\\LauncherPluginLib.jar')api files('libs\\libprotobuf-java-lite.jar')api files('libs\\PluginCoreLib.jar')

此处用 api 是因为套娃原因,Launcher3ResLib 中没有 src,都是给引用它的 module 提供便利

再处理 Androidx 相关库依赖,在阿里仓库中搜索对应库版本号

	api 'androidx.constraintlayout:constraintlayout:2.1.0'api 'androidx.recyclerview:recyclerview:1.2.1'api 'androidx.dynamicanimation:dynamicanimation:1.1.0-alpha03'api 'androidx.fragment:fragment:1.4.1'api 'androidx.preference:preference:1.2.0-alpha01'
//    api 'androidx.slice:slice-view:1.1.0-alpha02'api 'androidx.slice:slice-core:1.1.0-alpha02'api 'androidx.slice:slice-builders:1.1.0-alpha02'api 'androidx.cardview:cardview:1.0.0-rc02'

编译排错

做完上面的步骤后,代码都已经准备完成,接下来就是 build 和处理错误了

1、程序包 com.android.launcher3.icons 找不到

pSUZBXn.png

解决办法 Launcher3CommonDepsLib build.gradle 中改为 api project(path: ‘:Launcher3ResLib’)

2、程序包 android.os 找不到

pSUeA3Q.png

解决办法

将 aosp 编译后 framework.jar 引入 AS 中,解决编译时报错。

在这地方卡了好长时间,一开始按照这个试了试

https://blog.csdn.net/u013885959/article/details/84325173

因为我的 gradle 版本太高,按照网上的资料无法使用 XmlParser 和 Node,一开始我降低了 gradle

并确保sdk使用顺序已经是 framework.jar 优于默认版本,怎么试都还是不行,最后找到了解决办法。

将 framework.jar copy 到 app/libs 下,app/build.gradle 中配置

compileOnly files(‘libs\framework.jar’)

compileOnly 很关键,只是编译使用,并不打包到 apk 中,最终运行还是使用设备上的

修改 Launcher3/build.gradle 中增加配置

  allprojects {gradle.projectsEvaluated {tasks.withType(JavaCompile) {options.compilerArgs.add("-Xbootclasspath/p:${project.rootDir}/app/libs/framework.jar")}}}

3、类 ContainerCase 找不到符号 仅从类和接口静态导入

pSUe58g.png

根据报错其实可以跳转到 launcher_quickstep_log_protos_lite.jar 中,

报错提示在 module Launcher3QuickStepLib 中找不到

解决办法

将 launcher_quickstep_log_protos_lite.jar 从 module Launcher3ResLib 移动到 Launcher3QuickStepLib 中

并修改 Launcher3QuickStepLib/build.gradle 中配置

compileOnly files(‘libs\launcher_quickstep_log_protos_lite.jar’)

4、类 BuildConfig 找不到 变量 APPLICATION_ID

pSUmKsA.png

这是由于 Google 早已在 Android Studio 3.5 之后做出了变更:

BuildConfig: Deprecate APPLICATION_ID in libraries.
It is at best misleading, so it is marked as deprecated and replaced by LIBRARY_PACKAGE_NAME.

在 library 中已经把 BuildConfig.APPLICATION_ID 字段废弃掉,因为很容易造成误导,因此使用 BuildConfig.LIBRARY_PACKAGE_NAME 代替

解决办法

将报错 module 中 APPLICATION_ID 全替换为 LIBRARY_PACKAGE_NAME

5、attr/disabledIconAlpha (aka com.android.launcher3:attr/disabledIconAlpha) not found

pSUmdLn.png

解决办法

全局搜索 disabledIconAlpha 属性,先将其注释。一共 5 个地方

6、attr/loadingIconColor (aka com.android.launcher3:attr/loadingIconColor) not found.

解决办法

全局搜索 loadingIconColor 属性,先将其注释。一共 2 个地方

这两问题先暂时这样处理,后面会有解决方法

7、com.android.launcher3.BuildConfig is defined multiple times

在 Launcher3QuickStepLib 和 Launcher3CommonDepsLib 中都存在 BuildConfig

解决办法

去掉 Launcher3CommonDepsLib 中 BuildConfig.java,因为看起来没用

至此已经可以成功 build 出 apk 了

pSUnFyj.png

运行排错

接下来就把 apk 运行起来看看是否正常

1、INSTALL_FAILED_VERSION_DOWNGRADE

adb install -r E:\android\AS_WorkSpace\Launcher3\app\build\outputs\apk\debug\app-debug.apk
Performing Streamed Install
adb: failed to install E:\android\AS_WorkSpace\Launcher3\app\build\outputs\apk\debug\app-debug.apk: Failure [INSTALL_FAILED_VERSION_DOWNGRADE: Package Verification Result]

解决办法

修改 app/build.gradle 中 versionCode 32 versionName “12.1” ,先查看设备上原始 apk 版本,重新运行

如果遇到签名不一致的问题,先将设备里的 Launcher3 apk 给 rm 掉

2、 Error: -127 android.permission-group.SYSTEM_TOOLS

Installation failed due to: ‘Failed to commit install session 813937487 with command cmd package install-commit 813937487. Error: -127: Package com.android.launcher3 attempting to declare permission com.android.launcher3.permission.WRITE_SETTINGS in group android.permission-group.SYSTEM_TOOLS owned by package com.android.launcher3 with incompatible certificate’

解决办法

在 app/src/main/AndroidManifest.xml 中增加如下语句,重新运行

3、Could not identify launch activity: Default Activity not found Error while Launching activity

解决办法

为了测试,在 app/src/main/AndroidManifest.xml 中,增加

<intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /><category android:name="android.intent.category.HOME" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.MONKEY"/><category android:name="android.intent.category.LAUNCHER_APP" />
</intent-filter>

4、Permission denial: reading from settings requires:android.permission.READ_DEVICE_CONFIG

pSUunHI.png

虽然声明了权限

但普通 app 还是无法获取这个权限的

解决办法

给 apk 系统签名后再运行

5、android.content.res.Resources$NotFoundException: Resource ID #0x0

pSUuGvQ.png

根据错误堆栈信息找到问题出在 iconloader_base.jar 中,里面包含一个 R.class,所有的资源 id 全都

为 0,这就是为什么出现上面的崩溃 Resource ID #0x0

解决办法

将 iconloader_base.jar 作为 module 引入,在 aosp 源码中找到 iconloader_base 代码位置

frameworks/libs/systemui/iconloaderlib/

新建 module Launcher3IconLoadeBase

pSUuRV1.png

和上面一样操作,删除无用文件夹,然后导入java源码和资源文件

还记得上面编译错误 5 和 6 么,attr/disabledIconAlpha 和 attr/loadingIconColor 找不到,

巧了这两兄弟就在 iconloaderlib 源码中,这下就可以解决上面的问题。

修改 Launcher3ResLib/build.gradle 中引入依赖

// api files(‘libs\iconloader_base.jar’)
api project(path: ‘:Launcher3IconLoadeBase’)

再次重新运行

成功啦

运行结果图

pSUKZGT.png

各个 build.gradle 详细配置

\AS_WorkSpace\Launcher3\build.gradle

buildscript {repositories {google()mavenCentral()}dependencies {classpath "com.android.tools.build:gradle:7.0.4"}allprojects {gradle.projectsEvaluated {tasks.withType(JavaCompile) {options.compilerArgs.add("-Xbootclasspath/p:${project.rootDir}/app/libs/framework.jar")}}}
}

AS_WorkSpace\Launcher3\app\build.gradle

dependencies {implementation project(path: ':Launcher3QuickStepLib')compileOnly files('libs\\framework.jar')implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'com.google.android.material:material:1.3.0'implementation 'androidx.constraintlayout:constraintlayout:2.0.4'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

AS_WorkSpace\Launcher3\Launcher3QuickStepLib\build.gradle

dependencies {implementation files('libs\\SystemUI-statsd.jar')implementation files('libs\\SystemUISharedLib.jar')compileOnly files('libs\\launcher_quickstep_log_protos_lite.jar')api project(path: ':Launcher3CommonDepsLib')implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'com.google.android.material:material:1.3.0'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

AS_WorkSpace\Launcher3\Launcher3CommonDepsLib\build.gradle

dependencies {api project(path: ':Launcher3ResLib')/* implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'com.google.android.material:material:1.3.0'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'*/
}

AS_WorkSpace\Launcher3\Launcher3ResLib\build.gradle

dependencies {
//    api files('libs\\iconloader_base.jar')api project(path: ':Launcher3IconLoadeBase')api files('libs\\launcher_log_protos_lite.jar')
//    api files('libs\\launcher_quickstep_log_protos_lite.jar')api files('libs\\LauncherPluginLib.jar')api files('libs\\libprotobuf-java-lite.jar')api files('libs\\PluginCoreLib.jar')api 'androidx.constraintlayout:constraintlayout:2.1.0'api 'androidx.recyclerview:recyclerview:1.2.1'api 'androidx.dynamicanimation:dynamicanimation:1.1.0-alpha03'api 'androidx.fragment:fragment:1.4.1'api 'androidx.preference:preference:1.2.0-alpha01'
//    api 'androidx.slice:slice-view:1.1.0-alpha02'api 'androidx.slice:slice-core:1.1.0-alpha02'api 'androidx.slice:slice-builders:1.1.0-alpha02'api 'androidx.cardview:cardview:1.0.0-rc02'/*implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'com.google.android.material:material:1.3.0'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'*/
}

AS_WorkSpace\Launcher3\Launcher3IconLoadeBase\build.gradle

dependencies {implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'com.google.android.material:material:1.3.0'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

http://chatgpt.dhexx.cn/article/Txmsfjl5.shtml

相关文章

launcher3的具体学习

目录结构&#xff1a; allapps 目录&#xff1a;主要存放主菜单界面相关代码。 anim目录&#xff1a;存放动画相关&#xff0c; badge目录&#xff1a;存放图标标识相关 compat目录&#xff1a;存放解决兼容性相关。 config目录&#xff1a;配置Launcher相关功能的宏开关 dragn…

Android10/11 原生Launcher3深度定制开发

一、引言 关于Android10和11系统Launcher3的定制有很多&#xff0c;根据项目的需求会进行各种定制开发&#xff0c; 于是就需要研究Launcher3的源码。本文主要从Android 11的Launcher3QuickStep着手 &#xff08;go版本或者其他版本类似&#xff09;从常用的修改进行分析&#…

Launcher3-桌面布局+主要的类+启动流程

一、launhcer3桌面布局二、launcher3主要的类LauncherModel&#xff1a;BubblTextView&#xff1a;DragController&#xff1a;LauncherAppState&#xff1a;DragView&#xff1a;DragSource&#xff0c;DropTarget&#xff1a;Folder&#xff1a;FolderIcon&#xff1a;Launch…

Launcher3--初识Launcher3

一、Launcher简介 Launcher时开机完成后第一个启动的应用&#xff0c;用来展示应用列表和快捷方式、小部件等。Launcher作为第一个(开机后第一个启动的应用)展示给用户的应用程序&#xff0c;其设计的好坏影响到用户的体验&#xff0c;甚至影响用户购机的判断。所以很多品牌厂商…

Android Launcher3分析及定制主题实现

一. Launcher3 简介 **launcher3是在Launcher2的基础上进化的版本,从Android 4.4 开始就使用Launcher3 .(kk版,kk2版)作为桌面使用,以前我们都在使用Launcher2,我们使用的是KK版本,具体区别后面再说. ** 1 Launcher3 桌面变成了动态管理,launcher2 里面默认最多加载五个worksp…

Android Launcher3简介

一.Launcher3概述 Launcher顾名思义&#xff0c;就是桌面的意思&#xff0c;也是android系统启动后第一个启动的应用程序&#xff0c;这里以android11为例&#xff0c;和其他应用并无区别&#xff0c;只是增加了对其他app和widget的管理窗口&#xff0c;且可以为用户定制化一些…

详细理解准确率、精准率、召回率,F1值等评价指标的含义

转载文章 原博客地址&#xff1a;详解准确率、精确率、召回率、F1值等评价指标的含义 机器学习问题之中&#xff0c;通常需要建立模型来解决具体问题&#xff0c;但对于模型的好坏&#xff0c;也就是模型的泛化能力&#xff0c;如何进行评估&#xff1f;我们可以定一些评价指标…

详解准确率、精确率、召回率、F1值等评价指标的含义

机器学习问题之中&#xff0c;通常需要建立模型来解决具体问题&#xff0c;但对于模型的好坏&#xff0c;也就是模型的泛化能力&#xff0c;如何进行评估呢&#xff1f; 很简单&#xff0c;我们可以定一些评价指标&#xff0c;来度量模型的优劣。比如准确率、精确率、召回率、…

分类性能评价指标——精确率,召回率,F1值详细解释

分类性能的评价指标 准确率 准确率是全部参与分类的文本中&#xff0c;与人工分类结果吻合的文本所占的比例。 即&#xff1a;预测与真实标签相同的比例 A c c u r a c y T P T N T P T N F P F N Accuracy\frac{TPTN}{TPTNFPFN} AccuracyTPTNFPFNTPTN​ 精确率 也称…

准确率、精确率、召回率、F1值

1.TP、TN、FP、FN 先粘一个官方形式的。 用新冠来举例理解。下方正方形为样本&#xff0c;其中 圆的部分认定为检测后是阳性的&#xff0c;其余部分为检测为阴性的&#xff08;但是现在的情况是检测并不完全准确&#xff0c;有可能检测时阴性&#xff0c;但实际上已经有新冠…

机器学习中的二分类问题评价指标之精确率、召回率、F1值通俗理解

引言&#xff1a;对于分类问题&#xff0c;我们在评估一个模型的好坏时&#xff0c;通常想到的是把该模型在测试集上分类结果正确的样本数量比上测试集的样本数量的比值结果&#xff0c;即准确率&#xff08;精确率&#xff09;作为评价准则。但除此之外&#xff0c;还有精确率…

【转】一些因素对F1值的影响

截自&#xff1a;https://blog.csdn.net/qq_27590277/article/details/88374695 https://blog.csdn.net/qq_27590277/article/details/88367082 一些因素对F1值的影响 如果还没了解F1值的话&#xff0c;这里有我之前写的通俗易懂的文章 详谈P(查准率)&#xff0c;R(查全率)&…

keras计算precision、recall、F1值

近期写课程作业&#xff0c;需要用Keras搭建网络层&#xff0c;跑实验时需要计算precision&#xff0c;recall和F1值&#xff0c;在前几年&#xff0c;Keras没有更新时&#xff0c;我用的代码是直接取训练期间的预测标签&#xff0c;然后和真实标签之间计算求解&#xff0c;代码…

F1值(F-Measure)、准确率(Precision)、召回率(Recall) 菜鸡版理解

前置知识&#xff1a; T&#xff08;True&#xff09;&#xff1a; 正确的 F (False) &#xff1a; 错误的 P (Positive) : 正向的/积极的 N (Negetive): 负向的/消极的 则&#xff1a; TP&#xff1a;正确的 预测了 正向的 FN&#xff1a;错误的 预测了 负向的 FP&#xff1a…

准确率、精确率、召回率、F1值学习笔记

一、TN、TP、TN、FP、FN概念 TP与TN都是分对了情况&#xff0c;TP是正类&#xff0c;TN是负类。则推断出&#xff0c;FP是错误的正类&#xff0c;FN是错误的负类。 举例&#xff1a;我们需要从一个班级中的人中寻找所有女生,如果把这个任务当成一个分类器的话,那么女生就是我们…

为何选用F1值(调和平均数)衡量P与R?

二分类问题的性能度量为何选用 F 1 F_1 F1​ 值&#xff1f; 已知混淆矩阵 prediction positiveprediction negativeactuality positiveTrue Positive(TP)False Negative(FN)actuality negativeFalse Positive(FP)True Negative(TN) 其中&#xff1a;Precise&#xff08;精…

精确度/召回率/F1值/Micro-F1和Macro-F1的理解

如下图所示&#xff0c;假设有若干张图片&#xff0c;其中12张是狗的图片其余是猫的图片&#xff0e;现在利用程序去识别狗的图片&#xff0c;结果在识别出的8张图片中有5张是狗的图片&#xff0c;3张是猫的图片&#xff08;属于误报&#xff09;&#xff0e; 图中&#xff0c;…

混淆矩阵、精确率、召回率、F1值、ROC曲线、AUC曲线

假设一个分类器A&#xff0c;分类器A的作用是告诉你一张图片是不是汉堡&#xff0c;我们如果想知道这个分类器的效果到底好不好&#xff0c;如何做&#xff1f; 最简单的方法就是将手机里所有的图片都扔给分类器A看&#xff0c;让分类器告诉我们哪些是汉堡 我们无法直观的看到…

python实现计算精度、召回率和F1值

python实现计算精度、召回率和F1值 摘要&#xff1a;在深度学习的分类任务中&#xff0c;对模型的评估或测试时需要计算其在验证集或测试集上的预测精度&#xff08;prediction/accuracy&#xff09;、召回率&#xff08;recall&#xff09;和F1值。本文首先简要介绍如何计算精…

模型评价指标—F1值

最近空余时间在参加数字中国创新大赛&#xff0c;比赛规则是根据模型的F1值对参赛者进行排名。为了更深刻地理解这个指标&#xff0c;我最近对它做了一些梳理&#xff0c;现在把它分享给更多有需要的人图片。最近在参赛时也发现了一个问题&#xff0c;就是算法在训练集上完全拟…