shivao-projeto/mobile
PontualTech / Karlão 330d5aaa62
Some checks are pending
Build Android (APK + AAB) / build-android (push) Waiting to run
feat(ble): wake-up Xiaoxiang BMS — read inicial + 5A x4 v1.10.11
Confirmado: BMS responde ao app oficial Xiaoxiang. Problema é técnica
de inicialização não implementada na nossa abordagem.

Adicionado wake-up sequence ANTES do probe de protocolos:
1. ble.read na notify char (acorda stack BLE)
2. delay 300ms
3. write 0x5A x4 (handshake hello observado em alguns Xiaoxiang)
4. delay 1500ms (BMS processa wake)
5. probe normal de protocolos

Cada step protegido por try/catch + timeout 2s — não trava loop.
Logs detalhados pra ver onde falha se acontecer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 08:21:41 -03:00
..
android feat(ble): wake-up Xiaoxiang BMS — read inicial + 5A x4 v1.10.11 2026-04-29 08:21:41 -03:00
play-store-assets docs(ci): SETUP-RUNNER.md com token pré-gerado + instruções 5min 2026-04-28 05:26:57 -03:00
.gitignore feat(mobile): scaffold Capacitor pra Android Play Store + adapter nativo 2026-04-27 16:02:34 -03:00
capacitor.config.json feat(mobile): scaffold Capacitor pra Android Play Store + adapter nativo 2026-04-27 16:02:34 -03:00
package-lock.json fix(ble): plugin nativo @capacitor-community/bluetooth-le pra APK Android v1.9.1 2026-04-28 16:24:50 -03:00
package.json feat(ble): wake-up Xiaoxiang BMS — read inicial + 5A x4 v1.10.11 2026-04-29 08:21:41 -03:00
play-store-listing.md feat(legal+store): política de privacidade LGPD/GDPR + Play Store assets 2026-04-27 18:14:49 -03:00
README.md feat(mobile): scaffold Capacitor pra Android Play Store + adapter nativo 2026-04-27 16:02:34 -03:00

Shivao Mobile · Capacitor Android (e iOS futuro)

Wrapper Capacitor pra empacotar o Shivao web como app nativo Android (.apk pra sideload, .aab pra Play Store) e iOS no futuro.

Arquitetura: o frontend HTML mora em app/diario-bordo.html (1 fonte de verdade). Um script (scripts/sync-html.mjs) copia pra server/public/index.html (Express serve) e mobile/www/index.html (Capacitor empacota).


🛠️ Pré-requisitos (instalar 1 vez)

Windows (recomendado pra você)

  1. JDK 17+ — Adoptium Temurin é a melhor escolha:

    winget install EclipseAdoptium.Temurin.17.JDK
    

    Verificar: java -version deve mostrar 17.x

  2. Android Studio — instala SDK + emulador + tudo:

    winget install Google.AndroidStudio
    

    Após abrir, ir em Tools → SDK Manager e instalar:

    • Android SDK Platform 34 (Android 14)
    • Android SDK Build-Tools 34.0.0
    • Android SDK Command-line Tools (latest)
    • Android SDK Platform-Tools
  3. Variáveis de ambiente (Painel de Controle → Sistema → Variáveis de Ambiente):

    • JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-17.0.x (ajuste path)
    • ANDROID_HOME=C:\Users\pontu\AppData\Local\Android\Sdk
    • Adicionar ao PATH: %JAVA_HOME%\bin, %ANDROID_HOME%\platform-tools
  4. Reiniciar terminal. Verificar:

    java -version
    adb --version
    

Tempo total de instalação: ~30-45 min (download de ~3GB).


🚀 Build inicial (faz 1 vez)

cd mobile

# Instala deps Capacitor + plugins
npm install

# Sincroniza HTML do app/ pra mobile/www/
node ../scripts/sync-html.mjs

# Adiciona projeto Android (gera mobile/android/)
npx cap add android

# Sincroniza plugins nativos no projeto Android
npx cap sync android

Permissões Android (editar manualmente após cap add android)

Abra mobile/android/app/src/main/AndroidManifest.xml e adicione DENTRO do <manifest>:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

<uses-feature android:name="android.hardware.location.gps" android:required="false" />
<uses-feature android:name="android.hardware.sensor.barometer" android:required="false" />
<uses-feature android:name="android.hardware.sensor.compass" android:required="false" />

🔐 Keystore PERMANENTE (CRÍTICO — gera 1 vez, guarda pra sempre)

cd mobile/android/app
keytool -genkey -v -keystore shivao-release.keystore -alias shivao -keyalg RSA -keysize 2048 -validity 10000 \
  -dname "CN=Karlao, O=PontualTech, L=Sao Paulo, ST=SP, C=BR"
# Senha forte (mínimo 8 chars). ANOTE em local seguro — perda = perda permanente do app na Play Store.

BACKUP IMEDIATO:

cp shivao-release.keystore C:/Users/pontu/Downloads/Shivao-keystore-backup/shivao-release.keystore
echo "Senha keystore: SUA_SENHA_AQUI" >> C:/Users/pontu/Downloads/Shivao-keystore-backup/keystore-passwords.txt
echo "Alias: shivao" >> C:/Users/pontu/Downloads/Shivao-keystore-backup/keystore-passwords.txt

E também faça upload em Drive privado, HD externo etc — perdeu = não publica update na Play Store nunca mais.

Configurar signing no Gradle

Edite mobile/android/app/build.gradle, dentro de android { ... }:

signingConfigs {
    release {
        storeFile file('shivao-release.keystore')
        storePassword System.getenv('SHIVAO_KEYSTORE_PWD') ?: 'SUA_SENHA_AQUI'
        keyAlias 'shivao'
        keyPassword System.getenv('SHIVAO_KEY_PWD') ?: 'SUA_SENHA_AQUI'
    }
}
buildTypes {
    release {
        signingConfig signingConfigs.release
        minifyEnabled false
    }
}

📦 Build do APK (sideload) e AAB (Play Store)

cd mobile

# Sincroniza última versão do HTML antes de build
npm run sync

# APK assinado pra sideload (~3-5 min primeira vez, ~1 min em rebuilds)
npm run android:build:apk
# Output: mobile/android/app/build/outputs/apk/release/app-release.apk

# AAB pra Play Store (formato preferido)
npm run android:build:aab
# Output: mobile/android/app/build/outputs/bundle/release/app-release.aab

🌐 Alternativa: Build na nuvem (sem instalar nada local)

Se não quiser instalar 3GB de Android Studio:

Opção A: Codemagic (mais simples)

  • 500min grátis/mês, suficiente pra ~10 builds
  • Conecta ao Forgejo, push detecta e roda
  • Configura assinatura no painel

Opção B: Container Docker no Coolify (mais self-hosted)

  • Subir imagem mingc/android-build-box no Coolify
  • Cron job ou webhook do Forgejo dispara build
  • APK/AAB salvo em volume persistente

Ambas opções: vamos preparar quando você decidir.


🎮 Submeter Play Store

  1. Conta Google Play Developer: $25 1× em https://play.google.com/console
  2. Após aprovado (~24h), criar novo app:
    • Nome: "Shivao - Diário de Bordo"
    • Categoria: "Maps & Navigation"
    • Idioma: pt-BR
  3. Subir AAB: Production → Releases → Create new release → upload app-release.aab
  4. Conteúdo obrigatório:
    • Política de privacidade (URL pública — vou criar uma rota /politica-privacidade no servidor)
    • Screenshots: mínimo 2 (vou gerar via Playwright se quiser)
    • Ícone 512×512 (vou gerar do icon.svg)
    • Descrição curta (80 chars) e completa
  5. Content rating: preencher questionário (~5min)
  6. Pricing: Free (cobrança vai por dentro do app via Asaas, não Google IAP — economia de 30%)
  7. Submit pra review: Google revisa em 1-7 dias

📱 iOS (FASE 4 futura)

Requer:

  • Mac (mini M4 ~R$5k mais barato)
  • Apple Developer Program $99/ano
  • Xcode
npx cap add ios
npx cap sync ios
npx cap open ios  # abre Xcode
# Build Archive → Distribute → App Store Connect

🐛 Troubleshooting

adb: command not found — adicione %ANDROID_HOME%\platform-tools ao PATH

SDK location not found — crie mobile/android/local.properties:

sdk.dir=C:\\Users\\pontu\\AppData\\Local\\Android\\Sdk

Build muito lento — primeiro build baixa Gradle + dependências (~500MB). Próximos builds usam cache.

APK muito grande — habilitar minify em build.gradle:

buildTypes.release.minifyEnabled true
buildTypes.release.shrinkResources true