System API 접근 및 확장
Android Framework는 다양한 API를 제공하며, 이 중 일부는 공식적으로 공개되지 않은 System API로 분류됩니다. 이러한 System API는 기본적으로 일반 애플리케이션에서는 접근할 수 없도록 제한되지만, 특정 조건을 만족할 경우 활용할 수 있습니다. 이번 포스팅에서는 System API 접근 방법과 이를 활용한 기능 확장, 숨겨진 API 접근 방법, 그리고 커스텀 System API를 추가하는 방법에 대해 설명하겠습니다.
1. 숨겨진 API 접근 방법 (Hidden API)
Android에서는 일부 API가 공식적으로 숨겨져 있으며, 이러한 API를 Hidden API라고 부릅니다. 일반적으로 SDK에서 제공하는 API만 사용할 수 있지만, Hidden API를 활용하면 보다 깊은 시스템 접근이 가능합니다.
1.1 Hidden API의 특징
- Android SDK에 노출되지 않음: 공식적인 API 문서에서 찾을 수 없습니다.
- Java 리플렉션(Reflection)을 통해 접근 가능: 직접 호출이 불가능한 경우 리플렉션을 사용할 수 있습니다.
- Proguard 및 API 제한 정책으로 보호됨: 일부 API는 접근 제한이 걸려 있습니다.
1.2 Hidden API 우회 방법
1.2.1 Java 리플렉션을 이용한 접근
import java.lang.reflect.Method;
public class HiddenApiAccess {
public static void main(String[] args) {
try {
Class<?> activityThread = Class.forName("android.app.ActivityThread");
Method currentActivityThread = activityThread.getDeclaredMethod("currentActivityThread");
currentActivityThread.setAccessible(true);
Object at = currentActivityThread.invoke(null);
System.out.println("ActivityThread: " + at);
} catch (Exception e) {
e.printStackTrace();
}
}
}
이 방식은 특정 Android 버전에서 동작할 수 있지만, 최신 버전에서는 hidden API enforcement
가 적용되어 실행되지 않을 수도 있습니다.
1.2.2 VMRuntime
을 활용한 제한 해제
Android 9(Pie) 이후에는 hidden API enforcement
가 적용되어 리플렉션을 통한 접근이 제한됩니다. 이를 우회하기 위해 VMRuntime
클래스를 이용할 수 있습니다.
import dalvik.system.VMRuntime;
public class HiddenApiBypass {
public static void disableHiddenApiRestriction() {
try {
Method setHiddenApiExemptions = VMRuntime.class.getDeclaredMethod("setHiddenApiExemptions", String[].class);
setHiddenApiExemptions.setAccessible(true);
setHiddenApiExemptions.invoke(VMRuntime.getRuntime(), new Object[]{new String[]{"L"}});
} catch (Exception e) {
e.printStackTrace();
}
}
}
이 방법을 사용하면 hidden API
제한을 일부 우회할 수 있지만, 최신 Android 버전에서는 SELinux 정책과 ART의 보안 강화로 인해 동작하지 않을 수도 있습니다.
2. System API를 활용한 기능 확장
System API는 일반 애플리케이션에서 사용할 수 없으며, system
또는 platform
권한을 가진 애플리케이션에서만 접근 가능합니다. System API를 활용하려면 privileged 또는 system 앱으로 빌드해야 합니다.
2.1 System API를 활용하는 방법
2.1.1 System API 사용을 위한 Manifest 설정
AndroidManifest.xml에 privileged
또는 system
권한을 선언해야 합니다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.systemapi">
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
<application android:sharedUserId="android.uid.system">
<uses-library android:name="android.ext.services" />
</application>
</manifest>
2.1.2 System API를 활용한 설정 변경
예를 들어, Settings.Global
을 활용하여 특정 시스템 설정을 변경할 수 있습니다.
import android.content.ContentResolver;
import android.provider.Settings;
public class SystemSettingsChanger {
public static void changeSetting(ContentResolver contentResolver) {
Settings.Global.putInt(contentResolver, Settings.Global.AIRPLANE_MODE_ON, 1);
}
}
이 API는 일반 앱에서는 사용할 수 없으며, system
권한을 가진 앱에서만 실행됩니다.
3. 커스텀 System API 추가
AOSP(Android Open Source Project)를 수정하여 새로운 System API를 추가할 수도 있습니다. 이를 위해서는 AOSP 소스를 수정하고, 새 API를 프레임워크에 추가해야 합니다.
3.1 새로운 System API 추가 방법
3.1.1 AOSP 코드 수정
프레임워크의 Java 코드(frameworks/base/core/java/android/app/
)에 새로운 API를 추가할 수 있습니다.
예를 들어, SystemService.java
에 새로운 API를 추가할 수 있습니다.
package android.app;
public class SystemService {
public static void myCustomApi() {
// 새로운 기능 추가
}
}
3.1.2 AIDL을 활용한 API 확장
AOSP에서는 AIDL
(Android Interface Definition Language)을 활용하여 새로운 시스템 API를 만들 수 있습니다.
예를 들어, frameworks/base/core/java/com/example/IMyCustomService.aidl
파일을 생성합니다.
package com.example;
interface IMyCustomService {
void myCustomMethod();
}
이후, 서비스 구현 클래스를 작성합니다.
public class MyCustomService extends IMyCustomService.Stub {
@Override
public void myCustomMethod() {
// API 동작 로직 구현
}
}
3.2 빌드 및 적용
mm
명령어를 이용하여 프레임워크를 리빌드합니다.- 변경된 프레임워크를 기기에 플래싱합니다.
make -j8
adb remount
adb sync
adb reboot
결론
System API는 Android의 핵심 기능을 활용하는 강력한 도구이지만, 기본적으로 접근이 제한되어 있습니다. Hidden API를 활용하면 제한된 기능을 사용할 수 있으며, System API를 직접 확장하여 새로운 기능을 추가할 수도 있습니다. 다만, 이러한 작업은 보안 정책 및 버전별 제한 사항을 고려해야 하므로 신중한 접근이 필요합니다.
'Android > Framework' 카테고리의 다른 글
AOSP 소스 코드 수정 및 커스텀 기능 추가 (0) | 2025.04.19 |
---|---|
AOSP 빌드 및 환경 설정 (0) | 2025.04.17 |
Android의 주요 IPC 기법 (0) | 2025.04.15 |
Application과 Framework의 관계 (0) | 2025.04.14 |
Android Framework에서 새로운 시스템 서비스 추가 및 활용 (0) | 2025.04.13 |