Skip to content

Release 0.5.15: honor --no-slim on Android, Apple-strip lib execs, gate plugin flags#15

Merged
GenericJam merged 1 commit into
masterfrom
no-slim-and-plugin-gate
Jun 2, 2026
Merged

Release 0.5.15: honor --no-slim on Android, Apple-strip lib execs, gate plugin flags#15
GenericJam merged 1 commit into
masterfrom
no-slim-and-plugin-gate

Conversation

@GenericJam
Copy link
Copy Markdown
Owner

Three fixes found shipping a full-OTP, no-slim Livebook-host app (Io) to both stores.

1. --no-slim ignored on Android

MobDev.ReleaseAndroid.build_aab/0 called OtpAssetBundle.build/2 with no opts, so the OTP-lib strip ran unconditionally and mix mob.release --android --no-slim still shipped a stripped runtime. An app that lost runtime_tools (in its extra_applications) crashed on boot; inets loss broke Mix.install/Hex. Now slim threads build_aab → OtpAssetBundle.build(slim:), and slim: false ships the OTP tree untouched. Default stays slim: true. Regression test added.

2. iOS --no-slim bundle rejected by App Store validation

The always-on Apple-policy strip removed erts-*/bin and priv/bin but missed standalone executables inside OTP libs (e.g. erl_interface/bin/erl_call) → altool 90171 "Invalid bundle structure". Now lib/*/bin/* executables are stripped too (always on, not gated on slim), keeping each lib's .beam/.app, so a full-OTP bundle is Apple-compliant.

3. Native builds break on pre-plugin app scaffolding

native_build.ex emitted -Dplugin_c_nifs/-Dplugin_zig_nifs/-Dplugin_jni_sources (Android) and -Dplugin_swift_files/-Dplugin_frameworks (iOS) unconditionally. An app scaffolded before the plugin system has no such options in its build.zig, and Zig aborts with invalid option: -Dplugin_*. These flags (and the iOS plugin bootstrap, which otherwise made plugin_swift_files always non-empty) are now emitted only when plugins are activated; a plugin-aware build.zig defaults them to "", so behaviour there is unchanged.

Verification

  • 148 tests pass (incl. new slim: false test).
  • Android --no-slim AAB built + booted on a Pixel 8 emulator (full OTP).
  • iOS --no-slim IPA built + accepted by App Store Connect.
  • iOS simulator native build compiled + installed (plugin-flag gate).

🤖 Generated with Claude Code

…te plugin flags

Three fixes surfaced shipping a full-OTP Livebook-host app:

- Android --no-slim was ignored (OtpAssetBundle stripped unconditionally).
  Thread slim through build_aab → OtpAssetBundle.build(slim:); slim:false
  ships the full OTP tree (needed for runtime Mix.install). Default unchanged.
- iOS --no-slim bundle failed App Store validation on standalone execs inside
  OTP libs (erl_interface/bin/erl_call, 90171). Always-on Apple strip now also
  removes lib/*/bin/* executables, keeping each lib's .beam/.app.
- native_build emitted -Dplugin_* flags unconditionally; apps scaffolded before
  the plugin system have no such build.zig options and Zig rejects them. Emit
  the plugin flags (and the iOS bootstrap) only when plugins are activated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@GenericJam GenericJam merged commit f62e566 into master Jun 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant