Packaging files live under packaging/.
Current default product version: 1.0.5.
Official release artifacts are created by GitHub Actions (.github/workflows/publish.yml) only. Local packaging commands are validation helpers and must not be used as the authority for publishing a release.
Every GitHub Release must contain exactly these four ZIP packages plus matching .sha256 sidecars:
artifacts/AndroidTreeView-1.0.5-win-x64.zip
artifacts/AndroidTreeView-1.0.5-win-x64.zip.sha256
artifacts/AndroidTreeView-1.0.5-osx-arm64.zip
artifacts/AndroidTreeView-1.0.5-osx-arm64.zip.sha256
artifacts/AndroidTreeView-Mini-1.0.5-win-x64.zip
artifacts/AndroidTreeView-Mini-1.0.5-win-x64.zip.sha256
artifacts/AndroidTreeView-Mini-1.0.5-osx-arm64.zip
artifacts/AndroidTreeView-Mini-1.0.5-osx-arm64.zip.sha256
Windows ZIPs contain the published application files, the platform-matched scrcpy bundle, and release.json at the ZIP root. macOS ZIPs contain a top-level .app bundle (AndroidTreeView.app or AndroidTreeView Mini.app); the published files, scrcpy, and release.json live inside the bundle.
The Windows updater treats the ZIP as the source of truth for application files. During an update, files that exist in the installed directory but are missing from the new ZIP are removed unless they are config-like files such as .env, settings.json, appsettings.*.json, *.local.json, *.user, .config, .ini, .json, .yaml, .yml, or .toml.
| File | Purpose |
|---|---|
build-update-zip.ps1 |
GitHub Actions packaging helper. Publishes App/Mini for win-x64 or osx-arm64, writes release.json, creates Windows portable ZIPs or macOS .app bundle ZIPs, and writes SHA-256 sidecar. |
AndroidTreeView.Package.wixproj |
Optional x64 WiX MSI project kept for diagnostics or fallback Windows packaging. |
Product.wxs |
Product-parameterized WiX authoring. |
build-msi.ps1 |
Optional x64 MSI build script. Not used for the current upload flow. |
For local validation from the repository root:
./packaging/build-update-zip.ps1 -Product App -Rid win-x64
./packaging/build-update-zip.ps1 -Product Mini -Rid win-x64The GitHub Actions workflow additionally runs the same script on macOS:
./packaging/build-update-zip.ps1 -Product App -Rid osx-arm64
./packaging/build-update-zip.ps1 -Product Mini -Rid osx-arm64Supported release RIDs are win-x64 and osx-arm64.
The script:
- downloads the matching upstream scrcpy asset (
scrcpy-win64-v4.0.ziporscrcpy-macos-aarch64-v4.0.tar.gz) - folds
fastbootinto the full App package - runs
dotnet publish - writes
release.json - stages a macOS
.appbundle forosx-arm64 - compresses the package folder to
artifacts/ - writes
<zip>.sha256
macOS ZIPs are created with the system zip command so executable bits and .app bundle layout are preserved.
The updater uses release.json to distinguish an automated release ZIP from a random loose-file archive:
{
"packageKind": "portable-x64",
"product": "App",
"productName": "AndroidTreeView",
"appKey": "android-tree-view-app",
"version": "1.0.5",
"platform": "win",
"arch": "x64",
"rid": "win-x64",
"executable": "AndroidTreeView.App.exe"
}macOS packages use packageKind values such as portable-osx-arm64 and executable names without .exe; this metadata is stored inside the .app bundle for release auditing. The current automated updater accepts the Windows portable-x64 package kind; macOS ZIPs are GitHub Release .app artifacts.
For Windows update packages, release.json and the executable named by executable must be present in the ZIP. The updater rejects packages with the wrong appKey, wrong expected version, non-x64 architecture, missing executable, or unsupported package kind.
MSI packaging is no longer the release upload path, but the x64 WiX project remains available:
./packaging/build-msi.ps1 -Product App -Arch x64
./packaging/build-msi.ps1 -Product Mini -Arch x64The WiX project rejects non-x64 platforms.
build-update-zip.ps1 writes checksums automatically. Manual verification:
Get-FileHash -Algorithm SHA256 artifacts\AndroidTreeView-1.0.5-win-x64.zip
Get-FileHash -Algorithm SHA256 artifacts\AndroidTreeView-Mini-1.0.5-win-x64.zipThe sidecar uses <hash> *<filename> format for compatibility with sha256sum -c.
Keep these fields aligned:
src/AndroidTreeView.Core/AppInfo.cs->AppInfo.Version- App csproj version fields
- Windows Mini csproj version fields
- macOS Mini csproj version fields
- App manifest assembly identity
packaging/build-update-zip.ps1defaultVersion
See publishing.md for the release checklist and update-channel requirements.