A custom Android 17 (Baklava) ROM for the Cuttlefish virtual device
(aosp_cf_x86_64_phone), built by bringing the crDroid + LineageOS
customization stack on top of stock AOSP.
This repository does not contain the Android source tree. AOSP, crDroid's
crDroidSettings, and the bulk of the platform are downloaded from their upstreams;
this repo holds only the minimal set needed to turn a stock AOSP checkout into
IchthysOS:
- patches for the AOSP subprojects we modify (
frameworks/base, the Settings app, the Cuttlefish device tree) and forcrDroidSettings, - the new source files we add (SystemUI views, framework helpers, drawables, …),
- the
lineage-sdkforward-port to Android 17, - the custom boot animation,
- and an
apply.shthat stitches it all onto a synced AOSP tree.
Total repo size is ~21 MB (most of it the boot animation).
IchthysOS is only a thin layer on top of an enormous amount of other people's work. All of the heavy lifting belongs to:
- The Android Open Source Project — the entire base
platform (Android 17 / Baklava,
android-17.0.0_r1). Licensed under Apache 2.0. - LineageOS —
lineage-sdk(org.lineageos.platformframework,LineageSettings, the preference library and settings provider). The copy here is a forward-port of their SDK to Android 17. - crDroid Android —
crDroidSettingsand the framework customization patterns (TunerService prefixes, the settings keys, many of the SystemUI/framework feature implementations this ROM adapts to A17).
The IchthysOS name and boot animation (the spinning fish that resolves into the ICHTHYS symbol + "IchthysOS") are original to this project.
Please keep these credits intact and respect the upstream licenses (Apache 2.0).
README.md This file.
apply.sh Applies the whole IchthysOS stack onto a synced AOSP tree.
manifest/ichthysos.xml Optional repo local-manifest (fetches crDroidSettings).
patches/
frameworks_base.patch Our changes to frameworks/base (tracked files).
packages_apps_Settings.patch Wires crDroidSettings into the Settings app, homepage tile.
device_google_cuttlefish.patch Product packaging + IchthysOS branding.
crDroidSettings.patch Our A17 fixes/additions on top of crDroid's crDroidSettings.
files/ New files we add, mirrored by their destination path:
frameworks/base/... SystemUI BatteryBarView / StatusBarLogo / NetworkTraffic,
crDroid framework util helpers, status-bar logo drawables, …
packages/apps/Settings/crDroidSettings/res/values/cr_forwardport.xml
device/google/cuttlefish/shared/phone/bootanimation.zip
lineage-sdk/ LineageOS SDK, forward-ported to Android 17 (hosted in full).
docs/
ROM_CHANGELOG.md Everything IchthysOS changes vs stock AOSP.
SETTINGS_STATUS.md Per-setting status tracker (what works / what's blocked).
A Linux host (Ubuntu 22.04+ recommended) with, roughly:
- ~400 GB free disk (AOSP source ~150 GB + build output ~150 GB),
- 32 GB+ RAM (16 GB works with swap, slowly),
- a fast SSD and a good internet connection for the initial sync.
Install the AOSP build dependencies and the repo tool:
sudo apt update
sudo apt install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev \
libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev \
lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig openjdk-21-jdk
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
git config --global user.name "Your Name"
git config --global user.email "you@example.com"IchthysOS is built against android-17.0.0_r1 for the Cuttlefish phone target.
mkdir -p ~/aosp && cd ~/aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-17.0.0_r1
repo sync -c -j$(nproc) --no-clone-bundle --no-tags(This is the long one — expect an hour+ and a lot of bandwidth.)
Clone this repo somewhere outside the AOSP tree, then run apply.sh pointing at it:
git clone https://github.com/kusti420/IchthysOS ~/IchthysOS
~/IchthysOS/apply.sh ~/aospapply.sh will:
- copy the forward-ported
lineage-sdkinto the tree, - clone
crDroidSettingsfrom crDroid (pinned to commit9b9cacc, branch16.0) intopackages/apps/Settings/crDroidSettings, - copy all the new files (SystemUI views, drawables, the boot animation, …),
- apply the four patches.
If a patch reports it "does NOT apply cleanly", AOSP has drifted from android-17.0.0_r1;
re-sync to that tag, or resolve the reject manually.
Alternative for the crDroidSettings fetch: copy
manifest/ichthysos.xmlinto~/aosp/.repo/local_manifests/andrepo syncbefore runningapply.sh(it will then skip the clone).
cd ~/aosp
source build/envsetup.sh
lunch aosp_cf_x86_64_phone # Android 17 / Baklava, eng variant
m # full image (~30–60 min first time)Useful partial builds while iterating:
m Settings # the Settings app (incl. crDroidSettings) — installable without a reboot
m SystemUI # SystemUI (status bar, QS, lock screen, battery bar, …)
m # rebuild the flashable images (super.img etc.)Note on this environment. In a plain container/VM without the
cuttlefish-commonhost package,launch_cvdrefuses to start ("vm_manager not supported"). The bypass is to create an empty/manager.sockso the sandbox check passes. On a normal Cuttlefish host you can skip thetouchand just runlaunch_cvd.
cd ~/aosp
source build/envsetup.sh && lunch aosp_cf_x86_64_phone
touch /manager.sock # sandbox bypass (see note above)
HOME=$HOME out/host/linux-x86/bin/launch_cvd --daemon- Screen: open https://localhost:8443 in a browser (self-signed cert — accept it).
- adb: the device appears at
0.0.0.0:6520(adb devices).
Stopping / restarting the VM:
out/host/linux-x86/bin/stop_cvd # clean shutdown (clears the instance)
# then re-run the launch_cvd line aboveDo not
adb rebootthis VM — in a bypassed environment the guest often does not come back (the launcher can't relaunch the guest process). Usestop_cvd+launch_cvd, or just relaunch, instead of rebooting from inside the guest.
The IchthysOS boot animation is a three-part bootanimation.zip:
part0— the fish spins in a seamless loop for as long as boot takes,part1— when boot completes it winds down out of the spin,part2— it morphs into the ICHTHYS symbol and types out "IchthysOS", once.
You do not need to reboot to preview it. Push it (once) and drive it manually:
adb root && adb remount
adb push files/device/google/cuttlefish/shared/phone/bootanimation.zip /product/media/bootanimation.zip
# preview: fish loops, then fire the "boot complete" signal to see the finale
adb shell setprop service.bootanim.exit 0
adb shell setprop ctl.start bootanim # fish starts looping
# ...watch it in the viewer...
adb shell setprop service.bootanim.exit 1 # winds down -> "IchthysOS" -> exitsctl.start bootanim on its own only shows the loop; the finale plays when
service.bootanim.exit flips to 1 (which the system does automatically at the end of a
real boot — that's the whole point of the two c closing parts in desc.txt).
To see it during an actual boot, make sure the new zip is in the image
(files/.../bootanimation.zip ships to /product/media/ via PRODUCT_COPY_FILES) and
launch a fresh VM.
See docs/ROM_CHANGELOG.md for the full, categorized list, and docs/SETTINGS_STATUS.md for a per-setting "what actually works on-device" tracker. Highlights:
- The full crDroidSettings app, compiled into AOSP Settings, reachable from an "IchthysOS" homepage tile.
- lineage-sdk (
org.lineageos.platform,LineageSettings) forward-ported to A17. - A TunerService prefix system so SystemUI can observe any settings table.
- Working backends for: status-bar clock (seconds/date/AM-PM/position), battery percent + style, a full-width battery bar, double-tap-to-sleep, extra padding, lock-screen battery info / power menu / ripple, a global disable-all-vibration toggle, selectable recents, 8.1-style Quick Settings, a horizontal volume dialog, and pitch-black theming.
The IchthysOS-original bits in this repo (boot animation, glue, docs) follow the same Apache License 2.0 as the AOSP / LineageOS / crDroid code they build on. Upstream files retain their original copyright headers.