【求助】【严重】PAGView PAGImageView 使用最新4.5.2鸿蒙ohos 播放动画,释放资源后存在严重的内存泄漏问题,必现,复现工程见附件
@kevingpqi123 is already working on this.
Since Nov 20, 2025.
- Dominant language
- HTML
- Stars
- 5.8k
- Forks
- 531
- Avg merge
- 8d 55m
- Merged PRs (30d)
- 17
Description
【版本信息】
4.5.2
【平台信息】
鸿蒙ohos
【预期的表现】
【实际的情况】
PAGView PAGImageView 使用最新4.5.2鸿蒙ohos 播放动画,释放资源后存在严重的内存泄漏问题
复现IDE版本:DevEco Studio 5.0.5 Release(DevEco Studio for Windows 5.0.13.240)
IDE下载地址https://developer.huawei.com/consumer/cn/download/deveco-studio
手机使用Mate60pro
复现内存泄漏工程见附件,有两个页面,首页和动画播放页
PAGVIew:动画播放页有一个可以切换148个pag动画的切换按钮,先从首页点击按钮进入动画播放页面,点击切换动画按钮可以切换并播放动画,切换148个动画后,再调用PAGViewController 的release释放资源按钮后,然后返回到上一页(触发动画页资源销毁),发现仍然存在无法释放的135M 的内存泄漏。
重复以上操作33遍后,无法释放的内存达到4.4GB,然后应用出现闪退
将工程里的PAGVIew改成PAGImageView后,同样的操作场景下发现切换到第130个动画的时候,点击释放资源按钮,然后返回首页,发现存在更严重的内存泄漏,有1.4G内存无法释放,除了release也找不到有其他能释放的接口
PAGView和PAGImageView可能是两类内存无法释放干净的问题
之前7月份反馈过这个问题https://github.com/Tencent/libpag/discussions/2909 ,当时只在一个pag动画上发现,以为只是每次0.7M的内存泄漏。最近发现不同的pag文件,内存泄漏的大小还不一样,有些单次泄漏有3-4M左右(好像带图片画面的pag会存在,不带图片的pag动画好像不存在明显的内存泄漏问题),一些pag动画播放后在调用PAGViewController 的release释放资源后,部分内存始终一直存在未释放。
内存泄漏可通过
hdc shell
ps -ef |grep "com.example.myapplication" 找到应用PID
hidumper --mem 应用PID
可以查看到内存操作前后变化 Graph(和DMA上显示的占用内一样)内存上涨了138272Kb
内存泄漏怀疑可能和PAGAnimator相关代码有关
https://github.com/Tencent/libpag/blob/main/src/platform/ohos/JPAGView.cpp 第201行只要调用过 animator->start();(播放动画后出现的内存泄漏),后面即使调用release 后 还是有部分内存还是无法释放
看android对应的代码,和ohos代码逻辑也存在实现上的差异
安卓中JPAGAnimator.cpp PAGAnimator::MakeFrom是传入的AnimatorListener
listener = std::make_shared(env, animatorObject);
animator = pag::PAGAnimator::MakeFrom(listener);
而ohos JPAGView.cpp里PAGAnimator::MakeFrom传入的是JPAGView
auto cView = std::make_shared(id);
cView->animator = PAGAnimator::MakeFrom(cView);
AI上也查了下https://github.com/Tencent/libpag/blob/main/src/rendering/PAGAnimator.cpp
复现工程上的这个使用场景比较常见,希望仓库大佬能帮忙解决一下,感谢
【Demo及附件】
附件太大了,放网盘了
链接:https://pan.baidu.com/s/1JlagDJP72uTpk2qZMxwGqA?pwd=qwer
提取码:qwer
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.