Pipeline de injeção automática de camada de telemetria em AAB/APK.
Organizado em Clean Architecture para facilitar evolução (novos injetores, ofuscação, bloqueio, suporte a mais frameworks etc.).
src/fusionbase/
├── domain/ # Entidades, Value Objects e Ports (interfaces)
│ ├── __init__.py # InjectionMapping, BuildRequest, BuildResult...
│ └── ports.py
├── application/ # Casos de uso
│ └── use_cases.py # ProtectAppUseCase
├── infrastructure/ # Implementações concretas
│ ├── apktool_unpacker.py
│ ├── manifest_mapper.py
# Mapeamento automático
│ ├── smali_injector.py
│ ├── apktool_repackager.py
│ └── apksigner.py
└── interfaces/ # Entrada (CLI)
└── cli.py # Composition Root + argparse
domainnão depende de nada externoapplicationdepende apenas dedomaininfrastructureimplementa os ports dodomaininterfacescompõe tudo (Composition Root)
cd fusion-base
pip install -e .fusion-base run \
--input app-release.aab \
--output app-protected.aab \
--elastic-url https://elastic.example.com/telemetry \
--keystore release.jks \
--ks-pass env:KEYSTORE_PASSWORD \
--key-alias upload- Python 3.9+
apktoolbundletool(para AAB)apksigner(Android SDK build-tools)
Pontos naturais de extensão:
| Necessidade | Onde estender |
|---|---|
| Novo tipo de injeção | Novo InjectorPort + implementação |
| Ofuscação | Novo passo no ProtectAppUseCase |
| Envio real ao Elastic | Substituir stub em SmaliInjector |
| Suporte a mais frameworks | Regras em ManifestInjectionMapper |
| API HTTP | Novo adapter em interfaces/ |
| Bloqueio | Nova política no domínio + injector |
- Telemetria só faz
Log.i(stub) - Injeção principal apenas em
Application.onCreate; outros pontos falham de forma explícita - Sem ofuscação ainda
- Sem testes automatizados de instalação
- Localiza a classe
Applicationemsmali/e nos diretórios de múltiplos dex (smali_classesN/). - Insere a chamada de telemetria depois de
.localsou.registers, preservando a sintaxe necessária para remontagem pelo Apktool. - É idempotente: uma segunda execução retorna
already_appliedsem duplicar a chamada. - Retorna um resultado explícito para classe/método ausente ou método inválido.
- O pipeline é fail-closed: não remonta nem assina o APK quando a injeção obrigatória não foi comprovada.
O CI remonta uma fixture multidex com Apktool e publica cobertura e JUnit como artefatos. Instalação, assinatura e confirmação de execução em dispositivo ainda dependem do trabalho E2E planejado no roadmap.