iOS APP包分析工具 | 京东云技术团队
介绍
分享一款用于分析iOS
ipa包的脚本工具,使用此工具可以自动扫描发现
可修复的包体积问题,同时可以生成包体积数据用于查看。这块工具我们团队内部已经使用很长一段时间,希望可以帮助到更多的开发同学更加效率的优化包体积问题。
工具下载地址
背景
APPAnalyze
工具最早诞生主要是为了解决以下包体积管理的问题:
对于定位下沉市场的APP
来讲,包体积是一个非常重要的性能指标,包体积过大会影响用户下载APP
的意愿。但是在早期我们缺少一些手段帮助我们更高效的去进行包体积管理。
自动发现问题
-
提升效率
- 人工排查问题效率低,对于常见的问题尽可能自动扫描出来。并且对于组件化
工程来讲,很多外部组件是通过Framework
方式提供,没有仓库源码权限用于分析包体积问题。 -
流程化
- 形成自动化的质量流程,添加到CI流水线
自动发现包体积问题。
数据指标量化
-
包体积问题
- 提供数据化平台查看每个组件的包体积待修复
问题 -
包体积大小
- 提供数据化平台查看每个组件的包体积占比,包括总大小
,单个文件二进制大小
和每个资源大小
。可以针对不同的APP
版本进行组件化粒度的包体积数据对比,更方便查看每个版本的组件大小增量。
实现方式
我们选择了不依赖源码而是直接扫描二进制库的方式来实现这个能力,总体的执行流程一下:
提示:基于组件化工程的扫描方式内部支持,只是暂时不对外开放。
使用指南
安装
无需安装。通过下载链接直接下载终端可执行命令文件APPAnalyzeCommand
到本地即可使用。
APPAnalyzeCommand 下载地址
使用
$ /Users/Test/APPAnalyzeCommand --help
OPTIONS:--version <version> 当前版本 1.0.0--output <output> 输出文件目录。必传参数--config <config> 配置JSON文件地址。非必传参数--ipa <ipa> ipa.app文件地址。必传参数-h, --help Show help information.
执行
打开终端程序直接执行以下shell
指令,即可生成ipa
的包体积数据以及包体积待修复问题。
提示:不能直接使用
AppStore
的包,AppStore
的包需要砸壳。建议尽量使用XCodeDebug
的包。
/Users/Test/APPAnalyzeCommand --ipa ipas/JDAPP/JDAPP.app --output ipas/JDAPP
提示:如果提示
permission denied
没有权限,执行sudo chmod -R 777 /Users/a/Desktop/ipas/APPAnalyzeCommand
即可。
生成产物
指令执行完成以后,会在ouput
参数指定的文件夹生成APPAnalyze
文件夹。具体文件介绍如下:
包体积信息
app_size.html
- 展示ipa
每个framework
的包体积数据,可直接用浏览器打开。
提示:按照主程序和动态库进行粒度划分
framework_size.html
- 展示单个framework
所有的包体积数据,二级页面不要直接打开
。
提示:
XCode
生成Assets.car
时会将一些小图片拼接成一张PackedAssetImage
的大图片。
package_size.json
-ipa
包体积 JSON 数据
包体积待修复问题
app_issues.html
- 展示ipa
每个framework
的包体积待修复问题数量,可直接用浏览器打开。
提示:按照主程序和动态库进行粒度划分
framework_issues.html
- 展示单个framework
所有的待修复问题详细数据,二级页面不要单独打开
。
issues.json
-ipa
待修复包体积问题 JSON 数据
提示:
json
数据可用于搭建自己的数据平台,扩展更多的能力。例如查看不同APP版本以及支持多个APP版本对比等。
规则介绍
包体积
未使用的类
定义了类没有被使用到,包含ObjC
类和Swift
类。
扫描规则
-
没有查到到对应的
ObjC
类被引用 -
没有被当做父类使用
-
没有使用的字符串和类名一致
-
没有被当做属性类型使用
-
没有被创建或调用方法
-
没有实现
+load
方法
可选的修复方式
-
移除未使用的类
-
Swift
类如果只是用了static
方法考虑修改成Enum
类型 -
如果只是在类型转换时使用了也会检测出是未使用的类,例如
(ABCClass *)object;
。建议检查是否真的有没有到相关类后删除 -
对于
ObjC
,如果只是作为方法参数类型使用也会被检测出是未使用的类。建议删除相关方法即可。
提示:删除类相对是一种安全的行为,因为删除后如果有被使用到会产生编译时错误。虽然有做字符串调用的扫描过滤,不过还是建议检查是否可能被
Runtime
动态创建调用
未使用的ObjC协议
定义了ObjC
协议没有被类使用
扫描规则
- 对应的协议没有被类引用
可选的修复方式
- 移除未使用的协议
Bundle内多Scale图片
Bundle
内同一张图片包含多个Scale
会导致更大的包体积。
扫描规则
- 同一个
Bundle
内存在同名但是scale
不同的图片。例如a@2x.png
/a@3x.png
可选的修复方式
- 移除
Scale
更低的图片
大资源
文件大小超过一定大小的即为大资源,默认为20KB
。
扫描规则
- 某个文件超过设置的大资源限额
可选的修复方式
-
移除资源动态下发
-
使用更小的数据格式,例如使用更小的图片格式
重复的资源文件
存在多个同样的重复文件。
扫描规则
- 多个文件
MD5
一致即判定为重复文件。
可选的修复方式
- 移除多余的文件
未使用的类Property属性
ObjC
类中定义的属性没有被使用到。
扫描规则
-
对应的属性没有被调用 set/get 方法,同时也没有被
_
的方式使用 -
不是来自实现协议的属性
-
不是来自
Category
的属性 -
不存在字符串使用和属性名一致
可选的修复方式
-
移除对应的属性
-
如果是接口协议的属性,需要添加类实现此接口
注意事项
- 可能存在部分动态使用的场景,需要进行一定的检查。例如一些继承
NSObject
的数据模型类,可能存在属性没有被直接使用到,但是可能会被传唤成JSON
作为参数的情况。例如后台下发的数据模型
未使用的ImageSet/DataSet
包含的Imageset
/DataSet
并没有被使用到。
扫描规则
- 未检测到和
Imageset
同样名字的字符串使用
可选的修复方式
- 移除ImageSet/DataSet
注意事项
-
某些
Swift
代码中使用的字符串不能被发现所以会被当做未使用。 -
使用字符串拼接的名字作为imageset的名字。
-
被合成到
PackedAssetImage
里的Imageset
不能被扫描出来
未使用的ObjC方法
定义的ObjC
Category 方法并未被使用到。
扫描规则
-
不存在和此方法一样的方法名使用
-
不存在使用的
字符串
和方法名一致 -
不是来自父类或
Category
的方法 -
不是来自实现接口的方法
-
不是属性 set/get 方法
可选的修复方式
- 移除对应方法
未使用的分类方法
定义的ObjC
Category 方法并未被使用到。
扫描规则
-
不存在和此方法一样的方法名使用
-
不存在和方法名一致的
字符串
使用 -
不是来自父类或
Category
的方法 -
不是来自实现接口的方法
可选的修复方式
-
移除未使用的方法
-
如果是接口协议的方法,需要添加类实现此接口
未使用的资源文件
包含的文件资源并没有被使用到。这里的资源不包含Imageset
/DataSet
。
扫描规则
- 未检测到和文件名同样名字的字符串使用
可选的修复方式
- 移除资源
注意事项
-
某些
Swift
代码中使用的字符串不能被发现所以会被当做未使用 -
使用字符串拼接的名字作为资源的名字
安全
动态反射调用ObjC类
存在类名和字符串一致,可能使用NSClassFromString()
方法动态调用类。当字符串
或类名变更时无法利用编译时检查发现问题,可能会导致功能异常。
扫描规则
- 存在使用的
字符串
和NSObject子类
类名相同
可选的修复方式
-
使用
NSStringFromClass()
获取类名字符串 -
使用
Framework
外部的类应该使用方法封装,除了少部分功能不应该使用反射去调用类
提示:包含继承
NSObject
的 swift 类。
ObjC属性内存申明错误
一些特殊的NSObject
类型的属性内存类型申明错误,可能会导致功能异常或触发Crash
。
扫描规则
-
NSArray
/NSSet
/NSDictionary
类型的属性使用strong
申明 -
NSMutableArray
/NSMutableSet
/NSMutableDictionary
类型的属性使用copy
申明
可选的修复方式
- 修改
strong
/copy
申明
冲突的分类方法
ObjC
同一个类的多个Category
分类中存在多个相同的方法,由于运行时最终会加载方法可能是不确定的,可能会导致功能异常等未知的行为。
扫描规则
NSObject类
的多个Category
分类中存在多个相同的方法
修复方式
- 移除多余的分类方法
重复的分类方法
ObjC
原始类和类的Category
分类中有相同的方法,分类中的方法会覆盖原始类的方法,可能会导致功能异常等未知的行为。
扫描规则
NSObject
原始类和类的Category
分类中有相同的方法
修复方式
- 移除重复的分类方法
未实现的ObjC协议方法
类实现了某个ObjC
协议,但是没有实现协议的非可选
方法。可能会导致功能异常或触发Crash
。
扫描规则
类
和分类
未实现NSObject
协议的非可选
方法
可选的修复方式
-
对应的类实现缺失的
非可选
协议方法 -
将对应的协议方法标识为
optional
可选方法
重复的ObjC类
多个动态库
和静态库
之间存在同样的类
。不会导致编译失败,但是运行时只会使用其中一个类,可能会导致功能异常或触发Crash
。同时会增加包体积
。
扫描规则
- 多个
动态库
和静态库
之间存在同样的NSObject类
符号
可能的修复方式
- 移除重复的类
性能
使用动态库
使用动态库会增加启动
耗时。
扫描规则
Macho
为动态库
可选的修复方式
-
使用
静态库
-
使用
Mergeable Library
实现+load
方法的类
APP启动
后会执行所有+load
方法,减少+load
方法可以降低启动耗时。
扫描规则
- 实现
+load
方法的NSObject
类
可选的修复方式
-
移除
+load
方法 -
使用
+initialize
替代
自定义配置
重要配置
systemFrameworkPaths
可以基于自身项目进行系统库目录的配置,解析工程时也会对系统库进行解析。配置系统库目录对于未使用方法的查找可以提供更多的信息避免误报。但是配置更多会导致执行的更慢,建议至少配置Foundation
/UIKit
。
unusedObjCProperty-enable
unusedObjCProperty
规则默认不开启。
- 开启未使用属性检查以后,会扫描
macho
的__TEXT
段,会增加分析的耗时。
unusedClass-swiftEnable
unusedClass-swiftEnable
默认不开启。
-
开启
Swift
类检查以后,会扫描macho
的__TEXT
段,会增加分析的耗时。 -
未使用
Swift
类的项目建议不要开启,如果考虑执行性能的话Swift
使用相对比较多的再开启。
提示:扫描
macho
的__TEXT
段需要使用XCode
Run编译出的包,不能直接使用用于上架APP Store
构建出的包。主要是Debug
会包含更多的信息用于扫描。
配置属性
/Users/Test/APPAnalyzeCommand -ipa /Users/Desktop/ipas/APPMobile/APPMobile.app -config /Users/Desktop/ipas/config.json --output /Users/Desktop/ipas/APPMobile
可基于自身项目需要,添加下列规则可配置参数。在使用APPAnalyzeCommand
指令时添加--config
配置文件地址。
{"systemFrameworkPaths": ["/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/UIKitCore.framework/UIKitCore", "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation","/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Foundation.framework/Foundation"], // 配置系统库。会极大增加未使用方法的误报"rules": {"dynamicCallObjCClass": { // 动态调`ObjC类"enable": false, // 是否启用"excludeClasslist": [ // 过滤类名"NSObject","param"]},"incorrectObjCPropertyDefine": { // 错误的 ObjC 属性定义"enable": false // 是否启动},"largeResource": { // 大资源"maxSize": 20480 // 配置大资源判定大小。默认 20480Byte=20KB},"unusedObjCProperty": { // 未使用的 ObjC 属性"enable": false, // 是否启用。默认不开启"excludeTypes": ["NSString", "NSArray", "NSDictionary", "NSNumber", "NSMutableArray", "NSMutableDictionary", "NSSet"] // 过滤掉部分类型的属性},"unusedClass": { // 未使用的类"swiftEnable": false, // 是否支持 Swift 类。默认不支持"excludeSuperClasslist": ["JDProtocolHandler", "JDProtocolScheme"],// 如果类继承了某些类就过滤"excludeProtocols": ["RCTBridgeModule"], // 如果类实现了某些协议就过滤"excludeClassRegex": ["^jd.*Module$", "^PodsDummy_", "^pg.*Module$", "^SF.*Module$"] // 过滤掉名字符合正则表达式的类},"unusedObjCMethod": { // 未使用的 ObjC 方法"excludeInstanceMethods": [""], // 过滤掉某些名字的对象方法"excludeClassMethods": [""], // 过滤掉某些名字的类方法"excludeInstanceMethodRegex": ["^jumpHandle_"], // 过滤掉名字符合正则表达式的对象方法"excludeClassMethodRegex": ["^routerHandle_"], // 过滤掉名字符合正则表达式的类方法"excludeProtocols": ["RCTBridgeModule"] // 如果类集成了某些协议就不再检查,例如 RN 方法},"loadObjCClass": { // 调用 ObjC + load 方法"excludeSuperClasslist": ["ProtocolHandler"], // 如果类继承了某些类就过滤"excludeProtocols": ["RCTBridgeModule"] // 如果类实现了某些协议就过滤,例如 RN 方法},"unusedImageset": { // 未使用 imageset"excludeNameRegex": [""] // 过滤掉名字符合正则表达式的imageset},"unusedResource": { // 未使用资源"excludeNameRegex": [""] // 过滤掉名字符合正则表达式的资源}}
}
组件化工程扫描
可以基于APPAnalyzeCore.framework
定制实现自己的组件化工程扫描,或者添加基于自身组件化工程的检查规则。详情可以看Demo
。
基于组件化扫描方式有以下优势:
-
细化数据粒度
- 可以细化每个模块的包体积和包体积问题,更容易进行包体积优化。 -
更多的检查
- 例如检查不同组件同一个Bundle
包含同名的文件,不同组件包含同一个category
方法的的实现。 -
检查结果更准确
- 例如ObjC
未使用方法的检查,只要存在一个和方法名同样的调用就表示方法有被使用到。但是整个ipa
中可能存在很多一样的方法名但是只有一个方法有真正被调用到,如果细分到组件的粒度就可以发现更多问题。
提示:只有APP主工程无代码,全部通过子组件以
framework
的形式导入二进制库的方式的工程才适合这种模式。
其他
扫描质量如何
这套工具我们团队内部开发加逐步完善有一年的时间了。基于此工具修改了几十个组件的包体积问题,同时不断的修复误报问题。目前现有提供的这些规则检查误报率是很低的,只有极少数几个规则可能存在误报的可能性,总体扫描质量还是很高的。
和社区开源的工具有什么差异
我们在早期调研了社区的几个同类型的开源工具,主要存在以下几个问题:
-
扩展性不够
- 无法支持项目更好的扩展定制能力,例如添加扫描规则、支持不同类型扫描方式、生成更多的报告类型。 -
功能不全
- 只提供部分能力,例如只提供未使用资源
或者未使用类
。 -
无法生成包体积数据
- 无法生成包体积完整的数据。 -
检查质量不高
- 扫描发现的错误数据多,或者有一些问题不能被发现。
开源计划
后续一定会开源。主要是希望调整一些内部结构再开源,开源后就不方便调整。顺便修复一些常见的问题。
开源带来的好处
开源带来的好处是,部分工程可以基于自身的业务需要,扩展定制自己的扫描工具。同时也可以将一些更好的想法实现添加进来。
-
扩展解析方式
- 目前只支持ipa
模式扫描,很快会开放支持project
组件化工程的扫描方式。基于组件化工程
的扫描可以更加准确,但是不同的公司组件化工程
的构建方式可能是不一样的,有需要可以在上层定制自身组件化工程
的扫描解析。 -
扩展扫描规则
- 虽然现在已经添加了比较多的通用性的规则,同时提供了一定的灵活性配置能力。但是不同的项目可能需要定制一些其他的规则,这些规则没办法通过在现有规则上添加配置能力实现。 -
扩展数据生成
- 默认包里只包含两种数据生成,包体积
数据还有包体积待修复问题
数据。可以扩展更多的数据生成格式,例如我们自身的项目就有添加基于组件的依赖树格式。
后续规划
组件化工程支持
添加更多用于组件化工程的扫描
对于 Swift 更好的支持
对于Swift
语言只要开启XCode
编译优化以后就能在生成产物的时候支持无用代码的移除,包括未使用类型
和未使用方法
的自动移除,但是依然有部分场景不会进行优化。所以这一块也是后续完善的重点:
-
未使用属性
- 编译器不会对于未使用属性
进行移除,包括class
和struct
的属性。 -
未使用方法
- 对于class
的方法,编译器并不会进行移除,即使没有申明[@objc](https://my.oschina.net/TnhqVdFXL8vnu)
进行消息派发。
相关链接
- Github地址
作者:京东零售 何骁
来源:京东云开发者社区 转载请注明来源
相关文章:

iOS APP包分析工具 | 京东云技术团队
介绍 分享一款用于分析iOSipa包的脚本工具,使用此工具可以自动扫描发现可修复的包体积问题,同时可以生成包体积数据用于查看。这块工具我们团队内部已经使用很长一段时间,希望可以帮助到更多的开发同学更加效率的优化包体积问题。 工具下载…...

在 VSCode 中使用 GDB 进行 C/C++ 程序调试(图文版)
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...
任意文件读取漏洞理解
任意文件读取漏洞理解 1. 漏洞描述: 任意文件读取漏洞是指攻击者可以利用漏洞读取系统上的任意文件,包括敏感信息的配置文件、用户数据甚至系统文件,从而获取未经授权的访问权限。 2. 漏洞原理: 这种漏洞通常是由程序处理用户输入…...
linux 安装yum
问题1:File "/usr/libexec/urlgrabber-ext-down", line 28 except OSError, e: ^ 问题2:yum File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ^ vim /usr/…...
数学启发式
学习资料: 优化求解器 | Gurobi 数学启发式算法:参数类型与案例实现 数学启发式算法 | 可行性泵 (Feasibility Pump)算法精讲:一份让您满意的【理论介绍编程实现数值实验】学习笔记(PythonGurobi实现) 大佬到底是大佬!这些资料太…...
Win10/Win11 使用Wsl的Ubuntu 子系统搭建CGO环境,相当于Ubuntu下开发。GO环境CGO搭建,支持交叉编译
背景: 之前是使用Mac 开发,最近切换到win11下面。发现使用cgo编译有问题。 下面记载了我的使用方法。 环境: win11(win10理论一样) win11 安装了wsl2的环境,并且安装了ubuntu系统。 在win11 上面安装了g…...

CSS新特性(2-2)
CSS新特性(2-2) 前言box相关box-shadow background背景rgba颜色与透明度transform:rotate(Xdeg) 2D旋转transform:tranlate 平移 前言 本文继续讲解CSS3其他的新特性,想看之前新特性点击这里,那么好本文正式开始。 box相关 box…...

为什么,word文件在只读模式下,仍然能编辑?
Word文档设置了只读模式,是可以编辑的,但是当我们进行保存的时候就会发现,word提示需要重命名并选择新路径才能够保存。 这种操作,即使可以编辑文字,但是原文件是不会受到影响的,编辑之后的word文件会保存到…...
29 - 装饰器模式:如何优化电商系统中复杂的商品价格策略?
开始今天的学习之前,我想先请你思考一个问题。假设现在有这样一个需求,让你设计一个装修功能,用户可以动态选择不同的装修功能来装饰自己的房子。例如,水电装修、天花板以及粉刷墙等属于基本功能,而设计窗帘装饰窗户、…...

逆矩阵相关性质与例题
1.方阵的行列式:就是将方阵中的每一个元素转换至行列式中。 1.性质一:转置方阵的行列式等于转置前的行列式。(对标性质:行列式与它的转置行列式相等) 2.性质二:|ka||a|*k的n次方,n为方阵阶数。 …...
Ruoyi项目传List到后台并使用Excel模板下载数据的方法以及遇到的各种前后端数据交互问题
import { download } from @/utils/requestconst app = createApp(App)// 全局方法挂载 app.config.globalProperties.download = download 首先因为ruoyi-ui中的main.js有配置如上全局注册: 因此只需要在vue中定义一个方法直接使用this.download调用下载即可: (download的3…...

区块链技术将如何影响未来的数字营销?
你是否听腻了区块链和数字营销等流行语,却不明白它们对未来意味着什么?那么,准备好系好安全带吧,因为区块链技术将彻底改变我们对数字营销的看法。从建立消费者信任到提高透明度和效率,其可能性是无限的。 让我们来探…...
小程序wx:if和hidden的区别?
wx:if:wx:if 是一个完整的条件渲染指令,当它的表达式为真时,才会渲染该指令所在的元素。如果表达式的值为假,则不会渲染该元素。这意味着在表达式为假时,该元素及其子元素都不会被渲染,就像它们从未存在过一…...
分布式幂等
分布式幂等 在分布式系统、网络通信和数据库操作中,幂等性是一个非常重要的概念,特别是在面对可能发生网络故障、消息重复、或者系统崩溃等情况时。 举个简单的例子,考虑一个银行转账的操作。如果转账操作是幂等的,那么无论你执…...

大数据 DataX-Web 详细安装教程
目录 一、DataX-Web 介绍 1.1 DataX-Web 是什么 1.2 DataX-Web 架构 二、DataX-Web 安装部署 2.1 环境要求 2.2 安装 2.3 部署 2.4 数据库初始化 2.5 配置 2.6 启动服务 2.6.1 一键启动所有服务 2.6.2 一键取消所有服务 2.7 查看服务(注意!…...
CSS3媒体查询实现不同宽度的下不同内容的展示
文章目录 前言CSS3 多媒体查询实例520 到 699px 宽度 - 添加邮箱图标700 到 1000px - 添加文本前缀信息大于 1001px 宽度 - 添加邮件地址大于 1151px 宽度 - 添加图标代码后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:CSS ὃ…...

使用 STM32 读取和解析 NTC 热敏电阻的数值
本文介绍了如何利用 STM32 微控制器读取和解析 NTC(Negative Temperature Coefficient)热敏电阻的数值。首先,我们将简要介绍 NTC 热敏电阻的原理和特性。接下来,我们将详细讨论如何设计电路连接和采用合适的 STM32 外设进行数值读…...

C#,数值计算——有理函数插值和外推(Rational_interp)的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 有理函数插值和外推 /// Rational Function Interpolation and Extrapolation /// Given a value x, and using pointers to data xx and yy, this routine returns …...

力扣283:移动零(JAVA)
题目描述: 意思是将所有0移到最后的同时其余非0元素位置仍然不变 如 1 2 0 5 2 0 经过移动零后变为 1 2 5 2 0 0 思路:使用双指针的思路来写 fast:从左往右遍历数组 slow:非零元素最后的一个位置 将数组分为3个区间 [0,slow]为处理好的非0数据,slow永远指向最后一个非0数据 [s…...
【statsmodels】快速实现回归预测
python 做线性回归分析有好几种方式,常要的是 scipy 包,statsmodels 包,以及 sklearn包。 但是个人比较喜欢使用statsmodel进行线性回归,一是其可以更好的呈现回归效果,二是其能够自动跳过缺失值。 sklearn则不能方便…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

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…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...