java - 从非主线程读取/proc/self/exe 时,Android 权限被拒绝

标签 java android linux system

我正在尝试获取/proc/self/exe 的规范路径。当我在主线程上执行此操作时它可以工作,当我在另一个线程上执行此操作时它会崩溃并出现 IOException: "Permission denied":

                   DBG  E  Thread: main
                        E  Path: /system/bin/app_process32
                        E  Thread: Thread-21656
            System.err  W  java.io.IOException: Permission denied
                        W      at java.io.File.canonicalizePath(Native Method)
                        W      at java.io.File.getCanonicalPath(File.java:414)
                        W      at java.io.File.getCanonicalFile(File.java:428)
                        W      at com.quanturium.testbugprocselfexe.MyActivity.getPathOfExecutable(MyActivity.java:36)
                        W      at com.quanturium.testbugprocselfexe.MyActivity.access$000(MyActivity.java:12)
                        W      at com.quanturium.testbugprocselfexe.MyActivity$1.run(MyActivity.java:26)
                        W      at java.lang.Thread.run(Thread.java:818)

代码:

@Override
protected void onCreate (Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    getPathOfExecutable(); // Works as expected

    new Thread(new Runnable() {
        @Override
        public void run ()
        {
            getPathOfExecutable(); // Trigger the IOException: Permission denied
        }
    }).start();
}

private void getPathOfExecutable()
{
    try
    {
        Log.e("DBG", "Thread: " + Thread.currentThread().getName());
        Log.e("DBG", "Path: " + new File("/proc/self/exe").getCanonicalFile().getPath());
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

只有在build.gradle文件中将debuggable配置为false时才会出现这个错误

试用代码:https://github.com/quanturium/TestBugProcSelfExe

这是错误还是预期的行为?获取当前可执行文件路径的解决方法是什么?

最佳答案

代码是否阻塞?如果没有,在主线程中运行它应该没有任何后果。但是,您可以从另一个线程执行此操作,方法是:

Context.runOnUiThread(new Runnable() {
    getPathOfExecutable();
});

这是我能想到的最干净的解决方法,除了编辑文件的权限(如果不在主线程上运行代码就无法获得路径),因为你有读/写权限/proc/self/exe.

这很奇怪,我还在研究android上不同线程的权限差异。

如果你能让它在主线程中工作,我的意见是只在主线程中进行,而不用担心优化,因为在不同线程上的性能没有差异。

关于java - 从非主线程读取/proc/self/exe 时,Android 权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28590831/

相关文章:

c# - 写入后是否必须优化lucene索引?

java - 寻找开源 Java Help API

asp.net - 在 Linux 上部署 .Net Web 应用程序

java - Tomcat 6 由于堆大小而无法启动

linux - 如何在 shell 脚本中运行 SQL 查询时获得类似 SQLPLUS 的输出

Java如何以编程方式初始化二维对象数组?

java - Java 中最接近 Double 的 int

android - 如何使用 adb 工具调用 GC?

android - 无法缩放或翻转 surfaceview 矩阵

android - Compose 中带圆角的 CircularProgressIndicator