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码。
一、安卓手机
- 打开手机 “设置”。
- 在设置中找到 “安全” 或 “密码与安全” 等选项。
- 点击进入后,查找 “SIM 卡锁定” 或类似名称的选项。
- 进入该选项后,你可能需要输入手机的解锁密码、指纹或面部识别等进行验证。
- 验证通过后,开启 “锁定 SIM 卡” 开关。
- 此时会提示你输入初始的 PIN 码,一般初始 PIN 码为 “1234” 或 “0000”,具体可咨询运营商。输入正确的初始 PIN 码后点击确定。
- 接着你可以设置新的 PIN 码,输入新的 PIN 码并确认。
二、苹果手机
- 打开手机 “设置”。
- 点击 “蜂窝网络”。
- 选择你要设置 PIN 码的 SIM 卡。
- 点击 “SIM 卡 PIN 码”。
- 开启 “SIM 卡 PIN 码” 开关。
- 输入初始 PIN 码(通常为 “1234” 或 “0000”),然后点击 “完成”。
- 设置新的 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 码可以提高手机的安全性,防止他人在未经授权的情况下使…...

cc2530 Basic RF 讲解 和点灯讲解(1_1)
1. Basic RF 概述 Basic RF 是 TI 提供的一套简化版的无线通信协议栈,旨在帮助开发者快速搭建无线通信系统。它基于 IEEE 802.15.4 标准的数据包收发,但只用于演示无线设备数据传输的基本方法,不包含完整功能的协议。Basic RF 的功能限制包括…...
Android H5页面性能分析策略
文章目录 引言一、拦截资源加载请求以优化性能二、通过JavaScript代码监控资源下载速度三、使用vConsole进行前端性能调试四、使用Chrome DevTools调试Android端五、通过抓包分析优化网络性能六、总结 引言 在移动应用开发中,H5页面的性能直接影响到用户体验。本文…...
【前端面试】Typescript
Typescript面试题目回答 Typescript有哪些常用类型? Typescript的常用类型包括: 基本类型:boolean(布尔类型)、number(数字类型)、string(字符串类型)。特殊类型:nul…...
程序语言的内存管理:垃圾回收GC(Java)、手动管理(C语言)与所有权机制(Rust)(手动内存管理、手动管理内存)
文章目录 程序语言的内存管理:垃圾回收、手动管理与所有权机制引言一、垃圾回收机制(GC)(Java)1. 什么是垃圾回收机制2. 垃圾回收的工作原理3. 优点与缺点4. 示例代码 二、手动管理内存的分配和释放(C语言&…...

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

毕业设计选题:基于Django+Vue的图书馆管理系统
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页 图书馆界面 图书信息界面 个人中心界面 后台登录界面 管理员功能界面 用户…...
#网络安全#NGSOC与传统SOC的区别
NGSOC是Next Generation Security Operation Center(下一代安全运营中心)的缩写。 NGSOC安全运营服务基于态势感知与安全运营平台来开展监测分析等一系列的服务工作,旨在通过专业、高效的运营服务工作,帮助用户尽可能发挥NGSOC作…...

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

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

ollama 在 Linux 环境的安装
ollama 在 Linux 环境的安装 介绍 他的存在在我看来跟 docker 的很是相似,他把市面上已经存在的大语言模型集合在一个仓库中,然后通过 ollama 的方式来管理这些大语言模型 下载 # 可以直接通过 http 的方式吧对应的 shell 脚本下载下来,然…...
C语言二刷指针篇
&取得变量的地址 printf("%p\n", &a); printf("%p\n", a); printf("%p\n", &a[0]); printf("%p\n", &a[1]); 前三个输出相同,a[0]和a[1]之间相差4 指针就是保存地址的变量,指针里放的是别的…...
LeetCode题练习与总结:回文对--336
一、题目描述 给定一个由唯一字符串构成的 0 索引 数组 words 。 回文对 是一对整数 (i, j) ,满足以下条件: 0 < i, j < words.length,i ! j ,并且words[i] words[j](两个字符串的连接)是一个回文…...
CesiumJS 案例 P7:添加指定长宽的图片图层(原点分别为图片图层的中心点、左上角顶点、右上角顶点、左下角顶点、右下角顶点)
CesiumJS CesiumJS API:https://cesium.com/learn/cesiumjs/ref-doc/index.html CesiumJS 是一个开源的 JavaScript 库,它用于在网页中创建和控制 3D 地球仪(地图) 一、添加指定长宽的图片图层(原点为图片图层的中心…...
Redis 主从同步 问题
前言 相关系列 《Redis & 目录》(持续更新)《Redis & 主从同步 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 主从同步 & 总结》(学习总结/最新最准/持续更新)《Redis &a…...
【SQL Server】探讨 IN 和 EXISTS之间的区别
前言 在使用 SQL 查询相关表数据时,通常需要根据另一个表中的值来筛选数据。而 IN 与 EXISTS 子句都是用于此场景的常用方式,但使用时两者存在工作方式不同。它们使用上的选择会显著影响查询的性能,尤其是在大型数据集中。本文我们一起探讨 IN 和 EXISTS 之间的区别、使用与…...
清理pip和conda缓存
当用户目录没有空间时,可清理pip和conda缓存 清理conda缓存: conda clean --all清理pip缓存: pip cache purgeNote: 可以利用软链接,将用户目录下的文件链接到其他位置 首先移动文件或文件夹到其他位置 mv ~/test /…...
git rebase和merge的区别
Git merge和Git rebase是两种不同的合并策略,它们在处理分支合并时有各自的优点和缺点。 Git fetch git fetch 命令用于从远程仓库获取最新的更改,但不会自动合并这些更改到你的本地分支。它会下载远程仓库的所有分支和标签,并更新你的本地…...

【elkb】linux麒麟v10安装ELKB 8.8.X版本(ARM架构)
下载软件 相关版本信息 elasticsearch:8.8.1kibana:8.8.1logstash:8.8.1filebeat: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做一个系统…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...