Android开机启动流程
Android开机启动流程
systemReady启动"added application"
@frameworks/base/services/java/com/android/server/SystemServer.java
mainnew SystemServer().run();startBootstrapServicesmActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);mActivityManagerService.setSystemProcess();
@frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.javaServiceManager.addService(Context.ACTIVITY_SERVICEServiceManager.addService("meminfo", new MemBinder(this)ServiceManager.addService("gfxinfo", new GraphicsBinder(this))ApplicationInfo info = mContext.getPackageManager().getApplicationInfo( "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName, startOtherServices
@frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.javamActivityManagerService.systemReady(() -> {mLocalDeviceIdleController = LocalServices.getService(DeviceIdleInternal.class);
@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.javamActivityTaskManager.onSystemReady();
@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.javamTaskSupervisor.onSystemReady();
@frameworks/base/services/core/java/com/android/server/wm/LaunchParamsPersister.javamLaunchParamsPersister.onSystemReady();PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);mPackageList = pmi.getPackageList(new PackageListObserver());
@frameworks/base/services/core/java/com/android/server/am/UserController.javamUserController.onSystemReady();
@frameworks/base/services/core/java/com/android/server/appop/AppOpsService.javamAppOpsService.systemReady();mProcessList.onSystemReady();mAppExitInfoTracker.onSystemReady();ArrayList<ProcessRecord> procsToKill = null; //杀应用名单for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {ProcessRecord proc = mPidsSelfLocked.valueAt(i);procsToKill.add(proc);
@frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.javastartPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE);final List<ApplicationInfo> apps = AppGlobals.getPackageManager().getPersistentApplications(STOCK_PM_FLAGS | matchFlags).getList();addAppLocked(app, null, false, null ProcessRecord app;app = mProcessList.newProcessRecordLocked(info, customProcess, isolated, 0,mProcessList.startProcessLocked(app, new HostingRecord("added application", customProcess != null ? customProcess : app.processName),Start proc 1056:com.android.se/1068 for type:added application type end com.android.seStart proc 1078:com.android.phone/1001 for type:added application type end com.android.phoneStart proc 1079:com.android.systemui/u0a50 for type:added application type end com.android.systemui
Home应用程序
Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应用程序就是Launcher了.
@frameworks/base/services/core/java/com/android/server/am/UserController.java
finishUserUnlockingmHandler.obtainMessage(USER_UNLOCK_MSG, userId, 0, uss).sendToTarget();case USER_UNLOCK_MSG: finishUserUnlockedfinishUserUnlockedCompletedmHandler.obtainMessage(USER_UNLOCKED_MSG, userId, 0).sendToTarget();case USER_UNLOCKED_MSG: mInjector.getSystemServiceManager().onUserUnlocked(msg.arg1);mService.mTaskSupervisor.onUserUnlocked(user.getUserIdentifier());
@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.javascheduleStartHome("userUnlocked");mHandler.obtainMessage(START_HOME_MSG, reason).sendToTarget();case START_HOME_MSG: { mRootWindowContainer.startHomeOnEmptyDisplays((String) msg.obj); @frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.javastartHomeOnEmptyDisplaysforAllTaskDisplayAreas(taskDisplayArea -> {startHomeOnTaskDisplayArea(mCurrentUser, myReason, taskDisplayArea,
@frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.javaService.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason, taskDisplayArea);
@frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.javamLastHomeActivityStartResult = obtainStarter(intent, "startHomeActivity: " + reason).setActivityOptions(options.toBundle()).execute();res = executeRequest(mRequest);ActivityRecord r = new ActivityRecord.Builder(mService)..setActivityInfo(aInfo)mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,startFlags, doResume, options, inTask, inTaskFragment, restrictedBgActivity,mTargetRootTask.startActivityLocked(mStartActivity,
@frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.javamRootWindowContainer.resumeFocusedTasksTopActivities(mTargetRootTask, mStartActivity, mOptions, mTransientLaunch);final Task focusedRoot = display.getFocusedRootTask();
@frameworks/base/services/core/java/com/android/server/wm/Task.javafocusedRoot.resumeTopActivityUncheckedLocked(target, targetOptions);someActivityResumed = resumeTopActivityInnerLocked(prev, options, deferPause);
@frameworks/base/services/core/java/com/android/server/wm/TaskFragment.javaresumed[0] = topFragment.resumeTopActivity(prev, options, deferPause);ActivityRecord next = topRunningActivity(true /* focusableOnly */);pausing |= startPausing(mTaskSupervisor.mUserLeaving, false /* uiSleeping */, next, "resumeTopActivity"); //这里就是stop上一个activity的地方if (next.attachedToProcess()) { //要启动的activity所在的进程已经起来了,直接通过事务的形式去启动activityfinal ClientTransaction transaction = ClientTransaction.obtain(next.app.getThread(), next.appToken);mAtmService.getLifecycleManager().scheduleTransaction(transaction);} else { //如果进程没启动,调用ActivityTaskSupervisor的startSpecificActivity
@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.javamTaskSupervisor.startSpecificActivity(next, true, true);
@base/services/core/java/com/android/server/wm/ActivityTaskManagerService.javamService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess, mAmInternal, activity.processName,mH.sendMessage(m);LocalService::startProcess //class LocalService extends ActivityManagerInternalstartProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */, new HostingRecord(hostingType, hostingName, isTop),
@frameworks/base/services/core/java/com/android/server/am/ProcessList.javareturn mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,startProcessLocked(app, hostingRecord, zygotePolicyFlags, abiOverride);startProcessLocked(app, hostingRecord, zygotePolicyFlags, falsestartProcessLocked(hostingRecord, entryPoint, app, uid, gids, runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi,mService.mProcStartHandler.post(() -> handleProcessStart( app,handleProcessStartedLocked(app, startResult, startSeq);return handleProcessStartedLocked(pending, startResult.pid, startResult.usingWrapper,buf.append("Start proc "); //Start proc 1486:com.dynabook.VDlauncher/1000 for top-activity {com.dynabook.VDlauncher/com.dynabook.VDlauncher.MainActivity}buf.append(pid);buf.append(':');buf.append(app.processName);buf.append('/');buf.append(app.getHostingRecord().getType());buf.append(app.getHostingRecord().getName());..............
@src/main/java/com/xxx/launcher/MainActivity.javaMainActivity::onCreate
@frameworks/base/services/java/com/android/server/SystemServer.java
main
new SystemServer().run();
startBootstrapServices
mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
mActivityManagerService.setSystemProcess();
@frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
ServiceManager.addService(Context.ACTIVITY_SERVICE
ServiceManager.addService("meminfo", new MemBinder(this)
ServiceManager.addService("gfxinfo", new GraphicsBinder(this))
ApplicationInfo info = mContext.getPackageManager().getApplicationInfo( "android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,
startOtherServices
@frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
mActivityManagerService.systemReady(() -> {
mLocalDeviceIdleController = LocalServices.getService(DeviceIdleInternal.class);
@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
mActivityTaskManager.onSystemReady();
@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
mTaskSupervisor.onSystemReady();
@frameworks/base/services/core/java/com/android/server/wm/LaunchParamsPersister.java
mLaunchParamsPersister.onSystemReady();
PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
mPackageList = pmi.getPackageList(new PackageListObserver());
@frameworks/base/services/core/java/com/android/server/am/UserController.java
mUserController.onSystemReady();
@frameworks/base/services/core/java/com/android/server/appop/AppOpsService.java
mAppOpsService.systemReady();
mProcessList.onSystemReady();
mAppExitInfoTracker.onSystemReady();
ArrayList<ProcessRecord> procsToKill = null; //杀应用名单
for (int i=mPidsSelfLocked.size()-1; i>=0; i--) {
ProcessRecord proc = mPidsSelfLocked.valueAt(i);
procsToKill.add(proc);
@frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE);
final List<ApplicationInfo> apps = AppGlobals.getPackageManager().getPersistentApplications(STOCK_PM_FLAGS | matchFlags).getList();
addAppLocked(app, null, false, null
ProcessRecord app;
app = mProcessList.newProcessRecordLocked(info, customProcess, isolated, 0,
mProcessList.startProcessLocked(app, new HostingRecord("added application", customProcess != null ? customProcess : app.processName),
Start proc 1056:com.android.se/1068 for type:added application type end com.android.se
Start proc 1078:com.android.phone/1001 for type:added application type end com.android.phone
Start proc 1079:com.android.systemui/u0a50 for type:added application type end com.android.systemui
@frameworks/base/services/core/java/com/android/server/am/UserController.java
finishUserUnlocking
mHandler.obtainMessage(USER_UNLOCK_MSG, userId, 0, uss).sendToTarget();
case USER_UNLOCK_MSG: finishUserUnlocked
finishUserUnlockedCompleted
mHandler.obtainMessage(USER_UNLOCKED_MSG, userId, 0).sendToTarget();
case USER_UNLOCKED_MSG: mInjector.getSystemServiceManager().onUserUnlocked(msg.arg1);
mService.mTaskSupervisor.onUserUnlocked(user.getUserIdentifier());
@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
scheduleStartHome("userUnlocked");
mHandler.obtainMessage(START_HOME_MSG, reason).sendToTarget();
case START_HOME_MSG: { mRootWindowContainer.startHomeOnEmptyDisplays((String) msg.obj);
@frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
startHomeOnEmptyDisplays
forAllTaskDisplayAreas(taskDisplayArea -> {
startHomeOnTaskDisplayArea(mCurrentUser, myReason, taskDisplayArea,
@frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.java
Service.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason, taskDisplayArea);
@frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java
mLastHomeActivityStartResult = obtainStarter(intent, "startHomeActivity: " + reason).setActivityOptions(options.toBundle()).execute();
res = executeRequest(mRequest);
ActivityRecord r = new ActivityRecord.Builder(mService)..setActivityInfo(aInfo)
mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,
result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,startFlags, doResume, options, inTask, inTaskFragment, restrictedBgActivity,
mTargetRootTask.startActivityLocked(mStartActivity,
@frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
mRootWindowContainer.resumeFocusedTasksTopActivities(mTargetRootTask, mStartActivity, mOptions, mTransientLaunch);
final Task focusedRoot = display.getFocusedRootTask();
@frameworks/base/services/core/java/com/android/server/wm/Task.java
focusedRoot.resumeTopActivityUncheckedLocked(target, targetOptions);
someActivityResumed = resumeTopActivityInnerLocked(prev, options, deferPause);
@frameworks/base/services/core/java/com/android/server/wm/TaskFragment.java
resumed[0] = topFragment.resumeTopActivity(prev, options, deferPause);
ActivityRecord next = topRunningActivity(true /* focusableOnly */);
pausing |= startPausing(mTaskSupervisor.mUserLeaving, false /* uiSleeping */, next, "resumeTopActivity"); //这里就是stop上一个activity的地方
if (next.attachedToProcess()) { //要启动的activity所在的进程已经起来了,直接通过事务的形式去启动activity
final ClientTransaction transaction = ClientTransaction.obtain(next.app.getThread(), next.appToken);
mAtmService.getLifecycleManager().scheduleTransaction(transaction);
} else { //如果进程没启动,调用ActivityTaskSupervisor的startSpecificActivity
@frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
mTaskSupervisor.startSpecificActivity(next, true, true);
@base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");
final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess, mAmInternal, activity.processName,
mH.sendMessage(m);
LocalService::startProcess //class LocalService extends ActivityManagerInternal
startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */, new HostingRecord(hostingType, hostingName, isTop),
@frameworks/base/services/core/java/com/android/server/am/ProcessList.java
return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,
startProcessLocked(app, hostingRecord, zygotePolicyFlags, abiOverride);
startProcessLocked(app, hostingRecord, zygotePolicyFlags, false
startProcessLocked(hostingRecord, entryPoint, app, uid, gids, runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi,
mService.mProcStartHandler.post(() -> handleProcessStart( app,
handleProcessStartedLocked(app, startResult, startSeq);
return handleProcessStartedLocked(pending, startResult.pid, startResult.usingWrapper,
buf.append("Start proc "); //Start proc 1486:com.dynabook.VDlauncher/1000 for top-activity {com.dynabook.VDlauncher/com.dynabook.VDlauncher.MainActivity}
buf.append(pid);
buf.append(':');
buf.append(app.processName);
buf.append('/');
buf.append(app.getHostingRecord().getType());
buf.append(app.getHostingRecord().getName());
..............
@src/main/java/com/xxx/launcher/MainActivity.java
MainActivity::onCreate
相关文章:
Android开机启动流程
Android开机启动流程 systemReady启动"added application" frameworks/base/services/java/com/android/server/SystemServer.java mainnew SystemServer().run();startBootstrapServicesmActivityManagerService ActivityManagerService.Lifecycle.startService(…...
数据结构基本知识
一、什么是数据结构 1.1、组织存储数据 ---------》内存(存储) 1.2、研究目的 如何存储数据(变量,数组....)程序数据结构算法 1.3、常见保存数据的方法 数组:保存自己的数据指针:是间接访问已经存在的…...
浙大数据结构:02-线性结构4 Pop Sequence
这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,fr…...
java开发,记录一些注解和架构 pojo、entity、respository
最近接了一个项目,说是项目其实也不算是项目,因为是把这个项目赛到其他项目中的。 熟悉一些这个项目的功能,梳理了一下,在代码开发中主要关心pojo、entity、respository、controller、service。 在这里主要记录前3个的流程与作用…...
MatLab基础学习01
MatLab基础学习01 1.基础入门2.MatLab的数据类型2.1数字2.2字符串2.3矩阵2.4.元胞数组2.5结构体 3.MatLab的矩阵的操作3.1矩阵定义与构造3.2矩阵的下标取值 4.MatLab的逻辑流程4. For循环结构4.2 While循环,当条件成立的时候进行循环4.3 IF end 1.基础入门 matlba必…...
第 5 章多视图几何
本章讲解如何处理多个视图,以及如何利用多个视图的几何关系来恢复照相机位置信息和三维结构。通过在不同视点拍摄的图像,我们可以利用特征匹配来计算出三维场景点以及照相机位置。本章会介绍一些基本的方法,展示一个三维重建的完整例子&#…...
IOS 开发者账号注册流程
注册步骤 准备资料 营业执照 法人信息(电话、身份证信息) 注册邮箱(公司邮箱) 开发者信息(电话、身份证信息、邮箱)1. 注册AppleID 注册地址: https://appleid.apple.com/account 填写表单信…...
netty之NioEventLoop和NioEventLoopGroup
类结构图 NioEventLoopGroup #mermaid-svg-5g1iVjr5oyhqXK92 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5g1iVjr5oyhqXK92 .error-icon{fill:#552222;}#mermaid-svg-5g1iVjr5oyhqXK92 .error-text{fill:#55222…...
睿考网:中级经济师考试题型有哪些?
中级经济师考试时间在每年的11月份,2024年考试时间定于11月16-17日,考试科目为《经济基础知识》与《专业知识与实务》两科。 《专业知识与实务》有10个专业,分别是工商管理、知识产权、农业经济、财政税收、金融、保险、运输经济、人力资源管…...
kubernetes集群部署Confluence 7.2.0+mysql 5.7(自测有效)
背景介绍: Confluence是一个专业的企业知识管理与协同软件。使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论,信息推送。 这里介绍的使用的是Confluence 7.2.0版本的。 一、在kubernetes集群部署 1…...
Vmware ubuntu22.04 虚拟机 连接Windows主机虚拟串口
1. Windows虚拟串口配置 虚拟串口下载:虚拟串口 VSPD 的使用_vspd使用教程-CSDN博客 虚拟串口使用:使用虚拟串口在一台电脑上模拟串口通讯_pc怎么模拟一主多从串口-CSDN博客 2. ubuntu虚拟串口配置 Vmware ubuntu22.04 虚拟机 连接windows主机虚拟串口…...
Postgresql碎片整理
创建pgstattuple 扩展 CREATE EXTENSION pgstattuple 获取表的元组(行)信息,包括空闲空间的比例和行的平均宽度 SELECT * FROM pgstattuple(表名); 查看表和索引大小 SELECT pg_relation_size(表名), pg_relation_size(索引名称); 清理碎片方…...
【最新华为OD机试E卷-支持在线评测】字母组合(200分)多语言题解-(Python/C/JavaScript/Java/Cpp)
🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…...
力扣493.翻转对
class Solution {public static int MAXN 50001;public static int[] help new int[MAXN];public static void main(String[] args) {}public static int reversePairs(int[] arr) {return counts(arr, 0, arr.length - 1);}//统计l …… r上反转对的数量,同时计算…...
潜望长焦+快充:vivo X200系列,小尺寸手机的大突破
在智能手机市场日益激烈的竞争中,厂商们不断推陈出新,以满足消费者多样化的需求。vivo作为中国知名的智能手机品牌,一直以其创新的设计和强大的功能赢得市场的认可。 近日,vivo X200系列的即将发布引起了广泛关注,特别…...
Stable Diffusion训练LoRA模型参数详细说明(阿里巴巴堆友AI)
工具:线上模型训练堆友AI 一、训练参数 批量大小 (Batch Size) 作用:每次训练中使用的样本数量。参考值:可以从 8 到 64,取决于显存大小。 训练轮数 (Epochs) 作用:完整遍历训练数据的次数。参考值:通…...
Learn ComputeShader 12 Setting up a buffer-based particle effect
unity有自己的粒子系统,但是这次我们要尝试创建一个我们自己的粒子系统,而且使用计算着色器有下面这些好处。总而言之,计算着色器适合处理大规模的数据集。例如,能够高效地处理数万个甚至数百万个粒子的计算。这对于粒子系统这样的…...
【STL中容器汇总】map、list、vector等详解
容器学习分享 1、STL简介1.1、STL六大组件 2、vector容器2.1、vector 基本操作2.2、vector容器示例2.3、vector容器存放自定义数据类型示例2.3、vector嵌套vector示例 3、list 容器3.1使用示例3.2、list容器基本函数 4、map容器4.1、map函数原型4.2、map函数示例 1、STL简介 ST…...
Semantic Kernel + Natasha:一小时快速生成100个API的奇迹
大家好,我今天带来了一个让人瞠目结舌的实验:在一小时内快速生成了100个API! 其实如果手速高,可以更多。要知道,这得益于之前介绍过的Natasha —— 一个可以动态编译并加载代码的神奇工具。 动态编程神器! 探秘.Net…...
rancher upgrade 【rancher 升级】
文章目录 1. 背景2. 下载3. 安装4. 检查5. 测试5.1 创建项目5.2 创建应用5.3 删除集群5.4 注册集群 1. 背景 rancher v2.8.2 升级 v2.9.1 2. 下载 下载charts helm repo add rancher-latest https://releases.rancher.com/server-charts/latest helm repo update helm fetc…...
Keil中sprintf和自定义Serial_Printf,哪个更适合你的串口打印需求?
Keil开发中的串口打印方案:sprintf与自定义Serial_Printf深度对比 在嵌入式开发中,串口打印是调试和日志记录的重要手段。Keil MDK作为广泛使用的嵌入式开发工具链,提供了多种实现串口打印的方案。对于已经了解printf重定向基础概念的开发者…...
如何快速实现浏览器隐身:puppeteer-extra-stealth的完整指南
如何快速实现浏览器隐身:puppeteer-extra-stealth的完整指南 【免费下载链接】puppeteer-extra 💯 Teach puppeteer new tricks through plugins. 项目地址: https://gitcode.com/gh_mirrors/pu/puppeteer-extra 你是否曾尝试使用Puppeteer进行网…...
如何在Windows 10/11上完美使用PS3手柄:DsHidMini虚拟HID驱动终极指南
如何在Windows 10/11上完美使用PS3手柄:DsHidMini虚拟HID驱动终极指南 【免费下载链接】DsHidMini Virtual HID Mini-user-mode-driver for Sony DualShock 3 Controllers 项目地址: https://gitcode.com/gh_mirrors/ds/DsHidMini 你是否还在为Windows系统无…...
别再手搓流程图了!用WPF从零封装一个可拖拽、可连接的业务节点控件(附完整源码)
WPF业务流程图控件开发实战:从零构建可拖拽节点系统 在当今企业级应用开发中,可视化业务流程配置已成为提升用户体验的关键要素。无论是审批流程引擎、ETL数据处理管道,还是自动化任务编排系统,都需要直观的节点连接界面。本文将深…...
机器学习核函数原理与实战选型指南
1. 什么是机器学习中的核函数?它到底在解决什么问题?“Types of Kernels in Machine Learning”这个标题看起来像教科书目录里的一节,但如果你真在项目里调过SVM(kernelrbf)、用过sklearn.metrics.pairwise.rbf_kernel、或者被kernel trick这…...
SSE流式响应:从Reactor Flux到生产级AI聊天的工程实践——5分钟超时、线程隔离、背压处理全解析
大家好,我是程序员小策。 首先给大家去一个例子:凌晨两点,P0 告警炸了。 AI 聊天接口全部超时,用户消息发出去转圈转了 120 秒然后报错。你打开监控一看:Tomcat 线程池满了,200 个工作线程全部卡在"…...
FactoryBluePrints终极指南:戴森球计划蓝图库助你轻松建造完美工厂
FactoryBluePrints终极指南:戴森球计划蓝图库助你轻松建造完美工厂 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 你是否曾在戴森球计划中为复杂的工厂布局而头…...
NoFences:Windows桌面整理终极指南,5分钟打造高效工作空间
NoFences:Windows桌面整理终极指南,5分钟打造高效工作空间 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否每天都要在混乱的Windows桌面上花费大…...
Wireshark进阶实战:15分钟定位真实网络故障根因
1. 这不是“又一个Wireshark教程”,而是我三年里修过的27个真实网络故障现场 你打开Wireshark,看到满屏滚动的TCP、HTTP、DNS包,心里发虚——不是不会点“开始捕获”,而是根本不知道该盯哪一行、为什么这一行比那一行重要、哪个字…...
Android动态换肤框架深度解析:如何5分钟实现应用主题实时切换
Android动态换肤框架深度解析:如何5分钟实现应用主题实时切换 【免费下载链接】Android-Skin-Loader 一个通过动态加载本地皮肤包进行换肤的皮肤框架 项目地址: https://gitcode.com/gh_mirrors/an/Android-Skin-Loader 在Android应用开发中,主题…...
