mirror of
https://github.com/okhsunrog/vpnhide.git
synced 2026-04-28 14:44:43 +00:00
Two related changes that ship together because they touch the same
build-script + docs surface and were verified together on-device.
16 KiB alignment
- zygisk/build.rs: pass `-Wl,-z,max-page-size=16384` to lld so the
cdylib's LOAD segments line up on 16 KiB pages. NDK r28+ already
does this by default, but the flag keeps r27 builds compatible.
- lsposed/native/build.rs: new file, same flag, for libvpnhide_checks.so.
- docs/development.md: bumped the NDK requirement to r28+ and noted
the 16 KiB rationale.
Verified via `llvm-readelf -l`: both libvpnhide_zygisk.so and
libvpnhide_checks.so now show `Align 0x4000` on every LOAD segment.
Unified build entry points
- kmod/build.py replaces kmod/build-zip.py. Single script that
auto-detects whether to build natively (we're inside the DDK image
or `--kdir` was passed) or to spawn `ghcr.io/ylarod/ddk-min` via
podman/docker. CI uses the same script with `--inside-container`.
- zygisk/build-zip.py renamed to zygisk/build.py for symmetry; logic
unchanged.
- kmod/BUILDING.md rewritten — local build is now one command:
`./kmod/build.py --kmi android14-6.1` (or `--all`). The old
hand-rolled podman/docker recipes are gone.
- .github/workflows/ci.yml updated to call the new entry points.
The DDK image tag in CI now has a comment pointing at
`DDK_IMAGE_TAG` in kmod/build.py as the source of truth.
- README.{md,en.md}, kmod/README.md, zygisk/README.md, docs/releasing.md,
scripts/build_lib.py: reference updates.
- README.en.md: also fixes a "bacame" typo and tightens the Windows
zygisk-build note (the aux.rs / libgit2 issue is still real).
Verified end-to-end on Pixel 8 Pro (husky, android14-6.1, Android 16):
APK installs, kmod + zygisk modules load, all 26 self-checks PASS in
Enforcing, 22/26 PASS in Permissive (the same 4 by-design FAILs as
before — kmod doesn't cover those paths in Permissive).
60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
"""Shared helpers for build scripts.
|
|
|
|
Used by kmod/build.py, portshide/build-zip.py, zygisk/build.py,
|
|
and scripts/build-version.py.
|
|
|
|
Stdlib-only on purpose: scripts/build-version.py is invoked from
|
|
lsposed/app/build.gradle.kts on every Gradle build, so adding pip/uv
|
|
dependencies here would break the APK build for anyone without those
|
|
tools available.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import re
|
|
import subprocess
|
|
import zipfile
|
|
from pathlib import Path
|
|
|
|
|
|
def make_zip(source_dir: Path, output_zip: Path) -> None:
|
|
"""Create a zip archive from source_dir contents."""
|
|
with zipfile.ZipFile(output_zip, "w", zipfile.ZIP_DEFLATED) as zf:
|
|
for file_path in source_dir.rglob("*"):
|
|
if file_path.is_file():
|
|
arcname = file_path.relative_to(source_dir)
|
|
zf.write(file_path, arcname)
|
|
|
|
|
|
def version_sort_key(name: str) -> tuple[int, ...]:
|
|
"""Sort key that orders strings by their embedded integer runs.
|
|
|
|
Used to pick the highest version when multiple toolchain directories
|
|
coexist (NDK 25.0.1 vs 100.0.0, clang-r450b vs clang-r498344b) where
|
|
plain lexicographic sort gives the wrong answer.
|
|
"""
|
|
return tuple(int(part) for part in re.findall(r"\d+", name))
|
|
|
|
|
|
def get_build_version(repo_root: Path | None = None) -> str:
|
|
"""Get the effective build version for vpnhide artifacts.
|
|
|
|
- HEAD on a tag vX.Y.Z -> "X.Y.Z" (release build)
|
|
- N commits after tag vX.Y.Z -> "X.Y.Z-N-gSHA" (dev build)
|
|
- working tree dirty -> additional "-dirty" suffix
|
|
- no git / no matching tag -> falls back to VERSION file
|
|
"""
|
|
if repo_root is None:
|
|
repo_root = Path(__file__).resolve().parent.parent
|
|
|
|
result = subprocess.run(
|
|
["git", "describe", "--tags", "--match", "v*", "--dirty"],
|
|
cwd=repo_root,
|
|
capture_output=True,
|
|
text=True,
|
|
)
|
|
if result.returncode == 0 and result.stdout.strip():
|
|
return result.stdout.strip().removeprefix("v")
|
|
|
|
version_file = repo_root / "VERSION"
|
|
return version_file.read_text(encoding="utf-8").strip()
|