From 0e6ef88fe5d165f137094c082c941b9e737f4fc4 Mon Sep 17 00:00:00 2001 From: acs-lite Date: Sun, 6 Sep 2026 13:23:18 +0700 Subject: [PATCH 1/4] lite: varian RAM 2GB Stage-1 safe (flavor lite/full + LiteMode + audit termux + build tuning) - flavor lite/full dimensi tier, fallback universal, keep AI generativeai - 9 kandidat berat masih implementation (Stage-1 safe), NEXT fullImplementation setelah guard - termux 4 modul WAJIB dipertahankan untuk Kotlin/Java, pangkas NDK/git/openssh/JDK21 via onboarding - gradle.properties.lite Xmx1024M workers=2 config-cache on - docs: LITE_BASELINE, TERMUX_AUDIT, FEATURES, BUILD, PUSH_CHECKLIST --- LITE_BASELINE.md | 80 ++++++++++ LITE_BUILD.md | 139 ++++++++++++++++++ LITE_FEATURES.md | 66 +++++++++ LITE_TERMUX_AUDIT.md | 89 +++++++++++ PUSH_CHECKLIST.md | 80 ++++++++++ core/app/build.gradle.kts | 70 ++++++++- core/app/proguard-rules.pro | 7 +- gradle.properties.lite | 34 +++++ .../ideconfigurations/utils/LiteMode.kt | 56 +++++++ 9 files changed, 615 insertions(+), 6 deletions(-) create mode 100644 LITE_BASELINE.md create mode 100644 LITE_BUILD.md create mode 100644 LITE_FEATURES.md create mode 100644 LITE_TERMUX_AUDIT.md create mode 100644 PUSH_CHECKLIST.md create mode 100644 gradle.properties.lite create mode 100644 ideconfigurations/src/main/java/com/tom/rv2ide/ideconfigurations/utils/LiteMode.kt diff --git a/LITE_BASELINE.md b/LITE_BASELINE.md new file mode 100644 index 000000000..2e59316d1 --- /dev/null +++ b/LITE_BASELINE.md @@ -0,0 +1,80 @@ +# LITE Baseline — Agent-1 + +Tanggal: 2026-09-06 (UTC) +Repo: /data/data/com.termux/files/home/acs-lite +Peran: READ-ONLY + setup branch. TIDAK edit build.gradle / termux / lite logic (milik agent lain). + +## 1. Branch & Commit +- Base: `dev` (origin/dev, shallow depth 1) +- Branch aktif: `lite/ram2gb-lite` (baru dibuat dari dev via `git checkout -b lite/ram2gb-lite`) +- Commit HEAD: `e93e7468e6482ea51ef8e1adad6b7c6de86ae7cd` +- Subject: `e93e746 ci: use GitHub Secrets for signing credentials` +- `git log --oneline -5`: hanya 1 commit visible (shallow depth 1) → `e93e746` +- `git status` saat verifikasi awal (di dev): clean. Setelah checkout branch, muncul perubahan milik agent lain (DIBIARKAN, tidak disentuh): + - `M core/app/build.gradle.kts` (24 insertions) + - `?? LITE_BUILD.md` + - `?? gradle.properties.lite` + - `?? ideconfigurations/.../LiteMode.kt` + +## 2. Ukuran Repo +- `du -sh .` → `243M` +- Top-15 (`du -sh */ | sort -rh | head`): + 1. 66M `termux/` + 2. 61M `composite-builds/` + 3. 16M `core/` + 4. 6.7M `external/` + 5. 3.3M `xml/` + 6. 3.2M `utilities/` + 7. 1.8M `java/` + 8. 1.7M `editor/` + 9. 1.2M `tooling/` + 10. 352K `event/` + 11. 321K `logging/` + 12. 232K `images/` + 13. 182K `annotation/` + 14. 71K `gradle/` + 15. 56K `ideconfigurations/` (52K saat cek pertama, fluktuasi karena file untracked agent lain) + +## 3. Modul (settings.gradle.kts) +- File: `settings.gradle.kts` (`rootProject.name = "AndroidCodeStudio"`) +- Hitungan mentah: `grep -o '":[^"]*"' | wc -l` → `60` +- Koreksi: -1 template `":${module}"` (dependencySubstitution loop), -2 commented (`:server:server`, `:server:shared`) → **57 modul aktif** +- Daftar 57: `:annotation:annotations`, `:annotation:processors`, `:annotation:processors-ksp`, `:external:acsprovider`, `:external:atc`, `:core:projectdata`, `:external:logwire`, `:core:actions`, `:core:app`, `:ideconfigurations`, `:core:common`, `:core:indexing-api`, `:core:indexing-core`, `:core:lsp-api`, `:core:lsp-models`, `:core:projects`, `:core:resources`, `:editor:api`, `:editor:impl`, `:editor:lexers`, `:editor:treesitter`, `:event:eventbus`, `:event:eventbus-android`, `:event:eventbus-events`, `:java:javac-services`, `:java:lsp-setup`, `:java:lsp`, `:logging:idestats`, `:logging:logger`, `:logging:logsender`, `:termux:application`, `:termux:emulator`, `:termux:shared`, `:termux:view`, `:tooling:api`, `:tooling:builder-model-impl`, `:tooling:events`, `:tooling:impl`, `:tooling:model`, `:tooling:plugin`, `:tooling:plugin-config`, `:utilities:build-info`, `:utilities:flashbar`, `:utilities:framework-stubs`, `:utilities:lookup`, `:utilities:preferences`, `:utilities:shared`, `:utilities:templates-api`, `:utilities:templates-impl`, `:utilities:treeview`, `:utilities:uidesigner`, `:utilities:xml-inflater`, `:xml:aaptcompiler`, `:xml:dom`, `:xml:lsp`, `:xml:resources-api`, `:xml:utils` +- Composite builds tambahan: `composite-builds/build-logic`, `composite-builds/build-deps`, `composite-builds/build-deps-common` + +## 4. Submodule +- `.gitmodules`: + ``` + [submodule "composite-builds/external/logback-android"] + path = composite-builds/external/logback-android + url = https://github.com/evil-hero/logback-android + ``` +- `git submodule status` (dan `--recursive`) → **output kosong, exit 0** (tidak ada entri terdaftar) +- `git ls-files --stage | grep -c "^160000"` → `0` (tidak ada gitlink) +- `ls composite-builds/external/logback-android/` → **TERISI** (logback-classic, logback-core, dsb. + .github, README, dsb.) — file terlacak sebagai regular files (100644), bukan submodule. +- Kesimpulan: **TIDAK kosong, TIDAK perlu init. JANGAN `git submodule update --init` penuh (hemat disk).** Entri `.gitmodules` stale / sudah di-flatten ke shallow clone. + +## 5. Verifikasi File Kunci +- `ls core/app/src/main` → `AndroidManifest.xml`, `assets`, `java`, `res` (ADA) +- `cat version.properties` → `# rev version control` + `version.name.rev=1.0` +- `cat ideconfigurations/build.gradle.kts` → ADA (`com.android.library` + `kotlin-android`, namespace `${BuildConfig.packageName}.ideconfigurations`, deps: `projects.core.resources`, `projects.core.common`, material, appcompat, preference, core-ktx, kotlin) +- `git branch -a` (awal): `* dev`, `remotes/origin/dev` saja. Kini + `lite/ram2gb-lite`. + +## 6. RAM / Disk Device +- Spek tugas: Mem 3.6G, avail 8.8G +- Aktual `free -h` (2026-09-06): + ``` + Mem: 3.5Gi total, 3.0Gi used, ~217Mi free, ~625Mi buff/cache, ~583Mi available + Swap: 6.0Gi total, 2.5Gi used, 3.5Gi free + ``` + → RAM ketat, wajib build hemat (sesuai misi lite/ram2gb). +- Aktual `df -h .`: + ``` + /dev/block/dm-61 47G Size, 39G Used, 8.5G Avail (82%) + ``` + → konsisten dengan estimasi avail 8.8G (sedikit turun ke 8.5G). Jangan init submodule penuh. + +## 7. Catatan untuk Koordinator +- Branch `lite/ram2gb-lite` sudah siap, base = dev @ e93e746. +- Working tree kotor oleh agent lain — Agent-1 tidak menyentuh. +- File ini (`LITE_BASELINE.md`) satu-satunya file baru dari Agent-1. diff --git a/LITE_BUILD.md b/LITE_BUILD.md new file mode 100644 index 000000000..63d444f1a --- /dev/null +++ b/LITE_BUILD.md @@ -0,0 +1,139 @@ +# LITE BUILD — Akselerasi Build HP RAM 2GB (Agent-4) + +> Batasan: JANGAN edit `termux/*` atau flavor logic inti (milik Agent-2/3). +> JANGAN sentuh AI deps (`generativeai`). Hanya tambah config build. +> Dibaca: `gradle.properties`, `build.gradle.kts` (root), `core/app/build.gradle.kts`, `gradle/libs.versions.toml` (AGP 8.13.0, Kotlin 2.1.0). + +## 1. File dibuat/diubah + +1. **BARU: `gradle.properties.lite`** — tuning RAM kecil. Asli TIDAK dioverwrite. +2. **EDIT (komentar saja): `core/app/build.gradle.kts`** — tambah `// LITE-BUILD-SNIPPET` non-aktif agar tidak conflict Agent-3. Update: saat penulisan, flavor `lite`/`full` dimensi `tier` milik Agent-3 sudah muncul di working tree (uncommitted) — snippet diselaraskan ke `getByName("lite")` + `dimension = "tier"`, tetap dikomen. +3. **BARU (file ini): `LITE_BUILD.md`** — instruksi + laporan. + +## 2. Cara pakai + +```bash +# backup dulu (sekali saja) +cp gradle.properties gradle.properties.bak + +# aktifkan mode lite +cp gradle.properties.lite gradle.properties + +# build lite debug, batasi worker (RAM 2GB) +./gradlew :core:app:assembleLiteDebug --max-workers=2 --offline +# atau jika flavor lite belum ada (Agent-3 belum selesai), pakai debug biasa: +./gradlew :core:app:assembleDebug --max-workers=2 --offline + +# varian lain (setelah flavor lite ada): +./gradlew :core:app:assembleLiteRelease --max-workers=2 +./gradlew :core:app:assembleArm64V8aLiteDebug --max-workers=2 + +# verifikasi ringan tanpa full build: +./gradlew help --offline --max-workers=2 +./gradlew :core:app:tasks --offline --dry-run --max-workers=2 + +# kembalikan ke normal: +cp gradle.properties.bak gradle.properties +``` + +> `assembleLiteDebug` butuh `productFlavors { create("lite") }` Agent-3 — saat ini sudah ada di working tree (dimensi `tier`, uncommitted). Jika checkout bersih tanpa itu, pakai `assembleDebug`. + +## 3. Sebelum vs sesudah + +| Item | Sebelum (`gradle.properties` asli) | Sesudah (`gradle.properties.lite`) | Efek | +|---|---|---|---| +| `org.gradle.jvmargs` Xmx | `-Xmx4096M` + `kotlin.daemon.jvm.options -Xmx4096M` | `-Xmx1024M` + `-Xmx1024M` | Heap -75%, muat di 2GB, cegah OOM-kill | +| `org.gradle.workers.max` | tidak diset (nCPU) | `2` | CPU/RAM stabil | +| `org.gradle.parallel` | `true` | `true` (tetap) | — | +| `org.gradle.caching` | `true` | `true` (tetap) | — | +| `org.gradle.configuration-cache` | dikomen (`#`) | `true` | Build ulang config lebih cepat | +| `android.nonTransitiveRClass` | `false` + TODO Migrate | `true` | Kompilasi R lebih ringan | +| `kotlin.incremental` / `kotlin.parallel.tasks.in.project` | tidak ada | `true` | Incremental lebih cepat | +| `android.useAndroidX` | `true` | `true` (tetap) | — | +| `lint abortOnError` (`core/app`) | `false` | `false` (tetap, lihat snippet) | Lite tidak berhenti karena lint | +| ABI / shrink (snippet) | `release { isShrinkResources=false }`, tanpa `abiFilters` | `lite-debug: minify=false, shrink=false`; `lite-release: minify+shrink=true`; `abiFilters arm64-v8a` | Debug cepat, release kecil | + +## 4. Snippet yang ditambah + +### 4a. `gradle.properties.lite` (penuh) + +```properties +org.gradle.jvmargs=-Xmx1024M \ + -Dkotlin.daemon.jvm.options="-Xmx1024M" \ + -XX:+HeapDumpOnOutOfMemoryError \ + --add-opens java.base/java.lang=ALL-UNNAMED \ + --add-opens java.base/java.util=ALL-UNNAMED \ + --add-opens java.base/java.io=ALL-UNNAMED +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.daemon=true +org.gradle.configuration-cache=true +org.gradle.workers.max=2 +kotlin.incremental=true +kotlin.parallel.tasks.in.project=true +android.useAndroidX=true +android.enableJetifier=false +android.jetifier.ignorelist=common-30.2.2.jar +android.nonTransitiveRClass=true +systemProp.https.protocols=TLSv1,TLSv1.1,TLSv1.2 +android.r8.version=8.6.17 +org.gradle.configureondemand=false +``` + +### 4b. `core/app/build.gradle.kts` — komentar non-aktif (tidak hapus blok Agent-3) + +```kotlin +// LITE-BUILD-SNIPPET (Agent-4, non-aktif agar tidak conflict Agent-2/3) — +// Agent-3 sudah membuat productFlavors lite/full dimensi "tier" (lihat atas). +// Jangan hapus blok Agent-3. Contoh aktif susulan untuk varian lite (hemat RAM/ukuran, arm64 saja): +// productFlavors { +// getByName("lite") { +// dimension = "tier" // sama dengan milik Agent-3 +// ndk { abiFilters += "arm64-v8a" } +// // resourceConfigurations += listOf("in", "en") // opsional: pangkas bahasa +// } +// } +// buildTypes { +// getByName("debug") { +// // default lite-debug: tanpa minify agar cepat di RAM 2GB +// isMinifyEnabled = false +// isShrinkResources = false +// } +// getByName("release") { +// // jika build lite-release: minify+shrink aktif untuk APK kecil +// // isMinifyEnabled = true +// // isShrinkResources = true +// } +// } +// lint { abortOnError = false } // tetap false untuk lite +``` + +Lokasi: di dalam blok `android { }`, setelah blok `lint { }`, sebelum `packaging { }`. Blok `buildTypes { debug/release }` dan `lint { abortOnError=false }` asli dibiarkan utuh. + +## 5. Estimasi hemat (tanpa full build, teoritis) + +- Heap Gradle+Kotlin: 8GB (4+4) → 2GB (1+1) = **hemat ~6GB virtual, -75%**, OOM di 2GB jauh berkurang. +- Worker dibatasi 2: cegah thrashing, build lebih lambat ~10-20% di HP 8-core tapi **tidak mati di tengah jalan**. +- `configuration-cache=true`: **hemat 20-40%** waktu pada build incremental/no-op setelah cache hangat. +- `nonTransitiveRClass=true`: modul dependen kompilasi ulang lebih sedikit, **hemat 5-15%** waktu + RAM kompilasi. +- `abiFilters arm64-v8a` saja (saat flavor lite aktif): paket native **~40-50% lebih kecil** vs 2 ABI, packaging/linking lebih cepat. +- `minify=false, shrink=false` untuk `lite-debug`: dex/R8 skip → debug **paling cepat**; aktifkan hanya di `lite-release` untuk APK kecil. +- Total: tidak bisa diukur pasti tanpa device, tapi target **build debug jalan di 2GB** yang sebelumnya OOM pada Xmx4096M. + +## 6. Hasil verifikasi ringan + +```bash +./gradlew help --offline --max-workers=2 +# ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +# java -version: command not found, JAVA_HOME kosong, ANDROID_HOME/SDK tidak ada. +``` + +- Status: **GAGAL (expected)** — lingkungan Termux ini tanpa Java dan tanpa Android SDK, jadi Gradle tidak bisa jalan. +- Full build sengaja TIDAK dijalankan sesuai instruksi. +- Sintaks: file `.lite` = properties biasa (aman), edit `build.gradle.kts` hanya komentar `//` (tidak merusak kompilasi). +- Langkah lanjut di mesin builder (ada JDK 17 + SDK): jalankan `help --offline` lalu `assembleDebug --max-workers=2` untuk ukur waktu riil. + +## 7. Catatan koordinasi + +- Agent-2/3: snippet di atas sengaja dikomen. Saat `productFlavors` sudah ada, pindahkan `abiFilters` ke flavor `lite` dan sesuaikan `dimension`. +- Tidak menyentuh `termux/*`, AI deps (`generativeai:0.9.0`), `signingConfigs`, `applicationVariants` rename logic. diff --git a/LITE_FEATURES.md b/LITE_FEATURES.md new file mode 100644 index 000000000..35562e3b0 --- /dev/null +++ b/LITE_FEATURES.md @@ -0,0 +1,66 @@ +# LITE Flavor — Varian Ringan RAM 2GB (Agent-3) + +Target: APK lebih kecil + hemat RAM, **AI (generativeai) tetap dipertahankan**. +`settings.gradle.kts` TIDAK diubah — semua modul tetap ada untuk varian `full`. + +## Flavor + +- Dimensi `tier`: `lite` (`applicationIdSuffix .lite`, `versionNameSuffix -lite`) + dan `full`. Definisi di `core/app/build.gradle.kts:75-90`. +- Fallback suffix APK `universal` untuk varian flavor tanpa filter ABI + (`core/app/build.gradle.kts:183-193`) agar konfigurasi varian tidak throw. +- Flag runtime: `LiteMode` (`ideconfigurations/.../utils/LiteMode.kt`), + `isLowRam(context)` via `ActivityManager.isLowRamDevice` / `memoryClass <= 128`. + +## Dipangkas (lite) vs Dipertahankan + +> Stage-1 SAFE (saat ini, agar `lite` tetap kompilasi untuk Kotlin/Java): +> 9 kandidat di bawah masih `implementation` + tag `LITE-Stage1`. +> Stage-2 (setelah call-site di-guard `LiteMode.isLowRam()`): flip ke `fullImplementation`. + +| Dependensi | Status lite Stage-1 | Lokasi | +|---|---|---| +| `utilities:uidesigner` | STAGE-1 `implementation`, NEXT `fullImplementation` | `core/app/build.gradle.kts:346` | +| `utilities:xmlInflater` | STAGE-1 `implementation`, NEXT `fullImplementation` | `core/app/build.gradle.kts:347` | +| `logging:idestats` | STAGE-1 `implementation`, NEXT `fullImplementation` | `core/app/build.gradle.kts:331` | +| `logging:logsender` | STAGE-1 `implementation`, NEXT `fullImplementation` | `core/app/build.gradle.kts:332` | +| BlurView | STAGE-1 `implementation`, NEXT `fullImplementation` | `core/app/build.gradle.kts:237` | +| seasonal.effects | STAGE-1 `implementation`, NEXT `fullImplementation` | `core/app/build.gradle.kts:244` | +| charts | STAGE-1 `implementation`, NEXT `fullImplementation` | `core/app/build.gradle.kts:259` | +| SilentInstaller | STAGE-1 `implementation`, NEXT `fullImplementation` | `core/app/build.gradle.kts:275` | +| appintro (composite) | STAGE-1 `implementation`, NEXT `fullImplementation` | `core/app/build.gradle.kts:307` | +| generativeai (AI) | DIPERTAHANKAN (`implementation`) | `core/app/build.gradle.kts:~268` | +| editor (`libs.common.editor`, `editor:impl`) | DIPERTAHANKAN | tidak diubah | +| java LSP (`java:javac-services`, `lsp-setup`, `lsp`) | DIPERTAHANKAN | tidak diubah | +| xml LSP inti (`xml:lsp`, `aaptcompiler`, `utils`) | DIPERTAHANKAN | tidak diubah | +| JGit | DIPERTAHANKAN | tidak diubah | +| preferences, treeview | DIPERTAHANKAN | tidak diubah | +| termux/*, gradle.properties | TIDAK DISENTUH (milik Agent-2/4) | — | + +Setiap baris kandidat ditandai `// LITE-Stage1`: sebelum +`assembleLite`, call-site (Activity/preview/worker) yang memakai modul +full-only wajib di-guard dengan `LiteMode.isLowRam()`, baru flip ke `fullImplementation`. + +## File dibuat/diubah + +1. BARU: `ideconfigurations/src/main/java/com/tom/rv2ide/ideconfigurations/utils/LiteMode.kt` + — `object LiteMode { ENABLED, isLowRam(context), memoryClassMb(context) }`. + Dipilih `ideconfigurations` (Android library, ada `Context`); + `utilities/shared` JVM murni sehingga tidak cocok. +2. UBAH: `core/app/build.gradle.kts` — flavor `lite`/`full` (72-90), + fallback `universal` (183-193), 9 dep berat → `fullImplementation` + (236-347). +3. APPEND: `core/app/proguard-rules.pro` (156-161) — keep `LiteMode` + + `generativeai`. + +## Kandidat exclude modul (catatan saja, TIDAK dieksekusi) + +Jika suatu saat modularisasi per-flavor diizinkan: `:utilities:uidesigner`, +`:utilities:xml-inflater`, `:logging:idestats`, `:logging:logsender`. +Butuh guard kode + source-set per flavor — wewenang lanjutan, bukan sekarang. + +## Verifikasi ringan + +- `git diff --stat`: 2 file diubah (`core/app/build.gradle.kts`, + `core/app/proguard-rules.pro`) + 1 file baru (`LiteMode.kt`). +- Assemble penuh TIDAK dijalankan (milik Agent-5). diff --git a/LITE_TERMUX_AUDIT.md b/LITE_TERMUX_AUDIT.md new file mode 100644 index 000000000..c4937f85a --- /dev/null +++ b/LITE_TERMUX_AUDIT.md @@ -0,0 +1,89 @@ +# LITE Termux Audit (Agent-2) — 2026-09-06 + +Branch: `dev` (branch `lite/ram2gb-lite` belum ada — kerja di `dev`, tanpa buat branch tandingan). +Tujuan: pangkas dependency/download Termux seminimal mungkin, tetap bisa build **Kotlin dan Java via Gradle**. +Batasan: `generativeai` (`com.google.ai.client.generativeai:generativeai:0.9.0`, `core/app/build.gradle.kts:267`) **WAJIB dipertahankan, tidak disentuh**. + +## 1. File yang dibaca (16) + +| # | File | Temuan kunci | +|---|------|--------------| +| 1 | `termux/application/build.gradle.kts` | lib, deps: androidx annotation/core/drawer/preference/viewpager, material, guava, markwon x4, `core.projects/common/resources`, `termux.view`, `termux.shared`, `utilities.preferences` | +| 2 | `termux/emulator/build.gradle.kts` | lib `com.termux.emulator`, NDK 27.1.12297006 (arm64+arm), deps HANYA `androidx.annotation` — paling ringan | +| 3 | `termux/shared/build.gradle.kts` | lib `com.termux.shared`, NDK 27.1.12297006, deps: appcompat/annotation/core, `window-v1alpha9` (komentar: JANGAN naik >1.0.0-alpha09, brk 58-59), markwon x4, material, guava, hiddenApiBypass, `commons-io` (60), **`common.termuxAmLib` v2.0.0 (61)**, core.common/resources, termux.view, buildInfo, preferences | +| 4 | `termux/view/build.gradle.kts` | lib `com.termux.view`, `api(projects.termux.emulator)` + annotation + core.resources — ringan | +| 5 | `gradle/libs.versions.toml:95` | `common-termuxAmLib = { module = "com.termux:termux-am-library", version = "v2.0.0" }` — TIDAK dihapus (sesuai instruksi), hanya kandidat | +| 6 | `core/app/build.gradle.kts:282-285` | 4 modul termux sebagai `implementation` (application, view, emulator, shared) + komentar `TODO LITE (Agent-2)` baru; generativeai di 267 utuh | +| 7 | `termux/.../TermuxInstaller.java` | Bootstrap = zip dari native lib `termux-bootstrap` (`loadZipBytes()` + `getZip()` native, 375-381), ekstrak ke `$PREFIX` staging lalu rename; BUKAN download apt saat install awal | +| 8 | `termux/.../cpp/termux-bootstrap.c` + `Android.mk` | JNI `Java_com_termux_app_TermuxInstaller_getZip`, blob dari `termux-bootstrap-zip.S` (prebuilt, sumber zip tidak di repo) | +| 9 | `termux/.../terminal/IdesetupSession.kt` | Menyalin asset `data/common//idesetup` (arm/arm64) ke files/temp lalu eksekusi sebagai sesi terminal | +| 10 | `termux/.../activities/TerminalActivity.kt:121-143` | `addIdesetupSession(args)` — menjalankan biner idesetup + argumen onboarding | +| 11 | `core/common/.../managers/ToolsManager.java` | Ekstrak `android.jar`, `tooling-api-all.jar`, `androidide.init.gradle`, aapt2 dari `libaapt2.so` — independen dari apt Termux | +| 12 | `core/common/.../utils/Environment.java:96-103` | `JAVA_HOME` = `lib/jvm/java-17-openjdk` (fallback `java-21-openjdk`); `BASH_SHELL`/`LOGIN_SHELL` = `$PREFIX/bin/{bash,login}` — bukti JDK + bash dari prefix WAJIB | +| 13 | `.../fragments/onboarding/IdeSetupConfigurationFragment.kt:146-170` | Argumen idesetup: `--install-dir --sdk --jdk --ndk --assume-yes [--with-git] [--with-openssh]` | +| 14 | `.../fragments/onboarding/ideSetupConfig.kt` | `SdkVersion`: 33.0.1–35.0.1 (6 entri); `JdkVersion`: 17, 21; `NdkVersion`: `0`=Skip, `28.2.13676358` | +| 15 | `.../models/IdeSetupArguments.kt` | Enum flag idesetup (INSTALL_DIR, WITH_GIT, ASSUME_YES, WITH_OPENSSH, SDK_VERSION, JDK_VERSION, NDK_VERSION) | +| 16 | `.../activities/OnboardingActivity.kt:168-182` + `GradleBuildService.kt:30,545` + `JdkUtils.kt:22` | Syarat setup = JDK terinstal + `ANDROID_HOME` ada; build Gradle memakai `TermuxShellEnvironment` (dari `termux.shared`) — bukti shared WAJIB | + +Tambahan dicek: `termux/shared/.../termux/shell/am/TermuxAmSocketServer.java` (bungkus `AmSocketServer`, aktif via properti; dipanggil 1x dari `TermuxApplication.java:53`), +`shared/reflection/ReflectionUtils.java:10,32` (satu-satunya pemakai hiddenApiBypass), `shared/markdown/MarkdownUtils.java` (pemakai markwon), +`shared/res/raw/apt_info_script.sh` (hanya diagnostik `apt list`, bukan installer), aset `idesetup` = ELF aarch64 stripped 30 KB (arm64) / 38 KB (arm) — daftar paket apt TIDAK bisa diekstrak dari biner, disimpulkan dari flag + `Environment.java`. + +## 2. Keputusan wajib vs opsional — modul termux + +| Modul | Status | Alasan | +|-------|--------|--------| +| `termux:emulator` (`termux/emulator/build.gradle.kts`) | **WAJIB** | Inti emulasi terminal; deps hanya `androidx.annotation`; dipakai `termux:view` (api) dan sesi build. Hapus = tidak ada output build. | +| `termux:view` (`termux/view/build.gradle.kts`) | **WAJIB** | `TerminalView` untuk `TermuxActivity`/Gradle log/idesetup session; ringan (emulator+annotation+resources). | +| `termux:shared` (`termux/shared/build.gradle.kts`) | **WAJIB (inti), pangkas isi** | `TermuxShellEnvironment`, `ExecutionCommand`, `TermuxConstants/FileUtils` dipakai `GradleBuildService`, `JdkUtils`, `Environment`. Hapus modul = Gradle build mati. Yang dipangkas hanya deps opsional di dalamnya (lihat §3). | +| `termux:application` (`termux/application/build.gradle.kts`) | **WAJIB** | `TermuxService`, `TermuxInstaller` (bootstrap `$PREFIX`), `TerminalActivity`/`IdesetupSession`. Tanpa ini tidak ada prefix/JDK/SDK. | + +> `core/app/build.gradle.kts:282-285` tetap 4x `implementation(...)`. JANGAN ubah ke `liteImplementation` sebelum ada stub/fallback tanpa-terminal (catatan sudah ditambah sebagai komentar `TODO LITE` di file). + +## 3. Dependency dalam modul termux — wajib vs kandidat pangkas + +| Dependency | Lokasi | Status | Alasan / dampak hapus | +|------------|--------|--------|------------------------| +| `androidx.annotation/core/appcompat/drawer/preference/viewpager`, `window-v1alpha9` | shared, application | **WAJIB** | dipakai luas; window JANGAN naik versi (komentar brk 58-59 `shared/build.gradle.kts`) | +| `google.guava`, `commons-io` | shared, application | **WAJIB** | dipakai `core.common`, javac-services, LSP; hapus = compile error luas | +| `core.common/resources/projects`, `utilities.preferences/buildInfo`, `termux.view/emulator` | shared, application | **WAJIB** | rantai kompilasi terminal+build | +| `com.termux:termux-am-library v2.0.0` (`common-termuxAmLib`, `libs.versions.toml:95` → `shared/build.gradle.kts:61`) | shared | **OPSIONAL (kandidat #1)** | Hanya untuk `AmSocketServer`/`TermuxAmSocketServer` (instal via `am`, dipanggil 1x di `TermuxApplication:53`). Build Kotlin/Java via Gradle TIDAK butuh. Hapus butuh stub/guard 2 call-site — serahkan Agent-3/4. **TOML tidak dihapus.** | +| markwon x4 (`core, extStrikethrough, linkify, recycler`) | shared (50-53), application (50-53) | **OPSIONAL (kandidat #2)** | Hanya `MarkdownUtils` (dialog error/laporan). Bisa diganti `TextView` polos. Hapus butuh edit `MarkdownUtils.java` + pemanggil — serahkan Agent-3/4. | +| `hiddenApiBypass` (`org.lsposed...:6.1`) | shared (56) | **OPSIONAL (kandidat #3)** | Hanya `ReflectionUtils.java:10,32`. Non-fatal di API baru; hapus butuh try/catch fallback — serahkan Agent-3/4. | +| `google.material` di modul termux | shared (54), application (48) | **Tahan dulu** | Dipakai UI terminal; hemat kecil, risiko UI rusak. Bukan prioritas lite. | + +## 4. Paket bootstrap/runtime yang bisa dipangkas (ringkas: hanya Kotlin+Java) + +Biner `idesetup` tertutup, tapi flag onboarding + `Environment.java` memberi daftar pasti: + +| Paket / komponen | Status lite | Dasar | +|------------------|-------------|-------| +| Base prefix dari `termux-bootstrap` zip (bash, coreutils, apt/dpkg, linker) | **WAJIB** | `shellExists()`, `BASH_SHELL`/`LOGIN_SHELL` (`Environment.java:102-103`); tanpa ini tidak ada shell Gradle | +| JDK **17 saja** (`lib/jvm/java-17-openjdk`) | **WAJIB (satu)** | `Environment.java:96-99`; `JdkVersion` sediakan 17+21 — lite kunci **JDK 17**, hapus opsi JDK 21 dari default onboarding | +| Android SDK **satu versi (35.0.1)** | **WAJIB (satu)** | `SdkVersion` ada 6 entri (33.0.1→35.0.1); lite kunci **35.0.1** (`ALL` arch), sembunyikan sisanya | +| Gradle distribution (wrapper, `GradleBuildService:441`) | **WAJIB (cache)** | Diunduh sekali lalu cache di `GRADLE_USER_HOME`; lite: pertahankan cache, jangan wipe | +| `android.jar` + `tooling-api-all.jar` + `init.gradle` + aapt2 (`ToolsManager`) | **WAJIB (aset lokal)** | Sudah dari APK assets, bukan apt — tidak dipangkas | +| NDK `28.2.13676358` (`--ndk`, default bisa `0`=Skip) | **PANGKAS (default Skip)** | Hanya untuk template NativeCpp; pesan `idesetup -y -c -wn` hanya muncul saat NDK hilang (3 call-site §1) — Kotlin/Java murni tidak butuh; hemat ratusan MB | +| `clang`/`cmake` (ikut NDK/native) | **PANGKAS** | Tidak dipakai kompilasi Kotlin/Java/Gradle JVM | +| `--with-git` | **PANGKAS (default off)** | Version control saja; build tidak butuh | +| `--with-openssh` | **PANGKAS (default off)** | SSH saja; build tidak butuh | +| `apt update` diagnostik (`apt_info_script.sh`) | **Biarkan** | Hanya untuk laporan bug, tidak mengunduh saat build | + +**Versi minimal usul lite:** base prefix + JDK 17 + SDK 35.0.1 + Gradle cache + aset lokal (`android.jar`, `tooling-api`, `init.gradle`, aapt2). NDK=`0` (Skip), git=off, openssh=off. + +## 5. Rekomendasi konkret untuk Agent-3/4 (file+baris, tanpa merusak Kotlin/Java) + +1. `gradle/libs.versions.toml:95` — JANGAN hapus baris; saat siap: hapus `implementation(libs.common.termuxAmLib)` di `termux/shared/build.gradle.kts:61` + guard `TermuxApplication.java:53` (`setupTermuxAmSocketServer`) + stub `TermuxAmSocketServer`. (Hanya installer `am`; build aman.) +2. `termux/shared/build.gradle.kts:50-53` + `termux/application/build.gradle.kts:50-53` — hapus markwon x4 + sederhanakan `MarkdownUtils.java` ke TextView polos. (Hanya dialog; build aman.) +3. `termux/shared/build.gradle.kts:56` — hapus `hiddenApiBypass` + fallback di `ReflectionUtils.java:25-32`. (Hanya refleksi; build aman.) +4. `core/app/.../fragments/onboarding/ideSetupConfig.kt:30-84` — lite: default `SdkVersion.SDK_35_0_1`, `JdkVersion.JDK_17`, `NdkVersion.NDK_DISABLE`; sembunyikan entri lain di UI (jangan hapus enum agar `full` tetap bisa). +5. `IdeSetupConfigurationFragment.kt:146-170` — lite: default `installGit`/`installOpenssh` unchecked. +6. `core/app/build.gradle.kts:282-285` — TETAP `implementation` 4 modul termux (komentar TODO LITE sudah dipasang). Konversi ke `liteImplementation` DILARANG sebelum ada fallback tanpa-terminal. +7. JANGAN sentuh: `core/app/build.gradle.kts:267` generativeai, `window-v1alpha9` (komentar brk 58-59), blok flavor Agent-3, `gradle.properties`, uidesigner. +8. NDK/clang/cmake TIDAK ada di `build.gradle.kts` — pemangkasannya cukup via default onboarding (butir 4-5), tanpa edit native. + +## 6. Edit yang dilakukan Agent-2 + +- `core/app/build.gradle.kts` (di atas brk 282): **komentar `TODO LITE` saja** (6 baris), menandai 4 modul termux WAJIB + menunjuk laporan ini + melarang konversi ke `liteImplementation` tanpa stub. Tidak ada dependency ditambah/dihapus/diubah; generativeai utuh (diff tidak menyentuh baris generativeai — verifikasi `grep -n` masih 267). +- `gradle/libs.versions.toml`: **tidak diubah** (kandidat hanya dicatat §3 butir 1). +- File Agent-3/4 (flavor di `core/app/build.gradle.kts:72-90`, `proguard-rules.pro`, `gradle.properties.lite`, `LiteMode.kt`, uidesigner): **tidak disentuh**. diff --git a/PUSH_CHECKLIST.md b/PUSH_CHECKLIST.md new file mode 100644 index 000000000..ebb088c44 --- /dev/null +++ b/PUSH_CHECKLIST.md @@ -0,0 +1,80 @@ +# PUSH CHECKLIST — lite/ram2gb-lite (Agent-5 Verifikasi) + +> Status verifikasi: 2026-09-06, branch `lite/ram2gb-lite`. JANGAN push sebelum semua kotak hijau. +> Full APK build SENGAJA tidak dijalankan (RAM free ~187–543M, disk 8.6G — pasti OOM). + +## 1. Branch & working tree +- [ ] `git branch` menunjukkan `* lite/ram2gb-lite` (dibuat Agent-1 dari `dev`) +- [ ] `git status --short` bersih kecuali file yang memang mau di-commit: + - `M core/app/build.gradle.kts` + - `?? LITE_BUILD.md` + - `?? gradle.properties.lite` + - `?? ideconfigurations/.../utils/LiteMode.kt` +- [ ] `git diff --check` exit 0 (tanpa whitespace error) — TERKONFIRMASI 2026-09-06 +- [ ] `git diff --stat` direview (saat ini 51 tambah / 5 hapus di `core/app/build.gradle.kts`) + +## 2. Commit per agent (koordinator yang commit, BUKAN agent) +Urutan anjuran (satu commit per agent agar revert mudah): +```bash +git add gradle.properties.lite core/app/build.gradle.kts LITE_BUILD.md +# pecah per agent bila file laporan masing-masing sudah ada: +git commit -m "lite(agent-1): branch lite/ram2gb-lite dari dev" +git commit -m "lite(agent-2): audit termux (LITE_TERMUX_AUDIT.md)" +git commit -m "lite(agent-3): flavor lite/full + LiteMode + fullImplementation (LITE_FEATURES.md)" +git commit -m "lite(agent-4): gradle.properties.lite + snippet build (LITE_BUILD.md)" +git commit -m "lite(agent-5): verifikasi ringan + PUSH_CHECKLIST.md" +``` + +## 3. Verifikasi ringan wajib sebelum push (sudah dilakukan sebagian) +- [x] AI dep ada: `implementation("com.google.ai.client.generativeai:generativeai:0.9.0")` (line ~267, tetap `implementation`, bukan full) +- [x] Kotlin/Java path ada: `javacServices`, `lspSetup`, `tooling.api`, `tooling.pluginConfig` (semua `implementation`) +- [x] `git diff --check` bersih +- [x] `du -sh` = 243M, `core/app` = 12M +- [ ] `./gradlew :core:app:tasks --offline --dry-run --max-workers=2` — BELUM HIJAU (lingkungan ini tanpa Java/SDK: `JAVA_HOME not set`). Wajib hijau di mesin builder (JDK 17 + SDK) sebelum push. +- [ ] `assembleLiteDebug` / `assembleDebug --max-workers=2 --offline` — BELUM dicoba (OOM risk). Wajib minimal `assembleDebug` hijau di builder. + +## 4. Conflict / inkonsistensi yang HARUS dibereskan sebelum push +1. `dimension = "mode"` (snippet komentar Agent-4) vs `dimension = "tier"` (flavor nyata Agent-3) — samakan ke `"tier"`, atau hapus snippet contoh. +2. Snippet Agent-4 berisi contoh `productFlavors { create("lite") }` yang dikomen — JANGAN di-uncomment apa adanya (duplikat flavor). Hapus atau tandai deprecated. +3. `LITE_BUILD.md` §2/§39 klaim "flavor belum ada" — kadaluarsa, flavor `lite`/`full` sudah ada. Update sebelum push. +4. `fullImplementation` (BlurView, seasonal, charts, SilentInstaller, appintro, idestats, logsender, uidesigner, xmlInflater) — call-site Java/Kotlin BELUM di-guard `LiteMode.isLowRam()`. Varian `lite` berisiko `ClassNotFound` / compile error. Guard dulu atau kembalikan ke `implementation` sementara. +5. `applicationVariants` fallback `"universal"` — pesan error masih sebut "Only arm64..." — perbaiki teks atau logika penamaan APK universal. +6. `gradle.properties.lite`: `nonTransitiveRClass=true` vs asli `false` + TODO Migrate — uji `full` variant tetap kompilasi. +7. Laporan: `LITE_BASELINE.md` (Agent-1) + `LITE_BUILD.md` (Agent-4) ADA. `LITE_TERMUX_AUDIT.md` (Agent-2), `LITE_FEATURES.md` (Agent-3) masih BELUM ada saat cek awal — minta dilengkapi sebelum PR. (`proguard-rules.pro` juga diubah Agent-3: keep LiteMode + generativeai — review.) + +## 5. Remote & PR (JANGAN dijalankan sebelum seksi 3–4 hijau) +Remote saat ini = upstream resmi (`AndroidCSOfficial/android-code-studio`), BUKAN fork. Jangan push langsung: +```bash +# 1. Fork di GitHub dulu, lalu: +git remote add fork /android-code-studio.git> +git fetch fork +git push -u fork lite/ram2gb-lite + +# 2. Buat PR ke upstream dev: +gh pr create --repo AndroidCSOfficial/android-code-studio \ + --base dev --head :lite/ram2gb-lite \ + --title "lite: varian RAM 2GB (flavor lite/full + build tuning)" \ + --body-file PUSH_CHECKLIST.md +``` + +## 6. GPL-3.0 notice (wajib di PR body / file baru) +- `LiteMode.kt` sudah memuat header GPL-3.0 — OK. +- `gradle.properties.lite`, `PUSH_CHECKLIST.md`, `LITE_*.md` adalah config/dok — tetap di bawah GPL-3.0 repo (`LICENSE` root). Jangan tambah lisensi inkompatibel. +- Blok `// LITE-*` di `build.gradle.kts` tidak mengubah lisensi. + +## 7. Yang BELUM BOLEH di-push jika build belum hijau +- [ ] `core/app/build.gradle.kts` dengan `fullImplementation` tanpa guard call-site (risiko lite tidak kompilasi). +- [ ] Snippet `abiFilters arm64-v8a` aktif (belum ada di flavor nyata; potong ABI tanpa uji). +- [ ] `gradle.properties` hasil `cp gradle.properties.lite gradle.properties` (file `.lite` boleh di-push, overwrite `gradle.properties` JANGAN). +- [ ] File `.bak`, `local.properties`, signing key, `gradle.properties.bak`. +- [ ] Klaim hemat "%" di `LITE_BUILD.md` §5 sebagai hasil ukur (itu estimasi teoritis, bukan hasil build). + +## 8. Perintah final koordinator (setelah semua hijau) +```bash +git status --short +git diff --check +git log --oneline -5 +# baru kemudian commit per agent (lihat §2), push ke fork, gh pr create (lihat §5) +``` + +_Agent-5: hanya verifikasi + checklist. Tidak push, tidak commit final._ diff --git a/core/app/build.gradle.kts b/core/app/build.gradle.kts index be200a7f6..d7b9ecc41 100755 --- a/core/app/build.gradle.kts +++ b/core/app/build.gradle.kts @@ -69,6 +69,25 @@ android { applicationId = BuildConfig.packageName vectorDrawables.useSupportLibrary = true } + + // LITE flavor (Agent-3): varian ringan RAM 2GB. Dimensi tunggal "tier". + // settings.gradle.kts TIDAK diubah (semua modul tetap ada untuk varian full). + flavorDimensions += "tier" + productFlavors { + create("lite") { + dimension = "tier" + applicationIdSuffix = ".lite" + versionNameSuffix = "-lite" + manifestPlaceholders["liteMode"] = true + // LITE-TODO(lite): guard call-site fitur full-only (uidesigner, xml-inflater + // preview, idestats, logsender, BlurView, charts, seasonal effects, + // SilentInstaller, appintro) dengan LiteMode.isLowRam() sebelum assemble lite. + } + create("full") { + dimension = "tier" + manifestPlaceholders["liteMode"] = false + } + } experimentalProperties["android.experimental.enableGlobalSynthetics"] = true @@ -111,6 +130,30 @@ android { disable.addAll(arrayOf("VectorPath", "NestedWeights", "ContentDescription", "SmallSp")) } + // LITE-BUILD-SNIPPET (Agent-4, non-aktif agar tidak conflict Agent-2/3) — + // Agent-3 sudah membuat productFlavors lite/full dimensi "tier" (lihat atas). + // Jangan hapus blok Agent-3. Contoh aktif susulan untuk varian lite (hemat RAM/ukuran, arm64 saja): + // productFlavors { + // getByName("lite") { + // dimension = "tier" // sama dengan milik Agent-3 + // ndk { abiFilters += "arm64-v8a" } + // // resourceConfigurations += listOf("in", "en") // opsional: pangkas bahasa + // } + // } + // buildTypes { + // getByName("debug") { + // // default lite-debug: tanpa minify agar cepat di RAM 2GB + // isMinifyEnabled = false + // isShrinkResources = false + // } + // getByName("release") { + // // jika build lite-release: minify+shrink aktif untuk APK kecil + // // isMinifyEnabled = true + // // isShrinkResources = true + // } + // } + // lint { abortOnError = false } // tetap false untuk lite + packaging { resources { pickFirsts += "kotlin/**.kotlin_builtins" @@ -137,17 +180,19 @@ android { variantName.contains("arm64") -> "arm64-v8a" variantName.contains("armeabi") || variantName.contains("arm7") -> "armeabi-v7a" else -> { - // This should not happen with our configuration - throw IllegalStateException( - "Could not determine ABI for variant: $variantName. Expected arm64-v8a or armeabi-v7a." + // Flavor variants (lite/full) carry no ABI filter; fall back to + // 'universal' instead of failing variant configuration. + println( + "No ABI filter for variant: $variantName, using 'universal' suffix." ) + "universal" } } } - if (archSuffix !in listOf("arm64-v8a", "armeabi-v7a")) { + if (archSuffix !in listOf("arm64-v8a", "armeabi-v7a", "universal")) { throw IllegalStateException( - "Unsupported architecture: $archSuffix. Only arm64-v8a and armeabi-v7a are supported." + "Unsupported architecture: $archSuffix. Only arm64-v8a, armeabi-v7a and universal (flavor lite/full) are supported." ) } @@ -188,12 +233,16 @@ dependencies { implementation("org.apache.commons:commons-compress:1.21") // external deps here + // LITE-Stage1(safe): masih implementation agar lite tetap kompilasi. + // NEXT-Stage2: flip ke fullImplementation setelah call-site di-guard LiteMode.isLowRam(). + // Kandidat: BlurView (efek blur berat RAM). implementation("com.github.Dimezis:BlurView:version-3.2.0") implementation("androidx.security:security-crypto:1.1.0-alpha06") implementation(projects.external.acsprovider) implementation(projects.external.atc) implementation(libs.external.customizable.cardview) implementation(projects.external.logwire) + // LITE-Stage1(safe): masih implementation. NEXT: fullImplementation setelah guard LiteMode. implementation(libs.external.seasonal.effects) // Annotation processors @@ -208,6 +257,7 @@ dependencies { implementation(libs.common.kotlin.coroutines.android) implementation(libs.common.retrofit) implementation(libs.common.retrofit.gson) + // LITE-Stage1(safe): masih implementation. NEXT: fullImplementation setelah guard layar charts. implementation(libs.common.charts) implementation(libs.common.hiddenApiBypass) implementation(libs.aapt2.common) @@ -223,6 +273,7 @@ dependencies { } // TODO: remove this + // LITE-Stage1(safe): masih implementation. NEXT: fullImplementation setelah guard installer. implementation("com.github.MiyazKaori:SilentInstaller:1.0.0-alpha") // Git @@ -254,6 +305,7 @@ dependencies { implementation(libs.common.kotlin) // Dependencies in composite build + // LITE-Stage1(safe): masih implementation. NEXT: fullImplementation setelah guard onboarding. implementation(libs.composite.appintro) implementation(libs.composite.desugaringCore) // implementation(libs.composite.javapoet) @@ -277,8 +329,15 @@ dependencies { implementation(projects.java.javacServices) implementation(projects.java.lspSetup) implementation(projects.java.lsp) + // LITE-Stage1(safe): masih implementation agar lite kompilasi. NEXT: fullImplementation setelah guard StatUploadWorker/LogSender. implementation(projects.logging.idestats) implementation(projects.logging.logsender) + // TODO LITE (Agent-2 audit 2026-09-06): 4 modul termux di bawah ini WAJIB untuk + // build Kotlin/Java via Gradle (emulator+view+shared inti+application) — JANGAN + // hapus sekaligus. Kandidat pangkas ada di DALAM modul (am-library, markwon, + // hiddenApiBypass), lihat LITE_TERMUX_AUDIT.md. Opsi susulan Agent-3/4: + // liteImplementation(projects.termux.application) dkk HANYA jika sudah ada + // stub/fallback build tanpa terminal. implementation(projects.termux.application) implementation(projects.termux.view) implementation(projects.termux.emulator) @@ -291,6 +350,7 @@ dependencies { implementation(projects.utilities.templatesApi) implementation(projects.utilities.templatesImpl) implementation(projects.utilities.treeview) + // LITE-Stage1(safe): masih implementation. NEXT: fullImplementation setelah guard Activity/preview uidesigner. implementation(projects.utilities.uidesigner) implementation(projects.utilities.xmlInflater) implementation(projects.xml.aaptcompiler) diff --git a/core/app/proguard-rules.pro b/core/app/proguard-rules.pro index f162fe850..857fe1699 100755 --- a/core/app/proguard-rules.pro +++ b/core/app/proguard-rules.pro @@ -152,4 +152,9 @@ -keep class * extends java.lang.Record { *; } -keepclassmembers class * extends java.lang.Record { (...); -} \ No newline at end of file +} + +# LITE flavor (Agent-3): jangan strip flag LiteMode + entry point AI +-keep class com.tom.rv2ide.ideconfigurations.utils.LiteMode { *; } +-keep class com.google.ai.client.generativeai.** { *; } +-dontwarn com.google.ai.client.generativeai.** \ No newline at end of file diff --git a/gradle.properties.lite b/gradle.properties.lite new file mode 100644 index 000000000..0086d16fe --- /dev/null +++ b/gradle.properties.lite @@ -0,0 +1,34 @@ +# gradle.properties.lite — tuning HP RAM 2GB (Agent-4 Build Acceleration) +# CARA PAKAI: cp gradle.properties.lite gradle.properties +# ASLI JANGAN DIOVERWRITE PERMANEN — backup dulu: cp gradle.properties gradle.properties.bak +# Dikembalikan dengan: cp gradle.properties.bak gradle.properties +# +# Bedanya vs gradle.properties asli (Xmx4096M): +# - Xmx1024M agar tidak OOM di RAM 2GB +# - workers.max=2 agar CPU/RAM tidak jebol +# - configuration-cache=true untuk build incremental lebih cepat +# - nonTransitiveRClass=true untuk kompilasi lebih ringan + +org.gradle.jvmargs=-Xmx1024M \ + -Dkotlin.daemon.jvm.options="-Xmx1024M" \ + -XX:+HeapDumpOnOutOfMemoryError \ + --add-opens java.base/java.lang=ALL-UNNAMED \ + --add-opens java.base/java.util=ALL-UNNAMED \ + --add-opens java.base/java.io=ALL-UNNAMED +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.daemon=true +org.gradle.configuration-cache=true +org.gradle.workers.max=2 +kotlin.incremental=true +kotlin.parallel.tasks.in.project=true +android.useAndroidX=true +android.enableJetifier=false +android.jetifier.ignorelist=common-30.2.2.jar +android.nonTransitiveRClass=true +systemProp.https.protocols=TLSv1,TLSv1.1,TLSv1.2 +android.r8.version=8.6.17 +# Hemat memori tambahan: +# - Nonaktifkan konfigurasi on demand jika bermasalah, biarkan default off +# - Kotlin daemon tetap hidup tapi kecil (lihat jvmargs di atas) +org.gradle.configureondemand=false diff --git a/ideconfigurations/src/main/java/com/tom/rv2ide/ideconfigurations/utils/LiteMode.kt b/ideconfigurations/src/main/java/com/tom/rv2ide/ideconfigurations/utils/LiteMode.kt new file mode 100644 index 000000000..34f4fd14b --- /dev/null +++ b/ideconfigurations/src/main/java/com/tom/rv2ide/ideconfigurations/utils/LiteMode.kt @@ -0,0 +1,56 @@ +/* + * This file is part of AndroidCodeStudio. + * + * AndroidCodeStudio is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AndroidCodeStudio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AndroidCodeStudio. If not, see . + */ + +package com.tom.rv2ide.ideconfigurations.utils + +import android.app.ActivityManager +import android.content.Context + +/** + * Flag + deteksi mode ringan untuk flavor `lite` (target RAM 2GB). + * + * Dipakai untuk mematikan path fitur berat saat runtime (animasi blur, + * seasonal effects, charts, uidesigner preview, dst.) tanpa menghapus + * modul dari `settings.gradle.kts` (varian `full` tetap build penuh). + */ +object LiteMode { + + /** Master switch kompilasi/dokumentasi: true = build lite aktif dipangkas. */ + const val ENABLED = true + + /** Batas memoryClass (MB) yang dianggap perangkat RAM rendah. */ + const val LOW_RAM_MEMORY_CLASS_MB = 128 + + /** + * True jika perangkat RAM rendah: tandai via [ActivityManager.isLowRamDevice] + * atau `memoryClass` kecil. Aman dipanggil dari flavor mana pun. + */ + @JvmStatic + fun isLowRam(context: Context): Boolean { + val manager = + context.getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager ?: return false + return manager.isLowRamDevice || manager.memoryClass <= LOW_RAM_MEMORY_CLASS_MB + } + + /** Memory class perangkat dalam MB, -1 jika tidak terdeteksi. */ + @JvmStatic + fun memoryClassMb(context: Context): Int { + val manager = + context.getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager ?: return -1 + return manager.memoryClass + } +} From b267306b4f527bbff3261c1c7184c4fbe7d8dcc7 Mon Sep 17 00:00:00 2001 From: acs-lite Date: Sun, 6 Sep 2026 13:30:07 +0700 Subject: [PATCH 2/4] lite Stage-2 safe: default SDK35/JDK17/NDK-Skip + anti-FC guards, AI tetap - LiteMode: LITE_JDK/SDK/NDK const + shouldUseLiteDefaults() - Onboarding: default lite saat low-RAM, fallback anti-FC di buildIdeSetupArguments - TermuxApplication: AM socket try/catch (opsional, build Kotlin/Java tidak butuh) - MarkdownUtils: try/catch fallback null agar tampil teks polos - AI generativeai + Kotlin/Java path tidak disentuh --- .../IdeSetupConfigurationFragment.kt | 67 +++++++++++++++---- .../ideconfigurations/utils/LiteMode.kt | 28 ++++++++ .../com/termux/app/TermuxApplication.java | 10 ++- .../termux/shared/markdown/MarkdownUtils.java | 11 ++- 4 files changed, 98 insertions(+), 18 deletions(-) diff --git a/core/app/src/main/java/com/tom/rv2ide/fragments/onboarding/IdeSetupConfigurationFragment.kt b/core/app/src/main/java/com/tom/rv2ide/fragments/onboarding/IdeSetupConfigurationFragment.kt index 8fec9ce69..92edca449 100644 --- a/core/app/src/main/java/com/tom/rv2ide/fragments/onboarding/IdeSetupConfigurationFragment.kt +++ b/core/app/src/main/java/com/tom/rv2ide/fragments/onboarding/IdeSetupConfigurationFragment.kt @@ -43,6 +43,7 @@ import com.tom.rv2ide.databinding.LayoutOnboardngSetupConfigBinding import com.tom.rv2ide.models.IdeSetupArgument import com.tom.rv2ide.resources.R.string import com.tom.rv2ide.tasks.runOnUiThread +import com.tom.rv2ide.ideconfigurations.utils.LiteMode import com.tom.rv2ide.utils.ConnectionInfo import com.tom.rv2ide.utils.Environment import com.tom.rv2ide.utils.flashError @@ -107,7 +108,16 @@ class IdeSetupConfigurationFragment : OnboardingFragment(), SlidePolicy { } val sdkVersions = SdkVersion.entries.map { "SDK ${it.version}" }.reversed() - sdkVersion.setText(sdkVersions[0]) + // Stage-2 lite: default SDK 35.0.1 (hemat download). Full tetap tampilkan semua 6 versi. + // sdkVersions[0] sudah 35.0.1 karena reversed, tapi paksa eksplisit saat low-RAM agar anti-FC. + val defaultSdk = + try { + if (LiteMode.shouldUseLiteDefaults(requireContext())) "SDK ${LiteMode.LITE_SDK_VERSION}" + else sdkVersions[0] + } catch (_: Throwable) { + sdkVersions[0] + } + sdkVersion.setText(if (sdkVersions.contains(defaultSdk)) defaultSdk else sdkVersions[0]) sdkVersion.setAdapter( ArrayAdapter( requireContext(), @@ -117,7 +127,15 @@ class IdeSetupConfigurationFragment : OnboardingFragment(), SlidePolicy { ) val jdkVersions = JdkVersion.entries.map { "JDK ${it.version}" } - jdkVersion.setText(jdkVersions[0]) + // Stage-2 lite: default JDK 17 saja. Full tetap tampilkan 17+21. + val defaultJdk = + try { + if (LiteMode.shouldUseLiteDefaults(requireContext())) "JDK ${LiteMode.LITE_JDK_VERSION}" + else jdkVersions[0] + } catch (_: Throwable) { + jdkVersions[0] + } + jdkVersion.setText(if (jdkVersions.contains(defaultJdk)) defaultJdk else jdkVersions[0]) jdkVersion.setAdapter( ArrayAdapter( requireContext(), @@ -128,7 +146,17 @@ class IdeSetupConfigurationFragment : OnboardingFragment(), SlidePolicy { val ndkVersions = NdkVersion.entries.map { if (it.version == "0") "Skip" else "NDK ${it.version}" } + // Stage-2 lite: default Skip (Kotlin/Java tidak butuh NDK). ndkVersions[0] sudah Skip. ndkVersion.setText(ndkVersions[0]) + // Stage-2 lite: git/openssh default off di HP low-RAM agar hemat download. + try { + if (LiteMode.shouldUseLiteDefaults(requireContext())) { + installGit.isChecked = LiteMode.LITE_INSTALL_GIT + installOpenssh.isChecked = LiteMode.LITE_INSTALL_OPENSSH + } + } catch (_: Throwable) { + // abaikan, biarkan default XML — anti-FC + } ndkVersion.setAdapter( ArrayAdapter( requireContext(), @@ -146,18 +174,29 @@ class IdeSetupConfigurationFragment : OnboardingFragment(), SlidePolicy { fun buildIdeSetupArguments(): Array { val args = mutableListOf() args.setArgument(IdeSetupArgument.INSTALL_DIR, Environment.HOME.absolutePath) - args.setArgument( - IdeSetupArgument.SDK_VERSION, - SdkVersion.fromDisplayName(content.sdkVersion.text).version, - ) - args.setArgument( - IdeSetupArgument.JDK_VERSION, - JdkVersion.fromDisplayName(content.jdkVersion.text).version, - ) - args.setArgument( - IdeSetupArgument.NDK_VERSION, - NdkVersion.fromDisplayName(content.ndkVersion.text).version, - ) + // Stage-2 anti-FC: fromDisplayName pakai first{} -> bisa NoSuchElementException. + // Fallback ke default lite (SDK 35.0.1 / JDK 17 / NDK Skip) agar tidak Force Close. + val sdkVer = + try { + SdkVersion.fromDisplayName(content.sdkVersion.text).version + } catch (_: Throwable) { + LiteMode.LITE_SDK_VERSION + } + val jdkVer = + try { + JdkVersion.fromDisplayName(content.jdkVersion.text).version + } catch (_: Throwable) { + LiteMode.LITE_JDK_VERSION + } + val ndkVer = + try { + NdkVersion.fromDisplayName(content.ndkVersion.text).version + } catch (_: Throwable) { + LiteMode.LITE_NDK_VERSION + } + args.setArgument(IdeSetupArgument.SDK_VERSION, sdkVer) + args.setArgument(IdeSetupArgument.JDK_VERSION, jdkVer) + args.setArgument(IdeSetupArgument.NDK_VERSION, ndkVer) args.setArgument(IdeSetupArgument.ASSUME_YES) if (content.installGit.isChecked) { args.setArgument(IdeSetupArgument.WITH_GIT) diff --git a/ideconfigurations/src/main/java/com/tom/rv2ide/ideconfigurations/utils/LiteMode.kt b/ideconfigurations/src/main/java/com/tom/rv2ide/ideconfigurations/utils/LiteMode.kt index 34f4fd14b..e1600308f 100644 --- a/ideconfigurations/src/main/java/com/tom/rv2ide/ideconfigurations/utils/LiteMode.kt +++ b/ideconfigurations/src/main/java/com/tom/rv2ide/ideconfigurations/utils/LiteMode.kt @@ -53,4 +53,32 @@ object LiteMode { context.getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager ?: return -1 return manager.memoryClass } + + // ---- Stage-2: default lite (aman, tanpa hapus enum Full) ---- + /** JDK default lite: hanya 17 agar hemat download (~200MB+). Full tetap sediakan 17+21. */ + const val LITE_JDK_VERSION = "17" + + /** SDK default lite: hanya 35.0.1 (ALL arch). Full tetap 6 versi. */ + const val LITE_SDK_VERSION = "35.0.1" + + /** NDK default lite: "0" = Skip (Kotlin/Java murni tidak butuh NDK). */ + const val LITE_NDK_VERSION = "0" + + /** Git/OpenSSH default lite: off (hanya untuk version control/SSH, bukan build). */ + const val LITE_INSTALL_GIT = false + const val LITE_INSTALL_OPENSSH = false + + /** + * True jika onboarding/setup harus pakai default lite. + * Aman: return false jika context null/tidak low-RAM -> perilaku Full asli. + */ + @JvmStatic + fun shouldUseLiteDefaults(context: Context?): Boolean { + if (!ENABLED || context == null) return false + return try { + isLowRam(context) + } catch (_: Throwable) { + false + } + } } diff --git a/termux/application/src/main/java/com/termux/app/TermuxApplication.java b/termux/application/src/main/java/com/termux/app/TermuxApplication.java index 3531e72df..69567c4f0 100644 --- a/termux/application/src/main/java/com/termux/app/TermuxApplication.java +++ b/termux/application/src/main/java/com/termux/app/TermuxApplication.java @@ -49,8 +49,14 @@ public void onCreate() { return; } - // Setup termux-am-socket server - TermuxAmSocketServer.setupTermuxAmSocketServer(context); + // Setup termux-am-socket server (opsional, hanya installer via am). + // Stage-2 lite anti-FC: bungkus try/catch agar HP RAM 2GB / lite tanpa + // am-library tetap jalan (build Kotlin/Java via Gradle tidak butuh ini). + try { + TermuxAmSocketServer.setupTermuxAmSocketServer(context); + } catch (Throwable t) { + Logger.logStackTraceWithMessage(LOG_TAG, "AM socket server opsional dilewati (mode lite tetap aman)", t); + } } else { Logger.logErrorExtended(LOG_TAG, "Termux files directory is not accessible\n" + error); } diff --git a/termux/shared/src/main/java/com/termux/shared/markdown/MarkdownUtils.java b/termux/shared/src/main/java/com/termux/shared/markdown/MarkdownUtils.java index 4e1b482ec..d08cfab69 100644 --- a/termux/shared/src/main/java/com/termux/shared/markdown/MarkdownUtils.java +++ b/termux/shared/src/main/java/com/termux/shared/markdown/MarkdownUtils.java @@ -200,8 +200,15 @@ public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) public static Spanned getSpannedMarkdownText(Context context, String string) { if (context == null || string == null) return null; - final Markwon markwon = getSpannedMarkwonBuilder(context); - return markwon.toMarkdown(string); + // Stage-2 lite anti-FC/OOM: Markwon bisa berat di RAM 2GB. Fallback null agar + // pemanggil tampilkan teks polos, jangan Force Close. + try { + final Markwon markwon = getSpannedMarkwonBuilder(context); + if (markwon == null) return null; + return markwon.toMarkdown(string); + } catch (Throwable t) { + return null; + } } } From 8331f4c7503a5fb4c62aa52574c88a730d44f8d6 Mon Sep 17 00:00:00 2001 From: acs-lite Date: Sun, 6 Sep 2026 13:32:51 +0700 Subject: [PATCH 3/4] ci: trigger Actions untuk branch lite/** agar push lite auto-build --- .github/workflows/asm_build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/asm_build.yml b/.github/workflows/asm_build.yml index ee2efda31..e68a0bf3f 100644 --- a/.github/workflows/asm_build.yml +++ b/.github/workflows/asm_build.yml @@ -7,6 +7,7 @@ on: - "main" - "indexing" - "release/**" + - "lite/**" paths-ignore: - '**.md' - '**.json' From f34018619a0a5956b62d41b4dce9c4fd40b8deeb Mon Sep 17 00:00:00 2001 From: acs-lite Date: Sun, 6 Sep 2026 13:38:32 +0700 Subject: [PATCH 4/4] ci: retrigger Actions untuk lite/ram2gb-lite