【发布时间】:2015-04-19 21:07:26
【问题描述】:
我正在尝试获取 /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
这是一个错误还是预期的行为?获取当前可执行文件路径的解决方法是什么?
【问题讨论】:
-
每当我遇到权限问题时,尽管权限不同,logcat 都会在打印异常之前准确提到缺少哪个权限。异常上方 10 行左右的内容是什么?
-
不,这是整个错误
-
这可能是整个错误,但是当我遇到issues reading Alarm names 时,有一个不同的日志条目与告诉我需要
READ_EXTERNAL_STORAGE权限的错误分开。 -
相信我,这就是一切。
-
canonicalizePath()方法,以几个包装器为模,是这样的:android.googlesource.com/platform/libcore/+/lollipop-release/…(假设您使用的是 Android 5.0)。我的猜测是readlink()因某种原因失败(“self”是一个符号链接),但我不知道为什么会这样。