屏幕适配
你想了解 Android 开发中屏幕尺寸与分辨率的兼容性问题,核心是要解决不同设备(手机、平板、折叠屏等)上 UI 适配、布局错乱、元素变形的问题。下面从核心概念、适配原则、具体方案三个维度整理。
注:分辨率与屏幕大小没有关系,屏幕大小是物理外观,而分辨率则是显示能力。
一、先理清核心概念(避免适配误区)
Android屏幕适配出现的原因
碎片化严重!Android系统的开放性,任何用户、开发者、OEM厂商、运营商都可以对Android进行定制,修改成他们想要的样子。
而随着支持Android系统的设备(手机、平板、电视、手表)的增多,设备碎片化、品牌碎片化、系统碎片化、传感器碎片化和屏幕碎片化的程度也在不断地加深。而我们今天要探讨的,则是对我们开发影响比较大的——屏幕的碎片化。
很多开发者混淆 “尺寸” 和 “分辨率”,先明确关键定义:
| 概念 | 定义 | 适配核心意义 |
|---|---|---|
| 物理尺寸 | 屏幕对角线长度(如 6.1 英寸、10.9 英寸平板) | 决定 “大屏 / 小屏” 的布局逻辑(如平板分栏) |
| 分辨率 | 屏幕像素总数(如 1080×2400、2560×1440) | 仅代表像素多少,不能直接用于适配 |
| DPI(像素密度) | 每英寸像素数(ldpi/mdpi/ hdpi/xhdpi/ xxhdpi/xxxhdpi) | 决定图片 / 尺寸的缩放比例 |
| dp/dip | 设备独立像素(1dp = 1px @160dpi) | 适配的核心单位(替代 px) |
| sp | 缩放独立像素(用于文字) | 跟随系统字体大小,比 dp 更适配文字 |
| 屏幕比例 | 宽高比(如 18:9、20:9、4:3) | 避免黑边、元素被截断 |
关键误区:直接用 px 写布局、仅按分辨率适配 → 必现适配问题!
重要概念
什么是屏幕尺寸、屏幕分辨率、屏幕像素密度? 什么是dp、dip、dpi、sp、px?他们之间的关系是什么? 什么是mdpi、hdpi、xdpi、xxdpi?如何计算和区分?
屏幕尺寸
屏幕尺寸指屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米
比如常见的屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等
屏幕分辨率 Resolution
屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1个像素点。一般以纵向像素x横向像素,如1960*1080。
需要注意的是:尽管分辨率通常用宽x高表示,但分辨率并不意味着具体的屏幕长宽比。在Andorid系统中,应用程序不直接使用分辨率。
屏幕像素密度 Density
屏幕像素密度是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写。屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。
根据像素分辨率,在屏幕指定物理宽高范围内能显示的像素数量。
在同样的宽高区域,低密度的显示屏能显示的像素较少,而高密度的显示屏则能显示更多的像素。
屏幕密度非常重要,因为其它条件不变的情况下,一共宽高固定的UI组件(比如一个按钮)在在低密度的显示屏上显得很大, 而在高密度显示屏上看起来就很小。
屏幕长宽比 Aspect ratio
长宽比是屏幕的物理宽度与物理高度的比例关系。应用程序可以通过使用限定的资源来为指定的长宽比提供屏幕布局资源。
dp、dip、dpi、sp、px
px
像素,是屏幕上显示数据的最基本的点。我们应该是比较熟悉的,前面的分辨率就是用的像素为单位,大多数情况下,比如UI设计、Android原生API都会以px作为统一的计量单位,像是获取屏幕宽高等。
dip/dp
是一个意思,都是Device Independent Pixels / Density-independent pixel ? 的缩写,即设备独立像素,上面我们说过,dpi是屏幕像素密度,假如一英寸里面有160个像素,这个屏幕的像素密度就是160dpi,那么在这种情况下,dp和px如何换算呢?在Android中,规定以160dpi为基准,1dip=1px,如果密度是320dpi,则1dip=2px,以此类推。
假如同样都是画一条320px的线,在480x800分辨率手机上显示为2/3屏幕宽度,在320x480的手机上则占满了全屏,如果使用dp为单位,在这两种分辨率下,160dp都显示为屏幕一半的长度。这也是为什么在Android开发中,写布局的时候要尽量使用dp而不是px的原因。
sp
Sp即scale-independent pixels,与dp类似,但是可以根据文字大小首选项进行放缩,是设置字体大小的御用单位。
PPI(Pixels Per Inch)
屏幕 “每英寸像素数”,和 DPI 在屏幕场景下几乎等价(日常说的 “屏幕 DPI” 实际是 PPI),Android 系统中统一按 DPI 标准换算 dp。
DPI
dpi(Dots Per Inch):每英寸点数,也可称为像素密度,即屏幕对角线像素值÷英寸值

比如480x800分辨率4.0英寸的手机计算的 DPI =
DPI 是屏幕的物理属性(碎片化的体现),DIP/dp 是 Android 为了抵消 DPI 碎片化设计的逻辑单位;开发者只需用 dp 设计 UI,系统会自动根据设备实际 DPI 换算成物理像素,保证跨设备显示一致性。
dp(与dip相同):在每英寸160点的显示器上,1dp = 1px,即px = dp(dpi/160)
mdpi、hdpi、xdpi、xxdpi、xxxdpi,用来修饰Android中的drawable文件夹及values文件夹,用来区分不同像素密度下的图片和dimen值。
其实之前还有个ldpi,但是随着移动设备配置的不断升级,这个像素密度的设备已经很罕见了,所在现在适配时不需考虑。
res/
├── drawable-ldpi/ (120dpi,低端机)
├── drawable-mdpi/ (160dpi,1x,基准)
├── drawable-hdpi/ (240dpi, 1.5x)
├── drawable-xhdpi/ (320dpi,2x, 主流手机)
├── drawable-xxhdpi/ (480dpi,3x, 高清屏)
└── drawable-xxxhdpi/ (640dpi,4x, 旗舰机)
二、核心适配原则(所有方案的基础)
- 拒绝固定尺寸:布局 / 控件尺寸一律用
dp,文字用sp,绝对不用px; - 适配优先级:先保证 “可用”(元素不截断、不重叠),再追求 “美观”(视觉比例一致);
- 动态适配:利用布局权重、约束布局、百分比布局,让元素 “自适应” 屏幕空间;
- 资源分级:按 DPI / 屏幕尺寸 / 语言等维度,提供分级资源(如不同分辨率的图片)。
三、具体适配方案(从易到难,覆盖 99% 场景)
方案 1:基础适配(必做,低成本高收益)
1. 布局单位规范
- 控件宽高、间距用
dp:如android:layout_width="100dp",而非100px; - 文字大小用
sp:如android:textSize="16sp",支持系统字体缩放; - 禁止用
match_parent/fill_parent后再固定边距(易导致小屏截断),优先用wrap_content+ 权重。
2. 图片资源分级(解决图片模糊 / 拉伸)
按 DPI 分类存放图片,系统自动匹配最优版本:
res/
├── drawable-ldpi/ (120dpi,低端机)
├── drawable-mdpi/ (160dpi,基准)
├── drawable-hdpi/ (240dpi)
├── drawable-xhdpi/ (320dpi,主流手机)
├── drawable-xxhdpi/ (480dpi,高清屏)
└── drawable-xxxhdpi/ (640dpi,旗舰机)
- 工具:用 Android Studio 的
Vector Asset Studio生成 SVG 矢量图(推荐),一套图适配所有分辨率,无需多版本; - 注意:大图片(如启动页)仍需分级,避免矢量图渲染性能问题。
3. 布局适配(避免固定宽高导致的错乱)
LinearLayout:用
layout_weight分配剩余空间(如 2:1 分栏):<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2"/> <!-- 占 2/3 宽度 --> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"/> <!-- 占 1/3 宽度 --> </LinearLayout>ConstraintLayout(约束布局,推荐):通过约束关系(如
layout_constraintLeft_toLeftOf、layout_constraintWidth_percent)实现自适应,替代嵌套的 LinearLayout/RelativeLayout,同时支持百分比布局:<androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintWidth_percent="0.8" <!-- 宽度占屏幕 80% --> app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout>
方案 2:进阶适配(解决大屏 / 异形屏 / 折叠屏)
1. 屏幕尺寸分级适配(平板 / 手机区分布局)
按屏幕尺寸(最小宽度 sw,单位 dp)创建布局文件夹,系统自动匹配:
res/
├── layout/ (默认布局,手机)
├── layout-sw600dp/ (平板,最小宽度 ≥600dp)
├── layout-sw720dp/ (大屏平板,最小宽度 ≥720dp)
└── layout-land/ (横屏布局)
- 示例:手机用单列布局,平板用双列布局,无需改代码,系统自动加载对应布局;
- 关键:
sw(Smallest Width)是屏幕宽高中较小的值,如 6.1 英寸手机 sw≈360dp,10.9 英寸平板 sw≈600dp。
2. 异形屏适配(刘海屏 / 挖孔屏)
适配状态栏 / 导航栏:避免内容被刘海、状态栏遮挡:
<!-- 在 Activity 布局根节点添加 --> android:fitsSystemWindows="true"代码适配:获取状态栏高度,动态调整控件边距:
// 获取状态栏高度 fun getStatusBarHeight(context: Context): Int { val resourceId = context.resources.getIdentifier("status_bar_height", "dimen", "android") return if (resourceId > 0) context.resources.getDimensionPixelSize(resourceId) else 0 } // 动态设置控件 marginTop 为状态栏高度 tvTitle.setPadding(0, getStatusBarHeight(this), 0, 0)
3. 折叠屏适配(Android 12+)
监听屏幕折叠状态:通过
WindowManager监听屏幕宽高 / 折叠状态变化:val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager windowManager.registerLayoutChangeCallback { // 屏幕尺寸/折叠状态变化时回调,重新布局 adjustLayoutForFoldable() }声明折叠屏支持:在
AndroidManifest.xml中添加:<activity android:name=".MainActivity" android:resizeableActivity="true"> <!-- 支持分屏/折叠 --> <layout android:defaultHeight="600dp" android:defaultWidth="800dp" android:gravity="center" android:minHeight="400dp" android:minWidth="600dp"/> </activity>
方案 3:高级适配(解决极端场景)
1. 百分比布局(替代固定 dp)
使用 PercentFrameLayout/PercentRelativeLayout(或 ConstraintLayout 的百分比属性),按屏幕百分比设置尺寸:
<androidx.percentlayout.widget.PercentFrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_widthPercent="50%"
app:layout_heightPercent="20%"/>
</androidx.percentlayout.widget.PercentFrameLayout>
2. 动态适配(代码级调整)
针对特殊设备,代码中动态调整布局参数:
// 获取屏幕宽高(dp 单位)
val displayMetrics = resources.displayMetrics
val screenWidthDp = displayMetrics.widthPixels / displayMetrics.density
val screenHeightDp = displayMetrics.heightPixels / displayMetrics.density
// 小屏(sw < 360dp)隐藏次要元素
if (screenWidthDp < 360) {
tvSubtitle.visibility = View.GONE
} else {
tvSubtitle.visibility = View.VISIBLE
}
3. 第三方适配库(降低开发成本)
- AndroidAutoSize:今日头条开源的适配库,一行代码适配所有屏幕,自动缩放 dp/sp;
- SDP/SSP:替代 dp/sp 的自适应单位库,自动适配不同屏幕尺寸。
四、适配测试(验证适配效果)
- Android Studio 模拟器:测试主流分辨率(360×640、1080×2400、2560×1440)、屏幕比例(18:9、20:9);
- 真机测试:至少覆盖小屏(<5 英寸)、主流屏(5.5-6.5 英寸)、平板(≥7 英寸);
- 工具辅助:用
Layout Inspector查看布局层级,定位适配问题;用Display Metrics查看设备 dp/px 转换关系。
五、总结
- 核心基础:布局用
dp/sp、图片分级 / 矢量图、ConstraintLayout 自适应,是适配的核心; - 分级适配:按屏幕最小宽度(sw)区分手机 / 平板布局,解决大屏适配;
- 特殊场景:异形屏用
fitsSystemWindows,折叠屏监听布局变化,极端场景用动态适配 / 第三方库。
遵循以上方案,可覆盖 99% 的 Android 屏幕尺寸 / 分辨率适配场景,避免 UI 错乱、元素截断、图片模糊等问题。
六、Android 多 DPI 图片资源制作规范
遵循该规范制作的图片资源,能在不同 DPI 的 Android 设备上自动适配,避免拉伸、模糊或尺寸异常,是解决屏幕碎片化的关键环节。
1. 核心原则
- 基准锚定:以 mdpi(160 DPI) 为基准分辨率制作原图,其他 DPI 资源按比例缩放。
- 等比缩放:缩放时保持宽高比一致,不做拉伸或变形处理。
- 格式优先:图标类用 VectorDrawable(SVG 矢量图),避免位图缩放失真;位图优先用 PNG(无损压缩),复杂图可用 WebP(更小体积)。
- 避免过度压缩:位图压缩率控制在 70%–90%,保证清晰度的同时减少 APK 体积。
2. DPI 文件夹分类与缩放比例
Android 工程res目录下,需创建对应 DPI 的 drawable 文件夹,缩放比例以 mdpi 为 1:1 基准。
| 文件夹名称 | 对应 DPI(基准 160) | 缩放比例(相对 mdpi) | 适用设备类型 |
|---|---|---|---|
| drawable-ldpi | 120 DPI | 0.75x | 早期低端机型(极少) |
| drawable-mdpi | 160 DPI | 1x(基准) | 入门级手机、部分平板 |
| drawable-hdpi | 240 DPI | 1.5x | 中端手机 |
| drawable-xhdpi | 320 DPI | 2x | 主流旗舰手机 |
| drawable-xxhdpi | 480 DPI | 3x | 高端旗舰手机 |
| drawable-xxxhdpi | 640 DPI | 4x | 超大屏旗舰、折叠屏 |
| drawable-nodpi | 无固定 DPI | 不缩放 | 矢量图、不需要适配的图片(如背景图) |
缩放示例
若 mdpi 基准图尺寸为 48×48 px,其他 DPI 对应尺寸:
- ldpi:48×0.75 = 36×36 px
- hdpi:48×1.5 = 72×72 px
- xhdpi:48×2 = 96×96 px
- xxhdpi:48×3 = 144×144 px
- xxxhdpi:48×4 = 192×192 px
3. 不同类型图片的制作要求
a. 图标类(Icon)
优先矢量图
:用 VectorDrawable 格式,一份文件适配所有 DPI,无需多份位图。
- 命名规范:
ic_功能_状态.svg(如ic_home_selected.svg)
- 命名规范:
若用位图:严格按缩放比例制作,边缘做抗锯齿处理,避免出现毛边。
避免大图标:单个图标建议不超过 256×256 px(xxxhdpi),减少内存占用。
b. 背景图(Background)
- 小背景图:按 DPI 缩放制作,建议用
9-Patch格式(.9.png),指定可拉伸区域和内容显示区域,避免拉伸失真。 - 大背景图:可只放
xxhdpi或xxxhdpi文件夹,系统自动向下缩放;或用nodpi文件夹,固定尺寸显示。 - 渐变背景:优先用 XML 代码实现,无需图片资源。
c. 启动图(Splash Screen)
- 按不同屏幕尺寸 + DPI 制作多套,或用
layer-listXML 组合矢量图 + 颜色,适配所有设备。 - 避免文字硬编码在图片中,文字用 XML 布局实现,支持多语言和字体缩放。
4. 工程目录规范
res/
├── drawable-ldpi/ # 120 DPI 图片
├── drawable-mdpi/ # 160 DPI 基准图片
├── drawable-hdpi/ # 240 DPI 图片
├── drawable-xhdpi/ # 320 DPI 图片
├── drawable-xxhdpi/ # 480 DPI 图片
├── drawable-xxxhdpi/ # 640 DPI 图片
├── drawable-nodpi/ # 不缩放的矢量图/特殊图片
└── mipmap-xxhdpi/ # App图标(优先放xxhdpi,系统自动适配)
注:App 图标建议放在
mipmap文件夹,而非drawable,系统会优先读取mipmap图标用于桌面和启动器。
5. 避坑注意事项
- 不要混用文件夹:同一张图片的不同 DPI 版本,必须放在对应文件夹,命名完全一致(如
ic_setting.png在所有 drawable-* 文件夹中名称相同)。 - 矢量图兼容低版本:VectorDrawable 在 Android 5.0(API 21)以上原生支持,低版本需引入
androidx.vectordrawable库。 - 避免过度冗余:若只适配主流机型(xhdpi/xxhdpi/xxxhdpi),可省略 ldpi/mdpi/hdpi 文件夹,系统会自动缩放高 DPI 图片(牺牲少量清晰度,减少 APK 体积)。
- 测试验证:用不同 DPI 的真机或模拟器测试,检查图片是否模糊、拉伸,或尺寸异常。
七、Android 图片资源命名规范模板
本规范适用于 Android 项目中 drawable/mipmap 目录下的所有图片资源(位图、矢量图、9-Patch 图),目的是统一命名规则、提升资源查找效率、避免命名冲突。
1. 核心命名原则
- 全小写字母:禁止使用大写字母,避免跨平台(如 Linux 系统)大小写敏感问题。
- 下划线分隔:单词之间用下划线
_连接,禁止使用空格、连字符-或特殊符号。 - 语义化清晰:从名称能直接判断资源用途、类型、状态,做到 “见名知意”。
- 前后缀有序:按
前缀_功能_属性_状态_后缀的顺序组合,结构统一。
2. 分类命名规范
a. 图标类资源(Icon)
适用场景:功能图标、导航栏图标、按钮图标、状态图标等。
命名格式:
ic_功能_属性_状态前缀:固定用
ic(icon 缩写)后缀:矢量图加
_vector,9-Patch 图加_9patch(可选)示例:
资源用途 正确命名 错误命名 首页选中图标 ic_home_selectedhome_icon_selected.png搜索按钮默认图标(矢量) ic_search_default_vectorsearch_vector.svg返回箭头禁用图标 ic_back_disabledback_gray
b. 背景类资源(Background)
适用场景:页面背景、按钮背景、卡片背景、分割线背景等。
命名格式:
bg_载体_属性_状态前缀:固定用
bg(background 缩写)示例:
资源用途 正确命名 错误命名 登录页面背景 bg_login_pagelogin_bg.png按钮按下状态背景(9-Patch) bg_btn_pressed_9patchbtn_click_bg.9.png卡片默认背景 bg_card_defaultcard_background
c. 启动图 / 闪屏图(Splash)
适用场景:App 启动页图片、广告闪屏图。
命名格式:
splash_版本_属性前缀:固定用
splash示例:
资源用途 正确命名 错误命名 默认启动图 splash_defaultstart_image.png节日版启动图(春节) splash_spring_festivalspring_splash.png
d. 装饰类资源(Decoration)
适用场景:装饰性图片、占位图、空页面插图等。
命名格式:
img_场景_属性前缀:固定用
img(image 缩写)示例:
资源用途 正确命名 错误命名 列表空数据占位图 img_list_emptyempty_view.png个人中心装饰插图 img_profile_decorationprofile_pic.png
e. App 图标(Launcher Icon)
适用场景:桌面图标、应用商店图标,存放于 mipmap 目录。
命名格式:
ic_launcher_类型前缀:固定用
ic_launcher示例:
资源用途 正确命名 错误命名 默认 App 图标 ic_launcherapp_icon.png圆形 App 图标(适配安卓 12+) ic_launcher_roundlauncher_round_icon
3. 特殊格式资源后缀规则
针对 9-Patch、矢量图等特殊格式,在命名末尾添加标识,便于区分:
| 资源格式 | 后缀标识 | 示例命名 |
|---|---|---|
| 9-Patch 图 | _9patch | bg_btn_normal_9patch |
| 矢量图(SVG) | _vector | ic_setting_about_vector |
| WebP 格式图 | 无需后缀(按用途命名) | img_banner_promo |
4. 多语言 / 多主题资源命名
- 多语言资源:不修改图片名称,通过
drawable-语言代码目录区分,例如:- 中文:
drawable-zh-rCN/ic_share - 英文:
drawable-en-rUS/ic_share
- 中文:
- 多主题资源:通过
drawable-主题目录区分,名称保持一致,例如:- 浅色主题:
drawable-light/bg_card - 深色主题:
drawable-dark/bg_card
- 浅色主题:
5. 工程实践避坑
- 禁止重复命名:同一功能的不同状态,必须通过后缀区分(如
ic_msg_normal/ic_msg_unread)。 - 避免冗余词汇:禁止出现
icon/image等与前缀重复的单词(错误示例:ic_icon_home)。 - 统一缩写规则:常用缩写固定(
btn=button、msg=message、sel=selected),避免同一单词多种缩写。
Android 资源命名自查清单
本清单用于快速校验 Android 图片 / 布局 / 字符串等资源命名是否符合规范,可直接用于项目提测、代码评审环节,覆盖核心检查点:
| 检查维度 | 检查项 | 合规标准 | 检查结果(√/×) | 整改建议 |
|---|---|---|---|---|
| 基础格式 | 大小写 | 所有资源名称全小写,无大写字母 | 如 Ic_Home → ic_home | |
| 基础格式 | 分隔符 | 单词间仅用下划线 _ 连接,无空格 / 连字符 -/ 特殊符号 | 如 bg-btn-click → bg_btn_click | |
| 基础格式 | 长度 | 名称长度≤30 个字符,避免过度冗余 | 如 bg_login_page_blue_gradient_default → bg_login_page_blue_grad | |
| 图标类(ic_*) | 前缀 | 功能图标必须以 ic_ 开头 | 如 home_selected → ic_home_selected | |
| 图标类(ic_*) | 语义 | 包含 “功能 + 状态”,见名知意 | 如 ic_gray → ic_message_unread | |
| 图标类(ic_*) | 特殊格式 | 矢量图加 _vector,9-Patch 图加 _9patch | 如 ic_search.9.png → ic_search_9patch.9.png | |
| 背景类(bg_*) | 前缀 | 背景资源必须以 bg_ 开头 | 如 login_bg → bg_login_page | |
| 背景类(bg_*) | 载体明确 | 标注背景所属载体(页面 / 按钮 / 卡片) | 如 bg_blue → bg_btn_blue_normal | |
| 启动图(splash_*) | 前缀 | 启动图必须以 splash_ 开头 | 如 start_page → splash_default | |
| 装饰类(img_*) | 前缀 | 装饰 / 占位图必须以 img_ 开头 | 如 empty_list → img_list_empty | |
| App 图标(mipmap) | 命名 | 桌面图标命名为 ic_launcher/ic_launcher_round | 如 app_icon → ic_launcher | |
| 多版本资源 | 命名一致性 | 同一资源的不同 DPI 版本名称完全一致 | 如 ic_home.png(xhdpi)/ic_home_selected.png(xxhdpi)→ 统一为 ic_home.png | |
| 冗余校验 | 无重复资源 | 无功能相同但命名不同的重复资源 | 如同时存在 ic_back/ic_return → 统一为 ic_back | |
| 缩写规范 | 统一缩写 | 常用缩写固定(btn=button、msg=message、sel=selected) | 如 ic_message_selected → 可简化为 ic_msg_sel(保持团队统一) |
6. 快速自查步骤
- 批量导出项目
res/drawable/res/mipmap目录下的资源名称; - 按清单逐行核对 “检查项”,标记不合规项;
- 按 “整改建议” 统一重命名,并重检;
- 将合规命名规则写入项目
README.md,同步给所有开发 / 设计人员。
7. 工具辅助
- 用 Android Studio 插件「Resource Namer」自动检测命名不规范的资源;
- 编写 Python/Shell 脚本,批量校验资源名称格式(如检测大写字母、非法分隔符)。