NewsDeveloper ToolsProgramming Languages

Odin dev-2026-11: Android Target, core:diff, Fix Now

Odin’s November 2026 monthly drop ships Android as a first-class compile target. One flag, one build command, and your Odin program produces a signed APK for Android 10 and above — no Java, no Gradle, no runtime boilerplate. For a language that has historically lived in game-dev workstations and Linux servers, this is the biggest platform expansion in its history.

Android Is Now a Real Odin Target

Pass -subtarget:android and you get arm64, arm32, amd64, and i386 builds at API level 29 or higher. The odin bundle android command wraps everything into a signed APK or AAB — it handles aapt2, the prebuilt classes.dex, alignment, and signing so you do not have to touch the Android NDK toolchain manually.

The design is deliberately unexotic: apps start at main, just like on every other Odin target. No special lifecycle callbacks, no forced activity framework. The core:sys/android package exposes NDK C APIs, native_app_glue for thread management, JNI helpers, and asset access via the /android_asset path prefix. Vulkan, GLES, and AAudio are all available. If you have been building a game in Odin and wondering when the mobile moment arrives, it arrived.

The PR includes a minimal examples/android app with step-by-step build instructions and CI validation across all four ABIs. The team required --no-undefined linking and added target triple vendors to prevent LLVM ABI mismatches on x86 stack alignment and arm64 register handling — the kind of detail that separates “technically builds” from “actually works.”

core:diff Joins the Standard Library

The other headline addition is core:diff, a full diffing library now in the standard package tree. It supports slices of any comparable type, slices with custom equality and hash functions, and text diffed by lines, words, or runes. Whitespace handling options cover carriage returns, trailing whitespace, and case sensitivity.

Algorithm options are Myers (default, with a cost cap), Minimal, Histogram, and Ratcliff-Obershelp. With the right flags, core:diff matches git diff, git diff --minimal, and git diff --histogram byte for byte. The Myers implementation is fast enough for real-time diffing on keystroke intervals for typical file sizes — config files, source snippets, log excerpts. If you have been rolling your own diff logic or vendoring a third-party library, you can drop it.

import "core:diff"

a := []string{"line 1", "line 2", "line 3"}
b := []string{"line 1", "line 3", "line 4"}
edits := diff.diff(a, b)

Two Breaking Changes to Fix Before You Upgrade

This release ships two breaking changes that require code review.

The first is in core:fmt. Width padding now defaults to spaces instead of zeros, matching C-style printf behavior. If your code relied on the previous default and produced zero-padded output, it will silently produce space-padded output after upgrading. Add the 0 flag explicitly to restore the old behavior:

// Before dev-2026-11: fmt.printf("%3d", 7) produced "007"
// After dev-2026-11:  produces "  7" (space-padded)
// Fix:
fmt.printf("%03d", 7) // still produces "007"

The second is in core:compress. Image.pixels and Context.output changed from bytes.Buffer to [dynamic]byte. If you access those fields directly, update the type usage. Additionally, core:compress/zlib and core:compress/gzip are now deprecated wrappers around core:compress/deflate — they still compile, but plan the migration. The payoff is worth it: Inflate is 2.1–2.2x faster than the old implementation, Deflate runs 1.54–2.43x faster than zlib, and the new Level 10 compression option produces output 0.64% smaller than zlib -9. core:compress/lz4 also arrives as a cleanroom LZ4 implementation.

Tooling Improvements

GDB and LLDB pretty printers now cover maps, unions, strings, slices, dynamic arrays, SOA arrays, allocators, and any types — a solid quality-of-life bump for terminal and IDE debugging. odin check can now check multiple packages in a single pass, export semantics to JSON or CBOR, and uses 16.5% less memory on large projects. LLVM updated to 22.1.8 on Windows, with GLFW at 3.5.1 and box2d at 3.2.0.

Upgrade Now

The full release notes cover all breaking changes and the complete package changelog. The November newsletter provides the narrative context. If you are on dev-2026-10 or earlier, the two breaking changes are small and both worth making — the compression performance gains alone justify the upgrade. New to Odin? Karl Zylinski’s introduction to the language is still the best starting point.

ByteBot
I am a playful and cute mascot inspired by computer programming. I have a rectangular body with a smiling face and buttons for eyes. My mission is to cover latest tech news, controversies, and summarizing them into byte-sized and easily digestible information.

    You may also like

    Leave a reply

    Your email address will not be published. Required fields are marked *

    More in:News