Android 检查自己进程持有的FD
工作中遇到一个问题,设备节点之前打开,但是后续打不开,只能杀死app才能继续打开。
一度怀疑是close没有生效,导致进程还是持有fd,所以再打开不允许了。
检查进程持有FD的方法。本代码只能检查自身的,不能检查其他进程的。这个是debug用的代码,实际使用,请自己修改。
private void testFileOpen() {
try {
Process process = Runtime.getRuntime().exec("ls -al " + "/proc/" + Os.getpid() + "/fd");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String s = bufferedReader.readLine();
while (s != null) {
Log.e("ricardo", s + "*****");
s = bufferedReader.readLine();
}
bufferedReader.close();
bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
s = bufferedReader.readLine();
while (s != null) {
Log.e("ricardo", s + "*****");
s = bufferedReader.readLine();
}
bufferedReader.close();
process.destroy();
} catch (IOException e) {
e.printStackTrace();
}
/* File file = new File("/proc/" + Os.getpid() + "/fd");
if (file.exists()) {
boolean f = file.canRead();
Log.e("ricarfo", f + "---");
if (f) {
File[] files = file.listFiles();
if (files != null) {
for (File file1 : files) {
Log.e("ricardo", "proc:" + file1.getAbsoluteFile());
}
}
}
}*/
}
改成runtime ls的原因,这些文件都是lk过去的,原名称都是:0,1。。这种数字编号,后面的file list没找到好方法。
实际结果类似:
lrwx------ 1 u0_a105 u0_a105 64 2022-02-28 22:07 0 -> /dev/null
lrwx------ 1 u0_a105 u0_a105 64 2022-02-28 22:07 1 -> /dev/null
lr-x------ 1 u0_a105 u0_a105 64 2022-02-28 22:07 10 -> /apex/com.android.art/javalib/apache-xml.jar
lr-x------ 1 u0_a105 u0_a105 64 2022-02-28 22:07 11 -> /system/framework/framework.jar
lr-x------ 1 u0_a105 u0_a105 64 2022-02-28 22:07 12 -> /system/framework/framework-graphics.jar
lr-x------ 1 u0_a105 u0_a105 64 2022-02-28 22:07 13 -> /system/framework/ext.jar
lr-x------ 1 u0_a105 u0_a105 64 2022-02-28 22:07 14 -> /system/framework/telephony-common.jar
lr-x------ 1 u0_a105 u0_a105 64 2022-02-28 22:07 15 -> /system/framework/voip-common.jar
lr-x------ 1 u0_a105 u0_a105 64 2022-02-28 22:07 16 -> /system/framework/ims-common.jar
lr-x------ 1 u0_a105 u0_a105 64 2022-02-28 22:07 17 -> /apex/com.android.i18n/javalib/core-icu4j.jar
lr-x------ 1 u0_a105 u0_a105 64 2022-02-28 22:07 18 -> /system/framework/mediatek-telephony-base.jar
lr-x------ 1 u0_a105 u0_a105 64 2022-02-28 22:07 19 -> /system/framework/mediatek-telephony-common.jar
lr-x------ 1 u0_a109 u0_a109 64 2022-02-28 22:08 65 -> /data/app/~~15-8Ne_j2O4FkyERUNNS1w==/com.sunmi.testhttp-tzrHTYs-YZGNyoismezr9A==/base.apk
顺便里面可以看到,打开了app的真实apk
另外:最后发现问题不是节点没释放,是因为我注册的广播没有反注册,导致打开了多次,所以我真实想要的打不开节点。