Potrzebuję uzyskać absolutną ścieżkę pliku przy użyciu deskryptora pliku, który został zwrócony przez getFileDescriptor(). Jak mogę to zrobić?Jak uzyskać ścieżkę do pliku za pomocą deskryptora pliku na urządzeniu z systemem Android?
Odpowiedz
W systemie działającym pod kontrolą jądra Linux, które byłyby wszystkie obecne Android implementacje każdy deskryptor pliku będzie mieć wpis w /proc/[processid]/fd
który jest dowiązaniem symbolicznym do celu deskryptora pliku - nie tylko dla zwykłych plików , ale także dla wielu innych możliwych celów, takich jak rury i gniazda.
Oto częściowy przykład dla biegania cat > /mnt/sdcard/foo
procesowego na urządzeniu android
$ ls -l /proc/3528/fd
lrwx------ shell shell 2013-06-06 10:31 0 -> /dev/pts/1
l-wx------ shell shell 2013-06-06 10:31 1 -> /mnt/sdcard/foo
lrwx------ shell shell 2013-06-06 10:31 2 -> /dev/pts/1
lrwx------ shell shell 2013-06-06 10:31 6 -> socket:[188850]
Czytanie łączy symbolicznych w Javie „pozostawiamy jako ćwiczenie dla czytelnika”.
Na komputerze stacjonarnym znajduje się narzędzie lsof
, które przegląda te katalogi dla wszystkich procesów i zrzuca listę otwartych plików - jednak nie byłoby to zbyt użyteczne na Androidzie, gdzie korzystanie z aplikacji ograniczyłoby użytkownika takie trolling. Ale nadal możesz wyszukać fd należące do samej aplikacji lub dowolny inny proces działający pod tym samym identyfikatorem użytkownika.
Dobry pomysł na zbadanie tych plików urządzeń USB! Jeśli tworzysz pakiet debugowania, możesz użyć powłoki adb "run-as your.package.name", aby uzyskać powłokę jako identyfikator użytkownika aplikacji, a następnie, gdy jest uruchomiony, użyj ls -l z tej powłoki na wejściach/proc procesu aplikacji sprawdzać łącza fd, zamiast zastanawiać się, jak to zrobić z java. –