Oggi mi sono imbattuto nel porting di un codice per renderlo compatibile per Android 7, quindi nougat, da versione precedenti. Durante questa fase ho scoperto che dal SDK 25 in poi non vi è più la possibilità di listare tramite il listFiles della /proc .
Questo è avvenuto per motivi di sicurezza restringendo maggiormanete il raggio d'azione che differenzia Android da iOS. ( non di sicurezza sia ben inteso ) Il codice che vi incollo è quello relativo prima della versione SDK 25.
Questa funzione mi è utile per capire e recuperare il pid di un processo in background partendo dal suo nome. Resta ancora valido dalle versioni 25 in poi ma è ristretto ai permessi di lettura dell'utenza che esegue l'applicazione, quindi non listerà tutti i processi.
public static Listpidof(String str) { List < String > listOfPid = new ArrayList (); for (File file : new File("/proc").listFiles()) { if (!file.isFile()) { File file2; if (Build.VERSION.SDK_INT < 25) { file2 = new File(file.toString() + "/cmdline");; }else { file2 = new File(file.toString() + "/comm"); } if (file2.canRead()) { try { BufferedReader bufferedReader = new BufferedReader(new FileReader(file2), 8192); while (true) { String readLine = bufferedReader.readLine(); if (readLine == null) { break; } else if (readLine.toString().contains(str.toString())) { listOfPid.add(file2.getPath().split("\/")[2].toString()); } } bufferedReader.close(); } catch (IOException e) { } } else { continue; } } } return listOfPid; }
In alternativa, parliamo sempre di dispositivi con root, è possibile creare un piccolo script in sh:
sudo -c 'pidof nomeprocesso'
Salvarlo per esempio nella folder files della nostra app dandogli i permessi corretti tramite adb e successivamente richiamarlo tramite getRuntime().exec() Non so se esistano altri metodi validi e funzionali nel caso mi commentate suggerendomi?
Grazie a tutti!
Salutoni
GuiZ