Skip to content

新版本客户端在Android上的权限相关问题 #1376

@shc0743

Description

@shc0743

Issue Type / 问题类型

Launcher Problem / 启动器问题

Issue Description / 问题描述

在一些新版本中游戏客户端将大多数游戏文件的权限设置为了600,本意估计是增强安全性但是与Android的权限模型不再兼容了,设置600之后这些文件只能被启动器自己所属UID读取,不能被ext_data_rw读取,导致外部文件管理器无root的情况下无法访问。但启动器本体又没有完整的文件管理功能,UI中“版本文件夹”“存档文件夹”等按钮本质上又是跳转第三方文件管理器,导致该功能实质上不可用。

目前有一个绕过方法,使用启动器内置的“运行jar文件”功能运行用户代码来修复权限,但麻烦且脆弱。

参考代码(点击展开)
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.util.*;
import java.util.concurrent.atomic.*;

public class ChmodSaves {
    public static void main(String[] args) throws Exception {
        String savesDir = "/storage/emulated/0/Android/data/com.movtery.zalithlauncher.v2/files/.minecraft/versions/26.1.2 NeoForge 26.1.2.74/saves/";
        Path root = Paths.get(savesDir);

        AtomicInteger count = new AtomicInteger(0);
        Files.walk(root).forEach(p -> {
            try {
                Files.setAttribute(p, "unix:mode", 02770); // rwxrws---
// 最好需要把用户组也修复了,有一部分文件用户组也变成应用程序用户组而不是ext_data_rw了可能出问题
                count.incrementAndGet();
                System.out.println(p);
            } catch (Exception e) {
                System.err.println("失败: " + p + " -> " + e.getMessage());
            }
        });
    }
}

由于启动器有内置“存档文件夹”等快捷按钮,这个问题应该视为功能部分不可用。建议添加一个全局或本地选项,例如“自动修复权限”之类的,在游戏运行结束后自动将对应的存档文件夹内文件权限恢复,以保持和Android权限模型的兼容性,或者如果觉得自动操作存在风险至少也应该考虑在设置中提供一个手动点击以重置权限的按钮。

Log File / 日志文件

(非游戏崩溃问题)

错误信息
java.io.FileNotFoundException: /storage/emulated/0/​Android/data/com.movtery.zalithlauncher.v2/files/.minecraft/versions/26.1.2 NeoForge 26.1.2.74/saves/新的世界 (1)/level.dat: open failed: EACCES (Permission denied)
	at libcore.io.IoBridge.open(IoBridge.java:574)
	at java.io.RandomAccessFile.<init>(RandomAccessFile.java:289)
	at l.ۡۢۜ.<init>(E4GC:23)
	at l.ܰۢۜ.ܽ(O4XF:27)
	at l.᩹᩷۫.ۢ(4172:463)
	at l.ᩴܳ۫.ܺ(T17L:492)
	at l.᩸᩹۫.ܽ(Native Method)
	at l.۫᩹۫.call(SB3I:570)
	at java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
	at java.lang.Thread.run(Thread.java:1019)
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
	at libcore.io.Linux.open(Native Method)
	at libcore.io.ForwardingOs.open(ForwardingOs.java:563)
	at libcore.io.BlockGuardOs.open(BlockGuardOs.java:274)
	at libcore.io.ForwardingOs.open(ForwardingOs.java:563)
	at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:9535)
	at libcore.io.IoBridge.open(IoBridge.java:560)
	... 11 more

Screenshots or Videos / 截图或视频

Image Image

Reproduction Steps / 复现步骤

  1. 安装较新的 Minecraft (如 26.1.2)
  2. 创建一个存档或打开一个现有存档,然后保存并退出
  3. 回到版本概览页面,点击“存档文件夹”(或者使用其他方式)导航到存档所在文件夹
  4. 试图使用打开的第三方文件管理器访问存档,打开其中文件(如level.dat)或复制文件到其他地方
  5. 问题出现:拒绝访问。
    stat:
  File: /storage/emulated/0/​Android/data/com.movtery.zalithlauncher.v2/files/.minecraft/versions/26.1.2 NeoForge 26.1.2.74/saves/新的世界 (1)/level.dat
  Size: 599       	Blocks: 8          IO Block: 4096   regular file
Device: 0,137	Inode: 1991329     Links: 1
Access: (0600/-rw-------)  Uid: (10277/ u0_a277)   Gid: (10277/ u0_a277)
Context: u:object_r:fuse:s0
Access: 2026-06-08 01:48:47.736340490 +0800
Modify: 2026-06-08 01:48:47.740340490 +0800
Change: 2026-06-08 01:48:47.744340490 +0800
 Birth: -

Android Version / Android 版本

14

Launcher Version / 启动器版本

2.4.6 (200028)

Device Information / 设备信息

Linux localhost 5.15.104-android13-8-g246fd86c5778 #1 SMP PREEMPT Tue Jan 6 10:49:33 UTC 2026 aarch64 Android

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions