先来看下这份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
使用方法:
-
下载并解压
libwebp-{version}-windows-x64.zip
-
打开命令提示符(CMD)进入解压目录的
bin
文件夹 -
执行优化命令:
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>
替换优化图,显示效果也没有差别