低端设备加载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>

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

相关推荐
不爱吃炸鸡柳1 小时前
单链表专题(完整代码版)
数据结构·算法·链表
killerbasd1 小时前
牧苏苏传 我不装了 4/7
前端·javascript·vue.js
CylMK1 小时前
题解:AT_abc382_d [ABC382D] Keep Distance
算法
吴声子夜歌1 小时前
ES6——二进制数组详解
前端·ecmascript·es6
Dfreedom.1 小时前
计算机视觉全景图
人工智能·算法·计算机视觉·图像算法
码事漫谈2 小时前
手把手带你部署本地模型,让你Token自由(小白专属)
前端·后端
ZC跨境爬虫2 小时前
【爬虫实战对比】Requests vs Scrapy 笔趣阁小说爬虫,从单线程到高效并发的全方位升级
前端·爬虫·scrapy·html
爱上好庆祝2 小时前
svg图片
前端·css·学习·html·css3
Morwit2 小时前
【力扣hot100】 1. 两数之和
数据结构·c++·算法·leetcode·职场和发展
王夏奇2 小时前
python中的__all__ 具体用法
java·前端·python