Skip to content

Commit fb2fd55

Browse files
build: задача bundle собирает AAB для Play и печатает versionCode
Play принимает только AAB, а -Task release делал APK, поэтому бандл собирали руками и без предсборочной проверки нативов. Теперь :app:bundleRelease идёт через build.ps1 с той же проверкой комплектности и печатает versionCode из app/build.gradle.kts: Play запоминает номер, повторная загрузка с ним отклоняется. Проверено: AAB 177 МБ, подписан release-ключом, внутри libopencode.so и libbun-musl.so.
1 parent d443e38 commit fb2fd55

3 files changed

Lines changed: 33 additions & 4 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,13 @@ Play: листинг, скриншоты, политика конфиденци
130130
музыкальный MCP на 4200 **отсутствует — так и должно быть**: он стартует только при
131131
непустом токене Яндекса (`credentials.takeIf { it.accessToken.isNotBlank() }`), а на
132132
чистой установке логина нет. `adb logcat -b crash` пуст, приложение живо.
133+
- `build.ps1 -Task bundle` — AAB для Play (`:app:bundleRelease`). Раньше его собирали
134+
руками: `-Task release` делает только APK, а Play APK не принимает. Задача проходит ту же
135+
предсборочную проверку нативов (иначе «валидный» бандл без сервера внутри), а в конце
136+
печатает `versionCode` из `app/build.gradle.kts`: Play запоминает номер, и повторная
137+
загрузка с ним отклоняется. Проверено: AAB 177 208 102 байт, подписан тем же release-ключом
138+
(`CN=opencode-mobile, OU=Release`, SHA-256 `4fda00b2…`), внутри `libopencode.so` и
139+
`libbun-musl.so`.
133140
- Ограничение проверки, чтобы не выдавать желаемое за сделанное: release не debuggable,
134141
`run-as` не работает, пароль serve из `/proc/<pid>/environ` не прочитать — поэтому
135142
аутентифицированный вызов через HTTP не делался, проверены запуск, порты и отсутствие

‎build.ps1‎

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
verify : ktlint + detekt + compileDebugKotlin (быстрая проверка)
1212
debug : assembleDebug
1313
release : assembleRelease
14+
bundle : bundleRelease — AAB для Play (Play принимает только .aab, APK не берёт)
1415
native : assembleDebug c полной сборкой нативной части
1516
(требует whisper.cpp + VulkanSDK, см. -WhisperCppDir/-VulkanSdkDir)
1617
@@ -49,10 +50,11 @@
4950
.\build.ps1 -Task utest
5051
.\build.ps1 -Task native -WhisperCppDir C:\src\whisper.cpp
5152
.\build.ps1 -Task release -SkipNative
53+
.\build.ps1 -Task bundle -SkipNative # AAB dlya Play
5254
.\build.ps1 -Task binary # polozhit ves komplekt nativov v jniLibs
5355
#>
5456
param(
55-
[ValidateSet('verify', 'jstest', 'utest', 'debug', 'release', 'native', 'binary')]
57+
[ValidateSet('verify', 'jstest', 'utest', 'debug', 'release', 'bundle', 'native', 'binary')]
5658
[string]$Task = 'debug',
5759
[string]$WhisperCppDir = '',
5860
[string]$VulkanSdkDir = '',
@@ -108,7 +110,7 @@ function Quote-Arg([string]$a) {
108110
return $a
109111
}
110112
$vcvars = ''
111-
if (-not $SkipNative -and ($Task -eq 'debug' -or $Task -eq 'release' -or $Task -eq 'native')) {
113+
if (-not $SkipNative -and ($Task -eq 'debug' -or $Task -eq 'release' -or $Task -eq 'bundle' -or $Task -eq 'native')) {
112114
$vcvars = Find-VcVars
113115
if (-not $vcvars) {
114116
throw 'Visual Studio Build Tools (VC++) ne naideny: nuzhny dlya vulkan-shaders-gen (host MSVC). Ustanovite VS s "Desktop development with C++"'
@@ -126,7 +128,7 @@ if ($Task -eq 'binary') {
126128
& pwsh -ExecutionPolicy Bypass -File $fetchBinary
127129
exit $LASTEXITCODE
128130
}
129-
if (-not $SkipBinary -and ($Task -eq 'debug' -or $Task -eq 'release')) {
131+
if (-not $SkipBinary -and ($Task -eq 'debug' -or $Task -eq 'release' -or $Task -eq 'bundle')) {
130132
# Skript sam znaet polnyy spisok nativov i sveryaet kazhdyy po sha256,
131133
# poetomu zdes tolko ego vyvod - inache katalog rassypayetsya v dvukh
132134
# mestakh i odin iz nih poteryayet pravila pro verzii.
@@ -189,6 +191,10 @@ switch ($Task) {
189191
'utest' { $gradleArgs += ':app:testDebugUnitTest' }
190192
'debug' { $gradleArgs += ':app:assembleDebug' }
191193
'release' { $gradleArgs += ':app:assembleRelease' }
194+
# Play принимает только AAB. Отдельная задача, а не флаг у release: у них разные
195+
# артефакты и разные адреса, а сборка AAB без проверки нативов дала бы «валидный»
196+
# бандл без сервера внутри - ровно тот случай, который ловится предсборочной проверкой.
197+
'bundle' { $gradleArgs += ':app:bundleRelease' }
192198
'native' { $gradleArgs += ':app:assembleDebug' }
193199
}
194200
if ($SkipNative) { $gradleArgs += '-PskipNativeBuild=true' }
@@ -212,5 +218,21 @@ if ($exitCode -ne 0) {
212218
Write-Error "FAILED: $Task (exit $exitCode). Polnyi log: $Log"
213219
exit 1
214220
}
221+
222+
if ($Task -eq 'bundle') {
223+
# Play принимает только AAB и запоминает versionCode: повторный аплоад с тем же номером
224+
# отклоняется. Номер живёт одной строкой в app/build.gradle.kts, поэтому печатаем его
225+
# здесь - иначе о нём вспоминают уже в консоли, после отказа загрузки.
226+
$aab = Get-ChildItem (Join-Path $Root 'app\build\outputs\bundle\release\*.aab') -ErrorAction SilentlyContinue |
227+
Sort-Object LastWriteTime -Descending | Select-Object -First 1
228+
$versionLine = Select-String -Path (Join-Path $Root 'app\build.gradle.kts') -Pattern '^\s*versionCode\s*=\s*(\d+)' |
229+
Select-Object -First 1
230+
$versionCode = if ($versionLine) { $versionLine.Matches[0].Groups[1].Value } else { '?' }
231+
if ($aab) {
232+
Write-Host ("AAB: {0} ({1:N0} bayt) versionCode={2}" -f $aab.FullName, $aab.Length, $versionCode)
233+
}
234+
Write-Host "Play: sleduyushchiy aplodad trebuyet versionCode > $versionCode"
235+
}
236+
215237
"OK: $Task (log: $Log)"
216238
exit 0

‎docs/ROADMAP.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ SAW-грантом (после `adb install -r` accessibility на ColorOS сб
323323

324324
| Трек | Статус |
325325
|------|--------|
326-
| 1. Release-контур | **Выполнен** — R8 + shrinkResources (374 → 274 → **147 MB**), base вынесена в lazy, пакет чистый `org.opencode.mobile`, smoke OK. **Подпись закрыта (26.09, `96bb02a`):** release подписан своим RSA-4096 ключом, `keystore.properties` в `.gitignore`, оффлайн-копия ключа сделана. **Карточка Play готова (25.10):** листинг в лимитах, 6 скриншотов 1272×2477, иконка 512×512, feature graphic 1024×500, политика конфиденциальности — `docs/play/`. **Перепроверено 26.10.2026 после миграции на 2.0.27:** сборка за 40 с, подпись release-ключом (`CN=opencode-mobile, OU=Release`), все нативы в APK (включая `libopencode.so` 2.0.27 и `libbun-musl.so`), движок и memory-MCP поднимаются за ~2 с, музыкальный MCP пропускается по делу (на чистой установке нет токена Яндекса), падений нет. Ограничение: не-debuggable сборку нельзя опросить по HTTP — пароль serve читается только через `run-as`. Осталось: доступ к Play Console и URL политики |
326+
| 1. Release-контур | **Выполнен** — R8 + shrinkResources (374 → 274 → **147 MB**), base вынесена в lazy, пакет чистый `org.opencode.mobile`, smoke OK. **Подпись закрыта (26.09, `96bb02a`):** release подписан своим RSA-4096 ключом, `keystore.properties` в `.gitignore`, оффлайн-копия ключа сделана. **Карточка Play готова (25.10):** листинг в лимитах, 6 скриншотов 1272×2477, иконка 512×512, feature graphic 1024×500, политика конфиденциальности — `docs/play/`. **Перепроверено 26.10.2026 после миграции на 2.0.27:** сборка за 40 с, подпись release-ключом (`CN=opencode-mobile, OU=Release`), все нативы в APK (включая `libopencode.so` 2.0.27 и `libbun-musl.so`), движок и memory-MCP поднимаются за ~2 с, музыкальный MCP пропускается по делу (на чистой установке нет токена Яндекса), падений нет. Ограничение: не-debuggable сборку нельзя опросить по HTTP — пароль serve читается только через `run-as`. **AAB теперь собирается штатной задачей `-Task bundle`** (раньше — руками: `-Task release` даёт только APK, а Play APK не принимает); задача печатает `versionCode`, чтобы повторная загрузка с тем же номером не стала сюрпризом. Осталось: доступ к Play Console и URL политики |
327327
| 2. Сеть без прокси | **Выполнен** — встроенный `Ipv4Proxy` (CONNECT, IPv4-first); туннели к context7/grep/npm открываются автоматически. Legacy `connect_proxy.py` удалён (26.09) |
328328
| 3. STT turbo на CPU | **Почти готов** — int8-encoder ~2× fp32, **VAD-чанкинг внедрён (первые слова 1–2 s)**, бенч на устройстве прогнан (24.09), **VAD-пороги измерены** (26.09, `56034e9`: `MIN_RMS=0.015` подтверждён свипом 6 порогов × 5 SNR), **WER-счётка готова и покрыта 13 тестами** (26.09, `c7256c1`). Осталось: наполнить корпус доверенными расшифровками и прогнать на устройстве |
329329
| 4. Безопасность и память | **Выполнен** — Basic Auth (401 без пароля), локальная память MCP (`ensureMcpConfig`, фикс «0 MCP»), протокольная диагностика, e2e чистой установки пройден |

0 commit comments

Comments
 (0)