Android 부팅시 동작하는 service app

개요

Booting시 동작하는 Service App을 안드로이드 AOSP에 탑재하는 것을 설명한다.

이는 Activity를 삭제하고 Service로만 이루어진 App으로서 Android AOSP(플랫폼)에 탑재하여 부팅시 Service를 구동시키는 것이다.

이 방법으로 App을 탑재하면 사용자는 App목록에서 볼 수 없고 디버깅 또는 현재 동작하는 서비스를 확인하여 구동을 확인할 수 있다.

AOSP에 탑재하기

BroadcastReceiver 설정

AOSP에 탑재하면 일단 Activity가 필요가 없다. 그렇기 때문에 manifests를 다음과 같이 구성 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.service"
android:sharedUserId="android.uid.system">

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

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<service android:name=".BootService"/>
<receiver android:name=".Autostart"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>

</manifest>

Activity가 없는 App으로 부팅을 감지하는 BroadcastReceiver와 Service로 이루어져 있다.

Boot를 감지하는 BroadcastReceiver는 다음과 같이 이루어 진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

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

ACTION_BOOT_COMPLETED를 수신시 BootService 서비스를 실행하는 동작을 수행하게 된다.

APK로 빌드 후 AOSP에 탑재하기

APK Build

위와 같이 Android Studio에서 APK로 빌드한다.

그 후 프로젝터폴더\app\build\outputs\apk\debug를 보면 app-debug.apk가 생성되어 있다.

해당 apk를 아래 폴더에 저장한다.
AOSP폴더\vendor\제조사\common\apps\프로젝트이름

apps폴더의 apps.mk에 추가한 프로젝트이름 폴더를 추가한다.

해당 폴더에 apk를 저장한 후 Android.mk를 추가한다.
예시는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := 프로젝트이름
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE :=
LOCAL_CERTIFICATE := platform
#LOCAL_OVERRIDES_PACKAGES :=
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#LOCAL_REQUIRED_MODULES :=
#LOCAL_PREBUILT_JNI_LIBS :=
include $(BUILD_PREBUILT)
공유하기