Android SplashScreen API在Android≤9设备上崩溃问题求助
问题背景
- 应用闪屏迁移至新SplashScreen API后,Android 13设备运行正常,但Android 9模拟器启动即崩溃。
- 核心崩溃错误:
Caused by: java.lang.IllegalArgumentException: R is not a valid verb. Failure occurred at position 2 of path: STRING_TOO_LARGE
- 替换为简单SVG图标后模拟器可正常运行,但无法获取路径更短的目标SVG Logo,寻求Android 9及以下设备的解决办法。
完整崩溃日志
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.iku.test/com.iku.intro.splash.SplashActivity}: android.content.res.Resources$NotFoundException: Drawable com.iku.test:drawable/compat_splash_screen_no_icon_background with resource ID #0x7f0800a1 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: android.content.res.Resources$NotFoundException: Drawable com.iku.test:drawable/compat_splash_screen_no_icon_background with resource ID #0x7f0800a1 Caused by: android.content.res.Resources$NotFoundException: Drawable com.iku.test:drawable/iku_new_splash with resource ID #0x7f080215 Caused by: android.content.res.Resources$NotFoundException: File res/drawable/iku_new_splash.xml from drawable resource ID #0x7f080215 at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:847) at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:631) at android.content.res.Resources.loadDrawable(Resources.java:897) at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:955) at android.content.res.TypedArray.getDrawable(TypedArray.java:930) at android.graphics.drawable.LayerDrawable.updateLayerFromTypedArray(LayerDrawable.java:382) at android.graphics.drawable.LayerDrawable.applyTheme(LayerDrawable.java:224) at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:646) at android.content.res.Resources.getDrawableForDensity(Resources.java:888) at android.content.res.Resources.getDrawable(Resources.java:827) at android.content.Context.getDrawable(Context.java:626) at androidx.core.content.ContextCompat$Api21Impl.getDrawable(ContextCompat.java:1012) at androidx.core.content.ContextCompat.getDrawable(ContextCompat.java:522) at androidx.appcompat.widget.ResourceManagerInternal.getDrawable(ResourceManagerInternal.java:149) at androidx.appcompat.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:480) at androidx.appcompat.widget.TintTypedArray.getDrawableIfKnown(TintTypedArray.java:94) at androidx.appcompat.app.AppCompatDelegateImpl.attachToWindow(AppCompatDelegateImpl.java:807) at androidx.appcompat.app.AppCompatDelegateImpl.ensureWindow(AppCompatDelegateImpl.java:783) at androidx.appcompat.app.AppCompatDelegateImpl.onCreate(AppCompatDelegateImpl.java:506) at androidx.appcompat.app.AppCompatActivity$2.onContextAvailable(AppCompatActivity.java:131) at androidx.activity.contextaware.ContextAwareHelper.dispatchOnContextAvailable(ContextAwareHelper.java:99) at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:352) at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:217) at com.iku.intro.splash.SplashActivity.onCreate(SplashActivity.kt:24) at android.app.Activity.performCreate(Activity.java:7136) at android.app.Activity.performCreate(Activity.java:7127) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: java.lang.IllegalArgumentException: R is not a valid verb. Failure occurred at position 2 of path: STRING_TOO_LARGE at android.util.PathParser.nCreatePathDataFromString(Native Method) at android.util.PathParser.access$200(PathParser.java:24) at android.util.PathParser$PathData.<init>(PathParser.java:76) at android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray(VectorDrawable.java:2016) at android.graphics.drawable.VectorDrawable$VFullPath.inflate(VectorDrawable.java:1967) at android.graphics.drawable.VectorDrawable.inflateChildElements(VectorDrawable.java:819) at android.graphics.drawable.VectorDrawable.inflate(VectorDrawable.java:717) at android.graphics.drawable.DrawableInflater.inflateFromXmlForDensity(DrawableInflater.java:142) at android.graphics.drawable.Drawable.createFromXmlInnerForDensity(Drawable.java:1332) at android.graphics.drawable.Drawable.createFromXmlForDensity(Drawable.java:1291) at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:833) ... 38 more
可行解决办法
1. 拆分并优化SVG路径
Android 9及以下的VectorDrawable对单条路径长度有解析限制,可通过SVG编辑工具(如Figma、Inkscape)处理:
- 打开目标SVG,定位到报错的长路径
- 将单条长路径拆分为多条独立子路径
- 删除冗余路径指令(如重复的闭合指令、过度精确的小数点),保留核心路径信息
2. 分版本提供图标资源
针对不同系统版本提供对应格式的图标,绕过旧系统的SVG解析问题:
- 在
res/drawable-v28/目录下保留原SVG图标,供Android 10及以上设备使用 - 在
res/drawable/目录下放置对应分辨率的PNG格式图标,适配Android 9及以下设备 - 确保SplashScreen配置中引用的drawable资源会自动适配资源目录
3. 升级兼容库优化解析
更新androidx相关依赖,利用VectorDrawableCompat的兼容解析逻辑:
- 在项目的
build.gradle(Module级别)中更新依赖版本:
implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.12.0'
- 若直接在布局中引用图标,使用
app:srcCompat替代android:src属性
4. 压缩SVG文件
使用SVGO等工具压缩SVG,减少路径长度和冗余代码:
- 运行压缩命令(需提前安装SVGO):
svgo input.svg -o output.svg
- 压缩后验证图标视觉效果无变化,再替换原资源
内容的提问来源于stack exchange,提问作者Abhishek AN
相关产品推荐
相关产品推荐

