Skip to content

Releases: qusamulab/fuin

v2.0.0

Choose a tag to compare

@qusamulab qusamulab released this 01 Aug 03:11
e7dd174

A large release. The Python package is reorganised, the web service moves behind an extra, and several latent bugs are fixed. Read the migration notes before upgrading.

Docker: ghcr.io/ykus4/fuin:v2.0.0
Documentation: https://ykus4.github.io/fuin


⚠️ Breaking changes

1. pip install fuin no longer installs the server

The base install is the packer alone — cryptography and python-dotenv, down from 12 packages. To get fuin-server:

pip install 'fuin[server]'

2. Module paths changed

The flat package is now grouped by concern.

Before After
fuin.crypto fuin.encryption.aes
fuin.string_encrypt fuin.encryption.dex_strings
fuin.native_lib fuin.encryption.native_libs
fuin.resource_encrypt fuin.encryption.resources
fuin.signing, fuin.zipalign, fuin.keystore, fuin.stub_dex fuin.apk.*
fuin.android_tools fuin.apk.tools
fuin.manifest.patch_manifest fuin.apk.patch_manifest
fuin.manifest (byte level) fuin.axml.patcher
fuin.apk_info fuin.axml.info
fuin.analyze, fuin.report fuin.reporting.*
fuin._constants fuin.contract (+ fuin.axml.constants, fuin.apk.constants)
fuin.integrity removed — use fuin.apk.extract_cert_fingerprint
fuin.server.models fuin.server.schemas

3. Gradle composite-build path moved

// before
includeBuild("path/to/fuin/gradle-plugin")
// after
includeBuild("path/to/fuin/jvm/gradle-plugin")

4. API changes

  • run_pipeline returns a PackedOutput instead of a (path, sha256, report) tuple.
  • PipelineOptions is removed; use PackOptions.
  • The Pydantic PackResult is renamed PackedApp, to stop colliding with the packer's PackResult dataclass. RegisterAppResponse is removed (it had no references).
  • Protection options are now tri-state. Omitting --root-detection, --emulator-detection, --encrypt-strings, --verify-signature or --no-strict-manifest-patch defers to the matching FUIN_* variable; passing one always wins. Previously an explicit False could be overridden by the environment.

🐛 Fixed

  • The published wheel could not pack. assets/stub.dex sat outside the package directory and was never included, so pip install fuin had no stub to inject.
  • The Docker image did not start. The build never installed the project, so the fuin-server console script did not exist and the container exited immediately.
  • Settings were captured at import time, so FUIN_* changes needed a process restart, and every pipeline test wrote packed APKs into the repository instead of a temp directory.
  • package_name could be read from the wrong resource ID, returning an unrelated string-pool entry on APKs carrying a versionCode.
  • version_code was always None — initialised and never assigned.
  • Concurrent pack jobs clobbered each other through a single shared .pending.apk scratch path.
  • pipeline.py re-listed all 13 PackOptions fields to override one, silently dropping any field added later.
  • The in-memory job store grew without bound, retaining every finished job's full result for the process lifetime.
  • Detached asyncio tasks were created without holding a reference and could be garbage-collected mid-flight.
  • A DEX between 44 and 63 bytes raised struct.error instead of being skipped (off-by-one in the header bounds check).
  • reset_engine dropped the engine without disposing its connection pool.
  • Dead code removed from the AXML patcher, including an authoring note left in a shipped source file.

✨ Added

  • Documentation site at https://ykus4.github.io/fuin — 14 pages covering installation, all five interfaces, configuration, the API, architecture, security and development.
  • FUIN_MAX_MAPPING_MB for the ProGuard mapping upload limit, previously hardcoded at 50 MB.
  • Tests for signing and string_encrypt, neither of which had any coverage.
  • mypy, running clean over the package, in CI and pre-commit.
  • CI now tests Python 3.12, 3.13 and 3.14 (the Docker image ships 3.14 and had never been tested), measures coverage, runs the Docker image rather than only building it, exercises Alembic upgrade/downgrade and checks the migrated schema against the models, and verifies a packer-only wheel install can pack an APK.

🔧 Changed

  • Adopted a src layout; stub/ and gradle-plugin/ are grouped under jvm/.
  • The two AXML parsers — one in the inspector, one in the patcher — are unified into fuin.axml. PKCS12 handling, external-tool invocation and ZIP-copy loops are likewise deduplicated.
  • The server gains router, repository and settings layers; main.py drops from 286 lines to app assembly only.
  • action.yml no longer installs the dev dependency group, and no longer breaks workspace-relative input/output paths.
  • README trimmed from 446 lines to an entry point, with the content moved to the documentation site.

Full changes: CHANGELOG · v1.1.2...v2.0.0

v1.1.2

Choose a tag to compare

@qusamulab qusamulab released this 09 May 02:15
c242fe2

What's Changed

  • docs: add fuin logo to README by @ykus4 in #21
  • feat: add logo to web UI and switch to light theme by @ykus4 in #22

Full Changelog: v1.1.1...v1.1.2

v1.1.1

Choose a tag to compare

@qusamulab qusamulab released this 07 May 13:03
6b0187c

What's Changed

  • build: regenerate stub.dex with new protection modules by @ykus4 in #20

Full Changelog: v1.1.0...v1.1.1

v1.1.0

Choose a tag to compare

@qusamulab qusamulab released this 07 May 12:53
b48b72c

What's Changed

  • test: add pytest suite for crypto, manifest, apk, pipeline, and server by @ykus4 in #17
  • docs: update repository structure with tests/ directory by @ykus4 in #18
  • feat: add 7 new protection layers and CI integration by @ykus4 in #19

Full Changelog: v1.0.0...v1.1.0

v1.0.0

Choose a tag to compare

@qusamulab qusamulab released this 02 May 04:02
544535e

What's Changed

  • feat: initial implementation of fuin Android DEX packer by @ykus4 in #1
  • refactor: remove runtime key server — embed AES key in APK assets by @ykus4 in #2
  • chore: remove unused FUIN_SERVER_URL from config by @ykus4 in #3
  • refactor: restructure into fuin/ package by @ykus4 in #4
  • feat: async pack jobs with SSE progress and web UI by @ykus4 in #5
  • feat: complete stub Gradle project and expand setup docs by @ykus4 in #6
  • feat: some fixes by @ykus4 in #7
  • feat: support docker by @ykus4 in #9
  • feat: add CI and Docker workflows for linting, testing, and building images by @ykus4 in #10
  • feat: multidex, v2 signing, AXML parser, webhooks, and 6 more improvements by @ykus4 in #11
  • docs: overhaul README and consolidate runtime artifacts under data/ by @ykus4 in #12
  • refactor: update README.md by @ykus4 in #13
  • fix: restore setup-buildx-action required for GHA cache backend by @ykus4 in #14
  • fix: docker error by @ykus4 in #15
  • fix: add packages write permission for GHCR push by @ykus4 in #16

New Contributors

  • @ykus4 made their first contribution in #1

Full Changelog: https://github.com/ykus4/fuin/commits/v1.0