# RJNY/Obtainium-Emulation-Pack: hundreds of Android emulators as one importable JSON file

> This repository is not an application but a catalogue. It holds one JSON file describing how to find and update dozens of Android emulators and gaming utilities, packaged so that Obtainium, the Android app updater, can import the whole thing and keep every one of them current. The interesting engineering is in the tooling around that file, a validator, a normaliser, a generator and a live test harness that drives a connected device over adb.

**RJNY/Obtainium-Emulation-Pack** — An Obtainium import file containing an Android emulation pack 

- Repository: https://github.com/RJNY/Obtainium-Emulation-Pack
- Stars: 1,378 · Forks: 51
- Language: Python
- License: Unlicense
- Published: 2026-10-16 · Updated: 2026-10-16 · Language: en
- Canonical page: https://hysenlabs.com/projects/rjny-obtainium-emulation-pack

## A catalogue, not an application

The Obtainium Emulation Pack is a curated collection of Android emulators and gaming utilities for Obtainium, and the summary line says it plainly: an Obtainium import file containing an Android emulation pack. The promise in the README is that you import the pack and get automatic updates for every emulator on your device.

That framing matters because it changes what the repository is. There are no emulators in it. There is no APK and no build system for one. The repository holds configuration, a JSON description of each app, and the tooling to produce, validate and test that description.

The consumer is Obtainium, the Android app updater, and the flow is short. You install Obtainium from its releases, using `app-release.apk` if you are unsure which file to grab. Then you download `obtainium-emulation-pack-vX.X.X.json` from the latest release of this repository, open Obtainium, go to Import/Export and then Obtainium Import, and select the file. Obtainium then tracks and updates every included app.

If you do not want the whole pack, the README's tables carry an Add to Obtainium link per app, so you can take the handful you actually use and leave the rest.

## The configuration schema is the real product

Each entry in the pack is an Obtainium app configuration, and reading one tells you what the project is really doing. The entry for aPS3e, a PlayStation 3 emulator, carries an id, a source URL, an author, a name, a category of Emulator, an override source of GitHub, and an `additionalSettings` object with a long list of keys.

The list is the interesting part. There are `includePrereleases` set to false and `fallbackToOlderReleases` set to true, so the updater will not jump to a release candidate and will step back to an older release if the newest one is broken. There are `filterReleaseTitlesByRegEx` and `filterReleaseNotesByRegEx`, because a project whose release titles are inconsistent needs the updater to look at the notes. There is `sortMethodChoice` of date and `useLatestAssetDateAsReleaseDate`, `releaseTitleAsVersion` and `versionDetection` with `versionExtractionRegEx` and `matchGroupToUse`, which together decide how the version number is derived from a release that does not use tags conventionally.

Then there is `autoApkFilterByArch` with `apkFilterRegEx` and `invertAPKFilter`, which is how a project that publishes a separate APK per architecture gets the right one. And `includeZips` with `zippedApkFilterRegEx`, for projects that ship a zip. Then `shizukuPretendToBeGooglePlay`, `allowInsecure`, `exemptFromBackgroundUpdates` and `skipUpdateNotifications`, which control how the app installs and whether it phones home.

Every one of those is a decision a user would otherwise have to make by hand for every emulator. Encoding them once, per app, and sharing the result is the entire value proposition.

## The pipeline validates, normalises and generates

The repository is driven by a `justfile` that imports a `utility.just` helper, and the recipes are grouped, which makes the pipeline readable at a glance.

The release path is three steps in one recipe, `build: validate normalize generate`. The validate step runs a script that checks `src/applications.json` for errors, and the comment is specific about the three kinds it looks for, structure, regex syntax and source types. That last one matters, because a bad regular expression in a filter would silently break an update, and a source type that no longer exists would break the import.

The normalise step runs a second script that normalises key order and adds missing defaults in the same file. So the source file is hand-edited and machine-fixed, and the order of keys and the presence of every default are handled by a tool rather than by discipline. A Python tool configures it, and the `ruff.toml` at the root is the linter for those scripts.

There are two interactive helpers as well. `add-app` runs an interactive CLI to add a new app, and `package-id` resolves the Android package ID from a repository or release URL, which is the step that a new contributor would otherwise have to work out by installing the app and reading it out of the settings.

The release step tags, pushes and creates a GitHub release, and the artefact that comes out is a versioned JSON file whose name carries the version, which is what a user downloads and imports.

## Testing the catalogue against a real device

The most interesting tooling is the test harness, and it works against a connected Android device rather than against a mock.

The `test` recipe live-tests the app configurations, and the `test-cron` recipe is a dry run of the scheduled test workflow that creates no issues. The dry run writes its results to a temporary JSON file and processes them with a dry run flag and a local run URL, which is how the workflow can be exercised without spamming an issue tracker.

The daily tests badge in the README points at a scheduled workflow, so the configurations are checked on a timer rather than only when someone remembers.

The adb recipes make the manual part of that work possible. One types text into the focused input field on a connected device, and another takes a screenshot from the device and opens it:

```sh
adb shell input text '{{ text }}'
adb exec-out screencap -p > /tmp/adb-screenshot.png && open /tmp/adb-screenshot.png
```

The screenshot recipe is the kind of thing that only exists in a project where somebody has to look at a phone screen from a terminal, which is exactly the situation you are in when you are checking whether an emulator installed and launched correctly.

## The wider Obtainium ecosystem, and the licence

This pack sits inside a larger set of collections, and the README points at both of them.

The Obtainium maintainer hosts a broader collection of crowdsourced app configurations at apps.obtainium.imranr.dev, which is where the general purpose configs live, and the pages in this repository build on the same idea with the Add to Obtainium links pointing into that service. And for native Android ports, decompilations and recompilations of classic games, there is a separate Obtainium-Recomp-Decomp project on Codeberg.

That last one is worth pausing on, because the boundaries between these collections matter for what you install. A recompilation of a classic game is a port of software whose original publisher did not release the source, and the project is maintained separately for a reason. The emulation pack in this repository is the mainstream part of the family, the emulators that people publish as open source applications.

The licence here is the Unlicense, which is the most permissive of the common choices, it puts the work in the public domain and lets anyone do anything with it. For a repository of configuration data, that is a sensible and unusually clean choice, and it means a fork carries no attribution obligation and no restriction on how the catalogue is redistributed.

## Where this is the wrong thing to reach for

The first wrong case is expecting binaries here. The repository has no emulators in it, only the configuration that tells Obtainium where to find each project and how to pick the right asset. If you are looking for the software itself, the links in the tables take you to the upstream projects.

The second is a device you do not own. Obtainium is an Android app that installs and updates other apps, so the pack is a convenience for a device you administer, and a configuration catalogue is not a security control for a shared or managed device.

The third is assuming the pack stays correct. The value of the catalogue is that somebody checked each entry, and that checking is a recurring job. The daily test workflow and the validator exist because upstream projects change their release naming, their asset layout and their tag conventions, and an entry that was right a year ago will quietly stop updating. The version history shows how active that maintenance is, with v7.18.0 on 2026-09-26, v7.19.0 on 2026-10-06 and v8.0.0 on 2026-10-15, and the major version bump on the most recent release suggests the format itself changed in a way worth reading about before you import a specific file.

The fourth is a device where the emulators are not wanted. The pack is broad, it covers emulators for many console generations, and importing all of it means Obtainium will track and update apps you have no intention of running. The per app links exist precisely so you can take the two or three you need instead.

## Conclusion

Adopt this pack if you run Android emulators on a device and want them tracked and updated by Obtainium the way ordinary apps are, since the import file gives you automatic updates across every title instead of a dozen GitHub release pages you have to remember to check. Do not adopt it as a source of emulators themselves, because the repository contains no binaries, only the configuration that tells Obtainium where to find and how to verify each release. Verify first that each emulator in the pack is one you actually intend to run, since the pack is broad by design, and check the additional settings for the entries you care about, because the per app options for prereleases, version detection and architecture filtering are what decide whether you receive a working build or a broken one.

## FAQ

### What is the Obtainium Emulation Pack?

It is a curated collection of Android emulators and gaming utilities packaged as an Obtainium import file. You install Obtainium, import the JSON from the latest release, and Obtainium then tracks and updates every included app for you.

### How do I install just one app from the pack?

Instead of importing the whole file, you can browse the tables in the README and tap the Add to Obtainium link for the apps you want. Each link carries a full Obtainium app configuration for that emulator.

### What does the pack validate?

The `validate` recipe runs a script over `src/applications.json` checking for structure errors, regular expression syntax errors and source type errors, and it runs as part of the `build` recipe that precedes generating the release files. A `normalize` step then fixes key order and adds missing defaults.

### How are the app configurations tested?

There is a `test` recipe that live-tests the app configurations and a `test-cron` recipe that dry-runs the scheduled test workflow without creating issues. The repository also has adb helpers that type text into a connected device and take a screenshot of it to the desktop.

### What licence does the Obtainium Emulation Pack use?

The Unlicense, which places the work in the public domain with no attribution requirement and no restrictions on redistribution. The broader crowdsourced configuration collection lives separately at apps.obtainium.imranr.dev, and native ports, decompilations and recompilations of classic games are in a separate project on Codeberg.

## Sources

- [Issues](https://github.com/RJNY/Obtainium-Emulation-Pack/issues)
- [License: Unlicense](https://github.com/RJNY/Obtainium-Emulation-Pack/blob/main/LICENSE)
- [README](https://github.com/RJNY/Obtainium-Emulation-Pack/blob/main/README.md)
- [Releases](https://github.com/RJNY/Obtainium-Emulation-Pack/releases)
- [RJNY/Obtainium-Emulation-Pack on GitHub](https://github.com/RJNY/Obtainium-Emulation-Pack)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/rjny-obtainium-emulation-pack
