我正在尝试获取/ proc / self / exe的规范路径。当我在主线程上执行此操作时,它可以工作,当我在另一个线程上执行此操作时,它会因IOException崩溃:“权限被拒绝”:
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
这是一个错误还是一个预期的行为?获取当前可执行文件路径的解决方法是什么?
答案 0 :(得分:1)
代码是否阻止?如果没有,则应该没有在主线程中运行它的后果。但是,您可以使用以下命令从另一个线程执行此操作:
Context.runOnUiThread(new Runnable() {
getPathOfExecutable();
});
这是我能想到的最干净的工作,没有编辑文件的权限(无论如何都无法在主线程上运行代码的路径)因为你有r / w权限的/ proc /自/ EXE。
这很奇怪,我仍在研究android上不同线程的权限差异。
如果你可以在主线程中使用它,我的意见是在主线程中执行它,而不用担心优化,因为在不同的线程上性能没有区别。
答案 1 :(得分:0)
获取当前可执行文件路径的解决方法是什么?
由于每个Android应用程序都是从Zygote派生的,这是由/system/bin/app_process
在系统启动时创建的虚拟机的第一个Java vm进程。
如果您尝试从Android应用中阅读/proc/self/exe
,则实际可执行文件将为/system/bin/app_process
。即使您在应用程序主线程之外阅读此内容,结果也是相同的,理论上也不会出现权限错误。
你问的问题是一个奇怪的问题,我已经在Android 2.3.3上使用以下代码进行了测试并且工作正常。
new Thread() {
/* (non-Javadoc)
* @see java.lang.Thread#run()
*/
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
Log.d(TAG, new File("/proc/self/exe").getCanonicalFile().getPath());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();