Как создать приложение для Android в качестве системного сервиса

Я столкнулся с проблемой с приложением, которое создано для запуска в качестве службы Android и должно запускаться при загрузке без какого-либо взаимодействия с пользователем или существующей активности.

Из других источников мы знаем, что это в принципе невозможно: http://commonsware.com/blog/2011/07/13/boot-completed-regression-confirmed.html

В настоящее время для целей тестирования приложение имеет очень простой графический интерфейс и регистрирует широковещательный приемник следующим образом:

public class MyAppReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent serviceIntent = new Intent(context, MyAppService.class);
            context.startService(serviceIntent);
        }
    }
}

Это прекрасно работает, если пользователь запускает приложение хотя бы один раз, чтобы получатель мог получить ACTION_BOOT_COMPLETED,

Цель состоит в том, чтобы полностью удалить графический интерфейс и при этом запустить приложение при загрузке без каких-либо действий со стороны пользователя. Обратите внимание, что это программное обеспечение не будет развернуто в Play Store, а скорее создано для того, чтобы быть частью пользовательской сборки AOSP, а не для публичного использования.

Единственное решение, которое я нашел, - это создать приложение как системный сервис, добавив его в платформу приложений Android.

Смотрите ссылки:

http://www.androidenea.com/2009/12/adding-system-server-to-android.html http://processors.wiki.ti.com/index.php/Android-Adding_SystemService

Однако я немного озадачен преимуществами и недостатками этой возможности и надеюсь, что кто-нибудь ответит на следующие вопросы:

1) Должно ли приложение быть построено со всей системой (AOSP из источника) и, следовательно, его нельзя развернуть как APK?

2) Есть ли способ обновить приложение впоследствии (с помощью APK) после сборки системы?

3) Возможно ли или даже удобно запускать приложение таким образом (в качестве системной службы) исключительно потому, что оно должно запускаться при загрузке, а не по другим причинам (например, создание экземпляра кода из него и т. Д.)?

Само приложение ничего особенного - это модель клиент / удаленный сервер, которая сообщает системную статистику для исследовательских целей.

РЕДАКТИРОВАТЬ

Добавляем манифест для полноты:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="org.myapp.myapp"
  android:versionCode="1"
  android:versionName="22.0">

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.INTERNET" />

<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">

    <activity android:name="myapp"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service
        android:name="org.myapp.myappclient.myappservice"
        android:label="myappservice">
        <intent-filter>
            <action android:name="org.myapp.myappclient.myappservice" />
        </intent-filter>
    </service>

    <receiver
        android:enabled="true"
        android:name="org.myapp.myappclient.myappreceiver"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

</application>

2 ответа

Если вы изменяете AOSP, вы можете создать "постоянное приложение"

https://developer.android.com/guide/topics/manifest/application-element

Это идет в теге вашего приложения в манифесте

<application
  persistent="true"
  ...
>

Должно ли приложение оставаться запущенным все время - "true", если должно, и "false", если нет. Значение по умолчанию неверно". Приложения обычно не должны устанавливать этот флаг; Режим сохранения предназначен только для определенных системных приложений.

Чтобы оно работало, это должно быть системное приложение.

Он запускается при загрузке, любые приложения с этим флагом запускаются непосредственно перед BOOT_COMPLETED намерение запускается из init.

Преимущества:

  • Это приведет к тому, что приложение будет поддерживаться ActivityManager.
  • Он будет автоматически перезапущен, если приложение умрет
  • Изменения жизненного цикла не приведут к закрытию вашего приложения

Затем вы можете создавать сервисы или делать все, что хотите.

Я уверен, что через 5 лет это не поможет, но может помочь кому-то другому:-)

  1. Теоретически вы должны иметь возможность развертывать свой apk отдельно, но вам все равно может потребоваться изменить процедуру загрузки, чтобы включить вашу службу в список программ / служб, которые нужно запустить.

  2. Да, ты можешь. Просто убедитесь, что вы используете тот же ключ, чтобы подписать пакет приложения.

  3. Это зависит Стоит ли идти вниз и модифицировать каркас приложения только для того, чтобы убедиться, что ваш сервис будет работать правильно, если ваш пользователь установит приложение, а затем просто покинет его? Я предполагаю, что вы могли бы включить примечание к выпуску где-нибудь, чтобы сообщить пользователям, что приложение не будет работать, пока они не запустят его хотя бы один раз после установки.

ОБНОВИТЬ

  1. Может быть, вы можете заставить свое приложение Launcher позаботиться об этом тогда.
  2. Я думаю, что здесь есть некоторая путаница. Предустановленные приложения не обязательно являются системными приложениями. Если ваше приложение не требует специальных разрешений, то это просто предустановленное пользовательское приложение. Подумайте только о том, что большинство телефонов поставляются с Facebook или Youtube и что эти приложения могут быть позже обновлены.

1. Нет необходимости создавать системный сервис, просто обычный сервис, который работает в фоновом режиме, вам не нужен графический интерфейс, поэтому не используйте активность, а сервис. 3. Если сделать это как системную службу, при возникновении ошибки вся система будет сброшена.

Другие вопросы по тегам