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

Anrdoir 13 关于设置静态IP后,突然断电,在上电开机卡动画

bug描述:设置静态IP成功后,机器突然断电,然后在上电开机,发现机器一直卡在开机动画,无法成功进入桌面

第一时间抓取日志分析,Log如下:

08-13 11:26:42.455  2803  2803 I EthernetServiceImpl: Starting Ethernet service
08-13 11:26:42.457  2803  2924 D ConnectivityService: Got NetworkProvider Messenger for EthernetNetworkFactory
08-13 11:26:42.458  2803  2803 E IpConfigStore: Bad version on IP configuration file, ignore read
08-13 11:26:42.460  2803  2803 V SystemServerTiming: OnBootPhase_500_com.android.server.ConnectivityServiceInitializer took to complete: 5ms
08-13 11:26:42.460  2803  2803 E System  : ******************************************
08-13 11:26:42.461  2803  2803 E System  : ************ Failure starting system services
08-13 11:26:42.461  2803  2803 E System  : java.lang.RuntimeException: Failed to boot service com.android.server.ConnectivityServiceInitializer: onBootPhase threw an exception during phase 500
08-13 11:26:42.461  2803  2803 E System  : 	at com.android.server.SystemServiceManager.startBootPhase(SystemServiceManager.java:297)
08-13 11:26:42.461  2803  2803 E System  : 	at com.android.server.SystemServer.startOtherServices(SystemServer.java:2694)
08-13 11:26:42.461  2803  2803 E System  : 	at com.android.server.SystemServer.run(SystemServer.java:939)
08-13 11:26:42.461  2803  2803 E System  : 	at com.android.server.SystemServer.main(SystemServer.java:649)
08-13 11:26:42.461  2803  2803 E System  : 	at java.lang.reflect.Method.invoke(Native Method)
08-13 11:26:42.461  2803  2803 E System  : 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
08-13 11:26:42.461  2803  2803 E System  : 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:914)
08-13 11:26:42.461  2803  2803 E System  : Caused by: java.lang.NullPointerException: Attempt to read from field 'int android.util.ArrayMap.mSize' on a null object reference in method 'void android.util.ArrayMap.putAll(android.util.ArrayMap)'
08-13 11:26:42.461  2803  2803 E System  : 	at android.util.ArrayMap.putAll(ArrayMap.java:705)
08-13 11:26:42.461  2803  2803 E System  : 	at com.android.server.ethernet.EthernetConfigStore.loadConfigFileLocked(EthernetConfigStore.java:112)
08-13 11:26:42.461  2803  2803 E System  : 	at com.android.server.ethernet.EthernetConfigStore.read(EthernetConfigStore.java:95)
08-13 11:26:42.461  2803  2803 E System  : 	at com.android.server.ethernet.EthernetConfigStore.read(EthernetConfigStore.java:87)
08-13 11:26:42.461  2803  2803 E System  : 	at com.android.server.ethernet.EthernetTracker.start(EthernetTracker.java:184)
08-13 11:26:42.461  2803  2803 E System  : 	at com.android.server.ethernet.EthernetServiceImpl.start(EthernetServiceImpl.java:102)
08-13 11:26:42.461  2803  2803 E System  : 	at com.android.server.ConnectivityServiceInitializer.onBootPhase(ConnectivityServiceInitializer.java:97)
08-13 11:26:42.461  2803  2803 E System  : 	at com.android.server.SystemServiceManager.startBootPhase(SystemServiceManager.java:294)
08-13 11:26:42.461  2803  2803 E System  : 	... 6 more
08-13 11:26:42.462  2803  2803 V SystemServerTiming: OnBootPhase_500 took to complete: 660ms
08-13 11:26:42.463  2803  2803 E Zygote  : System zygote died with fatal exception
08-13 11:26:42.463  2803  2803 E Zygote  : java.lang.RuntimeException: Failed to boot service com.android.server.ConnectivityServiceInitializer: onBootPhase threw an exception during phase 500
08-13 11:26:42.463  2803  2803 E Zygote  : 	at com.android.server.SystemServiceManager.startBootPhase(SystemServiceManager.java:297)
08-13 11:26:42.463  2803  2803 E Zygote  : 	at com.android.server.SystemServer.startOtherServices(SystemServer.java:2694)
08-13 11:26:42.463  2803  2803 E Zygote  : 	at com.android.server.SystemServer.run(SystemServer.java:939)
08-13 11:26:42.463  2803  2803 E Zygote  : 	at com.android.server.SystemServer.main(SystemServer.java:649)
08-13 11:26:42.463  2803  2803 E Zygote  : 	at java.lang.reflect.Method.invoke(Native Method)
08-13 11:26:42.463  2803  2803 E Zygote  : 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
08-13 11:26:42.463  2803  2803 E Zygote  : 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:914)
08-13 11:26:42.463  2803  2803 E Zygote  : Caused by: java.lang.NullPointerException: Attempt to read from field 'int android.util.ArrayMap.mSize' on a null object reference in method 'void android.util.ArrayMap.putAll(android.util.ArrayMap)'
08-13 11:26:42.463  2803  2803 E Zygote  : 	at android.util.ArrayMap.putAll(ArrayMap.java:705)
08-13 11:26:42.463  2803  2803 E Zygote  : 	at com.android.server.ethernet.EthernetConfigStore.loadConfigFileLocked(EthernetConfigStore.java:112)
08-13 11:26:42.463  2803  2803 E Zygote  : 	at com.android.server.ethernet.EthernetConfigStore.read(EthernetConfigStore.java:95)
08-13 11:26:42.463  2803  2803 E Zygote  : 	at com.android.server.ethernet.EthernetConfigStore.read(EthernetConfigStore.java:87)
08-13 11:26:42.463  2803  2803 E Zygote  : 	at com.android.server.ethernet.EthernetTracker.start(EthernetTracker.java:184)
08-13 11:26:42.463  2803  2803 E Zygote  : 	at com.android.server.ethernet.EthernetServiceImpl.start(EthernetServiceImpl.java:102)
08-13 11:26:42.463  2803  2803 E Zygote  : 	at com.android.server.ConnectivityServiceInitializer.onBootPhase(ConnectivityServiceInitializer.java:97)
08-13 11:26:42.463  2803  2803 E Zygote  : 	at com.android.server.SystemServiceManager.startBootPhase(SystemServiceManager.java:294)
08-13 11:26:42.463  2803  2803 E Zygote  : 	... 6 more
08-13 11:26:42.463  2803  2803 D AndroidRuntime: Shutting down VM
08-13 11:26:42.477  2803  2916 D WifiConfigStore: Reading from all stores completed in 45 ms.
08-13 11:26:42.478  2803  2803 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main
08-13 11:26:42.478  2803  2803 E AndroidRuntime: java.lang.RuntimeException: Failed to boot service com.android.server.ConnectivityServiceInitializer: onBootPhase threw an exception during phase 500
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at com.android.server.SystemServiceManager.startBootPhase(SystemServiceManager.java:297)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at com.android.server.SystemServer.startOtherServices(SystemServer.java:2694)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at com.android.server.SystemServer.run(SystemServer.java:939)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at com.android.server.SystemServer.main(SystemServer.java:649)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:914)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to read from field 'int android.util.ArrayMap.mSize' on a null object reference in method 'void android.util.ArrayMap.putAll(android.util.ArrayMap)'
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at android.util.ArrayMap.putAll(ArrayMap.java:705)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at com.android.server.ethernet.EthernetConfigStore.loadConfigFileLocked(EthernetConfigStore.java:112)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at com.android.server.ethernet.EthernetConfigStore.read(EthernetConfigStore.java:95)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at com.android.server.ethernet.EthernetConfigStore.read(EthernetConfigStore.java:87)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at com.android.server.ethernet.EthernetTracker.start(EthernetTracker.java:184)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at com.android.server.ethernet.EthernetServiceImpl.start(EthernetServiceImpl.java:102)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at com.android.server.ConnectivityServiceInitializer.onBootPhase(ConnectivityServiceInitializer.java:97)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	at com.android.server.SystemServiceManager.startBootPhase(SystemServiceManager.java:294)
08-13 11:26:42.478  2803  2803 E AndroidRuntime: 	... 6 more
08-13 11:26:42.479  2803  2916 W WifiConfigManager: No stored networks found.
08-13 11:26:42.484  2803  2916 D AlarmManager: setImplLocked() callingPackage=android
08-13 11:26:42.484  2803  2916 I WifiInjector: enableVerboseLogging false hal false
08-13 11:26:42.485  2803  2916 D WifiNative: enableVerboseLogging false hal false
08-13 11:26:42.485  2803  2916 E SupplicantStaIfaceHalAidlImpl: Can't call setDebugParams, ISupplicant is null
08-13 11:26:42.488  2803  2916 I WifiService: WifiService starting up with Wi-Fi disabled
08-13 11:26:42.499  2803  2803 I DropBoxManagerService: add tag=system_server_crash isTagEnabled=true flags=0x2
08-13 11:26:42.499  2736  2736 I Zygote  : ...preloaded 16430 classes in 2478ms.
08-13 11:26:42.499  2736  2736 V ZygoteInitTiming_lazy: PreloadClasses took to complete: 2478ms

分析日志,发现system_server进程去启动Ethernet service,读取Ip配置的时候失败了.失败的原因:E IpConfigStore: Bad version on IP configuration file, ignore read.
上面这个先按下不表,我更好奇为什么Ethernet service启动失败,为什么导致设备一直卡在开机动画.

/frameworks/base/services/java/com/android/server/SystemServer.java服务管理,启动系统服务.
系统服务大概分成三类:引导服务,核心服务,其他服务,分别对于三个方法,startBootstrapServices、startCoreServices、startOtherServices、startApexServices(Android 13),
这三个函数的主要作用就是去启动不同的服务.
比如我们常见的引导服务:ActivityManagerService, PowerManagerService, LightsService,
DisplayManagerService,PackageManagerService.
核心服务:BatteryService…
其他服务:AlarmManagerService,InputManagerService,ConnectivityService,WindowManagerService…

private void startOtherServices(@NonNull TimingsTraceAndSlog t) {t.traceBegin("startOtherServices");mSystemServiceManager.updateOtherServicesStartIndex();...t.traceBegin("StartWindowManagerService");// WMS needs sensor service ready //WMS需要 sensor service 先启动mSystemServiceManager.startBootPhase(t, SystemService.PHASE_WAIT_FOR_SENSOR_SERVICE);//查看各种服务的启动状态(阶段)wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);ServiceManager.addService(Context.INPUT_SERVICE, inputManager,/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);t.traceEnd();...t.traceBegin("StartConnectivityService");//启动网络服务// This has to be called after NetworkManagementService, NetworkStatsService// and NetworkPolicyManager because ConnectivityService needs to take these// services to initialize.//CONNECTIVITY_SERVICE_INITIALIZER_CLASS = com.android.server.ConnectivityServiceInitializermSystemServiceManager.startServiceFromJar(CONNECTIVITY_SERVICE_INITIALIZER_CLASS,CONNECTIVITY_SERVICE_APEX_PATH);networkPolicy.bindConnectivityManager();t.traceEnd();...}    

系统启动了这么多的服务,万一有bug出现,如何去找是那个服务没有启动成功?没有启动成功的某个服务如何快速定位问题?
当然有办法的啦,Android 把系统启动分为了几个阶段,不同的阶段干了不同的事情,前面一个阶段的事情完成了才可以进入下一个阶段.

/* * Boot Phases 启动阶段*/  
public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100; // maybe should be a dependency?  /** * After receiving this boot phase, services can obtain lock settings data. ** 在接收到这个引导阶段之后,服务可以获得锁设置数据.*/  public static final int PHASE_LOCK_SETTINGS_READY = 480;  /** * After receiving this boot phase, services can safely call into core system services * such as the PowerManager or PackageManager. ** 在这个阶段之后,服务可以安全地调用核心系统服务,如 PowerManagerService 和 PackageManagerService*/  
public static final int PHASE_SYSTEM_SERVICES_READY = 500;  /*** After receiving this boot phase, services can safely call into device specific services.* * 在这个阶段之后,可以安全调用设备特定的服务*/
public static final int PHASE_DEVICE_SPECIFIC_SERVICES_READY = 520; /** * After receiving this boot phase, services can broadcast Intents. ** 在接收到这个引导阶段后,服务可以广播*/  
public static final int PHASE_ACTIVITY_MANAGER_READY = 550;  /** * After receiving this boot phase, services can start/bind to third party apps. * Apps will be able to make Binder calls into services at this point. ** 在接收到这个引导阶段之后,服务可以启动/绑定到第三方应用程序,此时应用程序将能够使用Binder绑定服务*/  public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;  /*** After receiving this boot phase, services can allow user interaction with the device.* This phase occurs when boot has completed and the home application has started.* System services may prefer to listen to this phase rather than registering a* broadcast receiver for ACTION_BOOT_COMPLETED to reduce overall latency.* * 在这个阶段之后,服务允许用户和设备交互.* 此阶段发生在引导完成并且主应用程序(home app)启动时.* 系统服务更倾向于监听这个阶段,而不是监听启动广播 ACTION_BOOT_COMPLETED,以降低延迟*/
public static final int PHASE_BOOT_COMPLETED = 1000;

通过函数startBootPhase,然后根据phase确定启动到哪一步.

./frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
/*** Starts the specified boot phase for all system services that have been started up to* this point.** @param t     trace logger* @param phase The boot phase to start.*/public void startBootPhase(@NonNull TimingsTraceAndSlog t, int phase) {if (phase <= mCurrentPhase) {throw new IllegalArgumentException("Next phase must be larger than previous");}mCurrentPhase = phase;Slog.i(TAG, "Starting phase " + mCurrentPhase);try {t.traceBegin("OnBootPhase_" + phase);final int serviceLen = mServices.size();for (int i = 0; i < serviceLen; i++) {final SystemService service = mServices.get(i);long time = SystemClock.elapsedRealtime();t.traceBegin("OnBootPhase_" + phase + "_" + service.getClass().getName());try {service.onBootPhase(mCurrentPhase);} catch (Exception ex) {throw new RuntimeException("Failed to boot service "+ service.getClass().getName()+ ": onBootPhase threw an exception during phase "+ mCurrentPhase, ex);}warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onBootPhase");t.traceEnd();}} finally {t.traceEnd();}if (phase == SystemService.PHASE_BOOT_COMPLETED) {final long totalBootTime = SystemClock.uptimeMillis() - mRuntimeStartUptime;t.logDuration("TotalBootTime", totalBootTime);SystemServerInitThreadPool.shutdown();}}

每个阶段做的事情都必须完成,假设某一个阶段执行的任务失败了.就会抛出异常,后面的就无法继续执行.
比如启动网络服务失败的,来源于上面的日志E System : java.lang.RuntimeException: Failed to boot service com.android.server.ConnectivityServiceInitializer: onBootPhase threw an exception during phase 500
解释了第二个问题:为什么卡在开机动画.(不能开机是因为以太网服务读取ipconfig.txt文件异常而一直重启服务,导致系统卡住)

gityuan_system-server
Zygote家的大儿子 —— SystemServer
Android进程系列第四篇—SystemServer进程的启动流程

然后回来思考第一个问题:为什么会读写文件失败?(Bad version on IP configuration file)
ipconfig.txt异常是系统对文件缓存引起.因为设置静态IP时,会创建ipconfig.txt.
当(30s之内)突然掉电的时候,这些数据可能还在内存缓冲区,还没有被写进磁盘,所以数据就会丢失.
但是设备重启或者关机再开机,ipconfig.txt的数据不会丢失,可能是系统在启动关机/重启流程时,会将内存缓冲区的数据写进磁盘.
Android13以太网静态IP不保存的问题
如何解决:

方案1:找个好的ipconfig.txt文件,push到/data/misc/apexdata/com.android.tethering/misc/ethernet/ipconfig.txt替换它

方案2:保存用户的静态参数,直接删除,rm -rf /data/misc/apexdata/com.android.tethering/misc/ethernet/ipconfig.txt,然后利用开机广播在设置一次静态IP

这两个方案都是思路,都能让系统开机.

方案3:/packages/modules/Connectivity/service-t/src/com/android/server/net/IpConfigStore.java,
这个方案可以避免系统卡死,能正常开机,倒是静态IP需要重新配置.(要恢复出厂设置,才能重新设置静态ip)(所以只是解决了开机问题,ip的缓存问题未解决)
关于内存缓存在突然断电时,数据丢失问题,争取可以随时把内存缓存数据同步到磁盘中,而不是内存缓存达到规定size时,才同步写入磁盘.

/** Returns a map of network identity token and {@link IpConfiguration}. */public static ArrayMap<String, IpConfiguration> readIpConfigurations(InputStream inputStream) {ArrayMap<String, IpConfiguration> networks = new ArrayMap<>();DataInputStream in = null;try {in = new DataInputStream(inputStream);int version = in.readInt();if (version != 3 && version != 2 && version != 1) {loge("Bad version on IP configuration file, ignore read");
-                return null;
+                return networks;//add text}...

方案4:(检测到文件被损坏,直接跳过文件读取)只是思路,尝试了下:可以避免系统卡死,能正常开机(只是解决了开机问题,ip的缓存问题为解决)
搞个判断条件,如果文件被损坏,flag变化,跳过mConfigStore.read()

private final EthernetConfigStore mConfigStore;void start(boolean isEnabled) {mFactory.register();mConfigStore.read();//负责读的// Default interface is just the first one we want to track.mIpConfigForDefaultInterface = mConfigStore.getIpConfigurationForDefaultInterface();final ArrayMap<String, IpConfiguration> configs = mConfigStore.getIpConfigurations();for (int i = 0; i < configs.size(); i++) {mIpConfigurations.put(configs.keyAt(i), configs.valueAt(i));}...

关于突然掉电,造成文件读写异常引申:
文件数据回写/文件掉电保护
FAQ
android设备配置静态IP后无法开机

相关文章:

Anrdoir 13 关于设置静态IP后,突然断电,在上电开机卡动画

bug描述:设置静态IP成功后,机器突然断电,然后在上电开机,发现机器一直卡在开机动画,无法成功进入桌面 第一时间抓取日志分析,Log如下: 08-13 11:26:42.455 2803 2803 I EthernetServiceImpl: Starting Ethernet service 08-13 11:26:42.457 2803 2924 D ConnectivityServ…...

multimodel ocr dataset

InternLM-XComposer2-4KHD InternLM-XComposer2-4KHD a light-weight Vision Encoder OpenAI ViT-Large/14Large Language Model InternLM2-7B, 这篇论文采用的是一种动态分辨率的输入&#xff1b; 全图有一个global view,resize到336*336&#xff1b; 然后把图片resize再pad…...

兼容并蓄,高效集成:EasyCVR视频综合接入能力助力多元化项目需求

随着视频技术的不断进步&#xff0c;视频监控、视频直播、执法记录仪、语音可视对讲、无人机等视频资源的应用场景日益丰富。这些视频资源不仅在数量上快速增长&#xff0c;而且在质量、格式、编码标准等方面也呈现出多样化的特点。因此&#xff0c;为了有效整合这些资源&#…...

linux 部署YUM仓库及NFS共享服务

目录 简介 一、YUM仓库服务 1.1 YUM概述 1.2 linux系统各家厂家用的安装源 1.3 yum命令 1.4 yum下载方式 1.5 部署YUM软件仓库 二、NFS共享存储服务 2.1 NFS共享存储服务概念 2.2 NFS配置环境 2.3 使用NFS发布共享资源 2.4 在客户端访问NFS共享 简介 yum&#xff…...

LCD 显示字符

1.0 字符显示 使用显示图片的方式显示字符会浪费存储空间&#xff0c;显示字符的时候字符的笔画是一个固定的颜色&#xff0c;因此不用使用显示图片的方式&#xff0c;可以使用1 表示字符的本身&#xff0c;0 表示字符的背景&#xff0c;使用这种方式显示字符节省存储空间。 注…...

NOI2003 逃学的小孩 题解

NOI2003 逃学的小孩 题解 传送门。 题目简述 给定一棵树 T T T&#xff0c;需要选择三个点 A , B , C A,B,C A,B,C&#xff0c;需要从 C C C 走到 A , B A,B A,B​​ 的最远距离。 &#xff08;第一段题目是在讲剧情吗。。&#xff09; 前置知识 图树树的直径 思路简…...

硬件服务器操作系统的选择:Linux 还是 Windows?

在这个科技日新月异的时代&#xff0c;云服务器虽然日益普及&#xff0c;但硬件服务器依然是众多云服务和数据中心不可或缺的基石。有趣的是&#xff0c;随着云服务器的兴起&#xff0c;不少工程师竟然未曾亲眼见过实体的硬件服务器。然而&#xff0c;事实是&#xff0c;无论是…...

dataV组件使用——数据更新更新组件

bug 当数据更新只更新一个属性页面不会刷新&#xff08;this.config1.data arr;&#xff09; 必须重新赋值整个config 方式一&#xff1a;检测到数据更新重新赋值config this.config1 {data: arr,header: ["所在单位", "人员姓名", "职位", &q…...

solana合约编写

文章目录 solana 合约编写整体思路Cargo.toml配置代码实现在 Solana 智能合约中,定义和管理可能的错误类型自定义一个 Solana 账户结构一个帐户的约束条件什么是bump账号获取指令参数编码基础常用总结format! 格式化字符串Option<String>Vec<u8>编译部署到localne…...

C++调用C#方法(附踩坑点)

C调用C#方法 写在前面效果思路步骤可能的问题 写在后面 写在前面 工作需要用C调用C#写到代码&#xff0c;看来网上写的方法&#xff0c;自己也踩了一些坑&#xff0c;这里总结一下&#xff0c;我只试了CLR的方法。 主要参考了下面几篇博客 C调用C#库简单例程&#xff08;Lucky…...

开源前端埋点监控插件Web-Tracing

Web-Tracing是一款专为前端项目设计的前端监控插件&#xff0c;它基于JavaScript设计&#xff0c;兼容跨平台使用&#xff0c;并提供了全方位的监控功能。 开源地址&#xff1a;https://gitee.com/junluoyu/web-tracing-analysis 以下是关于Web-Tracing的详细介绍&#xff1a;…...

智慧排水远程监测系统物联网解决方案

智慧排水监测系统是一种集成了现代信息技术、物联网技术、大数据分析及云计算能力的高效城市排水管理解决方案。该系统通过全面、实时地监控城市排水网络的运行状态&#xff0c;旨在预防内涝灾害&#xff0c;优化水资源管理&#xff0c;保障城市安全运行&#xff0c;促进可持续…...

【SVN(Subversion)是一个版本控制系统】

Question SVN所有命令 Answer SVN&#xff08;Subversion&#xff09;是一个版本控制系统&#xff0c;用于管理和跟踪文件和目录的更改。以下是一些常用的SVN命令&#xff1a; 检出&#xff08;Checkout&#xff09; svn checkout URL从版本库中检出一个工作副本。 更新&am…...

leetcode108.把升序数组转换成二叉搜索树

题目描述 [-10,-3,0,5,9] 转换成如下二叉搜索树&#xff1a; 解题的核心原理是&#xff1a;二叉搜索树的中序遍历结果是一个升序数组&#xff0c;所以根节点的数值&#xff0c;也位于数组的中部。 class Solution {public TreeNode sortedArrayToBST(int[] nums) {return h…...

用QTdesigner制作自己的双目标定软件

目录 1&#xff0c;设计布局软件界面 2&#xff0c;导出界面ui文件为python的.py文件 3&#xff0c;为界面添加对应的功能 4&#xff0c;导出为exe可执行文件 5&#xff0c;运行测试效果 5.1 双击启动 5.2 添加必要的参数 5.3 &#xff0c;运行结果 效果展示 动手制作双…...

MySQL:基础巩固-DDL

一、对数据库的操作 1.查询所有数据库 SHOW DATABASES;2. 查询当前使用的数据库 SELECT DATABASE();3. 创建数据库 CREATE DATABASE IF NOT EXISTS test DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;4. 删除数据库 DROP DATABASE IF EXISTS test;5. 使用数据库 …...

翻译软件在医学中的应用

翻译软件在医学中的应用非常广泛&#xff0c;主要体现在以下几个方面&#xff1a; 患者沟通&#xff1a;翻译软件可以帮助医务人员与非母语患者进行有效沟通&#xff0c;确保患者能够准确表达自己的症状和需求&#xff0c;也使医生能够清晰地解释治疗方案和用药说明。这对提升…...

政务大数据解决方案(六)

政务大数据解决方案通过建立综合数据平台&#xff0c;将来自各政府部门的异构数据整合并进行深入分析&#xff0c;利用人工智能和机器学习技术实现智能化数据处理与预测&#xff0c;从而提升政府决策的科学性和实时响应能力。方案涵盖数据采集、存储、处理、分析与可视化&#…...

【MATLAB机器人系统工具箱】【manipulatorRRT规划器】属性和方法解析

启用了连接启发式&#xff08;heuristic&#xff09;后&#xff0c;双向快速扩展随机树&#xff08;RRT&#xff09;算法会在以下情况下忽略 MAXCONNECTIONDISTANCE 的限制&#xff1a;当两棵树&#xff08;起始树和目标树&#xff09;之间的节点距离足够接近时&#xff0c;算法…...

MySQL 多表连接(JOIN)

在数据库开发中&#xff0c;多表连接&#xff08;JOIN&#xff09;是一个非常重要的技术&#xff0c;它使得我们可以在查询中整合多个表的数据&#xff0c;进而实现更加复杂的数据操作。本文将深入探讨 MySQL 中的多表连接&#xff0c;帮助读者全面理解 JOIN 的基本概念、类型和…...

Opencv学习-直方图比较

由于图像的直方图表示图像像素灰度值的统计特性&#xff0c;因此可以通过两幅图像的直方图特性比较 两幅图像的相似程度。从一定程度上来讲&#xff0c;虽然两幅图像的直方图分布相似不代表两幅图像相似&#xff0c;但是两幅图像相似则两幅图像的直方图分布一定相似。例如&…...

一文入门:正则表达式基础

正则表达式简介 正则表达式&#xff08;Regular Expression&#xff0c;简称regex或RE&#xff09;是一种用于匹配字符串中字符组合的模式。它广泛应用于编程语言、文本编辑器和各种工具中&#xff0c;用于执行复杂的字符串搜索和替换任务。 为什么使用正则表达式&#xff1f…...

深入理解 `@DateTimeFormat` 和 `@JsonFormat` 注解

前言 在Java应用程序中&#xff0c;处理日期和时间是一个常见的需求。无论是从数据库读取还是通过API接收数据&#xff0c;正确的日期和时间格式都是确保应用正确运作的关键因素。本文将深入探讨两个常用的注解——DateTimeFormat和JsonFormat——以及它们如何帮助我们在Sprin…...

微服务架构设计中的常见的10种设计模式

微服务架构设计的概念 微服务架构&#xff08;Microservices Architecture&#xff09;是一种用于构建分布式系统的软件设计模式。它将大型应用程序拆分成一组小型、自治的服务&#xff0c;每个服务都运行在其独立的进程中&#xff0c;服务之间通过轻量级的通信机制&#xff08…...

stripe Element 如何使用

这里要准备好几个东西&#xff1a; 一个支付成功过后的回调 还有一个下单的接口 一旦进入这个下单界面&#xff0c;就要去调下单的接口的&#xff0c;用 post, 这个 接口你自己写&#xff0c;可以写在后端中&#xff0c;也可以放到 nextjs 的 api 中。 首先说的是这个下单…...

vue3动态引入图片不显示问题

方法1.(打包后动态引用的图片未被打包入工程中,webpack,vite) 1.图片放到public 目录会更省事&#xff0c;不管是开发环境还是生产环境&#xff0c;可以始终以根目录保持图片路径的一致. 假设&#xff1a; 静态文件目录&#xff1a;src/assets/images/ 我们的目标静态文件在 …...

【流媒体】RTMPDump—AMF编码

目录 1. AMF类型2. AMF编码2.1 AMF_Number (AMF_EncodeNumber)2.2 AMF_BOOLEAN (AMF_EncodeBoolean)2.3 AMF_STRING 和 AMF_LONG_STRING (AMF_EncodeString)2.3.1 AMF_EncodeInt162.3.2 AMF_EncodeInt32 2.4 AMF_OBJECT (AMF_Encode)2.4.1 AMF_EncodeInt24 2.5 AMF_ECMA_ARRAY …...

Mysql双主双从

双主双从 1.安装Mysql1.1 查看linux版本1.2 下载Mysql安装包1.3 上传并解压1.4 安装Mysql1.5 编辑端口号1.6 Mysql启动命令1.7 更新密码 2.搭建Mysql主从复制2.1 搭建Master主服务器2.1.1 修改mysql配置文件2.1.2 重启Mysql服务2.1.3 创建Slave用户, 并授权2.1.4 查看主服务器当…...

安卓主板_MTK联发科主板定制开发|PCBA定制开发

MTK联发科安卓主板&#xff0c;采用MT6762八核平台方案&#xff0c;支持谷歌Android 11.0系统&#xff0c;MT6762采用ARM八核A53内核芯片、主频高达2.0GHz&#xff0c;GPU采用ARM PowerVR GE8329650MHZ&#xff0c;支持主流19201080分辨率&#xff0c;支持硬解H.264&#xff0c…...

结合GPT与Python实现端口检测工具(含多线程)

端口检测器是一个非常实用的网络工具&#xff0c;它主要用于检测服务器或本地计算机上的特定端口是否处于开放状态。通过这个工具&#xff0c;你可以快速识别和诊断网络连接问题&#xff0c;确保关键服务的端口能够正常接收和处理数据。这对于网络管理员和开发者来说是一个不可…...