Skip to content

Commit 365cf78

Browse files
Merge pull request #157 from appdevforall/chore/complete-150-binary-bump-consistency
docs+ci: keep native-binary pin and manifest in sync (complements #150)
2 parents 11a27c2 + 6dd89a6 commit 365cf78

3 files changed

Lines changed: 117 additions & 50 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
name: Binary bump consistency
2+
3+
# Guards the native-binaries pin: if the release tag changes, the integrity
4+
# manifest must change in the same PR (see controller/docs/UPDATING_NATIVE_BINARIES.md).
5+
# Complements PR #150, which bumped binary_version.txt without ninja_manifest.json.
6+
7+
on:
8+
pull_request:
9+
branches: [ "main", "development" ]
10+
paths:
11+
- 'controller/binary_version.txt'
12+
- 'controller/app/src/main/assets/ninja_manifest.json'
13+
14+
jobs:
15+
check:
16+
runs-on: ubuntu-latest
17+
steps:
18+
- uses: actions/checkout@v4
19+
with:
20+
fetch-depth: 0
21+
- name: Ensure binary_version.txt and ninja_manifest.json move together
22+
run: |
23+
base="origin/${{ github.base_ref }}"
24+
changed=$(git diff --name-only "$base"...HEAD)
25+
ver='controller/binary_version.txt'
26+
man='controller/app/src/main/assets/ninja_manifest.json'
27+
echo "$changed" | grep -qx "$ver" && v=1 || v=0
28+
echo "$changed" | grep -qx "$man" && m=1 || m=0
29+
if [ "$v" != "$m" ]; then
30+
echo "::error::binary_version.txt and ninja_manifest.json must change together (incomplete binary bump). See controller/docs/UPDATING_NATIVE_BINARIES.md"
31+
exit 1
32+
fi
33+
echo "OK: version pin and integrity manifest are consistent."

‎controller/app/src/main/assets/ninja_manifest.json‎

Lines changed: 50 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,141 +1,141 @@
11
{
2-
"build_date": "2026-06-10T17:17:32Z",
2+
"build_date": "2026-07-05T05:37:53Z",
33
"builder_info": "IIAB build_static.sh",
44
"binaries": {
55
"arm64-v8a": {
66
"libaria2c.so": {
77
"version": "1.37.0",
8-
"build_date": "2026-06-10T16:34:17Z",
9-
"sha256": "992bcbc57f15c345a6ba8f1c3c459def8ce3d523e2faefc700b9a1e1b3270262",
10-
"size_bytes": 8592288
8+
"build_date": "2026-07-05T04:57:17Z",
9+
"sha256": "b00d571e0427cceb66495cab9fc355af3081192424e19d3da6d932a5710e5828",
10+
"size_bytes": 8594880
1111
}
1212
,
1313
"libgzip.so": {
1414
"version": "1.14",
15-
"build_date": "2026-06-10T16:36:13Z",
15+
"build_date": "2026-07-05T04:59:17Z",
1616
"sha256": "8ea538ade972e44fabf6a6b23aa48c7e4bb44c5f443adf17597c974333fbf3c4",
1717
"size_bytes": 367640
1818
}
1919
,
2020
"libless.so": {
21-
"version": "702",
22-
"build_date": "2026-06-10T16:43:53Z",
23-
"sha256": "50a5b8d19c3c47f8bbf2410a9047110c04c7a99159595bada23062e0731baf73",
24-
"size_bytes": 1071000
21+
"version": "704",
22+
"build_date": "2026-07-05T05:06:23Z",
23+
"sha256": "04e0bbe6f845f333045528a9a5df0208ca4b04a8b3806cc3fbcf93ae4244dd4b",
24+
"size_bytes": 1071096
2525
}
2626
,
2727
"libnano.so": {
28-
"version": "9.0",
29-
"build_date": "2026-06-10T16:43:44Z",
30-
"sha256": "98ba00ee4417dea618f4e305f835e1d7231231135896ed1a5e177001d18e17da",
31-
"size_bytes": 919096
28+
"version": "9.1",
29+
"build_date": "2026-07-05T05:06:12Z",
30+
"sha256": "e7562eb5490a4afc50e48eb0682eb3f43ac0d1abb1965431e18dd974c11b403d",
31+
"size_bytes": 1006488
3232
}
3333
,
3434
"libproot-loader.so": {
35-
"version": "5.1.107.77",
36-
"build_date": "2026-06-10T16:03:59Z",
35+
"version": "5.1.107.82",
36+
"build_date": "2026-07-05T04:29:12Z",
3737
"sha256": "44ef39c1e1a18c09f6e4c4b5d6f8bba82d30596598bd155ec162d05c5122ff04",
3838
"size_bytes": 18136
3939
}
4040
,
4141
"libproot-loader32.so": {
42-
"version": "5.1.107.77",
43-
"build_date": "2026-06-10T16:03:59Z",
42+
"version": "5.1.107.82",
43+
"build_date": "2026-07-05T04:29:12Z",
4444
"sha256": "25f6bd90bc5a3d3088026289a0d3eaf3e502bd2b00e5cb74fadd9791132efa34",
4545
"size_bytes": 6244
4646
}
4747
,
4848
"libproot.so": {
49-
"version": "5.1.107.77",
50-
"build_date": "2026-06-10T16:03:59Z",
51-
"sha256": "f54c8314c05fafa9057cd530a125fc25a4bd8835a0632724bc42adc9f0952e8c",
52-
"size_bytes": 515488
49+
"version": "5.1.107.82",
50+
"build_date": "2026-07-05T04:29:12Z",
51+
"sha256": "980500b0bb0d024f8111b7b66920e622330396c146aac23271508f3b0b90c873",
52+
"size_bytes": 527072
5353
}
5454
,
5555
"librsync.so": {
5656
"version": "3.4.4",
57-
"build_date": "2026-06-10T16:42:25Z",
57+
"build_date": "2026-07-05T05:05:01Z",
5858
"sha256": "20278ee6ba580eed47196416bc2f127e3e53073a50dbf046f9a21ab66c35a9c5",
5959
"size_bytes": 2004992
6060
}
6161
,
6262
"libtar.so": {
6363
"version": "1.35",
64-
"build_date": "2026-06-10T16:35:52Z",
64+
"build_date": "2026-07-05T04:58:58Z",
6565
"sha256": "d414f208c5e829afa8bb3de08dcc6e1cd113c156559a1fb31d70ea3d006832f5",
6666
"size_bytes": 1946768
6767
}
6868
,
6969
"libxz.so": {
7070
"version": "5.8.3",
71-
"build_date": "2026-06-10T16:36:31Z",
72-
"sha256": "dbe8c63e74990bb7b75adf22f088b6e129a2cb63197f8a577eaba0addf85a464",
73-
"size_bytes": 210784
71+
"build_date": "2026-07-05T04:59:34Z",
72+
"sha256": "ee229ab9eb1af7079c2b9a8f49f203034301a114e01a22c7fe33ea8b44e31b29",
73+
"size_bytes": 457328
7474
}
7575
}
7676
,
7777
"armeabi-v7a": {
7878
"libaria2c.so": {
7979
"version": "1.37.0",
80-
"build_date": "2026-06-10T17:09:01Z",
81-
"sha256": "cc058fefc76ffacd377b2b9317de179b0933a9ee8d909f2868093bfdf5529955",
82-
"size_bytes": 4839272
80+
"build_date": "2026-07-05T05:29:19Z",
81+
"sha256": "bda3eed19fbe59f6002a25e510b0174a779d9a47996cee6abfe926fce6e21215",
82+
"size_bytes": 4841028
8383
}
8484
,
8585
"libgzip.so": {
8686
"version": "1.14",
87-
"build_date": "2026-06-10T17:10:42Z",
87+
"build_date": "2026-07-05T05:31:04Z",
8888
"sha256": "b192443ac1c5d541c910b38acbb8ea78f5b3d6496b6359f1f022ef5d965e1bef",
8989
"size_bytes": 231224
9090
}
9191
,
9292
"libless.so": {
93-
"version": "702",
94-
"build_date": "2026-06-10T17:17:32Z",
95-
"sha256": "36b34881fdc1ba9a76460e0d8c7e8c1bcecd27f8d56e318b3b7715b1172050d9",
96-
"size_bytes": 786248
93+
"version": "704",
94+
"build_date": "2026-07-05T05:37:53Z",
95+
"sha256": "87db137f8d157dd87b3aeb9b3c7fe7daae95bc4a2f9b0248a0f6db3b125b67cf",
96+
"size_bytes": 786184
9797
}
9898
,
9999
"libnano.so": {
100-
"version": "9.0",
101-
"build_date": "2026-06-10T17:17:23Z",
102-
"sha256": "fa409e739b6a106e4145e640804af6698063738e9c72bc208ed7d18157fad8e3",
103-
"size_bytes": 605132
100+
"version": "9.1",
101+
"build_date": "2026-07-05T05:37:43Z",
102+
"sha256": "c99dd5471a1681867ce9a423761119aaaea62b1e471fea8a8893b4707c3d754a",
103+
"size_bytes": 691660
104104
}
105105
,
106106
"libproot-loader.so": {
107-
"version": "5.1.107.77",
108-
"build_date": "2026-06-10T16:44:26Z",
107+
"version": "5.1.107.82",
108+
"build_date": "2026-07-05T05:06:55Z",
109109
"sha256": "c64fcdc4e487ac6ec39955faf0049235258cbe284a6255797945817dd7c36198",
110110
"size_bytes": 5632
111111
}
112112
,
113113
"libproot.so": {
114-
"version": "5.1.107.77",
115-
"build_date": "2026-06-10T16:44:26Z",
116-
"sha256": "42efd0b054784dbcdf2ff852c290b0f8d1b00a0dff650a5b0857e334984482d8",
117-
"size_bytes": 330304
114+
"version": "5.1.107.82",
115+
"build_date": "2026-07-05T05:06:55Z",
116+
"sha256": "12c5ad1979dd19b9da993390ccdda59ab0204c853d57fdfa30c4744e1f90daab",
117+
"size_bytes": 341888
118118
}
119119
,
120120
"librsync.so": {
121121
"version": "3.4.4",
122-
"build_date": "2026-06-10T17:16:11Z",
122+
"build_date": "2026-07-05T05:36:09Z",
123123
"sha256": "7e586104da70f625d39f52c49ca81f5fb942d39c6bcd2e316b746c9ce9037e81",
124124
"size_bytes": 1655416
125125
}
126126
,
127127
"libtar.so": {
128128
"version": "1.35",
129-
"build_date": "2026-06-10T17:10:25Z",
130-
"sha256": "12011a52cfa9cbdbe22f8882cb16147aa216e5a58bcbcfb4709508f77225f628",
129+
"build_date": "2026-07-05T05:30:49Z",
130+
"sha256": "f13f19a274fa3efe26fca71128432309cf3f0db32f09616dc760e9dd2cddc7f2",
131131
"size_bytes": 1607388
132132
}
133133
,
134134
"libxz.so": {
135135
"version": "5.8.3",
136-
"build_date": "2026-06-10T17:10:59Z",
137-
"sha256": "308aa236226f01732aa848079b6f2930549a8e2e7d2d62cdb29343fa08417c09",
138-
"size_bytes": 152932
136+
"build_date": "2026-07-05T05:31:20Z",
137+
"sha256": "4b1c6b0492e7171450c3d186bc2de4b38a2ae2dd6bacc564ef7fae78dca54658",
138+
"size_bytes": 321964
139139
}
140140
}
141141
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Updating native binaries (aria2, proot, tar, …)
2+
3+
The pinned native binaries are defined by **three** files that must always stay in sync.
4+
Update them **together, in the same commit** whenever you bump to a new binaries release.
5+
6+
| File | Role |
7+
|------|------|
8+
| `controller/binary_version.txt` | The pinned release tag (e.g. `binaries-2026-07-05_05-38`). |
9+
| `controller/app/src/main/assets/ninja_manifest.json` | Expected SHA256 of every binary for that tag. The build audits against this. |
10+
| `controller/app/src/main/assets/cacert.pem` | CA bundle shipped with the release (update only if it changed). |
11+
12+
## How to bump
13+
14+
1. Set the new tag in `controller/binary_version.txt`.
15+
2. Run the sync so the manifest (and cacert) come from that exact release:
16+
```bash
17+
cd controller && ./gradlew :app:syncNativeArtifacts
18+
```
19+
3. Commit the three files together:
20+
```bash
21+
git add controller/binary_version.txt \
22+
controller/app/src/main/assets/ninja_manifest.json \
23+
controller/app/src/main/assets/cacert.pem
24+
git commit -m "chore: bump native binaries to <tag>"
25+
```
26+
27+
## Why (background)
28+
29+
`ninja_manifest.json` is the integrity source of truth and is **version-controlled on purpose**
30+
(supply-chain traceability). If `binary_version.txt` moves without the manifest, the on-disk
31+
binaries (gitignored) no longer match the committed manifest, and the SHA256 audit in
32+
`syncNativeArtifacts` fails on the next build (first offender is usually `libaria2c.so`),
33+
forcing a re-download. PR #150 bumped only `binary_version.txt`; this is the miss this doc
34+
prevents. The CI check `binary-bump-consistency` enforces it.

0 commit comments

Comments
 (0)