Initial commit: BotOS - Android ROM customization project

This commit is contained in:
Rodrigo Rodriguez (Pragmatismo) 2025-12-12 13:32:55 -03:00
commit 936d4bce78
26 changed files with 2117 additions and 0 deletions

62
.gitignore vendored Normal file
View file

@ -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/

39
Cargo.toml Normal file
View file

@ -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"]

245
README.md Normal file
View file

@ -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

3
build.rs Normal file
View file

@ -0,0 +1,3 @@
fn main() {
tauri_build::build()
}

21
capabilities/default.json Normal file
View file

@ -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://**" }
]
}
]
}

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
BotOS AndroidManifest overlay
This file will be merged with Tauri's generated manifest.
Key features:
- HOME + DEFAULT category: Makes app appear as launcher option
- Permissions for camera, location, internet
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Permissions -->
<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.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- Hardware features (optional) -->
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
<application
android:label="BotOS"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/Theme.BotOS"
android:hardwareAccelerated="true"
android:usesCleartextTraffic="true">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- HOME intent filter - makes app appear as launcher option -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<!-- Boot receiver - auto-start on boot -->
<receiver
android:name=".BootReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>

View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- BotOS Dark Theme - matches General Bots branding -->
<style name="Theme.BotOS" parent="Theme.AppCompat.DayNight.NoActionBar">
<!-- Primary brand color -->
<item name="colorPrimary">#4A90D9</item>
<item name="colorPrimaryDark">#1a1a2e</item>
<item name="colorAccent">#4A90D9</item>
<!-- Background colors -->
<item name="android:windowBackground">#1a1a2e</item>
<item name="android:colorBackground">#1a1a2e</item>
<!-- Status bar and navigation -->
<item name="android:statusBarColor">#1a1a2e</item>
<item name="android:navigationBarColor">#1a1a2e</item>
<!-- Fullscreen for launcher mode -->
<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>
<!-- Smooth transitions -->
<item name="android:windowAnimationStyle">@style/BotOS.WindowAnimation</item>
</style>
<!-- Smooth window transitions -->
<style name="BotOS.WindowAnimation" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@android:anim/fade_in</item>
<item name="android:activityOpenExitAnimation">@android:anim/fade_out</item>
<item name="android:activityCloseEnterAnimation">@android:anim/fade_in</item>
<item name="android:activityCloseExitAnimation">@android:anim/fade_out</item>
</style>
</resources>

16
icons/gb-bot.svg Normal file
View file

@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
<!-- Bot head - rounded square inspired by GB logo -->
<rect x="4" y="4" width="16" height="14" rx="3" ry="3"/>
<!-- Eyes - circular like GB branding -->
<circle cx="9" cy="10" r="1.5" fill="currentColor" stroke="none"/>
<circle cx="15" cy="10" r="1.5" fill="currentColor" stroke="none"/>
<!-- Smile -->
<path d="M9 14 Q12 16 15 14" fill="none"/>
<!-- Antenna -->
<line x1="12" y1="4" x2="12" y2="1"/>
<circle cx="12" cy="1" r="1" fill="currentColor" stroke="none"/>
<!-- Base/body connection -->
<path d="M8 18 L8 21 L16 21 L16 18"/>
<line x1="10" y1="21" x2="10" y2="23"/>
<line x1="14" y1="21" x2="14" y2="23"/>
</svg>

After

Width:  |  Height:  |  Size: 811 B

BIN
icons/hdpi/ic_launcher.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
icons/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
icons/mdpi/ic_launcher.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 962 B

BIN
icons/xhdpi/ic_launcher.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

56
rom/README.md Normal file
View file

@ -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)

156
rom/gsi/README.md Normal file
View file

@ -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!

View file

@ -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

View file

@ -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

View file

@ -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

313
rom/install.sh Executable file
View file

@ -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

View file

@ -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 ""

406
rom/scripts/debloat.sh Executable file
View file

@ -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"

116
scripts/create-bootanimation.sh Executable file
View file

@ -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"

50
scripts/generate-icons.sh Executable file
View file

@ -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/"

77
src/lib.rs Normal file
View file

@ -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<String, String> {
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");
}

45
tauri.conf.json Normal file
View file

@ -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
}
}
}