当前位置: 首页 > news >正文

Android 13 about launcher3 (1)

Android 13 Launcher3
android13#launcher3#分屏相关

Launcher3修改 wm density界面布局不改变
/packages/apps/Launcher3/src/com/android/launcher3/InvariantDeviceProfile.java
Launcher的默认配置加载类,通过InvariantDeviceProfile方法可以看出,
CellLayout显示的应用行数和列数可以通过findClosestDeviceProfiles查询XML配置来读取配参

Launcher3图标布局原理解析

Android 13 diff

index 02ebb15cd1..36ce9bf7bf 100644
--- a/packages/apps/Launcher3/src/com/android/launcher3/util/DisplayController.java
+++ b/packages/apps/Launcher3/src/com/android/launcher3/util/DisplayController.java
@@ -284,7 +284,7 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {if (change != 0) {mInfo = newInfo;final int flags = change;
-            MAIN_EXECUTOR.execute(() -> notifyChange(displayInfoContext, flags));
+            //MAIN_EXECUTOR.execute(() -> notifyChange(displayInfoContext, flags));}}

Android 11 diff

./packages/apps/Launcher3/src/com/android/launcher3/util/ConfigMonitor.java@Overridepublic void onDisplayChanged(int displayId) {if (displayId != mDisplayId) {return;}Display display = getDefaultDisplay(mContext);display.getRealSize(mTmpPoint1);if (!mRealSize.equals(mTmpPoint1) && !mRealSize.equals(mTmpPoint1.y, mTmpPoint1.x)) {LogUtils.d(TAG, String.format("Display size changed from %s to %s", mRealSize, mTmpPoint1));notifyChange();return;}display.getCurrentSizeRange(mTmpPoint1, mTmpPoint2);if (!mSmallestSize.equals(mTmpPoint1) || !mLargestSize.equals(mTmpPoint2)) {LogUtils.d(TAG, String.format("Available size changed from [%s, %s] to [%s, %s]",mSmallestSize, mLargestSize, mTmpPoint1, mTmpPoint2));notifyChange();}}public synchronized void notifyChange() {if (mCallback != null) {Consumer<Context> callback = mCallback;mCallback = null;new MainThreadExecutor().execute(() -> {//add text//LauncherAppMonitor.getInstance(mContext).onUIConfigChanged();//callback.accept(mContext);//add text});}}
Android 13 关于旋转屏幕之后,按home键回Launcher3失效
//自动旋转
public static final String ACCELEROMETER_ROTATION = "accelerometer_rotation";
adb shell settings get system accelerometer_rotation  --> 0 off 1 on

Android 12之后,Launcher3有两个模式,一个是平板,另一个是手机.
手机模式:桌面默认是不可以旋转的.

桌面设置页面:桌面空白处长按,进入home settings,有个allow home screen rotation就是旋转开关,手机模式默认是关闭的,平板模式这个偏好隐藏了.

./packages/apps/Launcher3/res/values/config.xml    
<string name="settings_fragment_name" translatable="false">com.android.launcher3.settings.SettingsActivity$LauncherSettingsFragment</string>./packages/apps/Launcher3/src/com/android/launcher3/settings/SettingsActivity.java
public static class LauncherSettingsFragment extends PreferenceFragmentCompat 
{protected boolean initPreference(Preference preference) {switch (preference.getKey()) {case NOTIFICATION_DOTS_PREFERENCE_KEY:return !WidgetsModel.GO_DISABLE_NOTIFICATION_DOTS;case ALLOW_ROTATION_PREFERENCE_KEY:DisplayController.Info info =DisplayController.INSTANCE.get(getContext()).getInfo();if (info.isTablet(info.realBounds)) {// Launcher supports rotation by default. No need to show this setting.//是平板,不显示这个选项return false;}// Initialize the UI once //非平板,默认显示,preference.setDefaultValue(RotationHelper.getAllowRotationDefaultValue(info));//控制是否旋转return true;...}
}./packages/apps/Launcher3/src/com/android/launcher3/states/RotationHelper.javapublic static boolean getAllowRotationDefaultValue(DisplayController.Info info) {android.util.Log.d("tag","info.currentSize.x: " +info.currentSize.x);android.util.Log.d("tag","info.currentSize.y: " +info.currentSize.y);float originalSmallestWidth = dpiFromPx(Math.min(info.currentSize.x, info.currentSize.y),DENSITY_DEVICE_STABLE);return originalSmallestWidth >= MIN_TABLET_WIDTH;//MIN_TABLET_WIDTH = 600;}public static float dpiFromPx(float size, int densityDpi) {float densityRatio = (float) densityDpi / DisplayMetrics.DENSITY_DEFAULT;//DENSITY_DEFAULT=160;return (size / densityRatio);}//关于DENSITY_DEVICE_STABLEprivate static int getDeviceDensity() {//ro.sf.lcd_density的值在初始化进程的时候从build.prop里读取写入一次,之后不会修改//qemu.sf.lcd_density覆写上边的值,目的是在模拟器的时候可以动态修改return SystemProperties.getInt("qemu.sf.lcd_density",SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT));}initialize()->初始化setIgnoreAutoRotateSettingsprivate void setIgnoreAutoRotateSettings(boolean ignoreAutoRotateSettings,DisplayController.Info info) {// On large devices we do not handle auto-rotate differently.mIgnoreAutoRotateSettings = ignoreAutoRotateSettings;if (!mIgnoreAutoRotateSettings) {mHomeRotationEnabled = LauncherPrefs.get(mActivity).get(ALLOW_ROTATION);LauncherPrefs.get(mActivity).addListener(this, ALLOW_ROTATION);} else {LauncherPrefs.get(mActivity).removeListener(this, ALLOW_ROTATION);}}//手动控制屏幕旋转的方式private void setOritation(int i) {try {IWindowManager windowManagerService = WindowManagerGlobal.getWindowManagerService();if (i == 0) {windowManagerService.freezeRotation(0);Settings.System.putInt(this.mContext.getContentResolver(), "accelerometer_rotation", 0);//关闭自动旋转} else if (i == 90) {windowManagerService.freezeRotation(1);Settings.System.putInt(this.mContext.getContentResolver(), "accelerometer_rotation", 0);} else if (i == 180) {windowManagerService.freezeRotation(2);Settings.System.putInt(this.mContext.getContentResolver(), "accelerometer_rotation", 0);} else if (i == 270) {windowManagerService.freezeRotation(3);Settings.System.putInt(this.mContext.getContentResolver(), "accelerometer_rotation", 0);} else if (i == -1) {Settings.System.putInt(this.mContext.getContentResolver(), "accelerometer_rotation", 1);//打开自动旋转}} catch (Exception e) {...}}Settings.System.getInt(mContext.getContentResolver(), Settings.System.USER_ROTATION, 0);adb shell settings get system user_rotation(修改后查询)//修改  默认打开主界面旋转
+++ b/packages/apps/Launcher3/res/xml/launcher_preferences.xml
@@ -45,7 +45,7 @@android:key="pref_allowRotation"android:title="@string/allow_rotation_title"android:summary="@string/allow_rotation_desc"
-        android:defaultValue="false"
+        android:defaultValue="true"android:persistent="true"launcher:logIdOn="615"launcher:logIdOff="616" />
diff --git a/packages/apps/Launcher3/src/com/android/launcher3/states/RotationHelper.java b/packages/apps/Launcher3/src/com/android/launcher3/states/RotationHelper.java
index 7b4e2485ce..6693f9f123 100644
--- a/packages/apps/Launcher3/src/com/android/launcher3/states/RotationHelper.java
+++ b/packages/apps/Launcher3/src/com/android/launcher3/states/RotationHelper.java
@@ -55,7 +55,7 @@ public class RotationHelper implements OnSharedPreferenceChangeListener,// original dimensions to determine if rotation is allowed of not.float originalSmallestWidth = dpiFromPx(Math.min(info.currentSize.x, info.currentSize.y),DENSITY_DEVICE_STABLE);
-        return originalSmallestWidth >= MIN_TABLET_WIDTH;
+        return true;//originalSmallestWidth >= MIN_TABLET_WIDTH;//add text}
从源头隐藏某个apk不在最近应用(RecentView)显示
//这个改法:再需要隐藏的app,按Recent,有动画时显得卡顿,建议可以在Launcher3内尝试隐藏
frameworks/base/services/core/java/com/android/server/wm/RecentTasks.java/*** @return the list of recent tasks for presentation.*/private ArrayList<ActivityManager.RecentTaskInfo> getRecentTasksImpl(int maxNum, int flags,boolean getTasksAllowed, int userId, int callingUid) {final boolean withExcluded = (flags & RECENT_WITH_EXCLUDED) != 0;if (!isUserRunning(userId, FLAG_AND_UNLOCKED)) {Slog.i(TAG, "user " + userId + " is still locked. Cannot load recents");return new ArrayList<>();}loadUserRecentsLocked(userId);final Set<Integer> includedUsers = getProfileIds(userId);includedUsers.add(Integer.valueOf(userId));final ArrayList<ActivityManager.RecentTaskInfo> res = new ArrayList<>();final int size = mTasks.size();int numVisibleTasks = 0;for (int i = 0; i < size; i++) {final Task task = mTasks.get(i);if (isVisibleRecentTask(task)) {numVisibleTasks++;if (isInVisibleRange(task, i, numVisibleTasks, withExcluded)) {// Fall through} else {// Not in visible rangecontinue;}} else {// Not visiblecontinue;}// Skip remaining tasks once we reach the requested sizeif (res.size() >= maxNum) {continue;}// Only add calling user or related users recent tasksif (!includedUsers.contains(Integer.valueOf(task.mUserId))) {if (DEBUG_RECENTS) Slog.d(TAG_RECENTS, "Skipping, not user: " + task);continue;}...//add textComponentName cn = task.intent.getComponent();if(cn != null && cn.getPackageName().equals("com.xxx.xxx")){continue;}else{res.add(createRecentTaskInfo(task, true /* stripExtras */));}//add text}return res;}

Android T Launcher3
Android T Launcher3_recentView

T replace default launcher

关于3.0Ver 利用role不需要删除旧Launcher栈的补充.
case 1: 单独使用role,确实不需要删除旧Launcher栈,唯一需要注意点的是要在Launcher启动之前,把android.app.role.HOME替换,
所以需要在framework里某个必经之路上做文章…

//about home role
packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/role/model/HomeRoleBehavior.java
packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/role/ui/ManageRoleHolderStateLiveData.javapackages/modules/Permission/service/java/com/android/role/RoleService.java
addRoleHolderAsUser(...)
removeRoleHolderAsUser(...)
getRoleHoldersAsUser(...)frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java+import android.app.role.RoleManager;
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
+@Overridepublic void systemReady() {// In normal flow, systemReady is called before other system services are ready.// So it is better not to bind keyguard here.mKeyguardDelegate.onSystemReady();...mAutofillManagerInternal = LocalServices.getService(AutofillManagerInternal.class);mGestureLauncherService = LocalServices.getService(GestureLauncherService.class);
+        setDefaultLauncherItemToHomeRole(mContext);//add}public void setDefaultLauncherItemToHomeRole(Context context) {RoleManager roleManager = context.getSystemService(RoleManager.class);String packageName = SystemProperties.get("persist.xx.def_xxx_launcher", null);List<String> list = roleManager_1.getRoleHolders("android.app.role.HOME");boolean repeat_flag = false;for (int i = 0; i < list.size(); i++) {if (list.get(i).equals(packageName)) {flag = true;}}if (repeat_flag) return;if (packageName != null && !"".equals(packageName)) {String roleName = "android.app.role.HOME";boolean add = true;int flags = 0;UserHandle user = Process.myUserHandle();Log.d("tag", "role: " + roleName + ", package: " + packageName);Executor executor = context.getMainExecutor();Consumer<Boolean> callback = successful -> {if (successful) {Log.d("tag", "Success , role: " + roleName + ", package: " + packageName);} else {Log.d("tag", "Failed , role: " + roleName + ", package: " + packageName);}};roleManager.addRoleHolderAsUser(roleName, packageName, flags, user, executor, callback);}}

case 2:ResolverActivity

frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
onCreate()->rebuildList()->onPostListReady()->isAutolaunching()...                        protected void onCreate(Bundle savedInstanceState, Intent intent,CharSequence title, int defaultTitleRes, Intent[] initialIntents,List<ResolveInfo> rList, boolean supportsAlwaysUseOption) {setTheme(appliedThemeResId());super.onCreate(savedInstanceState);//add textif(true){setDefaultLauncher("com.xx.xxx");finish();return;}//add textmQuietModeManager = createQuietModeManager();...}    //add textprivate List<ResolveInfo> getResolveInfoList() {PackageManager pm = getPackageManager();Intent intent = new Intent(Intent.ACTION_MAIN, null);intent.addCategory(Intent.CATEGORY_HOME);intent.addCategory(Intent.CATEGORY_DEFAULT);return pm.queryIntentActivities(intent, 0);}private ResolveInfo getCurrentLauncher() {PackageManager pm = getPackageManager();Intent intent = new Intent(Intent.ACTION_MAIN, null);intent.addCategory(Intent.CATEGORY_HOME);intent.addCategory(Intent.CATEGORY_DEFAULT);return pm.resolveActivity(intent, 0);}private void setDefaultLauncher(String packageName) {PackageManager pm = getPackageManager();ResolveInfo oldCurrentLauncher = getCurrentLauncher();List<ResolveInfo> packageInfos = getResolveInfoList();ResolveInfo customerLauncher = null;for (ResolveInfo ri : packageInfos) {if (!TextUtils.isEmpty(ri.activityInfo.packageName) && !TextUtils.isEmpty(packageName)&& TextUtils.equals(ri.activityInfo.packageName, packageName)) {customerLauncher = ri;}}if (customerLauncher == null) return;pm.clearPackagePreferredActivities(oldCurrentLauncher.activityInfo.packageName);//clear old LauncherIntentFilter intentFilter = new IntentFilter();intentFilter.addAction(Intent.ACTION_MAIN);intentFilter.addCategory(Intent.CATEGORY_HOME);intentFilter.addCategory(Intent.CATEGORY_DEFAULT);ComponentName componentName = new ComponentName(customerLauncher.activityInfo.packageName,customerLauncher.activityInfo.name);ComponentName[] componentNames = new ComponentName[packageInfos.size()];int defaultMatch = 0;for (int i = 0; i < packageInfos.size(); i++) {ResolveInfo resolveInfo = packageInfos.get(i);componentNames[i] = new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);if (defaultMatch < resolveInfo.match) {defaultMatch = resolveInfo.match;}}pm.clearPackagePreferredActivities(oldCurrentLauncher.activityInfo.packageName);pm.addPreferredActivity(intentFilter, defaultMatch, componentNames, componentName);}//add text

Android13设置默认Launcher分析
Android13设置默认Launcher分析
RK3588 Android13 预安装自己的apk应用及把这个应用设置为默认桌面
Android R设置默认桌面

相关文章:

Android 13 about launcher3 (1)

Android 13 Launcher3 android13#launcher3#分屏相关 Launcher3修改 wm density界面布局不改变 /packages/apps/Launcher3/src/com/android/launcher3/InvariantDeviceProfile.java Launcher的默认配置加载类&#xff0c;通过InvariantDeviceProfile方法可以看出&#xff0c;…...

服务器数据恢复—raid5阵列热备盘未全部启用导致阵列崩溃的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台EMC某型号存储中有一组RAID5磁盘阵列。该raid5阵列中有12块硬盘&#xff0c;其中2块硬盘为热备盘。 服务器存储故障&#xff1a; 该存储raid5阵列中有两块硬盘离线&#xff0c;只有1块热备盘启用替换掉其中一块离线盘&#xff0c;另外…...

HTML—css

css概述 C S S 是 C a s c a d i n g S t y l e S h e e t s &#xff08; 级 联 样 式 表 &#xff09; 。 C S S 是 一 种 样 式 表 语 言 &#xff0c; 用 于 为 H T M L 文 档 控 制 外 观 &#xff0c; 定 义 布 局 。 例 如 &#xff0c; C S S 涉 及 字 体 、 颜 色 、…...

IO多路复用(Input/Output Multiplexing)

IO多路复用(Input/Output Multiplexing) 是一种在单个线程中管理多个输入/输出通道的技术。它允许一个线程同时监听多个输入流(如网络套接字、文件描述符等),并在有数据可读或可写时进行相应的处理,而不需要为每个通道创建一个独立的线程。这种技术主要用于处理并发连接…...

android与pc 用socket无线通信

今天做一个android与pc通信的小demo&#xff08;不是wifi&#xff0c;蓝牙&#xff09;android为客户端&#xff0c;pc为服务器&#xff08;一对多&#xff09;。pc代码很简单&#xff0c;android客户端代码也不难&#xff0c;但是有一点不太明白就是在客户端向服务器发送消息时…...

【流程引擎】springboot完美集成activiti工作流方案

前言 activiti工作流引擎项目&#xff0c;企业erp、oa、hr、crm等企事业办公系统轻松落地&#xff0c;一套完整并且实际运用在多套项目中的案例&#xff0c;满足日常业务流程审批需求。 项目源码配套文档获取&#xff1a;本文末个人名片直接获取。 一、项目形式 springboot…...

11、常见API

01、String类概述及构造方法简介 一、字符串 由多个字符组成的一串数据 二、简介 String类代表的是一个字符串。字符串对象在开发中是最常见的。为了方便我们对字符串进行操作&#xff0c;java就把字符串用对象进行了封装&#xff0c;这个封装就是String类 三、String类的构造方…...

渗透第三次作业

目录 第一关Ma Spaghet! 第二关Jefff&#xff1a; 第三关&#xff1a;Ugandan Knuckles 第四关&#xff1a;Ricardo Milos 第五关&#xff1a; Ah Thats Hawt 第一关Ma Spaghet! <h2 id"spaghet"></h2> <script>spaghet.innerHTML (new URL(…...

Python自动化:解锁高效工作与生产力的密钥

在当今快节奏的数字时代&#xff0c;自动化已成为提升工作效率、优化流程、减少人为错误的不可或缺的工具。Python&#xff0c;作为一种功能强大、易于学习且应用广泛的编程语言&#xff0c;在自动化领域扮演着举足轻重的角色。无论是数据处理、Web自动化、软件测试&#xff0c…...

Sentinel1.8.1 控制台改造

Sentinel 控制台是流量控制、熔断降级规则统一配置和管理的入口&#xff0c;它为用户提供了机器自发现、簇点链路自发现、监控、规则配置等功能。在 Sentinel 控制台上&#xff0c;我们可以配置规则并实时查看流量控制效果。 本项目是在Sentinel控制台1.8.1的基础上改造的&…...

设计模式(2)行为型模式和七大原则

1、目标 本文的主要目标是学习设计模式的行为型模式并举例说明 2、行为型模式 2.1 观察者模式&#xff08;Observer&#xff09; 观察者模式是对象之间存在一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖它的对象都会得到通知并自动更新&…...

学懂C++(三十一):高级教程——深入详解C++高级多线程编程技术之锁优化与替代

引言 随着多核处理器的普及&#xff0c;多线程编程技术已经成为提高应用程序性能的关键手段。在多线程环境下&#xff0c;如何高效、安全地管理线程之间的共享资源是开发者面临的主要挑战。传统的锁机制&#xff0c;如互斥锁&#xff08;Mutex&#xff09;、临界区&#xff08;…...

Linux - 基础工具使用

文章目录 一、yum1、介绍2、功能3、语法4、使用 二、rzsz1、安装rzsz的指令2、介绍3、使用 三、vim基础使用1、介绍2、基础使用 四、gcc/g使用1、生成可执行文件过程2、语法3、常用选项4、编译过程5、动静态库6、包含头文件的多文件编译7、链接外部库 一、yum 1、介绍 Linux中…...

理解线程id和简单封装原生线程库

一、理解线程id 首先我们要知道给用户提供的线程id不是内核里面LWP&#xff08;轻量级进程id&#xff09;&#xff0c;而是pthread库自己维护的一个唯一值。 我们理解为什么线程id不是内核里面LWP&#xff0c;因为用户没有权限使用内核里面的字段&#xff0c;那是专门给OS管理…...

Unified 阻抗控制 architecture、framework、approach

Unified 阻抗控制&#xff08;Unified Impedance Control&#xff09;作为一种控制策略&#xff0c;其architecture&#xff08;架构&#xff09;、framework&#xff08;框架&#xff09;和approach&#xff08;方法&#xff09;为&#xff1a; 一、Unified 阻抗控制 Archite…...

Java后端面试题(mq相关)(day9)

目录 为什么用MQ&#xff1f; 异步 、削峰、解耦1. 异步处理2. 解耦3. 削峰填谷 Exchange类型什么是死信队列&#xff1f;如何保证消息的可靠性&#xff1f;RabbitMQ中如何解决消息堆积问题?RabbitMQ中如何保证消息有序性?如何防止消息重复消费&#xff1f;(如何保证消息幂等…...

算法-华为OD机试-识别有效的IP地址和掩码并进行分类统计

1.描述 见牛客网 https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a74356822. 分析 根据题目要求&#xff0c;分为以下几步 1. 提取IP地址和子网掩码 我们首先需要拆分输入的每一行&#xff0c;分别提取IP地址和子网掩码&#xff0c;并检查它们的合法性。 2.…...

钉钉开发网页应用JSAPI前端授权鉴权nodejs实现

钉钉开发网页应用JSAPI前端授权鉴权nodejs实现 使用钉钉进行H5网页开发的时候&#xff0c;需要调用一些钉钉提供具有原生能力的api&#xff0c;要调用这些api需要进行jsapi授权。 详见官方文档&#xff08;可选&#xff09;开发网页应用前端 - 钉钉开放平台 (dingtalk.com) 官方…...

uniapp 自定义全局弹窗

自定义全局弹窗可在js和.vue文件中调用&#xff0c;unipop样式不满足&#xff0c;需自定义样式。 效果图 目录结构 index.vue <template><view class"uni-popup" v-if"isShow"><view class"uni-popup__mask uni-center ani uni-cust…...

element+-ui图片无法使用--安装

element-ui图片无法使用 安装npm install element-plus/icons-vue 注册 // main.jsimport * as ElementPlusIconsVue from element-plus/icons-vueconst app createApp(App) for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, compo…...

Python编码系列—Python ORM(对象关系映射):高效数据库编程实践

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

一次日志记录中使用fastjson涉及到ByteBuffer的教训

背景 目前本人在公司负责的模块中&#xff0c;有一个模块是负责数据同步的&#xff0c;主要是将我们数据产线使用的 AWS Dynamodb 同步的我们的测试QA 的环境的 MongoDB 的库中&#xff0c;去年开始也提供了使用 EMR 批量同步的功能&#xff0c;但是有时候业务也需要少量的数据…...

掌握TCP连接管理与流量控制:从零开始

文章目录 1. TCP连接管理1.1 三次握手&#xff08;Three-way Handshake&#xff09;1.2 四次挥手&#xff08;Four-way Handshake&#xff09;1.3 TCP连接管理的重要性 2. TCP流量控制2.1 滑动窗口&#xff08;Sliding Window&#xff09;2.2 拥塞控制&#xff08;Congestion C…...

python提取b站视频的音频(提供源码

如果我想开一家咖啡厅&#xff0c;那么咖啡厅的音乐可得精挑细选&#xff01;又假设我非常喜欢o叔&#xff0c;而o叔只在b站弹钢琴&#xff0c;那这时候我就得想方设法把b站的视频转为音频咯&#xff01; 一、首先打开网页版bilibili&#xff0c;按F12&#xff1a; 二、刷新页面…...

嵌入式Linux ,QT5 鼠标键盘设备参数指定环境变量的方法

根文件系统中&#xff0c;一般用mdev来管理设备&#xff0c;不像udev方便&#xff0c;有时候在执行rcS脚本的时候因为&#xff0c;太快&#xff0c;有些设备比如鼠标还没在/dev/input中生成设备文件&#xff0c;最好使用前用mdev -s扫描并等待几秒钟&#xff0c;然后就可以在in…...

C语言钥匙迷宫2.0

目录 开头程序程序的流程图程序游玩的效果结尾 开头 大家好&#xff0c;我叫这是我58。废话不多说&#xff0c;咱们直接开始。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <Windows.h> enum color {Y,B,R …...

【多线程】初步认识Thread类及其应用

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;多线程 / javaEE初阶 上篇文章我们简单介绍了什么是进程与线程&#xff0c;以及他们之间的区别与联系&#xff0c;实际应用中还是以多线程编程为主的&#xff0c;所以这篇文章就让我们更加深入地去剖…...

algorithm算法库学习之——划分操作和排序操作

algorithm此头文件是算法库的一部分。本篇介绍划分操作和排序操作。 划分操作 is_partitioned (C11) 判断范围是否已按给定的谓词划分 (函数模板) partition 将范围中的元素分为两组 (函数模板) partition_copy (C11) 复制一个范围&#xff0c;将各元素分为两组 (函数模板) st…...

XSS实验记录

目录 XXS地址 实验过程 Ma Spaghet Jeff Ugandan Knuckles Ricardo Milos Ah Thats Hawt Ligma Mafia Ok, Boomer XXS地址 XSS Game - Learning XSS Made Simple! | Created by PwnFunction 实验过程 Ma Spaghet 要求我们弹出一个alert(1337)sandbox.pwnfuncti…...

Cortex-A7的GIC(全局中断控制器)使用方法(7):基于stm32MP135的GIC配置中断效果测试

0 参考资料 STM32MP13xx参考手册.pdf&#xff08;RM0475&#xff09; ARM Generic Interrupt Controller Architecture version 2.0 - Architecture Specification.pdf 1 GIC配置中断效果测试 前面我们已经实现了GIC的配置&#xff0c;为了验证GIC是否配置有效&#xff0c;本例…...

c++动态数组new和delete

文章目录 动态数组的使用大全1. **基本创建和初始化**2. **动态调整大小**3. **动态数组的使用与标准库 std::vector**4. **动态数组作为函数参数**输出 5. **使用动态数组存储用户输入** 动态数组的使用大全 1. 基本创建和初始化 示例&#xff1a; #include <iostream&g…...

Redis热点知识速览(redis的数据结构、高性能、持久化、主从复制、集群、缓存淘汰策略、事务、Pub/Sub、锁机制、常见问题等)

Redis是一个开源的、使用内存作为存储的、支持数据结构丰富的NoSQL数据库。它的高性能、灵活性和简单易用使其在许多场景下成为首选的缓存解决方案。以下是Redis的常见和热点知识总结。 数据结构 Redis支持五种基本数据结构&#xff1a; String&#xff1a;字符串是Redis中最…...

【C++浅析】lambda表达式:基本结构 使用示例

基本结构 [捕获列表](参数列表) -> 返回类型 { // 函数体 } 捕获列表 ([ ]): 用于指定外部变量的捕获方式。可以&#xff1a; 通过值捕获&#xff1a;[x]通过引用捕获&#xff1a;[&x]捕获所有变量通过值&#xff1a;[]捕获所有变量通过引用&#xff1a;[&]自…...

利用Redis获取权限的多种方式

更多实战内容&#xff0c;可前往无问社区查看http://www.wwlib.cn/index.php/artread/artid/10333.html Redis是我们在实战中经常接触到的一款数据库&#xff0c;因其在前期打点中被利用后可直接影响服务器安全所以在攻防过程中也备受红队关注&#xff0c;在本文中会重点分享一…...

LeetCode - LCR 146- 螺旋遍历二维数组

LCR 146题 题目描述&#xff1a; 给定一个二维数组 array&#xff0c;请返回「螺旋遍历」该数组的结果。 螺旋遍历&#xff1a;从左上角开始&#xff0c;按照 向右、向下、向左、向上 的顺序 依次 提取元素&#xff0c;然后再进入内部一层重复相同的步骤&#xff0c;直到提取完…...

如何获取Bing站长工具API密钥

Bing站长工具近期悄然上线了网站URL推送功能&#xff0c;似乎有意跟随百度的步伐。这个新功能允许站长通过API向Bing提交链接数据&#xff0c;当然也可以通过Bing站长工具手动提交。 本文将详细介绍如何通过Bing站长工具生成用于网站链接推送的API密钥。 首先&#xff0c;访问…...

NC 调整数组顺序使奇数位于偶数前面(一)

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 输入一个长度…...

Unity异步把图片数据从显存下载到内存(GPU->CPU)

Unity异步把图片数据从显存下载到内存&#xff08;GPU->CPU&#xff09; 1.c#核心代码 using System.Collections; using System.Collections.Generic; using Unity.Collections; using UnityEditor.PackageManager.Requests; using UnityEngine; using UnityEngine.Rende…...

【MySQL】C/C++连接MySQL客户端,MySQL函数接口认知,图形化界面进行连接

【MySQL】C/C引入MySQL客户端 安装mysqlclient库mysql接口介绍初始化mysql_init链接数据库mysql_real_connect下发mysql命令mysql_query获取出错信息mysql_error获取执行结果mysql_store_result获取结果行数mysql_num_rows获取结果列数mysql_num_fields判断结果列数mysql_field…...

Wireshark分析工具

简单用例 首先打开软件&#xff0c;左上角点文件&#xff0c;选中要分析的文件列表。 导入用tcpdump抓的包后进行分析&#xff0c;这里要输入过滤条件&#xff0c;对网络包进行一定的过滤处理。&#xff08;这里172网段是阿里云的地址&#xff0c;用自己写的python2脚本对阿里…...

linux网络配置脚本

通过脚本&#xff0c;设置静态ip以及主机名 因为企业9的网络配置文件和企业7的不一样所以&#xff0c;我们以rhel9和rhel7为例 rhel7/centos7/openeuler #!/bin/bash cat > /etc/sysconfig/network-scripts/ifcfg-$1 << EOF DEVICE$1 ONBOOTyes BOOTPROTOnone IPAD…...

IT管理:我与IT的故事4

首先&#xff0c;宣布一个“坏消息”。最近Herry童鞋的办公邮箱似乎有些“抽抽”了&#xff0c;所以邮件出现了延迟、拒收、被拒收、甚至是石沉大海的现象。为了能够更好的和大家进行沟通&#xff0c;大家如果发邮件到我办公邮箱的时候&#xff0c;若不嫌麻烦&#xff0c;可以抄…...

短链接系统设计方案

背景 需要设计一个短链接系统&#xff0c;主要功能主要有如下几点&#xff1a; ToB&#xff1a; 输入一个长链接&#xff0c;转换成短链接。这个短链接有时效性&#xff0c;可以设定指定过期时间。这个系统的每天会生成千万级别的短链接。数据具备可分析功能。 ToC&#xf…...

Cisco交换机SSH使用RSA公钥免密登录(IOS与Nexus,服务器以RHEL8为例)

目录 需求实验步骤0. 实验环境1. Linux2. CiscoIOS基础设置保存密钥登陆测试 3. CiscoNexus基础配置保存密钥登陆测试 需求 在实际工作中&#xff0c;常会遇到自动化的需求&#xff0c;那么在自动采集、配置等对网络设备的自动化需求中&#xff0c;不可避免的会遇到需要登录-&…...

QT判断操作系统类型和CPU架构

一、判断操作系统类型 1.在.pro文件中判断 macx { # mac only } unix:!macx{ # linux only } win32 { # windows only }2.在代码中判断 可以包含QGlobal头文件&#xff0c;判断预定义宏 #include <QtGlobal> ... #ifdef Q_OS_MAC // mac #endif#ifdef Q_OS_LINUX // …...

input[type=checkbox]勾选框自定义样式

效果图&#xff1a; <template> <input class"rule-checkbox" type"checkbox" checked v-model"isChecked" /> </template><script setup lang"ts"> import { ref } from vue; const isChecked ref(); </…...

鼠害监测系统:科技守护农业安全

在农业生产中&#xff0c;鼠害一直是威胁作物安全、影响产量的重要因素。然而&#xff0c;随着科技的飞速发展&#xff0c;鼠害监测系统正逐步成为现代农业防治鼠害的重要利器。 鼠害监测系统巧妙融合了现代光电、数控及物联网技术&#xff0c;实现了诱鼠、投喂鼠药、鼠情监测及…...

Ubuntu20.04如何安装配置JDK

资源准备 官方下载地址&#xff08;根据自己的系统版本选择不同版本进行下载即可&#xff09;&#xff1a;Java Downloads | Oracle 如无特殊需要可直接移步至下方JDK1.8安装包 https://download.csdn.net/download/qq_43439214/89646731 安装步骤 创建Java目录 sudo mkdir …...

Python3网络爬虫开发实战(9)代理的使用 (需补充代理池的构建)

文章目录 一、代理的设置1.1 urllib 的代理设置1.2 requests 的代理设置1.3 httpx 的代理设置1.4 aiohttp 的代理设置1.4 Selenium 的代理设置1.6 Playwright 的代理设置 二、代理池的构建和维护2.1 代理池的模块构成2.2 代理池的实现 网站为了避免爬虫采集数据可能会采取一些反…...

人际关系中的价值交换原理,在人类社会的复杂网络中,人际关系犹如一根根交织的丝线,将我们彼此紧密相连

人际关系中的价值交换原理,在人类社会的复杂网络中,人际关系犹如一根根交织的丝线,将我们彼此紧密相连。无论是亲情、友情还是爱情,这些关系在表面的情感纽带之下,实则都涉及到价值交换的原理。这种价值交换并非仅仅局限于物质层面,而是涵盖了情感、心理等人类所需的一切…...