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

news2024/11/26 3:22:44

验证环境

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 := disabled

ifneq (,$(wildcard frameworks/base))
  LOCAL_PRIVATE_PLATFORM_APIS := true
else
  LOCAL_SDK_VERSION := system_current
  LOCAL_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.xml

LOCAL_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
else
  LOCAL_SDK_VERSION := system_current
  LOCAL_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 := disabled


LOCAL_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"],
	//又依赖 Launcher3ResLib
    static_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://www.coloradmin.cn/o/181148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[WUSTCTF2020]颜值成绩查询(布尔注入)

目录 信息收集 脚本 reference 信息收集 输入1出现固定的回显&#xff0c;输入2-4出现乱码 Hi admin, your score is: 100 输入其他特殊字符无回显&#xff0c;也无报错回显 采用布尔注入进行判断 布尔注入原理 代码存在SQL注入漏洞&#xff0c;然而页面即不会回显数据&am…

【C++算法图解专栏】一篇文章带你掌握尺取法(双指针)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为 0 基础刚入门数据结构与算法的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们一起交流~ &#x1f4da;专栏地址&#xff1a;https://blog.csdn.net/Newin…

java spring IOC xml方式工厂Bean操作

spring中有两种Bean 第一种 普通 Bean 就是我们在配置文件中 定义的类对象 创建bean 并定义相关的id和声明类对象 普通bean的特点在于 在配置文件中定义的类型 也就是返回类型 就比如 你定义的是一个 book类的类型 那你这个bean返回的 也比如是个book类型的对象 第二种 是在工…

模拟实现vector/迭代器失效问题

对于STL&#xff0c;我们不仅学会使用STL,还要了解其底层原理&#xff0c;这样一来&#xff0c;我们就能知道什么时候用string好&#xff0c;什么时候用vector&#xff0c;什么时候用list&#xff0c;哪种方法效率高等等。其次了解了STL的底层原理&#xff0c;也助于我们的C功力…

RTF、RIR、Steering Vector傻傻分不清

RTF&#xff1a; Relative transfer function&#xff0c;相对传递函数RIR: Room impulse response&#xff0c;空间冲击响应Steering vector: 导向矢量场景问题定义&#xff1a;空间中存在I个麦克风和J个声源&#xff0c;麦克风采集到的信号其中&#xff0c;麦克i的信号其中表…

一起自学SLAM算法:9.1 ORB-SLAM2算法

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 下面将从原理分析、源码解读和安装与运行这3个方面展开讲解ORB-SLAM2算法。 9.1.1 ORB-SLAM2原理分析 前面已经说过&#xff0c;ORB-SLAM2算法是特征点法的典型代表。因此在下面的分析中&#xff0c;首先介绍一…

被删库勒索了,怎么使用docker进行MySQL容器的管理?

大家觉得写还可以&#xff0c;可以点赞、收藏、关注一下吧&#xff01; 也可以到我的个人博客参观一下&#xff0c;估计近几年都会一直更新&#xff01;和我做个朋友吧&#xff01;https://motongxue.cn 起因&#xff1a;云服务器MySQL密码设置的太简单了&#xff0c;导致到被入…

路由策略实验

1.先配置IP和环回 [Huawei]sysname R1 [R1]interface GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [R1-GigabitEthernet0/0/0]int g 0/0/1 [R1-GigabitEthernet0/0/1]ip add 22.1.1.1 24 [R1-GigabitEthernet0/0/1]q [R1]int l 0 [R1-LoopBack0]ip ad…

ETHDenver 2023 的 Cartesi BUIDLathon 项目创意

希望你在了解Cartesi之前&#xff0c;谨慎对待自己的行为。一旦你开始研究并搜寻可以使用Cartesi Rollups构建的项目或者应用&#xff0c;你就会陷入一个令人兴奋的螺旋洞穴中&#xff0c;你会上瘾。如果你想在2023年中建造一些很具有意义的事情&#xff0c;那你就来对地方了。…

Python01概述 基础语法 判断

Python概述 第二章-Python基础语法 01-字面量 02-注释 03-变量 04-数据类型 05-数据类型转换 06-标识符 07-运算符 08-字符串的三种定义方式 09-字符串的拼接 10-字符串格式化 11-字符串格式化的精度控制 12-字符串格式化的方式-快速写法 13-对表达式进行格式化 14-字符串格…

Java语法核心——面向对象编程

目录 面向过程思想概述 面向对象思想概述 面向对象思想特点及举例 类与对象的关系 类的定义 类与对象的案例(demo02) 对象内存存储机制 成员变量和局部变量的区别 private关键字 面向过程思想概述 我们回想一下&#xff0c;这几天我们完成一个需求的步骤&#xff1a;首…

echarts数据可视化项目搭建(一)

目录直角坐标系通用配置项tooltiptoolboxlegenddataZoom柱状图常见效果折线图常见效果散点图常见效果其他坐标系饼图基本实现常见效果地图地图基本展示不同城市颜色不同地图与散点图结合雷达图仪表盘本博客内容参考黑马课程&#xff0c;详细信息请参考以下网址 Bilibili官方黑…

Apache Superset 开源商业智能大数据可视化

Apache Superset 是一款现代化的开源大数据工具&#xff0c;也是企业级商业智能 Web 应用&#xff0c;用于数据探索分析和数据可视化。 Apache Superset 是一个适合企业日常生产环境中使用的商业智能可视化工具。它具有快速、轻量、直观的特点&#xff0c;任何用户都可以轻松地…

Spring Boot学习之Shiro

文章目录零 全部源码地址一 Shiro简介1.1 Shiro功能1.2 Shiro架构&#xff08;外部视角&#xff09;1.3 Shiro架构&#xff08;内部视角&#xff09;二 Shiro快速入门2.1 演示代码&部分源码解读三 Spring Boot集成Shio3.0 准备操作3.1 整合Shiro3.2 页面拦截实现3.3 登录认…

ESP32设备驱动-HMC5983磁力计驱动

HMC5983磁力计驱动 1、HMC5983介绍 霍尼韦尔 HMC5983 是一款温度补偿型三轴集成电路磁力计。这种表面贴装、多芯片模块专为汽车和个人导航、车辆检测和指向等应用的低场磁场传感而设计。 HMC5983 包括我们最先进的高分辨率 HMC118X 系列磁阻传感器和一个 ASIC,该 ASIC 包含…

AOP切面编程

前言&#xff1a;AOP&#xff08;Aspect Oriented Programming&#xff09;是一种设计思想&#xff0c;是软件设计领域中的面向切面编程&#xff0c;它是面向对象编程的一种补充和完善&#xff0c;它以通过预编译方式和运行期动态代理方式实现在不修改源代码的情况下给程序动态…

各种Sequence Self-Attention变形 (加速矩阵运算 且保证全局特征)

人工设计Self-attention的N*N矩阵1. Local Attention/Truncated Attention2. Stride Attention3. Global Attention人工设计Self Attention的使用与选择1.LongFomer2.Big Bird自动设计Self Attention的N*N矩阵1. Reformer2.Sinkborn Sorting Network不需要N*N大小的矩阵1.Linfo…

【python】图片转字符画 cv2+pygame实现

网上看到一些字符画,非常羡慕,想要用python写一个类似的东西,突然想到字符画不就是把图片分割为像素块再进行替换嘛 恰好之前稍稍入门了python的opencv库,可以对图片进行处理。 处理图片的思想为:对一个区域的像素进行参考值计算,用具有相似参考值的字符进行替代,因此除…

打工人必学的法律知识(七)——《中华人民共和国劳动合同法实施条例》

目录 来源 第一章 总 则 第二章 劳动合同的订立 第三章 劳动合同的解除和终止 第四章 劳务派遣特别规定 第五章 法津责任 第六章 附 则 来源 《中华人民共和国劳动合同法实施条例》 第一章 总 则 第一条 为了贯彻实施《中华人民共和国劳动合同法》&#xff08;以下简称…

mybatis说明

目录 1.说明 2.配置文件 3.映射器 4.select标签 5.insert标签 6.update标签 7.delete标签 8.resultMap的特别说明 9.注解 10.关联(级联)查询 11.动态sql 12.mybatis分页 13缓存 1.说明 MyBatis 是一个开源、轻量级的数据持久化框架&#xff0c;是 JDBC 和 Hiberna…