2015-08-25 2 views
4

У меня есть приложение, которое использует API traffic stats, чтобы узнать, какие запущенные процессы используют сеть.Android M: Как получить все процессы UID?

Я использовал это, получив uid, полученный с помощью метода getRunningAppProcesses(). По-видимому, это было изменено в Android M, чтобы вернуть только имя вашего пакета приложений, как показано на рисунке here.

Мой вопрос: есть ли другой способ получить имя и UID всех запущенных процессов в Android M?

Вот пример того, как я делал это раньше, я хотел бы, чтобы воссоздать эту функциональность на Android M.

List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses(); 

PackageManager pm = context.getPackageManager(); 
for (int i = 0; i < procInfos.size(); i++) { 
    try { 
     String packageName = procInfos.get(i).processName; 
     String appName = ""; 
     try { 
      appName = pm.getApplicationLabel(
        pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA)) 
         .toString(); 
     } catch (NameNotFoundException e) { 
      appName = ""; 
     } 

     int uid = procInfos.get(i).uid; 
     long ulBytes = TrafficStats.getUidTxBytes(uid); 
     long dlBytes = TrafficStats.getUidRxBytes(uid); 
     // Do other stuff. 

Любая помощь очень ценится. Благодаря!

+0

То же самое происходит со мной. Любое решение? Я вижу https://code.google.com/p/android-developer-preview/issues/detail?id=2347, но никто не дает решения! – LopezAgrela

ответ

3

Вы можете использовать ActivityManager.getRunningServices(int maxNum):

PackageManager pm = context.getPackageManager(); 
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
List<ActivityManager.RunningServiceInfo> runningServices = am.getRunningServices(Integer.MAX_VALUE); 
for (ActivityManager.RunningServiceInfo service : runningServices) { 
    String appName; 
    try { 
     appName = pm.getApplicationInfo(service.process, 0).loadLabel(pm).toString(); 
    } catch (PackageManager.NameNotFoundException e) { 
     appName = null; 
    } 

    int uid = service.uid; 

    long ulBytes = TrafficStats.getUidTxBytes(uid); 
    long dlBytes = TrafficStats.getUidRxBytes(uid); 
} 

В документации говорится, что это не предназначено для производства. Я тоже не много тестировал. Если он не соответствует вашим требованиям, оставьте комментарий. Единственное, что я могу придумать, - это разбор выходного кода запуска ps в оболочке.

UPDATE

Синтаксический вывод ps в оболочке, мы можем получить текущие запущенные приложения. Пример:

PackageManager pm = context.getPackageManager(); 
// Get the output of running "ps" in a shell. 
// This uses libsuperuser: https://github.com/Chainfire/libsuperuser 
// To add this to your project: compile 'eu.chainfire:libsuperuser:1.0.0.+' 
List<String> stdout = Shell.SH.run("ps"); 
List<String> packages = new ArrayList<>(); 
for (String line : stdout) { 
    // Get the process-name. It is the last column. 
    String[] arr = line.split("\\s+"); 
    String processName = arr[arr.length - 1].split(":")[0]; 
    packages.add(processName); 
} 

// Get a list of all installed apps on the device. 
List<ApplicationInfo> apps = pm.getInstalledApplications(0); 

// Remove apps which are not running. 
for (Iterator<ApplicationInfo> it = apps.iterator(); it.hasNext();) { 
    if (!packages.contains(it.next().packageName)) { 
     it.remove(); 
    } 
} 

for (ApplicationInfo app : apps) { 
    String appName = app.loadLabel(pm).toString(); 
    int uid = app.uid; 
    long ulBytes = TrafficStats.getUidTxBytes(uid); 
    long dlBytes = TrafficStats.getUidRxBytes(uid); 
    /* do your stuff */ 
} 
+0

Привет, Джаред, Спасибо за ваш ответ! Я тестировал его, и он работает для служб, которые работают. Однако он пропускает все остальные процессы. Так, например, так как мое приложение не находится в сервисе, я не вижу использования своего собственного приложения. Также я попробовал запустить команду ps в оболочке adb, и он возвращает PID, но не тот uid, который мне нужен, так что не похоже, что это сработает. – Dave

+0

См. Мое обновление. Протестировано на Nexus 7 с последней версией Android 6.0. –

+0

Эй, Джаред, извините, мне потребовалось немного времени, чтобы ответить. Это похоже на действительно хороший ответ. У меня есть еще один вопрос для вас. Где вы получаете библиотеку Shell для Shell.SH.run («ps»); команда? Я не могу локально найти эту библиотеку. Я видел альтернативы с Runtime.getRuntime(). Exec ("ps") ;. Но я хотел бы посмотреть, смогу ли я получить ваш подход к работе. Благодаря! – Dave

Смежные вопросы