Android 14 设备上的动态代码加载问题

问题描述 投票:0回答:1
public void setPayment(PaymentResponse response){
        this.response = response;
        layout.findViewById(R.id.loader).setVisibility(View.GONE);
        layout.findViewById(R.id.payment_area).setVisibility(View.VISIBLE);
        if(razorpay==null){
            //cause of error due to referencing from .aar file
            razorpay = new Razorpay(getActivity(),response.getPayment().getGatewayKey());
        }
        razorpay.setWebView(paymentLayout.findViewById(R.id.payments));
        //code continues
    }

对于上述代码片段,我在 Android 14 设备上遇到以下错误消息:- java.lang.SecurityException:可写dex文件'/data/user/io.project.package.name/cache/。 ' 是不允许的。

我的 libs 文件夹中有 razorpay.aar,并且还在 build.gradle 的依赖项下包含以下内容: 实现 fileTree(dir: 'libs', include: ['*.aar']) 实现文件('libs/razorpay.aar') 然而,我在 Android 14 设备上遇到了这个问题,并且无法弄清楚如何按照 Android 14 的要求将其标记为只读。 谁能帮我弄清楚如何解决这个问题?它可以在 Android 14 之前的设备上流畅运行。同一 .aar 有一个更新的依赖版本,使用它代替 .aar 似乎可以解决 Android 14 设备上的问题,但它也需要服务器端进行更多重构和更改。因此,使用相同的 .aar 在应用程序级别修复它的解决方案对于我们作为修补程序进行部署将非常有帮助且更快。 使用 Android Studio Iguana | 2023.2.1 补丁 1 来编译我的构建。

java android razorpay
1个回答
0
投票

据我所知,Android 14 禁止应用加载可写的 DEX 文件,以避免安全风险。

如果您正在应用程序中加载任何 ELF 文件的

.aar
文件,您可以尝试使用
setReadOnly()
类的
File
将它们设置为只读。

val jar = File("DYNAMICALLY_LOADED_FILE.jar")
val os = FileOutputStream(jar)
os.use {
    // Set the file to read-only first to prevent race conditions
    jar.setReadOnly()
    // Then write the actual file content
}
val cl = PathClassLoader(jar, parentClassLoader)

参考:https://developer.android.com/about/versions/14/behavior-changes-14#safer-dynamic-code-loading

© www.soinside.com 2019 - 2024. All rights reserved.