当前位置:   article > 正文

Android 14 应用启动崩溃问题_java.lang.securityexception: writable dex file

java.lang.securityexception: writable dex file

报错背景

Android 14模拟器上崩溃,规律是卸载后第一次安装不会崩溃,当修改代码之后点击运行就会崩溃,错误信息如下:

java.lang.SecurityException: Writable dex file '/data/data/com.example.android14/code_cache/.overlay/base.apk/classes3.dex' is not allowed.
        at dalvik.system.DexFile.openDexFileNative(Native Method)
        at dalvik.system.DexFile.openDexFile(DexFile.java:406)
        at dalvik.system.DexFile.<init>(DexFile.java:128)
        at dalvik.system.DexFile.<init>(DexFile.java:101)
        at dalvik.system.DexPathList.loadDexFile(DexPathList.java:438)
        at dalvik.system.DexPathList.makeDexElements(DexPathList.java:387)
        at dalvik.system.DexPathList.<init>(DexPathList.java:166)
        at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:160)
        at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:130)
        at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:146)
        at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:93)
        at com.android.internal.os.ClassLoaderFactory.createClassLoader(ClassLoaderFactory.java:134)
        at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:126)
        at android.app.ApplicationLoaders.getClassLoaderWithSharedLibraries(ApplicationLoaders.java:61)
        at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:1034)
        at android.app.LoadedApk.getClassLoader(LoadedApk.java:1126)
        at android.app.LoadedApk.getResources(LoadedApk.java:1374)
        at android.app.ContextImpl.createAppContext(ContextImpl.java:3324)
        at android.app.ContextImpl.createAppContext(ContextImpl.java:3316)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6879)
        at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2236)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:205)
        at android.os.Looper.loop(Looper.java:294)
        at android.app.ActivityThread.main(ActivityThread.java:8177)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

问题原因

说一下问题原因,这个错误是老版本Android Studio在Android14上的一个bug,Android14有一个改动: 更安全的动态代码加载,简单来说就是:

打开DEX、JAR、APK等文件时必须将DEX文件设置为只读。

修改代码点击运行后,Android Sutdio在默认会将代码的改动打包成DEX动态加载,类似热修复,来提升打包而报错的根本原因就是它没有将DEX文件设置为只读。所以禁用Android Studio的动态加载功能或者升级Android Studio即可解决。

解决方案

方案1 禁用Android Studio动态加载的打包优化

Run/Debug Configurations中勾选
Always install with package manager (disables deploy optimizations on Android11 and later。缺点是会减慢一点打包安装速度
在这里插入图片描述

方案2 更新Android Studio

新版本的Android Studio已经修复了该Bug,比较新老版本的报错Dex文件,会发现新版本是只读的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/911164
推荐阅读
相关标签
  

闽ICP备14008679号