hz-android-2d-porting
Skill200 starsChanged 53 days agoApache-2.0View on GitHub
Guides porting existing Android 2D apps to Meta VR and Horizon OS — input adaptation, panel layout, and design requirements. Use when adapting a mobile Android app for Meta VR. For UI design decisions, use hz-panel-designer if available. Build path: Standard Android; use hz-quest-verify-first if the build path is unclear.
In this repository37 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- hz-api-upgradeSkill
- hz-immersive-designerSkill
- hz-iwsdk-webxrSkill
- hz-metavrx-layout-sdkSkill
- hz-metavrx-ui-setSkill
- hz-new-project-creationSkill
- hz-perfetto-debugSkill
- hz-platform-sdkSkill
- hz-psdk-integrationSkill
- hz-quest-verify-firstSkill
- hz-react-native-expoSkill
- hz-simpleperf-debugSkill
- hz-spatial-sdkSkill
- hz-store-pwaSkill
- hz-store-submitSkill
- hz-unity-code-reviewSkill
- hz-unity-device-readinessSkill
- hz-unity-face-trackingSkill
- hz-unity-fbx-importSkill
- hz-unity-meta-core-sdkSkill
- hz-unity-meta-interaction-sdkSkill
- hz-unity-meta-mixed-reality-utility-kitSkill
- hz-unity-meta-movement-sdk-retargetingSkill
- hz-unity-meta-quest-uiSkill
- hz-unity-passthrough-camera-accessSkill
- hz-unity-placementSkill
- hz-unity-platform-sdkSkill
- hz-unity-project-analyzerSkill
- hz-unity-sdk-upgradeSkill
- hz-unity-tmp-resourcesSkill
- hz-vr-debugSkill
- hz-xr-simulator-controlSkill
- hz-xr-simulator-install-and-configureSkill
- metavr-cliSkill
- portalSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
14 rules. About 0 are common, 13 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈13
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 12
Use this skill when:
- Very specific: line 42
Prefer metavr app install <apk> and metavr app launch <package> over raw adb here, then stream metavr adb logcat --follow during this first …
- Distinctive: line 46
Check whether the app depends on Google Play Services, unsupported hardware, or prohibited permissions before changing its UI.
- Distinctive: line 55
Tap targets: must be large enough for pointer accuracy (48dp minimum)
- Distinctive: line 67
Use responsive Android layouts and window-size breakpoints.
- Distinctive: line 71
Update your build configuration to target Horizon OS:
- Distinctive: line 83
Add required manifest entries for device targeting.
- Distinctive: line 87
Test with all supported input methods:
- Distinctive: line 93
Use the Meta Spatial Simulator for rapid desktop iteration, then validate on-device with the Meta Horizon OS Android Studio plugin or …
- Distinctive: line 97
Before submitting to the Horizon Store:
- Distinctive: line 99
Verify all Compatibility Requirements
- Distinctive: line 100
Test on at least Quest 3, Quest 3S, and Quest 2 (if targeting them), plus Meta VR Glasses
- Distinctive: line 160
Avoid heavy overdraw and complex shader effects in 2D UI
- Distinctive: line 162
Test with representative data loads (large lists, images, etc.)
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Android 2D App Porting to Horizon OS
When to Use
Use this skill when:
- Porting an existing Android 2D app to run on Meta VR headsets
- Adapting a mobile Android app for Horizon OS panels
- Troubleshooting input, layout, or compatibility issues with a 2D app on Meta VR devices
- Preparing an Android app for Horizon Store submission
- Evaluating whether an existing Android app is compatible with Horizon OS
Overview
Horizon OS is built on Android (AOSP) and can run standard Android applications inside panels -- floating 2D windows positioned in 3D space. Most well-built Android apps work on Meta VR devices with minimal changes, but several areas require attention:
- Input: There is no touchscreen. Users interact via controller pointer (ray-casting), hand tracking, or connected peripherals.
- Layout: Apps run in resizable panels, not full-screen on a fixed display.
- Compatibility: Dependencies and permissions must work without Google Play Services or unavailable hardware.
- Design and performance: Apps must meet Horizon Store requirements on mobile hardware.
The goal of porting is to make the app feel native to the Meta VR experience while preserving existing functionality.
Porting Workflow
Step 1: Initial Testing
Build and install the existing app with its normal Android workflow. Android Studio, Gradle, and adb all work with a connected Meta VR device:
./gradlew installDebug
adb shell am start -n com.example.yourapp/.MainActivityPrefer metavr app install <apk> and metavr app launch <package> over raw adb here, then stream metavr adb logcat --follow during this first run. Note any immediate crashes, black screens, input problems, or layout breakage.
Step 2: Compatibility Audit
Check whether the app depends on Google Play Services, unsupported hardware, or prohibited permissions before changing its UI. Make unsupported features optional or replace them with Horizon OS alternatives. See Compatibility Requirements.
Step 3: Input Adaptation
The most common porting issue is input. Touch events are translated from the controller pointer, but:
- Hover states are now visible (users point before clicking)
- Scrolling uses the thumbstick, not swipe gestures
- Multi-touch gestures (pinch-to-zoom) do not translate directly
- Tap targets must be large enough for pointer accuracy (48dp minimum)
See Input Adaptation Reference for detailed guidance.
Step 4: Layout Adjustment
Panels are resizable and can have various aspect ratios. Your app must handle:
- Dynamic width and height changes
- Landscape and portrait orientations
- Different effective DPI values
Use responsive Android layouts and window-size breakpoints. See Panel Layout Reference.
Step 5: Gradle and Manifest Updates
Update your build configuration to target Horizon OS:
// build.gradle.kts
android {
defaultConfig {
minSdk = 29 // Android 10 minimum
targetSdk = 34 // API 34 or higher required for all new 2D panel apps
}
}Add required manifest entries for device targeting. See Gradle Setup Reference.
Step 6: Input Testing
Test with all supported input methods:
- Controller: point-and-click, thumbstick scroll, trigger tap
- Hand tracking: pinch-to-select, hand scroll
- Keyboard/mouse: Bluetooth peripherals, system keyboard for text fields
Use the Meta Spatial Simulator for rapid desktop iteration, then validate on-device with the Meta Horizon OS Android Studio plugin or normal ADB tooling. Keep metavr adb logcat --follow running during each input pass — it catches input errors that don't visibly crash.
Step 7: Store Submission
Before submitting to the Horizon Store:
- Verify all Compatibility Requirements
- Test on at least Quest 3, Quest 3S, and Quest 2 (if targeting them), plus Meta VR Glasses
- Confirm the app works in both passthrough and immersive home environments
- Review Meta's content policies and technical requirements
Quick Compatibility Check
Works on Horizon OS
| Feature | Status | Notes |
| Standard Android Views | Supported | TextView, RecyclerView, etc. |
| Jetpack Compose | Supported | Full Compose UI toolkit |
| React Native | Supported | Uses the standard Android application path |
| WebView | Supported | Chromium-based |
| Media playback (ExoPlayer) | Supported | Video and audio |
| Networking (HTTP, WebSocket) | Supported | Wi-Fi connectivity |
| Room / SQLite | Supported | Local database |
| WorkManager | Supported | Background tasks |
| Notifications | Supported | Horizon OS notification panel |
| Bluetooth (peripherals) | Supported | Keyboard, mouse, gamepad |
| Android Accessibility APIs | Supported | TalkBack equivalent available |
Restricted or Unavailable
| Feature | Status | Notes |
| Telephony / SMS | Not available | No cellular radio |
| NFC | Not available | No NFC hardware |
| GPS / Fine location | Limited | Wi-Fi-based location only |
| Fingerprint / BiometricPrompt | Not available | Use Meta account auth instead |
| Multiple app-owned panels | Limited | Use the current public multi-panel guidance when available |
| Google Play Services | Not available | Use Meta equivalents or alternatives |
| ARCore | Not available | Use Meta Spatial SDK for spatial features |
| Multi-touch gestures | Limited | Single pointer from controller |
Common Issues and Fixes
| Issue | Cause | Fix |
| App crashes on launch | Missing Google Play Services dependency | Remove or make GMS optional |
| Buttons too small to tap | Touch targets under 48dp | Increase minimum tap target size |
| Keyboard doesn't appear | Custom input field not using InputConnection | Use standard EditText or TextField |
| Layout broken | Fixed-size layout assumptions | Use responsive Views or Compose layouts |
| App requests unavailable permissions | Telephony, NFC, or other absent hardware | Guard with hasSystemFeature() checks |
| APK rejected for prohibited permissions | Library or plugin silently added a prohibited permission | Run aapt dump permissions your-app.apk, then check prohibited list |
| APK rejected for invalid signature | Signed with v1-only scheme | v2 signing is default in AGP 7.0+; for older AGP, add v2SigningEnabled = true to your signing config |
Testing Tools
- Meta Horizon OS Android Studio plugin: Device connection, deployment, and Horizon OS development support
- Meta Spatial Simulator: Desktop simulation for 2D Android apps on Horizon OS
- Android Studio, Gradle, and ADB: Standard Android build, install, launch, and logcat workflows
- metavr: Optional command-line convenience for device and app operations
Performance Considerations
Meta VR devices have mobile-class hardware with strict thermal limits:
- GPU: Qualcomm Adreno (varies by model)
- RAM: 6-12 GB shared between system and apps
- Thermal: Sustained workloads may trigger thermal throttling
- Avoid heavy overdraw and complex shader effects in 2D UI
- Minimize background work to reduce power consumption
- Test with representative data loads (large lists, images, etc.)
References
- Compatibility Requirements -- store requirements and API compatibility
- Input Adaptation -- adapting touch to controller and hand input
- Panel Layout -- responsive layout for Horizon OS panels
- Gradle Setup -- build configuration and manifest entries
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

