前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >vmbackup和vmrestore是何方神圣?

vmbackup和vmrestore是何方神圣?

作者头像
没有故事的陈师傅
发布于 2022-02-09 00:43:31
发布于 2022-02-09 00:43:31
1.1K00
代码可运行
举报
文章被收录于专栏:运维开发故事运维开发故事
运行总次数:0
代码可运行

背景

在之前的文章中,给大家介绍了vmstorage、vminsert、vmselect、vmui、vmagent,分别代表了数据的存储、添加、查询、可视化以及数据的采集。想想是不是还差点什么?没错!还缺少数据的备份和还原。那么今天,它们来了!接下来,请让我为大家一一介绍。

vmbackup

vmbackup是一个数据备份的工具,可以从vmstorage即时的快照中去备份vm数据,同时支持将备份数据存储到存储系统,如:

  • GCS. Example: gs:///<path/to/backup>
  • S3. Example: s3:///<path/to/backup>
  • Any S3-compatible storage such as MinIO, Ceph or Swift. See these docs for details
  • Local filesystem. Example: fs://</absolute/path/to/backup>

vmbackup支持增量备份和全备。当备份数据存储路径已经有了之前的备份数据,增量备份将自动进行;而全备则可以通过-origin指定相同的远端存储去加速备份。因为在这种情况下,可以在远端存储进行新备份与已经存在的备份之间进行共有数据的复制,从而节省了时间和其他花销。备份进程可以在任何时间被打断,但当你使用vmbackup使用同样的参数进行再次备份时,备份将从打断处自动恢复。同时,通过vmbackup备份的数据能够被vmrestore用来恢复数据。

vmrestore

vmrestore被用于从通过vmbackup备份的数据中进行恢复数据,跟vmbackup备份进程一样,恢复数据进程也可以在任何时候被打断;当再次使用相同的命令和参数去恢复数据时,将从断点处自动恢复。原vmstorage数据存储的的数据将被恢复的数据所替换。

实操

数据备份

1、创建快照

上面提到过,vmbackup需要从即时的快照去备份数据,因此想要备份,我们需要先创建快照。vmstorage给我们提供了API去创建快照。使用以下的方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# request
curl http://<victoriametrics-addr>:8428/snapshot/create # 需要根据实际部署修改地址和端口

# response
{"status":"ok","snapshot":"<snapshot-name>"}

下面来实操一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@test ~]# curl http://172.16.47.122:8482/snapshot/create
{"status":"ok","snapshot":"20220119051931-16CA0D126A870F8B"}

我们再看看vmstorage的日志:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2022-01-19T05:19:31.767Z info VictoriaMetrics/lib/storage/storage.go:304 creating Storage snapshot for "/vm-data"...
2022-01-19T05:19:31.771Z info VictoriaMetrics/lib/storage/table.go:143 creating table snapshot of "/vm-data/data"...
2022-01-19T05:19:31.773Z info VictoriaMetrics/lib/storage/partition.go:1549 creating partition snapshot of "/vm-data/data/small/2022_01" and "/vm-data/data/big/2022_01"...
2022-01-19T05:19:31.920Z info VictoriaMetrics/lib/storage/partition.go:1570 created partition snapshot of "/vm-data/data/small/2022_01" and "/vm-data/data/big/2022_01" at "/vm-data/data/small/snapshots/20220119051931-16CA0D126A870F8B/2022_01" and "/vm-data/data/big/snapshots/20220119051931-16CA0D126A870F8B/2022_01" in 0.146 seconds
2022-01-19T05:19:31.920Z info VictoriaMetrics/lib/storage/table.go:171 created table snapshot for "/vm-data/data" at ("/vm-data/data/small/snapshots/20220119051931-16CA0D126A870F8B", "/vm-data/data/big/snapshots/20220119051931-16CA0D126A870F8B") in 0.149 seconds
2022-01-19T05:19:31.921Z info VictoriaMetrics/lib/mergeset/table.go:1161 creating Table snapshot of "/vm-data/indexdb/16CA0D126A874608"...
2022-01-19T05:19:31.963Z info VictoriaMetrics/lib/mergeset/table.go:1230 created Table snapshot of "/vm-data/indexdb/16CA0D126A874608" at "/vm-data/indexdb/snapshots/20220119051931-16CA0D126A870F8B/16CA0D126A874608" in 0.041 seconds
2022-01-19T05:19:31.963Z info VictoriaMetrics/lib/mergeset/table.go:1161 creating Table snapshot of "/vm-data/indexdb/16CA0D126A874607"...
2022-01-19T05:19:31.966Z info VictoriaMetrics/lib/mergeset/table.go:1230 created Table snapshot of "/vm-data/indexdb/16CA0D126A874607" at "/vm-data/indexdb/snapshots/20220119051931-16CA0D126A870F8B/16CA0D126A874607" in 0.003 seconds
2022-01-19T05:19:31.971Z info VictoriaMetrics/lib/storage/storage.go:361 created Storage snapshot for "/vm-data" at "/vm-data/snapshots/20220119051931-16CA0D126A870F8B" in 0.204 seconds

最后去vmstorage的存储路径下看看文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 我这里是直接去我的nfs下vmstorage对应的存储path下查看的。
# 可以很清楚看到我们之前的快照
[root@test ~]# cd /nfs_data/pvc-b06968ca-f31e-4d93-b16d-cf66a10c64d9/
[root@test pvc-b06968ca-f31e-4d93-b16d-cf66a10c64d9]# ls -al
total 24
drwxr-xr-x 6 root root 4096 Jan 14 13:49 .
drwxr-xrwx 6 root root 4096 Jan 14 13:49 ..
drwxr-xr-x 4 root root 4096 Jan 14 13:49 data
-rw-r--r-- 1 root root    0 Jan 14 13:49 flock.lock
drwxr-xr-x 5 root root 4096 Jan 14 13:49 indexdb
drwxr-xr-x 2 root root 4096 Jan 14 13:49 metadata
drwxr-xr-x 3 root root 4096 Jan 19 13:19 snapshots
[root@test pvc-b06968ca-f31e-4d93-b16d-cf66a10c64d9]# cd snapshots/
[root@test snapshots]# ls -al
total 12
drwxr-xr-x 3 root root 4096 Jan 19 13:19 .
drwxr-xr-x 6 root root 4096 Jan 14 13:49 ..
drwxr-xr-x 4 root root 4096 Jan 19 13:19 20220119051931-16CA0D126A870F8B
[root@test snapshots]# cd 20220119051931-16CA0D126A870F8B/
[root@test 20220119051931-16CA0D126A870F8B]# ls -al
total 16
drwxr-xr-x 4 root root 4096 Jan 19 13:19 .
drwxr-xr-x 3 root root 4096 Jan 19 13:19 ..
drwxr-xr-x 2 root root 4096 Jan 19 13:19 data
lrwxrwxrwx 1 root root   55 Jan 19 13:19 indexdb -> ../../indexdb/snapshots/20220119051931-16CA0D126A870F8B
drwxr-xr-x 2 root root 4096 Jan 19 13:19 metadata

其实也可以通过vmstorage提供的API去查看我们刚刚创建的快照

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 到这里我们的快照已经准备就绪了
[root@test ~]# curl http://172.16.47.122:8482/snapshot/list
{"status":"ok","snapshots":[
"20220119051931-16CA0D126A870F8B"

2、数据备份

有了上面的快照,下面我们来进行备份,我这边没有s3、gcs,直接用local filesystem,将其备份到本地/opt目录下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 通过刚刚创建的快照进行备份
./vmbackup-prod -storageDataPath=/vm-data -snapshotName=20220119051931-16CA0D126A870F8B -dst=fs:///opt

# 输出如下
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:12 build version: vmbackup-20210715-111047-tags-v1.63.0-0-g61cc13c16
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:13 command line flags
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:28 flag "concurrency"="10" (is_set=false)
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:28 flag "configFilePath"="" (is_set=false)
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:28 flag "configProfile"="" (is_set=false)
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:28 flag "credsFilePath"="" (is_set=false)
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:28 flag "customS3Endpoint"="" (is_set=false)
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:28 flag "dst"="fs:///opt" (is_set=true)
...省略...
00_22197_20220119051721.456_20220119051724.766_16CA152B5133B4AD/timestamps.bin", file_size: 0, offset: 0, size: 0} from src fslocal "/vm-data/snapshots/20220119051931-16CA0D126A870F8B" to dst fsremote "/opt"
2022-01-19T05:45:30.374Z info VictoriaMetrics/lib/backup/actions/backup.go:164 uploaded 125373885 out of 125373885 bytes from src fslocal "/vm-data/snapshots/20220119051931-16CA0D126A870F8B" to dst fsremote "/opt" in 627.488079ms
2022-01-19T05:45:30.374Z info VictoriaMetrics/lib/backup/actions/backup.go:171 backup from src fslocal "/vm-data/snapshots/20220119051931-16CA0D126A870F8B" to dst fsremote "/opt" with origin fsnil is complete; backed up 125373885 bytes in 0.664 seconds; deleted 0 bytes; server-side copied 0 bytes; uploaded 125373885 bytes

# 再去/opt目录下确保数据备份正确
/vm-data # cd /opt/
/opt # ls -al
total 24
drwxr-xr-x    1 root     root          4096 Jan 19 05:45 .
drwxr-xr-x    1 root     root          4096 Jan 14 05:49 ..
-rw-------    1 root     root             2 Jan 19 05:45 backup_complete.ignore
drwx------    4 root     root          4096 Jan 19 05:45 data
drwx------    4 root     root          4096 Jan 19 05:45 indexdb
drwx------    3 root     root          4096 Jan 19 05:45 metadata

3、创建第二个快照

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@test /]# curl http://172.16.47.122:8482/snapshot/create
{"status":"ok","snapshot":"20220119055254-16CA0D126A870F8C"}

4、增量备份

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 备份
./vmbackup-prod -storageDataPath=/vm-data -snapshotName=20220119055254-16CA0D126A870F8C  -dst=fs:///opt
# 日志输出
...省略...
2022-01-19T05:55:18.548Z info VictoriaMetrics/lib/backup/actions/backup.go:171 backup from src fslocal "/vm-data/snapshots/20220119055254-16CA0D126A870F8C" to dst fsremote "/opt" with origin fsnil is complete; backed up 127597222 bytes in 0.214 seconds; deleted 2714902 bytes; server-side copied 0 bytes; uploaded 4938239 bytes

从日志上不难看出,增量备份时,delete file 的值不为0,这里删除的是第一次快照中存在,但在第二次快照中不会存在的数据;另外
花费的时间也明显小于咱们第一次全备。

5、再做一个快照,测试server-side copy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建快照
[root@test ~]# curl http://172.16.47.122:8482/snapshot/create
{"status":"ok","snapshot":"20220119073821-16CA0D126A870F8D"}

6、全备,备份时添加-origin参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 备份,添加-origin指定之前备份数据所在目录
./vmbackup-prod -storageDataPath=/vm-data -snapshotName=20220119073821-16CA0D126A870F8D  -dst=fs:///ss -origin=fs:///opt

# 从命令输出来看,确定有进行server-side copy
...省略...
2022-01-19T07:44:56.657Z info VictoriaMetrics/lib/backup/actions/backup.go:171 backup from src fslocal "/vm-data/snapshots/20220119073821-16CA0D126A870F8D" to dst fsremote "/ss" with origin fsremote "/opt" is complete; backed up 131747249 bytes in 0.190 seconds; deleted 0 bytes; server-side copied 121316947 bytes; uploaded 10430302 bytes
数据恢复

上面我们创建了多个快照,也进行了多次备份。这里我选择从fs:///ss目录下的备份进行恢复到/tt目录下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 进行恢复
./vmrestore-prod  -src=fs:///ss -storageDataPath=/tt
# vm停止,再进行数据恢复;恢复后,vm再次重启时-storageDataPath参数需要指定为/tt目录,即恢复的数据所在的目录
# 控制台输出
...省略...
2022-01-19T07:58:32.117Z info VictoriaMetrics/lib/logger/flag.go:28 flag "src"="fs:///ss" (is_set=true)
2022-01-19T07:58:32.117Z info VictoriaMetrics/lib/logger/flag.go:28 flag "storageDataPath"="/tt" (is_set=true)
...省略...
2022-01-19T07:58:32.751Z info VictoriaMetrics/lib/backup/actions/restore.go:185 downloaded 131747249 out of 131747249 bytes from fsremote "/ss" to fslocal "/tt" in 624.892637ms
2022-01-19T07:58:32.751Z info VictoriaMetrics/lib/backup/actions/restore.go:192 restored 131747249 bytes from backup in 0.635 seconds; deleted 0 bytes; downloaded 131747249 bytes

# 查看/tt目录下的恢复的数据
/vm-data # ls -al /tt/
total 20
drwxr-xr-x    5 root     root          4096 Jan 19 07:58 .
drwxr-xr-x    1 root     root          4096 Jan 19 07:44 ..
drwx------    4 root     root          4096 Jan 19 07:58 data
-rw-r--r--    1 root     root             0 Jan 19 07:58 flock.lock
drwx------    4 root     root          4096 Jan 19 07:58 indexdb
drwx------    2 root     root          4096 Jan 19 07:58 metadata

注:在进行恢复数据期间,vm应该停止。

Troubleshooting

  • 当发现备份数据时很慢,可以通过设置-concurrency参数来设置并发来加快上传数据至存储系统
  • 如果vmbackup/vmrestore使用了太多的带宽,可以通过maxBytesPerSecond参数进行限制
  • 如果备份/恢复数据时被打断,使用相同的命令参数重新备份/恢复即可,将在断点处自动恢复
  • 单节点vm备份的数据不能被用于恢复数据至集群版本vm

总结

以上就是本次我对vmbackup和vmrestore的简单介绍了,更多内容请查看官网。如果你觉得vm不错,动手试试看吧!

参考

  • https://docs.victoriametrics.com
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发故事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
移植一个抖音贴纸组件到Flutter
本文发于简书——何时夕,搬运转载请注明出处,否则将追究版权责任。交流qq群:859640274
何时夕
2019/06/20
1.4K0
面试官问我:如何加载100M的图片却不撑爆内存,一张 100M 的大图,如何预防 OOM?
Android开发中,有时候会有加载巨图的需求,如何加载一个大图而不产生OOM呢,使用系统提供的BitmapRegionDecoder这个类可以很轻松的完成。
Android技术干货分享
2020/08/26
2.4K1
面试官问我:如何加载100M的图片却不撑爆内存,一张 100M 的大图,如何预防 OOM?
仿抖音上下滑动分页视频
目录介绍 01.先来看一下需求 02.有几种实现方式 2.1 使用ViewPager 2.2 使用RecyclerView 03.用ViewPager实现 3.1 自定义ViewPager 3.2 ViewPager和Fragment 3.3 修改滑动距离翻页 3.4 修改滑动速度 04.用RecyclerView实现 4.1 自定义LayoutManager 4.2 添加滑动监听 4.3 监听页面是否滚动 4.4 attach和Detached 05.优化点详谈 5.1 ViewPager改变滑动速率 5
杨充
2019/11/22
6K0
从零开始仿写一个抖音App——视频编辑SDK开发(一)
本文首发于微信公众号——世界上有意思的事,搬运转载请注明出处,否则将追究版权责任。交流qq群:859640274
何时夕
2019/11/21
2K0
从零开始仿写一个抖音App——视频编辑SDK开发(一)
iOS开发常用之图像浏览及处理
图像浏览及处理 FLAnimatedImage - gif播放处理的工具。 CLImageEditor - 超强的图片编辑库,快速帮你实现旋转,防缩,滤镜等等一系列麻烦的事情。 ios-image-filters - 图像滤镜,库比较旧了,很容易崩溃。 XBImageFilters - 图像滤镜。 MWPhotoBrowser - 一个非常不错的照片浏览器,在github的star接近3000个,解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题。 co
GuangdongQi
2018/12/14
4.1K0
图片操作系列 —(1)手势缩放图片功能
项目开发中,大家APP开发一般都会用到上传图片,比如是上传了自己的生活照,然后在某个界面处查看上传的图片,这时候一般在这个查看详情的界面,会有手势放大缩小功能,手势进行旋转功能,双击放大图片等等。
青蛙要fly
2018/08/29
3.2K0
图片操作系列 —(1)手势缩放图片功能
图片操作系列 —(2)手势旋转图片
在上次的文章:图片操作系列 —(1)手势缩放图片功能中,我们已经学会了如何用手势来对图片进行缩放。这次我们继续来看第二个操作,那就是如何用手势来旋转图片。
青蛙要fly
2018/08/29
3.7K0
图片操作系列 —(2)手势旋转图片
高仿剪映视频多轨剪辑页实现
剪映是当下比较火的一款手机视频剪辑工具,由抖音官方推出,可用于手机短视频的剪辑制作,拥有强大的多轨编辑能力。其中视频剪辑页用于剪辑的View拥有出色的交互性,很考验Android的基础能力,值得拿出来学习一下。   观察剪映的视频剪辑页面,可见主要有时间轴、视频轨道、时间游标和预览窗口四部分组成。时间轴用于展示当前的时间长度和时间刻度,通过缩放手势可以改变最小刻度值,拖动可以对音视频进行seek。视频轨道用于显示轨道在时间轴上的长度、以及轨道信息,同时视频轨道会显示对应时间的帧图像,而音频轨道则会显示波形图。时间游标会固定在整个View的中间位置,虽然叫它游标,但实际上并不会移动,只能通过移动时间轴和视频轨道来表示当前的时间位置。预览窗口用于显示视频帧,通常是SurfaceView或TextureView,比较简单,非本文的重点。
阿利民
2022/05/16
1.6K0
高仿剪映视频多轨剪辑页实现
从抖音到多闪,今日头条的短视频社交简史
公元前400年,希波克拉提斯把那些过于害羞的人描述为“喜欢在黑暗中生活”,这就是「社交恐惧」的源头;
mixlab
2019/05/05
1.1K0
从抖音到多闪,今日头条的短视频社交简史
Android技能树 — View事件体系小结
这次是讲View的事件体系。特别是不同情况下的事件分发,我会用很简单的方式教会大家。
青蛙要fly
2018/08/29
3790
Android技能树 — View事件体系小结
高级 UI 成长之路 (二) 深入理解 Android 8.0 View 触摸事件分发机制
在上一篇文章中我们介绍了 View 的基础知识以及 View 滑动的实现,本篇将为大家带来 View 的一个核心知识点 事件分发机制。事件分发机制不仅仅是核心知识点也是 Android 中的一个难点,下面我们就从源码的角度来分析事件的传递还有最后是如何解决滑动冲突的。
做个快乐的码农
2021/11/12
7460
高级 UI 成长之路 (二) 深入理解 Android 8.0 View 触摸事件分发机制
“多闪”的短视频社交底层逻辑是什么?
视频社交不一样,它区别于图文,图文社交注重效率沟通,视频社交偏向于娱乐消遣和场景再现。
数据猿
2019/11/20
8000
“多闪”的短视频社交底层逻辑是什么?
Ios常用第三方动画框架(三)
gif动画 UIImageView-PlayGIF - UIImageView-PlayGIF。 YLGIFImage - YLGIFImage。 YLGIFImage-Swift - YLGIFImage-Swift。 gifu.Swift - gifu.Swift高性能GIF显示类库。 droptogif - droptogif视频拖拽到应用窗口后自动转换为 GIF 动画(其转换进程动画效果也超赞)。 JWAnimatedImage.swift - JWAnimatedImage.swift
honey缘木鱼
2018/09/26
9.4K0
一篇文章教会你使用Python下载抖音无水印视频
今天小编要跟大家分享的是,利用Python如何下载抖音无水印的视频;大家可能要问了,这个有什么用呢?当然有用了。那么有什么用呢?下面小编跟大家详细说说。
菜鸟小白的学习分享
2021/06/17
4050
一篇文章教会你使用Python下载抖音无水印视频
抖音国庆小游戏是如何实现的?
经过若干个月的点滴积累,我有幸参与到抖音国庆活动的开发,这是我第一次完整参与大型活动项目的开发,它是全员关注的一个重点项目,致力于让用户领略美好中国,指导用户在抖音中搜索与获取旅行攻略和出游信息。
ConardLi
2021/12/02
1.5K0
抖音国庆小游戏是如何实现的?
腾讯T11考官亲述:90%候选人答错的View事件冲突,藏着Handler与Choreographer的世纪对决
大家好,我是稳稳,一个曾经励志用技术改变世界,现在为随时失业做准备的中年奶爸程序员,与你分享生活和学习的点滴。
AntDream
2025/03/24
570
腾讯T11考官亲述:90%候选人答错的View事件冲突,藏着Handler与Choreographer的世纪对决
看完这篇还不会 GestureDetector 手势检测,我跪搓衣板!
像网上其他将手势监听的博客一样,本文将以双击事件为引子,逐步展开探讨 Android 手势监听,你需要知道的点点滴滴,还是那句话:看完这篇还不会 GestureDetector 手势检测,我跪搓衣板!
圆号本昊
2021/09/24
1.7K0
看完这篇还不会 GestureDetector 手势检测,我跪搓衣板!
用Kotlin实现抖音爆红的文字时钟,征服产品小姐姐就靠它了(上)
周末在家刷抖音的时候看到了这款网红时钟,都是Android平台的,想来何不自己实现一把。看抖音里大家发的视频,这款时钟基本分两类,一类是展示在「壁纸」上,一类是展示在「锁屏」上。
Android技术干货分享
2019/07/26
1.3K0
用Kotlin实现抖音爆红的文字时钟,征服产品小姐姐就靠它了(上)
android 仿音悦台页面交互效果
概述 新版的音悦台 APP 播放页面交互非常有意思,可以把播放器往下拖动,然后在底部悬浮一个小框,还可以左右拖动,然后回弹的时候也会有相应的效果,这种交互效果在头条视频和一些专注于视频的app也是很常
xiangzhihong
2018/02/05
1K0
android 仿音悦台页面交互效果
Android Studio 知识储备 之 ✨-基础知识学习历程
所有的资源文件都会在R.java文件下生成对应的资源id,我们可以直接通过资源id访问到对应的资源。使用mipmap会在图片缩放在提供一定的性能优化,分辨率不同系统会根据屏幕分辨率来选择hdpi,mdpi,xmdpi,xxhdpi下的对应图片,所以你解压别人的apk可以看到上述目录同一名称的图片,在四个文件夹下都有,只是大小和像素不一样而已!当然,这也不是绝对的,比如我们把所有的图片都丢在了drawable-hdpi下的话,即使手机 本该加载ldpi文件夹下的图片资源,但是ldpi下没有,那么加载的还会是hdpi下的图片! 另外,还有一种情况:比如是hdpi,mdpi目录下有,ldpi下没有,那么会加载mdpi中的资源! 原则是使用最接近的密度级别!另外如果你想禁止Android不跟随屏幕密度加载不同文件夹的资源,只需在AndroidManifest.xml文件中添加android:anyDensity="false"字段即可!
呆呆敲代码的小Y
2021/08/12
6750
推荐阅读
相关推荐
移植一个抖音贴纸组件到Flutter
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档