skills/L2-framework-services-expert/SKILL.md
--- name: framework-services-expert layer: L2 path_scope: frameworks/base/, frameworks/native/, libcore/, libnativehelper/ version: 1.1.0 android_version_tested: Android 16 parent_skill: aosp-root-router --- ## Path Scope | Path | Responsibility | |------|---------------| | `frameworks/base/` | Core Android Java framework | | `frameworks/base/services/` | System services running in SystemServer | | `frameworks/base/services/core/java/com/android/server/` | ActivityManagerService, PackageManage
npx skillsauth add jonaschen/Android-Software framework-services-expertInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| Path | Responsibility |
|------|---------------|
| frameworks/base/ | Core Android Java framework |
| frameworks/base/services/ | System services running in SystemServer |
| frameworks/base/services/core/java/com/android/server/ | ActivityManagerService, PackageManagerService, WindowManagerService, etc. |
| frameworks/base/core/java/android/ | Public Android API (android.* packages) |
| frameworks/base/api/ | API surface files: current.txt, system-current.txt |
| frameworks/base/cmds/ | Platform command-line tools (am, pm, wm) |
| frameworks/native/ | Native C++ services and libraries |
| frameworks/native/services/ | SurfaceFlinger, inputflinger, sensorservice |
| frameworks/native/libs/ | libbinder, libgui, libui, libcutils |
| libcore/ | Java core libraries (OpenJDK subset) |
| libnativehelper/ | JNI utilities |
Load this skill when the task involves:
@SystemApi, @TestApi, or @HideApi annotation questionsframeworks/base/api/)IBinder, AIDL within frameworks/ (not HAL — see HAL skill)ContentProvider, BroadcastReceiver, Service lifecycle in platform codeandroid.permission.* system permission additions@SystemService annotation and service registrationframeworks/native/services/init → zygote → system_server process
│
SystemServer.main()
│
startBootstrapServices() ← ActivityManagerService, PackageManagerService
│
startCoreServices() ← BatteryService, UsageStatsService
│
startOtherServices() ← WindowManagerService, InputManagerService, ...
│
AMS.systemReady() ← System is ready; third-party apps may start
1. Define AIDL interface in frameworks/base/core/java/android/<pkg>/I<Name>.aidl
- Use @SystemApi if only privileged callers are allowed
- Annotate with @EnforcePermission("<PERMISSION>") for access control
2. Implement the service:
frameworks/base/services/core/java/com/android/server/<Name>Service.java
- Extend SystemService
- Override onStart(), onBootPhase()
3. Register in SystemServer:
frameworks/base/services/java/com/android/server/SystemServer.java
- Add to startOtherServices() or appropriate stage
4. Add Watchdog monitor if service holds locks:
Watchdog.getInstance().addMonitor(mService);
Watchdog.getInstance().addThread(mHandler);
5. Declare permission in:
frameworks/base/core/res/AndroidManifest.xml
6. Update API surface:
m update-api ← regenerates frameworks/base/api/current.txt
| File | Audience | Annotation |
|------|---------|-----------|
| current.txt | Public API — all apps | (none) |
| system-current.txt | System/privileged apps | @SystemApi |
| test-current.txt | Test infrastructure | @TestApi |
| module-lib-current.txt | Mainline module internals | @SystemApi(MODULE_LIBRARIES) |
Rule: Any method or class addition visible outside the package must be reflected in the appropriate api/*.txt file. Run m update-api after changes.
Watchdog monitors threads for lock starvation (default timeout: 60s).
Triggers a system_server crash to recover from deadlock.
Common causes:
- Holding a lock inside a Binder call (remote process may be dead)
- Blocking the main thread on disk I/O
- Waiting for a broadcast receiver with no timeout
Mitigation patterns:
- Use Handler + HandlerThread for async work
- Never call into another service while holding your own lock
- Use android.os.Trace.traceBegin/End() to instrument critical paths
ServiceManager.addService("name", binder).ServiceManager.getService("name").frameworks/base/ use /dev/binder (not /dev/vndbinder).Normal permission: Granted at install, no user prompt
Dangerous permission: User must grant at runtime (READ_CONTACTS, etc.)
Signature permission: Only apps signed with same cert as definer
Privileged permission: Only pre-installed privileged apps
Declare in: frameworks/base/core/res/AndroidManifest.xml
Enforce in: service code via:
mContext.enforceCallingOrSelfPermission(Manifest.permission.MY_PERM, "reason");
or annotation:
@EnforcePermission(Manifest.permission.MY_PERM)
| Change | Impact |
|--------|--------|
| Foreground service restrictions | BOOT_COMPLETED receivers cannot launch certain FGS types; throws ForegroundServiceStartNotAllowedException |
| New mediaProcessing FGS type | Foreground service type for transcoding and media processing |
| Minimum targetSdkVersion 24 | Apps below API 24 blocked from installation |
| Compiler filter override API | setAdjustCompilerFilterCallback for per-package compiler customization |
| Soft restart deprecated | Runtime restart via SoftRestart mechanism removed |
system/core/ — all Java services live under frameworks/base/services/.frameworks/base/api/current.txt manually — always run m update-api to regenerate; manual edits will cause build failures.Thread.sleep() or blocking I/O on the system_server main thread — this causes ANR and Watchdog kills.@hide alone to protect a system API — @hide only prevents SDK access; security enforcement requires explicit permission checks.ServiceManager.addService() from a vendor process — vendor code must register HALs via servicemanager using AIDL HAL, not framework ServiceManager.hardware/interfaces/ to this skill — HAL Binder is owned by L2-hal-vendor-interface-expert.# Find a system service implementation
grep -r "class.*extends SystemService" frameworks/base/services/
# Find where a service is registered in SystemServer
grep -r "ServiceManager.addService\|startService" \
frameworks/base/services/java/com/android/server/SystemServer.java
# Check current API surface
cat frameworks/base/api/system-current.txt | grep "IMyInterface"
# Update API after changes
m update-api
# Find all callers of a system service method (by AIDL transaction)
grep -r "IMyService" frameworks/base/ --include="*.java"
# Check for Watchdog registrations
grep -r "Watchdog.getInstance().addMonitor\|addThread" frameworks/base/services/
| Condition | Hand off to |
|-----------|------------|
| New service requires SELinux domain | L2-security-selinux-expert |
| New service needs .rc file for startup | L2-init-boot-sequence-expert |
| Service exposes a HAL interface to vendor | L2-hal-vendor-interface-expert |
| Build fails after API changes | L2-build-system-expert |
| Service involves audio/video/camera | L2-multimedia-audio-expert |
Emit [L2 FRAMEWORK → HANDOFF] before transferring.
references/system_server_lifecycle.md — SystemServer boot phases and service registration patterns.frameworks/base/services/java/com/android/server/SystemServer.java — master service registry.frameworks/base/core/res/AndroidManifest.xml — platform permission declarations.ANDROID_SW_OWNER_DEV_PLAN.md §5 — L2 skill design spec.development
--- name: qualcomm-kernel-expert layer: L3 path_scope: vendor/qcom/opensource/, device/qcom/, kernel/msm-*/ version: 1.0.0 android_version_tested: Android 16 (GKI 6.12) parent_skill: kernel-gki-expert --- ## Path Scope | Path | Responsibility | |------|---------------| | `vendor/qcom/opensource/` | Qualcomm open-source kernel modules (camera, audio, wlan, data, video) | | `vendor/qcom/opensource/camera-kernel/` | Camera kernel drivers (IFE, IPE, IOMMU, CCI) | | `vendor/qcom/opensource/audio-ke
development
--- name: mediatek-kernel-expert layer: L3 path_scope: vendor/mediatek/kernel_modules/, vendor/mediatek/proprietary/, device/mediatek/, kernel/mediatek/ version: 1.0.0 android_version_tested: Android 16 (GKI 6.12) parent_skill: kernel-gki-expert --- ## Path Scope | Path | Responsibility | |------|---------------| | `vendor/mediatek/kernel_modules/` | MediaTek out-of-tree kernel modules (connectivity, GPU, display, camera, audio) | | `vendor/mediatek/kernel_modules/connectivity/` | CONNSYS / WM
development
--- name: <oem-or-soc>-<subsystem>-expert layer: L3 path_scope: vendor/<oem>/, device/<oem>/ version: 1.0.0 android_version_tested: Android 16 parent_skill: <L2-parent-skill-name> --- ## Path Scope | Path | Responsibility | |------|---------------| | `vendor/<oem>/` | OEM-proprietary code, BSP blobs, vendor HALs | | `device/<oem>/<device>/` | Device-specific configuration, BoardConfig, overlays | | <!-- Add OEM-specific paths below --> | | ### Inherited Paths (from parent L2 skill) This L3 s
development
--- name: L2-virtualization-pkvm-expert layer: L2 path_scope: packages/modules/Virtualization/, external/crosvm/, frameworks/libs/vmbase/ version: 1.1.0 android_version_tested: Android 16 parent_skill: aosp-root-router --- # L2 Expert: pKVM / Android Virtualization Framework ## Path Scope | Path | Description | |------|-------------| | `packages/modules/Virtualization/` | AVF mainline module — VirtualizationService, Microdroid, VmPayloadService, vmbase | | `packages/modules/Virtualization/mic