Intereting Posts

Разрешение READ_LOGS на Jelly Bean (api 16)

Поскольку Android Jelly Bean не поддерживает разрешение на чтение журналов (в соответствии с этим видео google io 2012 и этим тоже ), я хотел бы знать, возможно ли, чтобы корневые устройства (или ненагруженные устройства) могли обойти это Ограничение и возможность читать журналы.

Как мне это сделать? Действительно ли мне нужно сделать приложение системным приложением или достаточно укоренилось?

Solutions Collecting From Web of "Разрешение READ_LOGS на Jelly Bean (api 16)"

Вы можете получить разрешение на корневое устройство, выполнив команду pm grant из своего приложения. Вероятно, вам придется перезапустить приложение после этого, чтобы изменения вступили в силу:

String pname = getPackageName(); String[] CMDLINE_GRANTPERMS = { "su", "-c", null }; if (getPackageManager().checkPermission(android.Manifest.permission.READ_LOGS, pname) != 0) { Log.d(TAG, "we do not have the READ_LOGS permission!"); if (android.os.Build.VERSION.SDK_INT >= 16) { Log.d(TAG, "Working around JellyBeans 'feature'..."); try { // format the commandline parameter CMDLINE_GRANTPERMS[2] = String.format("pm grant %s android.permission.READ_LOGS", pname); java.lang.Process p = Runtime.getRuntime().exec(CMDLINE_GRANTPERMS); int res = p.waitFor(); Log.d(TAG, "exec returned: " + res); if (res != 0) throw new Exception("failed to become root"); } catch (Exception e) { Log.d(TAG, "exec(): " + e); Toast.makeText(context, "Failed to obtain READ_LOGS permission", Toast.LENGTH_LONG).show(); } } } else Log.d(TAG, "we have the READ_LOGS permission already!"); 

Этот код следует вызывать из вашего onCreate (). Как только разрешение будет предоставлено, больше нет полномочий root.

PS: блоки p.waitFor () в приложении Superuser, задерживают запуск приложения и потенциально вызывают ANR.


EDIT : Оказывается, adb shell pm grant работает только на эмуляторах. Производственные устройства не позволяют shell предоставлять и отменять дополнительные разрешения.


Вам не нужно иметь root. Единственное, что нужно включить READ_LOGS для не-системных приложений, – это установить Android SDK.

В принципе, вам нужно позвонить:

 adb shell pm grant <pkg.name> android.permission.READ_LOGS 

Где <pkg.name> – это имя пакета вашего приложения. Это возможно, потому что READ_LOGS – это не только «системное» разрешение, но и разрешение «разработки» (этот термин введен в JB). Что фактически позволяет пользователям предоставлять это разрешение любому приложению. Не требуется корень.

Дополнительная информация доступна в этом разделе групп google с комментариями от Dianne Hackborn.

У меня есть это на корневом устройстве, вызывая logcat с su и чтение из stdout

 ... .getRuntime().exec("su -c logcat -d"); 

Существует еще один способ доступа ко всем журналам без необходимости прав root. Вы можете использовать удаленную отладку. Взгляните на бесплатное приложение с открытым исходным кодом Logcat .