在开发Android 14应用程序时遇到的问题

11
我发现当我的应用程序达到一个相当大的规模时(例如通过添加多个库),运行应用程序会抛出java.lang.SecurityException:不允许写入dex文件'.../code_cache/.overlay/base.apk/classes2.dex'。
如果我删除大部分库,只留下默认添加的那些,然后再次运行,可能会正常工作。但是,如果我添加一点点代码,比如一个日志,它可能会出现相同的错误。
如果我想要在没有这个错误的情况下运行它,我必须卸载应用程序,然后从Android Studio重新运行。这非常不方便,因为每次我做一些更改时,都必须卸载应用程序。我无法想象有人会喜欢以这种方式开发Android应用程序。
有人知道这个问题的解决办法吗?

也许尝试使用MultiDex? - undefined
为什么你给标签打上了android-14?这与那个操作系统有特殊关联吗? - undefined
@WeiWen:您是否在项目中使用动态代码加载(DCL)?或者您是否可以获取有关库是否使用了此功能的信息? - undefined
@Smalls 不,我还没有找到解决办法。我并没有在Android 14上积极开发任何应用程序,只是想看看有哪些功能。我希望谷歌能够找出问题并修复它。 - undefined
不确定您是否解决了这个问题,但在我的情况下,问题是我需要更新到Java 11并更新依赖版本到更新的版本。 - undefined
显示剩余7条评论
2个回答

2
我之前也遇到了这个问题,所以我查看了这份文档 DexClassLoader,然后决定这样做。
package com.example

import android.app.Application

class BaseApp : Application() {
    override fun onCreate() {
        super.onCreate()
         val dexOutputDir: File = codeCacheDir
         dexOutputDir.setReadOnly()
    }
}

只需在我的应用程序中添加dexOutputDir.setReadOnly()就解决了这个问题。
卸载并重新安装应用程序。

2
这似乎无法解决当最新的官方播放广告库将一个.jar文件写入/cache时的问题。 - undefined

0
在测试我的应用程序在Android 14模拟器上时,我遇到了相同的错误。只允许DexClassLoader使用只读的dex文件。所以我在DexClassLoader之前添加了File("path/to/abc.dex").setReadOnly()来解决我的问题。
根据您的日志../code_cache/.../classes2.dex,您的代码或依赖项可能使用了某种dex加载。因此,在加载它们之前,您应该将这些dex文件设置为只读。

我在哪里添加代码:File("...").setReadOnly()? - undefined
在使用DexClassLoader之前,或者仅在Application/Activity的onCreate方法中使用。 - undefined
我更新了Android Studio。当我遇到问题时,我使用的是Android Studio Chipmunk 2021.2.1。现在我更新到了Android Studio Giraffe 2022.3.1,问题已经解决了。也许在我重新安装旧版本的Android Studio后,我会测试你提出的解决方案。 - undefined
1
在使用Iguana 2023.2.1构建时遇到了类似的错误。错误出现在预启动报告中,应用程序似乎在将一个jar文件写入应用程序的/cache文件夹中。对于这个问题我并不清楚具体是什么原因,因为应用程序并没有显式地写入任何jar文件,但可能是由com.google.android.gms.policy_ads_fdr_dynamite(?!)写入的。 - undefined
@bilabila 我测试了添加你建议的代码,但是仍然出现了“不允许可写的dex文件”错误。我尝试在活动和应用程序类的onCreate方法中添加代码,但都没有起作用。我尝试的路径类似于这样:../code_cache/.overlay/base.apk/classes2.dex,假设Android Studio指向的完整路径是:/data/data/com.example.testandroid14/code_cache/.overlay/base.apk/classes2.dex - undefined
有人解决了吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接