Разрешение Android INJECT_EVENTS - PullRequest
40 голосов
/ 21 марта 2011

Я пытаюсь создать приложение, которое будет иметь службу, работающую в фоновом режиме, которая будет способна вставлять события сенсорного экрана в любую активную работу. Я могу внедрить события в Activity, которая является частью моего приложения, вызвав Instrumentation.sendPointerSync(motionEvent);. Однако, если я пытаюсь сделать это без активности из моего приложения, я получаю ошибку разрешения, говорящую, что у меня нет разрешения INJECT_EVENTS. Я добавил это разрешение в свой манифест следующим образом: <uses-permission android:name="android.permission.INJECT_EVENTS"></uses-permission> Это все еще вызывает то же исключение разрешения, хотя. После небольшого поиска я получил ответ, что для получения разрешения INJECT_EVENTS ваше приложение должно быть подписано той же подписью, что и система. Однако мне неясно, что именно это означает. Я собираюсь найти собственный сборочный файл и подписать его той же подписью, с которой подписано приложение. Затем установите пользовательский rom на моем устройстве, затем установите мое приложение, и я смогу правильно вводить события касания? Если это так, то мне лучше начать с пользовательского рома, который уже собран, например, с этой страницы Или это ситуация, когда мне нужно будет получить git-копию Android спроектировать и построить все это myslef? И так или иначе кто-нибудь знает место, которое вы могли бы указать мне, чтобы заставить меня работать в правильном направлении, чтобы это произошло?

Ответы [ 6 ]

18 голосов
/ 07 апреля 2014

Чтобы добавить события в отдельный процесс, необходимо установить ваше приложение в / system / app и подписать ваш APK с системным сертификатом .

1. Добавить разрешение в манифест приложения

<uses-permission android:name="android.permission.INJECT_EVENTS"/>

2. Подпишите свой APK системным сертификатом

Для этого требуется, чтобы у вас был источник AOSP для создания хранилища ключей с ключами Google, используемыми для построения системы, работающей на телефоне.

Учитывая, что у вас есть каталог AOSP, @Eli отлично показывает, как создать хранилище ключей, используя хороший скрипт под названием 'keytool-importkeypair'

Используя в качестве примера IntelliJ, выберите «Создать подписанный APK» в меню «Сборка». Найдите созданное выше хранилище ключей, введите указанный пароль (например, android), при желании дайте ключу тот же пароль. Обратите внимание, что подписанный apk записывается в корень проекта (!), А не в типичное расположение (./out/production//).

3. Установить в / system / app /

adb root
adb remount
adb push MyApp.apk /system/app

«Установка» происходит автоматически. Однако обратите внимание, что, в отличие от обычного процесса установки приложения, любые нативные библиотеки в вашем APK не копируются в / system / lib /. Вам нужно будет сделать это вручную, если вы используете NDK для создания и вызова собственных библиотек.

12 голосов
/ 07 сентября 2011

На самом деле, это довольно просто на рутованном устройстве. Я думаю, что любое приложение, которое работает / system, получит доступ ко всем необходимым разрешениям. Так что просто установите приложение вручную в / system (как описано здесь http://androidforums.com/droid-all-things-root/64603-installing-apk-system-app-directory.html):

Выполните следующие команды в эмуляторе терминала, чтобы перемонтировать каталог / system в режим чтения / записи и установить приложение в каталог / system / app с SDCARD:

su
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
cp /sdcard/APP.apk /system/app

Если вы предпочитаете использовать adb со своего компьютера, выполните следующие команды:

adb remount
adb shell cp /sdcard/APP.apk /system/app

Некоторые пользователи использовали root explorer из магазина Google для упрощения этого процесса.


В качестве альтернативы, проверьте это: Как скомпилировать приложение Android с системными разрешениями

8 голосов
/ 04 февраля 2014

Использование событий Touch:

  1. Подпишите приложение той же подписью, с которой подписано ПЗУ
  2. Загрузите keytool-importkeypair, чтобы сделать это
  3. Найти платформу.pk8 + platform.x509.pem: {Android Source} / build / target / product / security
  4. Затем сгенерируйте сертификат:

    ./keytool-importkeypair -k google_certificate.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform

  5. Теперь экспортируйте ваше приложение из Eclipse и подпишите с новым сгенерированным сертификатом

  6. Сборка ПЗУ, прошивка на устройство, установка приложения

Проверка http://code.google.com/p/android-event-injector/

6 голосов
/ 03 июня 2015

Начиная с API 18, существует класс UiAutomation, который не связан с разрешениями пользователя.

Для получения дополнительной информации см http://developer.android.com/reference/android/app/Instrumentation.html#getUiAutomation()

4 голосов
/ 29 июля 2014

В случае, если кто-то ищет решение, чтобы обойти это разрешение уровня подписи и хочет создать сенсорные события.

Я посмотрел на источник до уровня C ++, где фактически проверяется, разрешать ли приложению создавать сенсорные события или нет. Ниже приведена функция, которая фактически проверяет, должно ли приложение быть разрешено или нет:

bool InputDispatcher::hasInjectionPermission(int32_t injectorPid, int32_t injectorUid) {
return injectorUid == 0
        || mPolicy->checkInjectEventsPermissionNonReentrant(injectorPid, injectorUid);
}

Таким образом, функция возвращает true для идентификатора пользователя приложения, установленного на 0.

Теперь я изменил uid, если мое приложение на 0, отредактировав файл /data/system/packages.xml. Этот файл содержит идентификатор, назначенный каждому приложению. Отредактируйте этот файл, установив атрибут userId, соответствующий вашему приложению, на 0.

Теперь все, что вам нужно, это принудительно закрыть приложение и перезапустить снова. Вы сможете обойти разрешение INJECT_EVENTS.

0 голосов
/ 28 сентября 2015

Хорошо, я наконец понял это.Поверьте мне, когда я говорю это, это, вероятно, худшее решение, если вы можете даже назвать это так.Для этого требуется root, а отключит проверку подписи всех пакетов в масштабе всей системы.Это может подвергнуть вас множеству атак, в которых опасное приложение заменяет нормальное.

В любом случае, с этим мы уходим:

  1. Установите Xposed
  2. Установите модуль XInstaller для Xposed
  3. В опциях XInstaller перейдите в меню «Установки» и установите флажок «Проверка подписей» и «Проверка приложений "

Вы должны быть хороши, чтобы пойти после перезагрузки.Ваше приложение даже не нужно устанавливать как системное, теперь его можно запускать в пользовательском пространстве, что, как я полагаю, облегчает разработку, поскольку вам больше не нужно копировать в / system / app

...