commit 936d4bce785ddc8749d8d030b4b69f48e918bce1 Author: Rodrigo Rodriguez (Pragmatismo) Date: Fri Dec 12 13:32:55 2025 -0300 Initial commit: BotOS - Android ROM customization project diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c75458b --- /dev/null +++ b/.gitignore @@ -0,0 +1,62 @@ +# Rust/Cargo build artifacts +target/ +Cargo.lock + +# Generated files (keep structure but ignore binaries) +*.so +*.a +*.o +*.dylib +*.dll +*.exe +*.bin +*.elf + +# Android build artifacts +*.apk +*.aab +*.dex +*.class +*.jar +gen/android/app/build/ +gen/android/.gradle/ +gen/android/build/ +gen/android/local.properties +*.keystore +*.jks + +# Tauri build artifacts +src-tauri/target/ + +# IDE +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# OS files +.DS_Store +Thumbs.db + +# Debug files +*.pdb +*.dSYM/ + +# ROM build artifacts +rom/out/ +rom/*.img +rom/*.zip +*.img +*.zip + +# Magisk module builds +rom/scripts/*.zip + +# Logs +*.log + +# Temporary files +*.tmp +*.temp +.cache/ diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..55e1349 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "botos" +version = "1.0.0" +edition = "2021" +description = "BotOS - Android launcher powered by General Bots" +license = "AGPL-3.0" + +[lib] +name = "botos_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[dependencies] +# Core from botlib +botlib = { path = "../botlib", features = ["http-client"] } + +# Tauri with mobile features +tauri = { version = "2", features = ["unstable"] } +tauri-plugin-dialog = "2" +tauri-plugin-opener = "2" +tauri-plugin-notification = "2" +tauri-plugin-http = "2" +tauri-plugin-geolocation = "2" + +# Common +anyhow = "1.0" +chrono = { version = "0.4", features = ["serde"] } +log = "0.4" +android_logger = "0.14" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +tokio = { version = "1.41", features = ["rt-multi-thread", "macros"] } +reqwest = { version = "0.12", features = ["json"] } + +[build-dependencies] +tauri-build = { version = "2", features = ["codegen"] } + +[features] +default = ["custom-protocol"] +custom-protocol = ["tauri/custom-protocol"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..4c687df --- /dev/null +++ b/README.md @@ -0,0 +1,245 @@ +# BotOS - Android OS powered by General Bots + +**BotOS** transforma qualquer Android em um sistema dedicado ao General Bots, removendo todo bloatware de fabricantes (Samsung, Huawei, Xiaomi, etc) e substituindo pela interface GB. + +## Níveis de Instalação + +| Nível | Requisitos | O que faz | +|-------|-----------|-----------| +| **1** | Apenas ADB | Remove bloatware, instala BotOS como app | +| **2** | Root + Magisk | Boot animation GB, BotOS como system app | +| **3** | Bootloader desbloqueado | Substitui Android inteiro por BotOS | + +## Quick Start + +```bash +cd botos/rom +./install.sh +``` + +O instalador detecta automaticamente o dispositivo e mostra as opções disponíveis. + +## Arquitetura + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ NÍVEL 3: GSI │ +│ ┌─────────────────────────────────────────────────────────────────────────┐│ +│ │ Android AOSP customizado - Zero apps de fabricante ││ +│ │ Boot animation GB desde inicialização ││ +│ │ BotOS integrado como launcher único ││ +│ └─────────────────────────────────────────────────────────────────────────┘│ +├─────────────────────────────────────────────────────────────────────────────┤ +│ NÍVEL 2: MAGISK MODULE │ +│ ┌─────────────────────────────────────────────────────────────────────────┐│ +│ │ Android original + Magisk ││ +│ │ Bloatware removido via overlay ││ +│ │ Boot animation GB ││ +│ │ BotOS como system app privilegiado ││ +│ └─────────────────────────────────────────────────────────────────────────┘│ +├─────────────────────────────────────────────────────────────────────────────┤ +│ NÍVEL 1: DEBLOAT + APP │ +│ ┌─────────────────────────────────────────────────────────────────────────┐│ +│ │ Android original (Samsung/Huawei/Xiaomi/etc) ││ +│ │ Bloatware removido via ADB (sem root) ││ +│ │ BotOS instalado como app normal ││ +│ │ Pode ser definido como launcher padrão ││ +│ └─────────────────────────────────────────────────────────────────────────┘│ +└─────────────────────────────────────────────────────────────────────────────┘ + +┌─────────────────────────────────────────────────────────────────────────────┐ +│ BotOS App (Tauri) │ +├─────────────────────────────────────────────────────────────────────────────┤ +│ botui/ui/suite │ Tauri Android │ src/lib.rs (Rust) │ +│ (Interface Web) │ (WebView + NDK) │ (Backend + Hardware) │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +## Estrutura do Projeto + +``` +botos/ +├── Cargo.toml # Dependências Rust/Tauri +├── tauri.conf.json # Config Tauri → botui/ui/suite +├── build.rs # Build script +├── src/lib.rs # Entry point Android +│ +├── icons/ +│ ├── gb-bot.svg # Ícone fonte +│ ├── icon.png (512x512) # Ícone principal +│ └── */ic_launcher.png # Ícones por densidade +│ +├── scripts/ +│ ├── generate-icons.sh # Gera PNGs do SVG +│ └── create-bootanimation.sh # Gera animação de boot +│ +├── capabilities/ +│ └── default.json # Permissões Tauri +│ +├── gen/android/ # Projeto Android gerado +│ └── app/src/main/ +│ ├── AndroidManifest.xml # HOME intent (launcher) +│ └── res/values/themes.xml # Tema dark GB +│ +└── rom/ # Tools de instalação + ├── install.sh # Instalador interativo + ├── scripts/ + │ ├── debloat.sh # Remove bloatware (sem root) + │ └── build-magisk-module.sh # Gera módulo Magisk + └── gsi/ + ├── README.md # Instruções GSI/AOSP + └── device/pragmatismo/botos/ # Device tree AOSP +``` + +## Pré-requisitos + +### Para compilar BotOS App + +```bash +# Rust e Android targets +rustup target add aarch64-linux-android armv7-linux-androideabi + +# Android SDK e NDK +export ANDROID_HOME=$HOME/Android/Sdk +export NDK_HOME=$ANDROID_HOME/ndk/25.2.9519653 + +# Tauri CLI +cargo install tauri-cli +``` + +### Para instalar em dispositivos + +```bash +# ADB +sudo apt install adb + +# Para gerar ícones/boot animation +sudo apt install librsvg2-bin imagemagick +``` + +## Compilação + +```bash +cd botos + +# Gerar ícones +./scripts/generate-icons.sh + +# Inicializar projeto Android +cargo tauri android init + +# Build APK +cargo tauri android build --release +``` + +## Instalação + +### Método Rápido (Interativo) + +```bash +cd botos/rom +chmod +x install.sh +./install.sh +``` + +### Método Manual + +#### Nível 1: Debloat + App (Sem Root) + +```bash +# Conectar dispositivo via USB (debug ativo) +cd botos/rom/scripts +./debloat.sh + +# Instalar APK +adb install ../gen/android/app/build/outputs/apk/release/app-release.apk + +# Definir como launcher: Home → BotOS → Sempre +``` + +#### Nível 2: Magisk Module (Com Root) + +```bash +# Gerar módulo +cd botos/rom/scripts +./build-magisk-module.sh + +# Copiar para dispositivo +adb push botos-magisk-v1.0.zip /sdcard/ + +# No celular: Magisk → Modules → + → Selecionar ZIP → Reboot +``` + +#### Nível 3: GSI (Bootloader Desbloqueado) + +Veja instruções detalhadas em `rom/gsi/README.md`. + +## Bloatware Removido + +O debloat remove automaticamente: + +**Samsung One UI:** +- Bixby, Samsung Pay, Samsung Pass +- Apps duplicados (Email, Calendar, Browser) +- AR Zone, Game Launcher + +**Huawei EMUI:** +- AppGallery, HiCloud, HiCar +- Huawei Browser, Music, Video + +**Xiaomi MIUI:** +- MSA (analytics), Mi Apps +- GetApps, Mi Cloud + +**Universal (todos):** +- Facebook, Instagram pré-instalados +- Netflix, Spotify pré-instalados +- Jogos como Candy Crush + +## Boot Animation + +Para customizar a animação de boot (requer root): + +```bash +# Gerar animação +./scripts/create-bootanimation.sh + +# Instalar (root) +adb root +adb remount +adb push bootanimation.zip /system/media/ +adb reboot +``` + +## Desenvolvimento + +```bash +# Dev mode (conecta ao dispositivo) +cargo tauri android dev + +# Logs +adb logcat -s BotOS:* +``` + +## Parceria Chuna + +BotOS foi criado para vendas/parcerias na Chuna, oferecendo: +- Celulares com sistema "limpo" - sem bloatware +- Interface única conectada ao General Bots +- Experiência simplificada para usuários finais +- Controle total do dispositivo + +## Recursos + +- 🏠 **Launcher Mode**: Substitui home screen +- 🤖 **Interface Chat**: botui/ui/suite +- 🦀 **Backend Rust**: Via Tauri +- 📍 **GPS**: Acesso a localização +- 📷 **Câmera**: Via plugins Tauri +- 🔔 **Notificações**: Push notifications +- 🌐 **Internet**: Comunicação com botserver +- 🎨 **Boot Animation**: Customizável com gb-bot.svg + +## Licença + +AGPL-3.0 diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/capabilities/default.json b/capabilities/default.json new file mode 100644 index 0000000..a77a62e --- /dev/null +++ b/capabilities/default.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "identifier": "default", + "description": "BotOS default capabilities", + "windows": ["main"], + "permissions": [ + "core:default", + "dialog:default", + "opener:default", + "notification:default", + "http:default", + "geolocation:default", + { + "identifier": "http:default", + "allow": [ + { "url": "https://**" }, + { "url": "http://**" } + ] + } + ] +} diff --git a/gen/android/app/src/main/AndroidManifest.xml b/gen/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..49c861e --- /dev/null +++ b/gen/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gen/android/app/src/main/res/values/themes.xml b/gen/android/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..146c7bb --- /dev/null +++ b/gen/android/app/src/main/res/values/themes.xml @@ -0,0 +1,33 @@ + + + + + + + + diff --git a/icons/gb-bot.svg b/icons/gb-bot.svg new file mode 100644 index 0000000..48f1314 --- /dev/null +++ b/icons/gb-bot.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/icons/hdpi/ic_launcher.png b/icons/hdpi/ic_launcher.png new file mode 100644 index 0000000..97e407a Binary files /dev/null and b/icons/hdpi/ic_launcher.png differ diff --git a/icons/icon.png b/icons/icon.png new file mode 100644 index 0000000..b9bff85 Binary files /dev/null and b/icons/icon.png differ diff --git a/icons/mdpi/ic_launcher.png b/icons/mdpi/ic_launcher.png new file mode 100644 index 0000000..53b4cdb Binary files /dev/null and b/icons/mdpi/ic_launcher.png differ diff --git a/icons/xhdpi/ic_launcher.png b/icons/xhdpi/ic_launcher.png new file mode 100644 index 0000000..0ebf87c Binary files /dev/null and b/icons/xhdpi/ic_launcher.png differ diff --git a/icons/xxhdpi/ic_launcher.png b/icons/xxhdpi/ic_launcher.png new file mode 100644 index 0000000..8f40409 Binary files /dev/null and b/icons/xxhdpi/ic_launcher.png differ diff --git a/icons/xxxhdpi/ic_launcher.png b/icons/xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..28cb71a Binary files /dev/null and b/icons/xxxhdpi/ic_launcher.png differ diff --git a/rom/README.md b/rom/README.md new file mode 100644 index 0000000..f168f68 --- /dev/null +++ b/rom/README.md @@ -0,0 +1,56 @@ +# BotOS ROM - Sistema Android Customizado + +## Níveis de Customização + +### Nível 1: Debloat + Launcher (Sem Root) +Remove apps do fabricante via ADB e configura BotOS como launcher padrão. + +### Nível 2: Magisk Module (Com Root) +Módulo que substitui boot animation, launcher padrão, e remove bloatware permanentemente. + +### Nível 3: Custom GSI (Imagem Completa) +Android puro com BotOS integrado, sem nenhum app de fabricante. + +--- + +## Nível 1: Debloat sem Root + +```bash +# Conectar dispositivo via USB (debug USB ativado) +./scripts/debloat.sh +``` + +Remove apps Samsung, Huawei, Xiaomi sem precisar de root. + +## Nível 2: Magisk Module + +```bash +# Gerar módulo Magisk +./scripts/build-magisk-module.sh + +# Instalar via Magisk Manager +adb push botos-magisk.zip /sdcard/ +``` + +## Nível 3: GSI Build + +Requer ambiente de build AOSP. Veja `gsi/README.md`. + +--- + +## Fabricantes Suportados para Debloat + +- Samsung (One UI) +- Huawei (EMUI) +- Xiaomi (MIUI) +- Motorola +- LG +- Realme/OPPO (ColorOS) +- Vivo (FuntouchOS) + +## Requisitos + +- ADB instalado +- USB Debug ativado no dispositivo +- Para Nível 2+: Bootloader desbloqueado + Magisk +- Para Nível 3: Ambiente AOSP build (~200GB espaço) diff --git a/rom/gsi/README.md b/rom/gsi/README.md new file mode 100644 index 0000000..ca0ccee --- /dev/null +++ b/rom/gsi/README.md @@ -0,0 +1,156 @@ +# BotOS GSI - Generic System Image + +## O que é GSI? + +GSI (Generic System Image) é uma imagem Android pura que funciona em **qualquer dispositivo** com Project Treble (Android 8.0+). + +Com GSI você pode: +- Substituir COMPLETAMENTE o sistema do fabricante +- Ter Android puro + BotOS +- Zero bloatware Samsung/Huawei/Xiaomi +- Controle total da inicialização + +## Requisitos do Dispositivo + +1. **Project Treble** - Verificar com: + ```bash + adb shell getprop ro.treble.enabled + # Deve retornar "true" + ``` + +2. **Bootloader desbloqueado** + +3. **Partição system tipo A/B ou A-only**: + ```bash + adb shell getprop ro.build.ab_update + # "true" = A/B, vazio = A-only + ``` + +## Opções de GSI Base + +### Opção 1: Usar GSI existente + BotOS Magisk Module + +Mais simples. Use uma GSI pronta e instale o módulo BotOS: + +1. Baixe GSI de: https://github.com/nicograph/nicograph-gsi +2. Flash via fastboot +3. Instale Magisk +4. Instale botos-magisk.zip + +### Opção 2: Compilar AOSP com BotOS integrado + +Para controle total, compile o AOSP do zero. + +## Compilando AOSP com BotOS + +### Requisitos de Build + +```bash +# Ubuntu 20.04+ recomendado +# ~300GB de espaço em disco +# 16GB+ RAM +# CPU com muitos cores (compilação leva horas) + +# Instalar dependências +sudo apt install -y git-core gnupg flex bison build-essential \ + zip curl zlib1g-dev libc6-dev-i386 libncurses5 \ + x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev \ + libxml2-utils xsltproc unzip fontconfig python3 +``` + +### Estrutura do Projeto + +``` +aosp/ +├── .repo/ # Repo tool metadata +├── build/ # Build system +├── device/ +│ └── pragmatismo/ +│ └── botos/ # Device config para BotOS +├── packages/ +│ └── apps/ +│ └── BotOS/ # App BotOS como system app +├── vendor/ +│ └── pragmatismo/ +│ └── botos/ # Vendor customizations +└── out/ # Build output +``` + +### Passo 1: Inicializar Repo + +```bash +mkdir aosp && cd aosp + +# Inicializar com Android 14 (ou versão desejada) +repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r1 + +# Sync (demora muito!) +repo sync -c -j$(nproc) --no-tags +``` + +### Passo 2: Criar Device Tree BotOS + +O device tree define configurações específicas do BotOS. + +Veja os arquivos em `device/pragmatismo/botos/` neste repositório. + +### Passo 3: Compilar + +```bash +source build/envsetup.sh +lunch botos_arm64-userdebug +make -j$(nproc) +``` + +### Passo 4: Flash + +```bash +# Entrar em fastboot mode +adb reboot fastboot + +# Flash GSI +fastboot flash system out/target/product/botos/system.img +fastboot flash vendor out/target/product/botos/vendor.img +fastboot flash boot out/target/product/botos/boot.img + +# Limpar dados (necessário para GSI) +fastboot -w + +# Reboot +fastboot reboot +``` + +## Arquivos de Configuração + +Os arquivos necessários estão em: +- `device/` - Device tree +- `vendor/` - Vendor customizations +- `packages/apps/BotOS/` - App BotOS + +## Alternativa: phh-treble GSI + +Para uma abordagem mais rápida, modifique o phh-treble GSI: + +```bash +git clone https://github.com/nicograph/nicograph-gsi +cd nicograph-gsi + +# Adicionar BotOS como system app +mkdir -p nicograph-files/system/priv-app/BotOS +cp /path/to/BotOS.apk nicograph-files/system/priv-app/BotOS/ + +# Adicionar boot animation +cp /path/to/bootanimation.zip nicograph-files/system/media/ + +# Rebuild +./build.sh +``` + +## Notas de Segurança + +⚠️ **AVISO**: Modificar system images pode: +- Invalidar garantia do dispositivo +- Causar brick se feito incorretamente +- Desabilitar recursos de segurança (SafetyNet, etc) + +Sempre tenha backup completo antes de qualquer modificação! diff --git a/rom/gsi/device/pragmatismo/botos/AndroidProducts.mk b/rom/gsi/device/pragmatismo/botos/AndroidProducts.mk new file mode 100644 index 0000000..caba6ff --- /dev/null +++ b/rom/gsi/device/pragmatismo/botos/AndroidProducts.mk @@ -0,0 +1,10 @@ +# BotOS Android Products +# Define os targets de build disponíveis + +PRODUCT_MAKEFILES := \ + $(LOCAL_DIR)/device.mk + +COMMON_LUNCH_CHOICES := \ + botos_arm64-userdebug \ + botos_arm64-user \ + botos_arm64-eng diff --git a/rom/gsi/device/pragmatismo/botos/BoardConfig.mk b/rom/gsi/device/pragmatismo/botos/BoardConfig.mk new file mode 100644 index 0000000..f201d58 --- /dev/null +++ b/rom/gsi/device/pragmatismo/botos/BoardConfig.mk @@ -0,0 +1,40 @@ +# BotOS Board Configuration +# Generic System Image (GSI) for ARM64 + +# Architecture +TARGET_ARCH := arm64 +TARGET_ARCH_VARIANT := armv8-a +TARGET_CPU_ABI := arm64-v8a +TARGET_CPU_VARIANT := generic + +TARGET_2ND_ARCH := arm +TARGET_2ND_ARCH_VARIANT := armv8-a +TARGET_2ND_CPU_ABI := armeabi-v7a +TARGET_2ND_CPU_VARIANT := generic + +# Treble +BOARD_VNDK_VERSION := current +PRODUCT_FULL_TREBLE := true + +# Partitions +BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE := ext4 +BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE := ext4 +BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE := ext4 + +# System as root +BOARD_BUILD_SYSTEM_ROOT_IMAGE := true + +# Boot image +BOARD_KERNEL_BASE := 0x00000000 +BOARD_KERNEL_PAGESIZE := 4096 +BOARD_KERNEL_CMDLINE := androidboot.hardware=botos + +# Verified Boot +BOARD_AVB_ENABLE := true + +# SELinux +BOARD_SEPOLICY_DIRS += device/pragmatismo/botos/sepolicy + +# Recovery +TARGET_USERIMAGES_USE_EXT4 := true +TARGET_USERIMAGES_USE_F2FS := true diff --git a/rom/gsi/device/pragmatismo/botos/device.mk b/rom/gsi/device/pragmatismo/botos/device.mk new file mode 100644 index 0000000..196e5bf --- /dev/null +++ b/rom/gsi/device/pragmatismo/botos/device.mk @@ -0,0 +1,77 @@ +# BotOS Device Configuration + +# Inherit from common +$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk) + +# Product info +PRODUCT_NAME := botos +PRODUCT_DEVICE := botos +PRODUCT_BRAND := Pragmatismo +PRODUCT_MODEL := BotOS +PRODUCT_MANUFACTURER := Pragmatismo.io + +# Locales +PRODUCT_LOCALES := pt_BR en_US es_ES + +# ===================================================== +# BotOS Customizations +# ===================================================== + +# BotOS Launcher como app de sistema privilegiado +PRODUCT_PACKAGES += \ + BotOS + +# Boot animation customizada +PRODUCT_COPY_FILES += \ + device/pragmatismo/botos/media/bootanimation.zip:system/media/bootanimation.zip + +# Overlay para configurações padrão +DEVICE_PACKAGE_OVERLAYS += device/pragmatismo/botos/overlay + +# Propriedades do sistema +PRODUCT_PROPERTY_OVERRIDES += \ + ro.product.brand=Pragmatismo \ + ro.product.name=BotOS \ + ro.product.device=botos \ + ro.build.display.id=BotOS-1.0 \ + ro.botos.version=1.0 \ + persist.sys.language=pt \ + persist.sys.country=BR + +# Desabilitar analytics/telemetria +PRODUCT_PROPERTY_OVERRIDES += \ + ro.com.google.gmsversion= \ + ro.setupwizard.mode=DISABLED + +# Performance +PRODUCT_PROPERTY_OVERRIDES += \ + dalvik.vm.heapsize=512m \ + dalvik.vm.heapgrowthlimit=256m + +# ===================================================== +# Removido bloatware +# ===================================================== + +# NÃO incluir esses pacotes +PRODUCT_PACKAGES_REMOVED += \ + Calculator \ + Calendar \ + Camera2 \ + DeskClock \ + Email \ + Gallery2 \ + Music \ + QuickSearchBox + +# ===================================================== +# Apps mínimos necessários +# ===================================================== + +PRODUCT_PACKAGES += \ + Launcher3 \ + Settings \ + SystemUI \ + SettingsProvider \ + Shell \ + adb diff --git a/rom/install.sh b/rom/install.sh new file mode 100755 index 0000000..3309ab6 --- /dev/null +++ b/rom/install.sh @@ -0,0 +1,313 @@ +#!/bin/bash +# BotOS Installation Script +# Escolha o nível de instalação baseado no seu dispositivo +# +# Uso: ./install.sh + +set -e +cd "$(dirname "$0")" + +# Cores +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' + +clear +echo -e "${CYAN}" +cat << 'BANNER' +╔══════════════════════════════════════════════════════════════════════════════╗ +║ ║ +║ ██████╗ ██████╗ ████████╗ ██████╗ ███████╗ ║ +║ ██╔══██╗██╔═══██╗╚══██╔══╝██╔═══██╗██╔════╝ ║ +║ ██████╔╝██║ ██║ ██║ ██║ ██║███████╗ ║ +║ ██╔══██╗██║ ██║ ██║ ██║ ██║╚════██║ ║ +║ ██████╔╝╚██████╔╝ ██║ ╚██████╔╝███████║ ║ +║ ╚═════╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝ ║ +║ ║ +║ Android OS by General Bots ║ +║ Pragmatismo.io ║ +║ ║ +╚══════════════════════════════════════════════════════════════════════════════╝ +BANNER +echo -e "${NC}" + +# ===================================================== +# Verificações +# ===================================================== + +check_adb() { + if ! command -v adb &> /dev/null; then + echo -e "${RED}ERRO: ADB não encontrado!${NC}" + echo "Instale com: sudo apt install adb" + return 1 + fi + return 0 +} + +check_device() { + if ! adb devices | grep -q "device$"; then + echo -e "${YELLOW}Nenhum dispositivo conectado.${NC}" + echo "" + echo "Para conectar:" + echo " 1. Ative 'Opções do desenvolvedor' no celular" + echo " (Configurações → Sobre → Tocar 7x no 'Número da versão')" + echo " 2. Ative 'Depuração USB'" + echo " 3. Conecte o cabo USB" + echo " 4. Autorize no celular quando solicitado" + echo "" + return 1 + fi + + DEVICE=$(adb shell getprop ro.product.model 2>/dev/null | tr -d '\r') + BRAND=$(adb shell getprop ro.product.brand 2>/dev/null | tr -d '\r') + ANDROID=$(adb shell getprop ro.build.version.release 2>/dev/null | tr -d '\r') + + echo -e "${GREEN}Dispositivo conectado: $BRAND $DEVICE (Android $ANDROID)${NC}" + return 0 +} + +check_root() { + if adb shell su -c "id" 2>/dev/null | grep -q "uid=0"; then + echo -e "${GREEN}Root detectado!${NC}" + return 0 + else + echo -e "${YELLOW}Dispositivo NÃO tem root.${NC}" + return 1 + fi +} + +check_magisk() { + if adb shell pm list packages 2>/dev/null | grep -q "com.topjohnwu.magisk"; then + echo -e "${GREEN}Magisk detectado!${NC}" + return 0 + else + return 1 + fi +} + +check_treble() { + local treble=$(adb shell getprop ro.treble.enabled 2>/dev/null | tr -d '\r') + if [ "$treble" == "true" ]; then + echo -e "${GREEN}Project Treble: Suportado${NC}" + return 0 + else + echo -e "${YELLOW}Project Treble: NÃO suportado${NC}" + return 1 + fi +} + +check_bootloader() { + local unlocked=$(adb shell getprop ro.boot.flash.locked 2>/dev/null | tr -d '\r') + if [ "$unlocked" == "0" ]; then + echo -e "${GREEN}Bootloader: Desbloqueado${NC}" + return 0 + else + echo -e "${YELLOW}Bootloader: Bloqueado${NC}" + return 1 + fi +} + +# ===================================================== +# Instalação +# ===================================================== + +install_level_1() { + echo -e "\n${BLUE}=== Nível 1: Debloat + BotOS Launcher ===${NC}" + echo "Removendo bloatware e instalando BotOS como app..." + echo "" + + # Executar debloat + bash scripts/debloat.sh +} + +install_level_2() { + echo -e "\n${BLUE}=== Nível 2: Magisk Module ===${NC}" + echo "Instalando módulo Magisk com boot animation + BotOS system app..." + echo "" + + # Verificar se tem APK compilado + if [ ! -f "../gen/android/app/build/outputs/apk/release/app-release.apk" ]; then + echo -e "${YELLOW}APK do BotOS não encontrado.${NC}" + echo "Compilando..." + cd .. + cargo tauri android build --release || { + echo -e "${RED}Erro na compilação. Configure o ambiente Tauri primeiro.${NC}" + return 1 + } + cd rom + fi + + # Gerar boot animation + if [ ! -f "../bootanimation.zip" ]; then + echo "Gerando boot animation..." + bash ../scripts/create-bootanimation.sh || true + fi + + # Build Magisk module + bash scripts/build-magisk-module.sh + + # Instalar + if [ -f "botos-magisk-v1.0.zip" ]; then + echo "Copiando módulo para dispositivo..." + adb push botos-magisk-v1.0.zip /sdcard/ + + echo "" + echo -e "${GREEN}Módulo copiado!${NC}" + echo "" + echo "Para completar a instalação:" + echo " 1. Abra o Magisk Manager no celular" + echo " 2. Vá em 'Modules' (Módulos)" + echo " 3. Toque em '+' e selecione 'botos-magisk-v1.0.zip'" + echo " 4. Reinicie o dispositivo" + fi +} + +install_level_3() { + echo -e "\n${BLUE}=== Nível 3: GSI Flash ===${NC}" + echo "Instalando GSI completa com BotOS..." + echo "" + + echo -e "${YELLOW}AVISO: Isso irá APAGAR todos os dados do dispositivo!${NC}" + echo "" + read -p "Tem certeza? Digite 'SIM' para continuar: " confirm + + if [ "$confirm" != "SIM" ]; then + echo "Cancelado." + return 1 + fi + + # Verificar requisitos + check_treble || { + echo -e "${RED}Dispositivo não suporta Project Treble.${NC}" + return 1 + } + + check_bootloader || { + echo -e "${YELLOW}Bootloader precisa ser desbloqueado primeiro.${NC}" + echo "" + echo "Instruções:" + echo " 1. Habilite 'OEM unlocking' nas opções do desenvolvedor" + echo " 2. adb reboot bootloader" + echo " 3. fastboot flashing unlock" + echo " 4. Confirme no dispositivo" + return 1 + fi + + echo "" + echo "Para GSI, você precisa:" + echo " 1. Baixar uma GSI base (ex: phh-treble)" + echo " 2. Ou compilar AOSP com os arquivos em gsi/" + echo "" + echo "Veja gsi/README.md para instruções detalhadas." +} + +show_device_info() { + echo -e "\n${BLUE}=== Informações do Dispositivo ===${NC}\n" + + check_device || return 1 + + echo "" + check_root && HAS_ROOT=1 || HAS_ROOT=0 + check_magisk && HAS_MAGISK=1 || HAS_MAGISK=0 + check_treble && HAS_TREBLE=1 || HAS_TREBLE=0 + check_bootloader && HAS_UNLOCKED=1 || HAS_UNLOCKED=0 + + echo "" + echo -e "${CYAN}Opções disponíveis para este dispositivo:${NC}" + echo "" + echo -e " ${GREEN}✓${NC} Nível 1 (Debloat + App) - Sempre disponível" + + if [ "$HAS_MAGISK" == "1" ]; then + echo -e " ${GREEN}✓${NC} Nível 2 (Magisk Module) - Magisk detectado" + else + echo -e " ${YELLOW}?${NC} Nível 2 (Magisk Module) - Requer Magisk instalado" + fi + + if [ "$HAS_TREBLE" == "1" ] && [ "$HAS_UNLOCKED" == "1" ]; then + echo -e " ${GREEN}✓${NC} Nível 3 (GSI) - Treble + Bootloader desbloqueado" + else + echo -e " ${RED}✗${NC} Nível 3 (GSI) - Requer Treble + bootloader desbloqueado" + fi +} + +# ===================================================== +# Menu Principal +# ===================================================== + +main_menu() { + while true; do + echo "" + echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" + echo -e "${CYAN} MENU DE INSTALAÇÃO ${NC}" + echo -e "${CYAN}═══════════════════════════════════════════════════════════════${NC}" + echo "" + echo " 1) Ver informações do dispositivo" + echo "" + echo " 2) Nível 1: Debloat + BotOS Launcher (SEM root)" + echo " Remove bloatware via ADB, instala BotOS como app" + echo "" + echo " 3) Nível 2: Magisk Module (COM root)" + echo " Boot animation GB, BotOS como system app, bloat removido" + echo "" + echo " 4) Nível 3: GSI Flash (Bootloader desbloqueado)" + echo " Substitui Android inteiro por BotOS" + echo "" + echo " 5) Compilar BotOS APK" + echo "" + echo " 6) Gerar Boot Animation" + echo "" + echo " 0) Sair" + echo "" + read -p "Escolha [0-6]: " choice + + case $choice in + 1) + check_adb && show_device_info + ;; + 2) + check_adb && check_device && install_level_1 + ;; + 3) + check_adb && check_device && install_level_2 + ;; + 4) + check_adb && check_device && install_level_3 + ;; + 5) + echo -e "\n${BLUE}Compilando BotOS APK...${NC}\n" + cd .. + cargo tauri android build --release + cd rom + echo -e "${GREEN}APK gerado em gen/android/app/build/outputs/apk/${NC}" + ;; + 6) + echo -e "\n${BLUE}Gerando boot animation...${NC}\n" + bash ../scripts/create-bootanimation.sh + ;; + 0) + echo -e "\n${GREEN}Até logo!${NC}\n" + exit 0 + ;; + *) + echo -e "${RED}Opção inválida${NC}" + ;; + esac + + echo "" + read -p "Pressione ENTER para continuar..." + clear + done +} + +# ===================================================== +# Início +# ===================================================== + +# Verificar se ADB está disponível +check_adb || exit 1 + +# Mostrar menu +main_menu diff --git a/rom/scripts/build-magisk-module.sh b/rom/scripts/build-magisk-module.sh new file mode 100755 index 0000000..364c6af --- /dev/null +++ b/rom/scripts/build-magisk-module.sh @@ -0,0 +1,286 @@ +#!/bin/bash +# Build BotOS Magisk Module +# Substitui boot animation, launcher padrão, e configurações do sistema +# +# O módulo será instalado via Magisk Manager + +set -e +cd "$(dirname "$0")/.." + +MODULE_DIR="magisk-module" +MODULE_ZIP="botos-magisk-v1.0.zip" + +echo "╔══════════════════════════════════════════════════════════════╗" +echo "║ Building BotOS Magisk Module ║" +echo "╚══════════════════════════════════════════════════════════════╝" +echo "" + +# Limpar e criar estrutura +rm -rf "$MODULE_DIR" +mkdir -p "$MODULE_DIR/META-INF/com/google/android" +mkdir -p "$MODULE_DIR/system/media" +mkdir -p "$MODULE_DIR/system/etc/permissions" +mkdir -p "$MODULE_DIR/system/priv-app/BotOS" +mkdir -p "$MODULE_DIR/common" + +# ===================================================== +# module.prop - Metadados do módulo +# ===================================================== +cat > "$MODULE_DIR/module.prop" << 'EOF' +id=botos +name=BotOS - General Bots Launcher +version=v1.0 +versionCode=1 +author=Pragmatismo.io +description=Transforma seu Android em BotOS - Remove bloatware, substitui boot animation e define BotOS como launcher padrão +EOF + +# ===================================================== +# update-binary - Script de instalação +# ===================================================== +cat > "$MODULE_DIR/META-INF/com/google/android/update-binary" << 'INSTALLER' +#!/sbin/sh + +################# +# Initialization +################# + +TMPDIR=/dev/tmp +PERSISTDIR=/sbin/.magisk/mirror/persist + +rm -rf $TMPDIR 2>/dev/null +mkdir -p $TMPDIR + +# echo before loading util_functions +ui_print() { echo "$1"; } + +require_new_magisk() { + ui_print "*******************************" + ui_print " Please install Magisk v20.4+! " + ui_print "*******************************" + exit 1 +} + +########################## +# Load util_functions.sh +########################## + +OUTFD=$2 +ZIPFILE=$3 + +mount /data 2>/dev/null + +[ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk +. /data/adb/magisk/util_functions.sh +[ $MAGISK_VER_CODE -lt 20400 ] && require_new_magisk + +install_module +exit 0 +INSTALLER + +chmod 755 "$MODULE_DIR/META-INF/com/google/android/update-binary" + +# ===================================================== +# updater-script (vazio, necessário para compatibilidade) +# ===================================================== +echo "#MAGISK" > "$MODULE_DIR/META-INF/com/google/android/updater-script" + +# ===================================================== +# customize.sh - Script de customização pós-instalação +# ===================================================== +cat > "$MODULE_DIR/customize.sh" << 'CUSTOMIZE' +#!/system/bin/sh +# BotOS Magisk Module - Customization Script + +ui_print "╔══════════════════════════════════════════════════════════════╗" +ui_print "║ Installing BotOS ║" +ui_print "╚══════════════════════════════════════════════════════════════╝" +ui_print "" + +# Verificar arquitetura +ARCH=$(getprop ro.product.cpu.abi) +ui_print "- Device architecture: $ARCH" +ui_print "- Android version: $(getprop ro.build.version.release)" +ui_print "- Device: $(getprop ro.product.model)" +ui_print "" + +# Copiar boot animation se existir +if [ -f "$MODPATH/bootanimation.zip" ]; then + ui_print "- Installing custom boot animation..." + mkdir -p "$MODPATH/system/media" + cp "$MODPATH/bootanimation.zip" "$MODPATH/system/media/" +fi + +# Copiar APK do BotOS se existir +if [ -f "$MODPATH/BotOS.apk" ]; then + ui_print "- Installing BotOS launcher as system app..." + mkdir -p "$MODPATH/system/priv-app/BotOS" + cp "$MODPATH/BotOS.apk" "$MODPATH/system/priv-app/BotOS/" +fi + +# Configurar permissões +ui_print "- Setting permissions..." +set_perm_recursive $MODPATH 0 0 0755 0644 + +if [ -d "$MODPATH/system/priv-app" ]; then + set_perm_recursive "$MODPATH/system/priv-app" 0 0 0755 0644 +fi + +ui_print "" +ui_print "╔══════════════════════════════════════════════════════════════╗" +ui_print "║ BotOS installed successfully! ║" +ui_print "║ ║" +ui_print "║ After reboot: ║" +ui_print "║ 1. Press Home button ║" +ui_print "║ 2. Select 'BotOS' as default launcher ║" +ui_print "║ 3. Choose 'Always' ║" +ui_print "╚══════════════════════════════════════════════════════════════╝" +CUSTOMIZE + +chmod 755 "$MODULE_DIR/customize.sh" + +# ===================================================== +# post-fs-data.sh - Executado no boot (após fs montado) +# ===================================================== +cat > "$MODULE_DIR/post-fs-data.sh" << 'POSTFS' +#!/system/bin/sh +# BotOS - Post-FS-Data Script +# Executado após o sistema de arquivos ser montado + +MODDIR=${0%/*} + +# Log +log -t BotOS "BotOS module post-fs-data started" + +# Desabilitar apps de fabricante (overlay) +# Isso "esconde" os apps sem deletá-los +for bloat in \ + "com.facebook.katana" \ + "com.facebook.appmanager" \ + "com.facebook.services" \ + "com.samsung.android.bixby.agent" \ + "com.samsung.android.bixby.service" \ + "com.huawei.appmarket" \ + "com.miui.msa.global" \ + "com.miui.analytics" +do + # Criar diretório vazio para "substituir" o app + if [ -d "/system/app/$bloat" ]; then + mkdir -p "$MODDIR/system/app/$bloat" + touch "$MODDIR/system/app/$bloat/.replace" + fi + if [ -d "/system/priv-app/$bloat" ]; then + mkdir -p "$MODDIR/system/priv-app/$bloat" + touch "$MODDIR/system/priv-app/$bloat/.replace" + fi +done + +log -t BotOS "BotOS bloatware disabled via overlay" +POSTFS + +chmod 755 "$MODULE_DIR/post-fs-data.sh" + +# ===================================================== +# service.sh - Executado como serviço no boot +# ===================================================== +cat > "$MODULE_DIR/service.sh" << 'SERVICE' +#!/system/bin/sh +# BotOS - Service Script +# Executado como serviço após o boot completar + +MODDIR=${0%/*} + +# Aguardar boot completar +while [ "$(getprop sys.boot_completed)" != "1" ]; do + sleep 1 +done + +# Aguardar mais um pouco para sistema estabilizar +sleep 5 + +log -t BotOS "BotOS service started" + +# Configurar BotOS como launcher padrão (se instalado) +BOTOS_PKG="br.com.pragmatismo.botos" + +if pm list packages | grep -q "$BOTOS_PKG"; then + # Tentar definir como launcher padrão + # Nota: Isso pode não funcionar em todos os dispositivos + pm set-home-activity "$BOTOS_PKG/.MainActivity" 2>/dev/null || true + log -t BotOS "BotOS set as preferred launcher" +fi + +# Desabilitar analytics/telemetria de fabricantes +settings put global upload_apk_enable 0 2>/dev/null || true +settings put secure send_action_app_error 0 2>/dev/null || true + +# Ativar modo imersivo (esconde barra de navegação) +# settings put global policy_control immersive.full=* 2>/dev/null || true + +log -t BotOS "BotOS service configuration complete" +SERVICE + +chmod 755 "$MODULE_DIR/service.sh" + +# ===================================================== +# uninstall.sh - Script de desinstalação +# ===================================================== +cat > "$MODULE_DIR/uninstall.sh" << 'UNINSTALL' +#!/system/bin/sh +# BotOS - Uninstall Script + +# Restaurar launcher padrão do sistema +# (O Magisk automaticamente remove os overlays) + +log -t BotOS "BotOS module uninstalled" +UNINSTALL + +chmod 755 "$MODULE_DIR/uninstall.sh" + +# ===================================================== +# Copiar boot animation se existir +# ===================================================== +if [ -f "../bootanimation.zip" ]; then + echo "- Incluindo boot animation customizada..." + cp "../bootanimation.zip" "$MODULE_DIR/" +else + echo "- Boot animation não encontrada." + echo " Execute ../scripts/create-bootanimation.sh primeiro." +fi + +# ===================================================== +# Copiar APK do BotOS se existir +# ===================================================== +APK_PATH="../gen/android/app/build/outputs/apk/release/app-release.apk" +if [ -f "$APK_PATH" ]; then + echo "- Incluindo BotOS APK..." + cp "$APK_PATH" "$MODULE_DIR/BotOS.apk" +else + echo "- APK não encontrado." + echo " Compile com: cd .. && cargo tauri android build --release" +fi + +# ===================================================== +# Criar arquivo ZIP do módulo +# ===================================================== +echo "" +echo "Criando $MODULE_ZIP..." +cd "$MODULE_DIR" +zip -r "../$MODULE_ZIP" . -x "*.DS_Store" +cd .. + +echo "" +echo "╔══════════════════════════════════════════════════════════════╗" +echo "║ Magisk Module criado com sucesso! ║" +echo "╚══════════════════════════════════════════════════════════════╝" +echo "" +echo "Arquivo: $(pwd)/$MODULE_ZIP" +echo "" +echo "Para instalar:" +echo " 1. Copie para o dispositivo:" +echo " adb push $MODULE_ZIP /sdcard/" +echo "" +echo " 2. Abra o Magisk Manager" +echo " 3. Vá em 'Modules' → '+' → Selecione o ZIP" +echo " 4. Reinicie o dispositivo" +echo "" diff --git a/rom/scripts/debloat.sh b/rom/scripts/debloat.sh new file mode 100755 index 0000000..c9a5606 --- /dev/null +++ b/rom/scripts/debloat.sh @@ -0,0 +1,406 @@ +#!/bin/bash +# BotOS Debloat Script - Remove bloatware sem root +# Funciona via ADB shell pm uninstall --user 0 +# +# Uso: ./debloat.sh [samsung|huawei|xiaomi|all] + +set -e +cd "$(dirname "$0")/.." + +# Cores +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +echo -e "${BLUE}" +echo "╔══════════════════════════════════════════════════════════════╗" +echo "║ BotOS Debloat Tool v1.0 ║" +echo "║ Remove bloatware Samsung/Huawei/Xiaomi/etc ║" +echo "╚══════════════════════════════════════════════════════════════╝" +echo -e "${NC}" + +# Verificar ADB +if ! command -v adb &> /dev/null; then + echo -e "${RED}ERRO: ADB não encontrado!${NC}" + echo "Instale com: sudo apt install adb" + exit 1 +fi + +# Verificar dispositivo conectado +if ! adb devices | grep -q "device$"; then + echo -e "${RED}ERRO: Nenhum dispositivo conectado!${NC}" + echo "1. Ative 'Depuração USB' nas configurações do desenvolvedor" + echo "2. Conecte o cabo USB e autorize no celular" + exit 1 +fi + +DEVICE=$(adb shell getprop ro.product.model | tr -d '\r') +BRAND=$(adb shell getprop ro.product.brand | tr -d '\r') +echo -e "${GREEN}Dispositivo detectado: $BRAND $DEVICE${NC}" +echo "" + +# ===================================================== +# LISTAS DE BLOATWARE POR FABRICANTE +# ===================================================== + +# Samsung One UI +SAMSUNG_BLOAT=( + # Samsung Apps + "com.samsung.android.app.tips" + "com.samsung.android.bixby.agent" + "com.samsung.android.bixby.service" + "com.samsung.android.visionintelligence" + "com.samsung.android.app.routines" + "com.samsung.android.game.gamehome" + "com.samsung.android.game.gametools" + "com.samsung.android.app.spage" + "com.samsung.android.mateagent" + "com.samsung.android.app.watchmanagerstub" + "com.samsung.android.ardrawing" + "com.samsung.android.aremoji" + "com.samsung.android.arzone" + "com.samsung.android.stickercenter" + "com.samsung.android.app.dressroom" + "com.samsung.android.forest" + "com.samsung.android.app.social" + "com.samsung.android.livestickers" + "com.samsung.android.app.sharelive" + + # Samsung Duplicates (use Google apps instead) + "com.samsung.android.email.provider" + "com.samsung.android.calendar" + "com.samsung.android.contacts" + "com.samsung.android.messaging" + "com.sec.android.app.sbrowser" + + # Facebook bloatware (pre-installed) + "com.facebook.katana" + "com.facebook.appmanager" + "com.facebook.services" + "com.facebook.system" + + # Microsoft bloatware + "com.microsoft.skydrive" + "com.microsoft.office.excel" + "com.microsoft.office.word" + "com.microsoft.office.powerpoint" + "com.linkedin.android" + + # Other Samsung bloat + "com.samsung.android.spay" + "com.samsung.android.samsungpass" + "com.samsung.android.authfw" + "com.samsung.android.kidsinstaller" + "com.samsung.android.app.camera.sticker.facearavatar.preload" +) + +# Huawei EMUI +HUAWEI_BLOAT=( + "com.huawei.hiview" + "com.huawei.himovie.overseas" + "com.huawei.music" + "com.huawei.appmarket" + "com.huawei.browser" + "com.huawei.hifolder" + "com.huawei.gameassistant" + "com.huawei.tips" + "com.huawei.hwid" + "com.huawei.wallet" + "com.huawei.health" + "com.huawei.hicloud" + "com.huawei.compass" + "com.huawei.mirrorlink" + "com.huawei.hicar" + "com.huawei.hiai" + "com.huawei.intelligent" + "com.huawei.parentcontrol" + "com.huawei.securitymgr" + + # Facebook + "com.facebook.katana" + "com.facebook.appmanager" + "com.facebook.services" + + # Booking + "com.booking" +) + +# Xiaomi MIUI +XIAOMI_BLOAT=( + "com.miui.analytics" + "com.miui.msa.global" + "com.miui.daemon" + "com.miui.hybrid" + "com.miui.yellowpage" + "com.miui.videoplayer" + "com.miui.player" + "com.miui.compass" + "com.miui.cleanmaster" + "com.miui.gallery" + "com.miui.weather2" + "com.miui.notes" + "com.miui.calculator" + "com.miui.mishare.connectivity" + "com.xiaomi.glgm" + "com.xiaomi.joyose" + "com.xiaomi.mipicks" + "com.xiaomi.midrop" + "com.mi.android.globalminusscreen" + "com.mi.android.globallauncher" + "com.mi.health" + + # Games + "com.miui.bugreport" + "cn.wps.xiaomi.abroad.lite" + + # Facebook + "com.facebook.katana" + "com.facebook.appmanager" + "com.facebook.services" + "com.facebook.system" +) + +# Oppo/Realme ColorOS +OPPO_BLOAT=( + "com.coloros.gamespace" + "com.coloros.weather" + "com.coloros.compass2" + "com.coloros.filemanager" + "com.coloros.floatassistant" + "com.coloros.gallery3d" + "com.coloros.video" + "com.coloros.music" + "com.coloros.smartdrive" + "com.heytap.browser" + "com.heytap.music" + "com.heytap.cloud" + "com.oppo.market" + + # Facebook + "com.facebook.katana" + "com.facebook.appmanager" + "com.facebook.services" +) + +# Motorola +MOTO_BLOAT=( + "com.motorola.help" + "com.motorola.demo" + "com.motorola.motocare" + "com.motorola.ccc.mainplm" + "com.motorola.android.providers.settings" + "com.motorola.actions" + "com.motorola.gamemode" + + # Facebook + "com.facebook.katana" + "com.facebook.appmanager" + "com.facebook.services" +) + +# Universal bloatware (all vendors) +UNIVERSAL_BLOAT=( + # Facebook (pre-installed em quase todos) + "com.facebook.katana" + "com.facebook.appmanager" + "com.facebook.services" + "com.facebook.system" + "com.facebook.orca" + + # Netflix (pre-installed) + "com.netflix.mediaclient" + "com.netflix.partner.activation" + + # Spotify (pre-installed) + "com.spotify.music" + + # TikTok + "com.zhiliaoapp.musically" + "com.ss.android.ugc.trill" + + # Games pre-instalados + "com.king.candycrushsaga" + "com.gameloft.android.ANMP.GloftA9HM" +) + +# ===================================================== +# FUNÇÕES +# ===================================================== + +uninstall_package() { + local pkg=$1 + echo -n " Removendo $pkg... " + + # Verificar se está instalado + if adb shell pm list packages | grep -q "^package:$pkg$"; then + if adb shell pm uninstall -k --user 0 "$pkg" 2>/dev/null | grep -q "Success"; then + echo -e "${GREEN}OK${NC}" + return 0 + else + echo -e "${YELLOW}Falhou (protegido)${NC}" + return 1 + fi + else + echo -e "${YELLOW}Não instalado${NC}" + return 0 + fi +} + +debloat_list() { + local name=$1 + shift + local packages=("$@") + + echo -e "\n${BLUE}=== Removendo $name bloatware ===${NC}\n" + + local removed=0 + local failed=0 + + for pkg in "${packages[@]}"; do + if uninstall_package "$pkg"; then + ((removed++)) + else + ((failed++)) + fi + done + + echo -e "\n${GREEN}$removed removidos${NC}, ${YELLOW}$failed protegidos${NC}" +} + +detect_vendor() { + local brand=$(echo "$BRAND" | tr '[:upper:]' '[:lower:]') + + case "$brand" in + samsung) + echo "samsung" + ;; + huawei|honor) + echo "huawei" + ;; + xiaomi|redmi|poco) + echo "xiaomi" + ;; + oppo|realme|oneplus) + echo "oppo" + ;; + motorola) + echo "moto" + ;; + *) + echo "unknown" + ;; + esac +} + +install_botos_launcher() { + echo -e "\n${BLUE}=== Instalando BotOS Launcher ===${NC}\n" + + local apk="../gen/android/app/build/outputs/apk/release/app-release.apk" + + if [[ -f "$apk" ]]; then + adb install -r "$apk" + echo -e "${GREEN}BotOS instalado!${NC}" + + # Definir como launcher padrão + echo "Para definir como launcher padrão:" + echo " 1. Pressione o botão Home" + echo " 2. Selecione 'BotOS' na lista" + echo " 3. Escolha 'Sempre'" + else + echo -e "${YELLOW}APK não encontrado. Compile primeiro:${NC}" + echo " cd .. && cargo tauri android build --release" + fi +} + +enable_kiosk_mode() { + echo -e "\n${BLUE}=== Configurando Kiosk Mode ===${NC}\n" + + # Desabilitar navegação por gestos + adb shell settings put global policy_control immersive.full=* + + # Esconder barra de navegação + adb shell settings put global policy_control immersive.navigation=* + + echo -e "${GREEN}Kiosk mode ativado!${NC}" + echo "O usuário não poderá sair do app facilmente." +} + +# ===================================================== +# MAIN +# ===================================================== + +VENDOR_ARG=${1:-auto} + +if [[ "$VENDOR_ARG" == "auto" ]]; then + VENDOR=$(detect_vendor) + echo -e "Fabricante detectado: ${GREEN}$VENDOR${NC}" +else + VENDOR=$VENDOR_ARG +fi + +echo "" +echo "Opções:" +echo " 1) Debloat leve (apenas Facebook/bloat universal)" +echo " 2) Debloat médio (+ apps do fabricante duplicados)" +echo " 3) Debloat agressivo (remove TUDO do fabricante)" +echo " 4) Instalar BotOS e configurar launcher" +echo " 5) Ativar Kiosk Mode (travar no BotOS)" +echo " 6) Executar tudo (2 + 4 + 5)" +echo "" +read -p "Escolha [1-6]: " CHOICE + +case $CHOICE in + 1) + debloat_list "Universal" "${UNIVERSAL_BLOAT[@]}" + ;; + 2) + debloat_list "Universal" "${UNIVERSAL_BLOAT[@]}" + case $VENDOR in + samsung) debloat_list "Samsung" "${SAMSUNG_BLOAT[@]}" ;; + huawei) debloat_list "Huawei" "${HUAWEI_BLOAT[@]}" ;; + xiaomi) debloat_list "Xiaomi" "${XIAOMI_BLOAT[@]}" ;; + oppo) debloat_list "Oppo/Realme" "${OPPO_BLOAT[@]}" ;; + moto) debloat_list "Motorola" "${MOTO_BLOAT[@]}" ;; + esac + ;; + 3) + debloat_list "Universal" "${UNIVERSAL_BLOAT[@]}" + debloat_list "Samsung" "${SAMSUNG_BLOAT[@]}" + debloat_list "Huawei" "${HUAWEI_BLOAT[@]}" + debloat_list "Xiaomi" "${XIAOMI_BLOAT[@]}" + debloat_list "Oppo/Realme" "${OPPO_BLOAT[@]}" + debloat_list "Motorola" "${MOTO_BLOAT[@]}" + ;; + 4) + install_botos_launcher + ;; + 5) + enable_kiosk_mode + ;; + 6) + debloat_list "Universal" "${UNIVERSAL_BLOAT[@]}" + case $VENDOR in + samsung) debloat_list "Samsung" "${SAMSUNG_BLOAT[@]}" ;; + huawei) debloat_list "Huawei" "${HUAWEI_BLOAT[@]}" ;; + xiaomi) debloat_list "Xiaomi" "${XIAOMI_BLOAT[@]}" ;; + oppo) debloat_list "Oppo/Realme" "${OPPO_BLOAT[@]}" ;; + moto) debloat_list "Motorola" "${MOTO_BLOAT[@]}" ;; + esac + install_botos_launcher + enable_kiosk_mode + ;; + *) + echo "Opção inválida" + exit 1 + ;; +esac + +echo "" +echo -e "${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}" +echo -e "${GREEN}║ Debloat concluído! ║${NC}" +echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}" +echo "" +echo "Reinicie o dispositivo para aplicar todas as mudanças:" +echo " adb reboot" diff --git a/scripts/create-bootanimation.sh b/scripts/create-bootanimation.sh new file mode 100755 index 0000000..cfdffad --- /dev/null +++ b/scripts/create-bootanimation.sh @@ -0,0 +1,116 @@ +#!/bin/bash +# Create Android boot animation from gb-bot.svg +# +# Boot animation format: +# - bootanimation.zip containing: +# - desc.txt (animation descriptor) +# - part0/, part1/ (frame folders with PNG images) +# +# To install (requires root): +# adb root +# adb push bootanimation.zip /system/media/bootanimation.zip +# adb reboot + +set -e +cd "$(dirname "$0")/.." + +SVG_FILE="icons/gb-bot.svg" +OUTPUT_DIR="bootanimation" +BOOT_ZIP="bootanimation.zip" + +# Animation settings +WIDTH=1080 +HEIGHT=1920 +FPS=30 +LOOP_COUNT=0 # 0 = infinite + +echo "Creating boot animation from $SVG_FILE..." + +# Check for required tools +if ! command -v rsvg-convert &> /dev/null; then + echo "ERROR: rsvg-convert not found!" + echo "Install with: sudo apt install librsvg2-bin" + exit 1 +fi + +if ! command -v convert &> /dev/null; then + echo "ERROR: ImageMagick convert not found!" + echo "Install with: sudo apt install imagemagick" + exit 1 +fi + +# Clean and create directories +rm -rf "$OUTPUT_DIR" +mkdir -p "$OUTPUT_DIR/part0" +mkdir -p "$OUTPUT_DIR/part1" + +# Generate base icon (centered, large) +ICON_SIZE=400 +rsvg-convert -w $ICON_SIZE -h $ICON_SIZE "$SVG_FILE" -o "$OUTPUT_DIR/icon_base.png" + +# Create background (dark theme matching GB branding) +convert -size ${WIDTH}x${HEIGHT} xc:'#1a1a2e' "$OUTPUT_DIR/background.png" + +# Part 0: Static logo appear (fade in effect via multiple frames) +echo "Generating part0 (fade in)..." +for i in $(seq 0 9); do + opacity=$((i * 10 + 10)) + frame=$(printf "%05d" $i) + + # Composite icon on background with opacity + convert "$OUTPUT_DIR/background.png" \ + \( "$OUTPUT_DIR/icon_base.png" -channel A -evaluate multiply $(echo "scale=2; $opacity/100" | bc) +channel \) \ + -gravity center -composite \ + "$OUTPUT_DIR/part0/${frame}.png" +done + +# Part 1: Pulsing animation (loop) +echo "Generating part1 (pulse loop)..." +for i in $(seq 0 29); do + frame=$(printf "%05d" $i) + + # Calculate scale for pulse effect (subtle) + scale=$(echo "scale=4; 1 + 0.05 * s($i * 3.14159 / 15)" | bc -l) + new_size=$(echo "scale=0; $ICON_SIZE * $scale / 1" | bc) + + # Resize icon for pulse effect + convert "$OUTPUT_DIR/icon_base.png" \ + -resize ${new_size}x${new_size} \ + "$OUTPUT_DIR/icon_pulse.png" + + # Composite on background + convert "$OUTPUT_DIR/background.png" \ + "$OUTPUT_DIR/icon_pulse.png" \ + -gravity center -composite \ + "$OUTPUT_DIR/part1/${frame}.png" +done + +# Create desc.txt +cat > "$OUTPUT_DIR/desc.txt" << EOF +$WIDTH $HEIGHT $FPS +p 1 0 part0 +p $LOOP_COUNT 0 part1 +EOF + +# Create bootanimation.zip +echo "Creating $BOOT_ZIP..." +cd "$OUTPUT_DIR" +zip -r0 "../$BOOT_ZIP" desc.txt part0 part1 +cd .. + +# Cleanup +rm -f "$OUTPUT_DIR/icon_base.png" "$OUTPUT_DIR/icon_pulse.png" "$OUTPUT_DIR/background.png" + +echo "" +echo "=========================================" +echo "Boot animation created: $BOOT_ZIP" +echo "=========================================" +echo "" +echo "To install (requires rooted device):" +echo " adb root" +echo " adb remount" +echo " adb push $BOOT_ZIP /system/media/bootanimation.zip" +echo " adb reboot" +echo "" +echo "Or for testing:" +echo " adb shell bootanimation" diff --git a/scripts/generate-icons.sh b/scripts/generate-icons.sh new file mode 100755 index 0000000..fd4bc41 --- /dev/null +++ b/scripts/generate-icons.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# Generate Android icons from SVG +# Requires: inkscape or rsvg-convert + +set -e +cd "$(dirname "$0")/.." + +SVG_FILE="icons/gb-bot.svg" +ICON_DIR="icons" + +# Android icon sizes +declare -A SIZES=( + ["mdpi"]=48 + ["hdpi"]=72 + ["xhdpi"]=96 + ["xxhdpi"]=144 + ["xxxhdpi"]=192 +) + +echo "Generating Android icons from $SVG_FILE..." + +# Main icon (512x512 for store) +if command -v rsvg-convert &> /dev/null; then + rsvg-convert -w 512 -h 512 "$SVG_FILE" -o "$ICON_DIR/icon.png" + echo "Created icon.png (512x512)" + + # Generate density-specific icons + for density in "${!SIZES[@]}"; do + size=${SIZES[$density]} + mkdir -p "$ICON_DIR/$density" + rsvg-convert -w $size -h $size "$SVG_FILE" -o "$ICON_DIR/$density/ic_launcher.png" + echo "Created $density/ic_launcher.png (${size}x${size})" + done +elif command -v inkscape &> /dev/null; then + inkscape -w 512 -h 512 "$SVG_FILE" -o "$ICON_DIR/icon.png" + echo "Created icon.png (512x512)" + + for density in "${!SIZES[@]}"; do + size=${SIZES[$density]} + mkdir -p "$ICON_DIR/$density" + inkscape -w $size -h $size "$SVG_FILE" -o "$ICON_DIR/$density/ic_launcher.png" + echo "Created $density/ic_launcher.png (${size}x${size})" + done +else + echo "ERROR: Neither rsvg-convert nor inkscape found!" + echo "Install with: sudo apt install librsvg2-bin" + exit 1 +fi + +echo "Done! Icons generated in $ICON_DIR/" diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..6862936 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,77 @@ +//! BotOS - Android launcher powered by General Bots +//! +//! Minimal Android OS replacement using Tauri + botui +//! - Replaces default launcher (home screen) +//! - Access to camera, GPS, notifications +//! - Connects to General Bots server + +use tauri::Manager; + +#[cfg(target_os = "android")] +fn init_logger() { + android_logger::init_once( + android_logger::Config::default() + .with_max_level(log::LevelFilter::Info) + .with_tag("BotOS"), + ); +} + +#[cfg(not(target_os = "android"))] +fn init_logger() { + env_logger::init(); +} + +/// Tauri command: Get device info +#[tauri::command] +fn get_device_info() -> serde_json::Value { + serde_json::json!({ + "platform": "android", + "app": "BotOS", + "version": env!("CARGO_PKG_VERSION") + }) +} + +/// Tauri command: Send message to bot server +#[tauri::command] +async fn send_to_bot(message: String, server_url: String) -> Result { + let client = reqwest::Client::new(); + + let response = client + .post(&format!("{}/api/messages", server_url)) + .json(&serde_json::json!({ "text": message })) + .send() + .await + .map_err(|e| e.to_string())?; + + response.text().await.map_err(|e| e.to_string()) +} + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + init_logger(); + log::info!("BotOS starting..."); + + tauri::Builder::default() + .plugin(tauri_plugin_dialog::init()) + .plugin(tauri_plugin_opener::init()) + .plugin(tauri_plugin_notification::init()) + .plugin(tauri_plugin_http::init()) + .plugin(tauri_plugin_geolocation::init()) + .invoke_handler(tauri::generate_handler![ + get_device_info, + send_to_bot + ]) + .setup(|app| { + log::info!("BotOS initialized, loading botui..."); + + #[cfg(debug_assertions)] + { + let window = app.get_webview_window("main").unwrap(); + window.open_devtools(); + } + + Ok(()) + }) + .run(tauri::generate_context!()) + .expect("error running BotOS"); +} diff --git a/tauri.conf.json b/tauri.conf.json new file mode 100644 index 0000000..c9a0450 --- /dev/null +++ b/tauri.conf.json @@ -0,0 +1,45 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "BotOS", + "version": "1.0.0", + "identifier": "br.com.pragmatismo.botos", + "build": { + "beforeDevCommand": "", + "beforeBuildCommand": "", + "frontendDist": "../botui/ui/suite" + }, + "app": { + "security": { + "csp": null + }, + "windows": [ + { + "title": "BotOS", + "fullscreen": true, + "resizable": false + } + ] + }, + "bundle": { + "active": true, + "targets": ["apk", "aab"], + "android": { + "minSdkVersion": 24 + }, + "icon": [ + "icons/icon.png" + ] + }, + "plugins": { + "notification": { + "enabled": true + }, + "http": { + "enabled": true, + "scope": ["https://**", "http://**"] + }, + "geolocation": { + "enabled": true + } + } +}