Initial commit: BotOS - Android ROM customization project
62
.gitignore
vendored
Normal 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
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1,3 @@
|
|||
fn main() {
|
||||
tauri_build::build()
|
||||
}
|
||||
21
capabilities/default.json
Normal 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://**" }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
66
gen/android/app/src/main/AndroidManifest.xml
Normal 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>
|
||||
33
gen/android/app/src/main/res/values/themes.xml
Normal 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
|
|
@ -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
|
After Width: | Height: | Size: 1.3 KiB |
BIN
icons/icon.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
icons/mdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 962 B |
BIN
icons/xhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
icons/xxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
icons/xxxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
56
rom/README.md
Normal 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
|
|
@ -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!
|
||||
10
rom/gsi/device/pragmatismo/botos/AndroidProducts.mk
Normal 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
|
||||
40
rom/gsi/device/pragmatismo/botos/BoardConfig.mk
Normal 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
|
||||
77
rom/gsi/device/pragmatismo/botos/device.mk
Normal 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
|
|
@ -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
|
||||
286
rom/scripts/build-magisk-module.sh
Executable 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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||