低端设备加载webp ANR

先来看下这份ANR日志

复制代码
suspend all histogram:	Sum: 476us 99% C.I. 7us-64us Avg: 28us Max: 64us
DALVIK THREADS (38):
"Signal Catcher" daemon prio=10 tid=6 Runnable
  | group="system" sCount=0 dsCount=0 flags=0 obj=0x133811a0 self=0xf2322400
  | sysTid=5754 nice=-20 cgrp=default sched=0/0 handle=0xdca551c0
  | state=R schedstat=( 38398213 739957 14 ) utm=2 stm=1 core=2 HZ=100
  | stack=0xdc95a000-0xdc95c000 stackSize=1008KB
  | held mutexes= "mutator lock"(shared held)
  native: #00 pc 00371015  /apex/com.android.art/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+76)
  native: #01 pc 0043fb87  /apex/com.android.art/lib/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool, BacktraceMap*, bool) const+386)
  native: #02 pc 0043b553  /apex/com.android.art/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool, BacktraceMap*, bool) const+34)
  native: #03 pc 00458129  /apex/com.android.art/lib/libart.so (art::DumpCheckpoint::Run(art::Thread*)+664)
  native: #04 pc 00453703  /apex/com.android.art/lib/libart.so (art::ThreadList::RunCheckpoint(art::Closure*, art::Closure*)+354)
  native: #05 pc 00452c3b  /apex/com.android.art/lib/libart.so (art::ThreadList::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool)+1486)
  native: #06 pc 00452335  /apex/com.android.art/lib/libart.so (art::ThreadList::DumpForSigQuit(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)+604)
  native: #07 pc 0040adc7  /apex/com.android.art/lib/libart.so (art::Runtime::DumpForSigQuit(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)+130)
  native: #08 pc 0041a94b  /apex/com.android.art/lib/libart.so (art::SignalCatcher::HandleSigQuit()+1046)
  native: #09 pc 00419cef  /apex/com.android.art/lib/libart.so (art::SignalCatcher::Run(void*)+246)
  native: #10 pc 000aab73  /apex/com.android.runtime/lib/bionic/libc.so (__pthread_start(void*)+40)
  native: #11 pc 00063fe3  /apex/com.android.runtime/lib/bionic/libc.so (__start_thread+30)
  (no managed stack frames)

"main" prio=5 tid=1 Native
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x7235aa78 self=0xf231de00
  | sysTid=5744 nice=-10 cgrp=default sched=0/0 handle=0xf26f1470
  | state=R schedstat=( 1084080374 75387661 399 ) utm=97 stm=11 core=1 HZ=100
  | stack=0xfeff2000-0xfeff4000 stackSize=8192KB
  | held mutexes=
  native: #00 pc 005359f4  /system/lib/libhwui.so (WebPRescalerImport+240)
  native: #01 pc 005060f0  /system/lib/libhwui.so (EmitRescaledRGB+116)
  native: #02 pc 00504e04  /system/lib/libhwui.so (CustomPut.llvm.16658038581547897248+52)
  native: #03 pc 00503ff0  /system/lib/libhwui.so (FinishRow.llvm.13521785089726402735+2040)
  native: #04 pc 00501c78  /system/lib/libhwui.so (IDecode+1124)
  native: #05 pc 00173f75  /system/lib/libhwui.so (SkWebpCodec::onGetPixels(SkImageInfo const&, void*, unsigned int, SkCodec::Options const&, int*)+1680)
  native: #06 pc 001695cf  /system/lib/libhwui.so (SkCodec::getPixels(SkImageInfo const&, void*, unsigned int, SkCodec::Options const*)+250)
  native: #07 pc 001663b7  /system/lib/libhwui.so (SkAndroidCodecAdapter::onGetAndroidPixels(SkImageInfo const&, void*, unsigned int, SkAndroidCodec::AndroidOptions const&)+42)
  native: #08 pc 0016606f  /system/lib/libhwui.so (SkAndroidCodec::getAndroidPixels(SkImageInfo const&, void*, unsigned int, SkAndroidCodec::AndroidOptions const*)+590)
  native: #09 pc 00119935  /system/lib/libhwui.so (android::ImageDecoder::decode(void*, unsigned int)+264)
  native: #10 pc 00104279  /system/lib/libhwui.so (ImageDecoder_nDecodeBitmap(_JNIEnv*, _jobject*, long long, _jobject*, unsigned char, int, int, _jobject*, unsigned char, int, unsigned char, unsigned char, unsigned char, long long, unsigned char)+824)
  at android.graphics.ImageDecoder.nDecodeBitmap(Native method)
  at android.graphics.ImageDecoder.decodeBitmapInternal(ImageDecoder.java:1712)
  at android.graphics.ImageDecoder.decodeDrawableImpl(ImageDecoder.java:1795)
  at android.graphics.ImageDecoder.decodeDrawable(ImageDecoder.java:1751)
  at android.content.res.ResourcesImpl.decodeImageDrawable(ResourcesImpl.java:808)
  at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:883)
  at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:673)
  at android.content.res.Resources.loadDrawable(Resources.java:993)
  at android.content.res.Resources.getDrawableForDensity(Resources.java:983)
  at android.content.res.Resources.getDrawable(Resources.java:922)
  at android.content.Context.getDrawable(Context.java:693)
  at androidx.core.content.ContextCompat$Api21Impl.getDrawable(ContextCompat.java:1049)
  at androidx.core.content.ContextCompat.getDrawable(ContextCompat.java:485)
  at androidx.appcompat.widget.ResourceManagerInternal.getDrawable(ResourceManagerInternal.java:147)
  - locked <0x028cc8e3> (a androidx.appcompat.widget.ResourceManagerInternal)
  at androidx.appcompat.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:475)
  - locked <0x0db8e2e0> (a androidx.appcompat.widget.AppCompatDrawableManager)
  at androidx.appcompat.widget.TintTypedArray.getDrawableIfKnown(TintTypedArray.java:93)
  at androidx.appcompat.app.AppCompatDelegateImpl.attachToWindow(AppCompatDelegateImpl.java:848)
  at androidx.appcompat.app.AppCompatDelegateImpl.ensureWindow(AppCompatDelegateImpl.java:824)
  at androidx.appcompat.app.AppCompatDelegateImpl.onCreate(AppCompatDelegateImpl.java:531)
  at androidx.appcompat.app.AppCompatActivity$2.onContextAvailable(AppCompatActivity.java:133)
  at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable(ContextAwareHelper.kt:84)
  at androidx.activity.ComponentActivity.onCreate(ComponentActivity.kt:331)
  at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:216)
  at com.healthfitness.common.base.BaseActivity.onCreate(BaseActivity.kt:22)
  at com.healthfitness.xxxx.WelcomeActivity.onCreate(WelcomeActivity.kt:37)
  at android.app.Activity.performCreate(Activity.java:8022)
  at android.app.Activity.performCreate(Activity.java:8006)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3404)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595)
  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
  at android.os.Handler.dispatchMessage(Handler.java:106)
  at android.os.Looper.loop(Looper.java:223)
  at android.app.ActivityThread.main(ActivityThread.java:7664)
  at java.lang.reflect.Method.invoke(Native method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

主要是在欢迎页加载了一个图片,造成了Anr,查看后发现这个图片是

57.47KB,尺寸为 (5760x3240) 的一张webp的图片,

这个图片大小虽然不大,但是尺寸,其实远超设备需求的,所以考虑将图片优化后再观察ANR概率。

在 Windows 环境下优化 WebP 图片,可以使用以下工具和方法:

推荐工具及使用步骤

1. 使用 Google 官方工具包 (推荐)

下载地址
https://developers.google.com/speed/webp/docs/precompiled

使用方法

  1. 下载并解压 libwebp-{version}-windows-x64.zip

  2. 打开命令提示符(CMD)进入解压目录的 bin 文件夹

  3. 执行优化命令:

cmd

复制代码
cwebp -q 75 -m 6 -resize 2160 3840 "D:\原图路径\large.webp" -o "D:\输出路径\optimized.webp"

参数详解

  • -q 75:设置质量级别(0-100,75是视觉无损的推荐值)

  • -m 6:压缩级别(0-6,6为最高压缩)

  • -resize 2160 3840:调整尺寸(保持宽高比)

  • -af:启用自动滤镜(智能降噪)

  • -f 80:滤镜强度(0-100,80为推荐值)

  • -sharpness 1:锐化程度(0-7,补偿压缩导致的模糊)

    E:\tools\webptools\libwebp-1.6.0-windows-x64\libwebp-1.6.0-windows-x64\bin> .\cwebp.exe -q 75 -resize 2880 1620 .\webp\splash_bg.webp -o .\webp\splash_bg2.webp
    Saving file '.\webp\splash_bg2.webp'
    File: .\webp\splash_bg.webp
    Dimension: 2880 x 1620
    Output: 19834 bytes Y-U-V-All-PSNR 56.13 57.17 55.99 56.26 dB
    (0.03 bpp)
    block count: intra4: 390 (2.12%)
    intra16: 17970 (97.88%)
    skipped: 17783 (96.86%)
    bytes used: header: 258 (1.3%)
    mode-partition: 9412 (47.5%)
    Residuals bytes |segment 1|segment 2|segment 3|segment 4| total
    macroblocks: | 0%| 1%| 2%| 97%| 18360
    quantizer: | 36 | 36 | 33 | 25 |
    filter level: | 11 | 31 | 28 | 4 |
    PS E:\tools\webptools\libwebp-1.6.0-windows-x64\libwebp-1.6.0-windows-x64\bin>

替换优化图,显示效果也没有差别

相关推荐
朝阳581几秒前
在浏览器端使用 xml2js 遇到的报错及解决方法
前端
GIS之路9 分钟前
GeoTools 读取影像元数据
前端
scx2013100425 分钟前
20250814 最小生成树和重构树总结
c++·算法·最小生成树·重构树
阿巴~阿巴~34 分钟前
冒泡排序算法
c语言·开发语言·算法·排序算法
ssshooter38 分钟前
VSCode 自带的 TS 版本可能跟项目TS 版本不一样
前端·面试·typescript
散1121 小时前
01数据结构-交换排序
数据结构·算法
yzx9910131 小时前
Yolov模型的演变
人工智能·算法·yolo
Jerry1 小时前
Jetpack Compose 中的状态
前端
weixin_307779132 小时前
VS Code配置MinGW64编译SQLite3库
开发语言·数据库·c++·vscode·算法
无聊的小坏坏2 小时前
拓扑排序详解:从力扣 207 题看有向图环检测
算法·leetcode·图论·拓扑学