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