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

Android Framework定制sim卡插入解锁pin码的界面

文章目录

  • 手机设置SIM卡pin码
    • 一、安卓手机
    • 二、苹果手机
  • Android Framework中SIM卡pin码代码
    • 定位pin码提示文本位置
    • 定位pin码java代码位置
  • 定制pin码framework窗口
    • 数字按钮

手机设置SIM卡pin码

设置 SIM 卡 PIN 码可以提高手机的安全性,防止他人在未经授权的情况下使用你的 SIM 卡。但请务必牢记你的 PIN 码,因为连续多次输入错误的 PIN 码可能会导致 SIM 卡被锁定,需要使用 PUK 码解锁。如果你忘记了 PIN 码或 PUK 码,应及时联系你的运营商获取帮助。

以下介绍怎么在手机上开启锁定SIM卡并设置pin码。

一、安卓手机

  1. 打开手机 “设置”。
  2. 在设置中找到 “安全” 或 “密码与安全” 等选项。
  3. 点击进入后,查找 “SIM 卡锁定” 或类似名称的选项。
  4. 进入该选项后,你可能需要输入手机的解锁密码、指纹或面部识别等进行验证。
  5. 验证通过后,开启 “锁定 SIM 卡” 开关。
  6. 此时会提示你输入初始的 PIN 码,一般初始 PIN 码为 “1234” 或 “0000”,具体可咨询运营商。输入正确的初始 PIN 码后点击确定。
  7. 接着你可以设置新的 PIN 码,输入新的 PIN 码并确认。

二、苹果手机

  1. 打开手机 “设置”。
  2. 点击 “蜂窝网络”。
  3. 选择你要设置 PIN 码的 SIM 卡。
  4. 点击 “SIM 卡 PIN 码”。
  5. 开启 “SIM 卡 PIN 码” 开关。
  6. 输入初始 PIN 码(通常为 “1234” 或 “0000”),然后点击 “完成”。
  7. 设置新的 PIN 码并确认。

Android Framework中SIM卡pin码代码

如图打开SIM卡锁定并后,再插入SIM会弹出窗口,要求输入pin码。重启开机锁屏画面也是显示这个:
在这里插入图片描述
可以根据提示文本来定位代码在哪。

定位pin码提示文本位置

find frameworks/base/ -name “*.xml” | xargs grep “请输入 SIM”

frameworks/base/packages/SystemUI/res-unisoc/values-zh-rCN/strings_ex.xml:        <item quantity="one">请输入 SIM <xliff:g id="carrier" example="CARD 1">%1$s</xliff:g> PIN,您还可以尝试 <xliff:g id="number">%2$d</xliff:g> 次。如果仍不正确,则需要联系运营商帮您解锁设备。</item>
frameworks/base/packages/SystemUI/res-unisoc/values-zh-rCN/strings_ex.xml:        <item quantity="other">请输入 SIM <xliff:g id="carrier" example="CARD 1">%1$s</xliff:g> PIN,您还可以尝试 <xliff:g id="number">%2$d</xliff:g> 次。</item>
frameworks/base/packages/SystemUI/res-unisoc/values-zh-rCN/strings_ex.xml:    <string name="kg_simlock_instructions">请输入 SIM LOCK 解锁密码</string>
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:    <string name="keyguard_password_enter_puk_code" msgid="3813154965969758868">"请输入 SIM 卡 PUK 码和新的 PIN 码"</string>
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:    <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"请输入 SIM 卡 PIN 码。"</string>
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:      <item quantity="other">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:      <item quantity="one">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍不正确,则需要联系运营商帮您解锁设备。</item>

其中最有可能的是这两处

frameworks/base/packages/SystemUI/res-unisoc/values-zh-rCN/strings_ex.xml:        <item quantity="other">请输入 SIM <xliff:g id="carrier" example="CARD 1">%1$s</xliff:g> PIN,您还可以尝试 <xliff:g id="number">%2$d</xliff:g> 次。</item>frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml:      <item quantity="other">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item>

打开第二个查看具体内容
frameworks/base/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml

    <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818"><item quantity="other">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次。</item><item quantity="one">请输入 SIM 卡 PIN 码,您还可以尝试 <xliff:g id="NUMBER_0">%d</xliff:g> 次。如果仍不正确,则需要联系运营商帮您解锁设备。</item></plurals>

得到关键字
kg_password_default_pin_message

定位pin码java代码位置

通过上面的关键字,在.java文件中搜索,可定位到java代码

find frameworks/base/ -name "*.java" | xargs grep "kg_password_default_pin_message"
frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java:                msgId = isDefault ? R.plurals.kg_password_default_pin_message :
frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java:                msgId = isDefault ? R.plurals.kg_password_default_pin_message_multi :

frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java
这段代码是针对不同情况获取到不同的提示文本。

    private String getPinPasswordErrorMessage(int attemptsRemaining, boolean isDefault) {String displayMessage;int msgId;if (attemptsRemaining == 0) {// 这里是尝试多次pin码都错误情况下的错误提示displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked);} else if (attemptsRemaining > 0) {// 这里是还有可尝试输入pin码的次数情况int count = TelephonyManager.getDefault().getSimCount();if (count < 2) {msgId = isDefault ? R.plurals.kg_password_default_pin_message :R.plurals.kg_password_wrong_pin_code;displayMessage = getContext().getResources().getQuantityString(msgId, attemptsRemaining, attemptsRemaining);} else {msgId = isDefault ? R.plurals.kg_password_default_pin_message_multi :R.plurals.kg_password_wrong_pin_code_multi;int phoneId = SubscriptionManager.getPhoneId(mSubId);SubscriptionInfo info = Dependency.get(KeyguardUpdateMonitor.class).getSubscriptionInfoForSubId(mSubId);Log.d(LOG_TAG, "phoneId : " + phoneId + "; mSubId : " + mSubId + "; info : " + info);if (info!= null && !SubscriptionManager.isValidPhoneId(phoneId)) {phoneId = info.getSimSlotIndex();Log.d(LOG_TAG, "SubscriptionInfo:"+info.toString() + "; phoneId : " + phoneId);}displayMessage = getContext().getResources().getQuantityString(msgId,attemptsRemaining, phoneId + 1, attemptsRemaining);}} else {msgId = isDefault ? R.string.kg_sim_pin_instructions : R.string.kg_password_pin_failed;displayMessage = getContext().getString(msgId);}if (KeyguardEsimArea.isEsimLocked(mContext, mSubId)) {displayMessage = getResources().getString(R.string.kg_sim_lock_esim_instructions, displayMessage);}if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:"+ " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage);return displayMessage;}

在SystemUI目录下搜索,发现如下这些地方,有多处,代表锁屏时不同的窗口
在这里插入图片描述

这是由KeyguardSecurityContainer.java中判断,调用哪个layout的view, 对应上面的不同view

    private int getSecurityViewIdForMode(SecurityMode securityMode) {switch (securityMode) {case Pattern: return R.id.keyguard_pattern_view;case PIN: return R.id.keyguard_pin_view;case Password: return R.id.keyguard_password_view;case SimPin: return R.id.keyguard_sim_pin_view;case SimPuk: return R.id.keyguard_sim_puk_view;// Unisoc: Support for SimLockcase SimLock: return !mHideSimLockView? R.id.keyguard_simlock_view : R.id.keyguard_operator_simlock_view;/* For SubsidyLock feature @{ */case SubsidyLock_Lock: return R.id.keyguard_subsidylock_lock_view;case SubsidyLock_EnterCode: return R.id.keyguard_subsidylock_entercode_view;case SubsidyLock_Init: return R.id.keyguard_subsidylock_init_view;/* @} */}return 0;}

这里就是要求用户输入pin码的弹窗代码
KeyguardSimPinView.java, 此类继承自KeyguardPinBasedInputView.java,再上一层父类是KeyguardAbsKeyInputView.java。

先只看KeyguardSimPinView.java的代码
如下是设置文本提示的地方,调用上面提到的getPinPasswordErrorMessage

setLockedSimMessage() {if (mSecurityMessageDisplay != null && getVisibility() == VISIBLE) {if (msg == null) {msg = getPinPasswordErrorMessage(mRemainingAttempts, true);} else {msg = msg.concat(getPinPasswordErrorMessage(mRemainingAttempts, true));}mSecurityMessageDisplay.setMessage(msg);}
}

它对应的layout是这个
keyguard_sim_pin_view.xml

<com.android.keyguard.KeyguardSimPinViewxmlns:android="http://schemas.android.com/apk/res/android"xmlns:androidprv="http://schemas.android.com/apk/res-auto"android:id="@+id/keyguard_sim_pin_view"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"androidprv:layout_maxWidth="@dimen/keyguard_security_width"androidprv:layout_maxHeight="@dimen/keyguard_security_max_height"android:gravity="center_horizontal"><!-- 这个是sim卡的图标 --><ImageViewandroid:id="@+id/keyguard_sim"android:layout_width="match_parent"android:layout_height="wrap_content"android:tint="@color/background_protected"android:src="@drawable/ic_lockscreen_sim"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:orientation="vertical"android:gravity="center"android:layout_weight="1"android:layoutDirection="ltr"><!-- 停用 eSIM 卡提示,默认不显示 --><include layout="@layout/keyguard_esim_area"android:id="@+id/keyguard_esim_area"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="@dimen/eca_overlap" /><RelativeLayoutandroid:id="@+id/row0"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:paddingBottom="16dp"><!-- 密码输入框 --><com.android.keyguard.PasswordTextViewandroid:id="@+id/simPinEntry"android:layout_width="@dimen/keyguard_security_width"android:layout_height="match_parent"android:gravity="center"android:layout_centerHorizontal="true"android:layout_marginRight="72dp"androidprv:scaledTextSize="@integer/scaled_password_text_size"android:textColor="?attr/wallpaperTextColor"android:contentDescription="@string/keyguard_accessibility_sim_pin_area"/><Viewandroid:id="@+id/divider"android:layout_width="match_parent"android:layout_height="1dp"android:layout_alignParentBottom="true"android:background="@drawable/pin_divider"/></RelativeLayout><!-- 数字1到9 --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="horizontal"><com.android.keyguard.NumPadKeyandroid:id="@+id/key1"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="1"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key2"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="2"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key3"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="3"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="horizontal"><com.android.keyguard.NumPadKeyandroid:id="@+id/key4"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="4"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key5"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="5"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key6"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="6"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:orientation="horizontal"android:layout_weight="1"><com.android.keyguard.NumPadKeyandroid:id="@+id/key7"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="7"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key8"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="8"/><com.android.keyguard.NumPadKeyandroid:id="@+id/key9"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="9"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="horizontal"><!-- 删除按钮 --><com.android.keyguard.AlphaOptimizedImageButtonandroid:id="@+id/delete_button"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"android:background="@drawable/ripple_drawable_pin"android:contentDescription="@string/keyboardview_keycode_delete"style="@style/Keyguard.ImageButton.NumPadDelete"/><!-- 数字0 --><com.android.keyguard.NumPadKeyandroid:id="@+id/key0"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"androidprv:textView="@+id/simPinEntry"androidprv:digit="0"/><!-- 确认输入按钮 --><com.android.keyguard.AlphaOptimizedImageButtonandroid:id="@+id/key_enter"android:layout_width="0px"android:layout_height="match_parent"android:layout_weight="1"style="@style/Keyguard.ImageButton.NumPadEnter"android:background="@drawable/ripple_drawable_pin"android:contentDescription="@string/keyboardview_keycode_enter"/></LinearLayout></LinearLayout><!-- keyguard_eca,它实际是一个引用,指向另一个layout,引用说明在values-land/alias.xml中,代表紧急拔号的ui --><include layout="@layout/keyguard_eca"android:id="@+id/keyguard_selector_fade_container"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_gravity="bottom|center_horizontal"android:gravity="center_horizontal"/><!-- UNISOC: Add for SubsidyLock @{ --><TextViewstyle="?android:attr/buttonBarButtonStyle"android:id="@+id/kg_simpin_dismiss_button"android:layout_width="wrap_content"android:layout_marginTop="@dimen/eca_overlap"android:layout_height="wrap_content"android:text="@string/simlock_dismiss" <!-- 取消 -->android:textAppearance="?android:attr/textAppearanceMedium"android:textSize="@dimen/kg_status_line_font_size"android:textColor="?attr/wallpaperTextColor"android:textAllCaps="@bool/kg_use_all_caps"android:visibility="gone"/><!-- @} --></com.android.keyguard.KeyguardSimPinView>

定制pin码framework窗口

定位到代码后,就可以进行替换
如果把这个layout放到Android Studio中预览,就是如图的样子:
在这里插入图片描述
知道layout就可以做针对性的修改了,
比如不要显示最上方的sim卡图标,则在layout中加个android:visibility=“gone”
详情如下:

    <ImageViewandroid:id="@+id/keyguard_sim"android:layout_width="match_parent"android:layout_height="wrap_content"android:tint="@color/background_protected"android:visibility="gone"android:src="@drawable/ic_lockscreen_sim"/>

比如要改数字按钮,则就改com.android.keyguard.NumPadKey

数字按钮

代码NumPadKey.java

    public NumPadKey(Context context, AttributeSet attrs, int defStyle) {this(context, attrs, defStyle, R.layout.keyguard_num_pad_key);}

layout keyguard_num_pad.key.xml

<merge xmlns:android="http://schemas.android.com/apk/res/android"><TextViewandroid:id="@+id/digit_text"style="@style/Widget.TextView.NumPadKey"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/klondike_text"style="@style/Widget.TextView.NumPadKey.Klondike"android:layout_width="wrap_content"android:layout_height="wrap_content"/>
</merge>

修改layout就会影响数字的样式。

作者:帅得不敢出门

相关文章:

Android Framework定制sim卡插入解锁pin码的界面

文章目录 手机设置SIM卡pin码一、安卓手机二、苹果手机 Android Framework中SIM卡pin码代码定位pin码提示文本位置定位pin码java代码位置 定制pin码framework窗口数字按钮 手机设置SIM卡pin码 设置 SIM 卡 PIN 码可以提高手机的安全性&#xff0c;防止他人在未经授权的情况下使…...

cc2530 Basic RF 讲解 和点灯讲解(1_1)

1. Basic RF 概述 Basic RF 是 TI 提供的一套简化版的无线通信协议栈&#xff0c;旨在帮助开发者快速搭建无线通信系统。它基于 IEEE 802.15.4 标准的数据包收发&#xff0c;但只用于演示无线设备数据传输的基本方法&#xff0c;不包含完整功能的协议。Basic RF 的功能限制包括…...

Android H5页面性能分析策略

文章目录 引言一、拦截资源加载请求以优化性能二、通过JavaScript代码监控资源下载速度三、使用vConsole进行前端性能调试四、使用Chrome DevTools调试Android端五、通过抓包分析优化网络性能六、总结 引言 在移动应用开发中&#xff0c;H5页面的性能直接影响到用户体验。本文…...

【前端面试】Typescript

Typescript面试题目回答 Typescript有哪些常用类型? Typescript的常用类型包括&#xff1a; 基本类型&#xff1a;boolean&#xff08;布尔类型&#xff09;、number&#xff08;数字类型&#xff09;、string&#xff08;字符串类型&#xff09;。特殊类型&#xff1a;nul…...

程序语言的内存管理:垃圾回收GC(Java)、手动管理(C语言)与所有权机制(Rust)(手动内存管理、手动管理内存)

文章目录 程序语言的内存管理&#xff1a;垃圾回收、手动管理与所有权机制引言一、垃圾回收机制&#xff08;GC&#xff09;&#xff08;Java&#xff09;1. 什么是垃圾回收机制2. 垃圾回收的工作原理3. 优点与缺点4. 示例代码 二、手动管理内存的分配和释放&#xff08;C语言&…...

研究生论文学习记录

文献检索 检索论文的网站 知网&#xff1a;找论文&#xff0c;寻找创新点paperswithcode &#xff1a;这个网站可以直接找到源代码 直接再谷歌学术搜索 格式&#xff1a;”期刊名称“ 关键词 在谷歌学术搜索特定期刊的关键词相关论文&#xff0c;可以使用以下几种方法&#…...

毕业设计选题:基于Django+Vue的图书馆管理系统

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 图书馆界面 图书信息界面 个人中心界面 后台登录界面 管理员功能界面 用户…...

#网络安全#NGSOC与传统SOC的区别

NGSOC是Next Generation Security Operation Center&#xff08;下一代安全运营中心&#xff09;的缩写。 NGSOC安全运营服务基于态势感知与安全运营平台来开展监测分析等一系列的服务工作&#xff0c;旨在通过专业、高效的运营服务工作&#xff0c;帮助用户尽可能发挥NGSOC作…...

GCN+BiLSTM多特征输入时间序列预测(Pytorch)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GCNBiLSTM多特征输入时间序列预测&#xff08;Pytorch&#xff09; 可以做风电预测&#xff0c;光伏预测&#xff0c;寿命预测&#xff0c;浓度预测等。 Python代码&#xff0c;基于Pytorch编写 1.多特征输入单步预测…...

LinkedList和链表之刷题课(下)

1. 给定x根据x把链表分割,大的结点放在x后面,小的结点放在x前面 题目解析: 注意此时的pHead就是head(头节点的意思) 基本上就是给定一个链表,我们根据x的值来把这个链表分成俩部分,大的那部分放在x后面,小的那部分放在x前面,并且我们不能改变链表本来的顺序,比如下面的链表,我…...

ollama 在 Linux 环境的安装

ollama 在 Linux 环境的安装 介绍 他的存在在我看来跟 docker 的很是相似&#xff0c;他把市面上已经存在的大语言模型集合在一个仓库中&#xff0c;然后通过 ollama 的方式来管理这些大语言模型 下载 # 可以直接通过 http 的方式吧对应的 shell 脚本下载下来&#xff0c;然…...

C语言二刷指针篇

&取得变量的地址 printf("%p\n", &a); printf("%p\n", a); printf("%p\n", &a[0]); printf("%p\n", &a[1]); 前三个输出相同&#xff0c;a[0]和a[1]之间相差4 指针就是保存地址的变量&#xff0c;指针里放的是别的…...

LeetCode题练习与总结:回文对--336

一、题目描述 给定一个由唯一字符串构成的 0 索引 数组 words 。 回文对 是一对整数 (i, j) &#xff0c;满足以下条件&#xff1a; 0 < i, j < words.length&#xff0c;i ! j &#xff0c;并且words[i] words[j]&#xff08;两个字符串的连接&#xff09;是一个回文…...

CesiumJS 案例 P7:添加指定长宽的图片图层(原点分别为图片图层的中心点、左上角顶点、右上角顶点、左下角顶点、右下角顶点)

CesiumJS CesiumJS API&#xff1a;https://cesium.com/learn/cesiumjs/ref-doc/index.html CesiumJS 是一个开源的 JavaScript 库&#xff0c;它用于在网页中创建和控制 3D 地球仪&#xff08;地图&#xff09; 一、添加指定长宽的图片图层&#xff08;原点为图片图层的中心…...

Redis 主从同步 问题

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 主从同步 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 主从同步 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis &a…...

【SQL Server】探讨 IN 和 EXISTS之间的区别

前言 在使用 SQL 查询相关表数据时,通常需要根据另一个表中的值来筛选数据。而 IN 与 EXISTS 子句都是用于此场景的常用方式,但使用时两者存在工作方式不同。它们使用上的选择会显著影响查询的性能,尤其是在大型数据集中。本文我们一起探讨 IN 和 EXISTS 之间的区别、使用与…...

清理pip和conda缓存

当用户目录没有空间时&#xff0c;可清理pip和conda缓存 清理conda缓存&#xff1a; conda clean --all清理pip缓存&#xff1a; pip cache purgeNote&#xff1a; 可以利用软链接&#xff0c;将用户目录下的文件链接到其他位置 首先移动文件或文件夹到其他位置 mv ~/test /…...

git rebase和merge的区别

Git merge和Git rebase是两种不同的合并策略&#xff0c;它们在处理分支合并时有各自的优点和缺点。 Git fetch git fetch 命令用于从远程仓库获取最新的更改&#xff0c;但不会自动合并这些更改到你的本地分支。它会下载远程仓库的所有分支和标签&#xff0c;并更新你的本地…...

【elkb】linux麒麟v10安装ELKB 8.8.X版本(ARM架构)

下载软件 相关版本信息 elasticsearch&#xff1a;8.8.1kibana&#xff1a;8.8.1logstash&#xff1a;8.8.1filebeat&#xff1a;8.8.1 下载地址 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.1-linux-aarch64.tar.gzhttps://artifacts.elastic…...

bluez hid host介绍,连接键盘/鼠标/手柄不是梦,安排

零. 前言 由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluez做一个系统…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...