# AtomEnv **Repository Path**: atm_java/atom-env ## Basic Information - **Project Name**: AtomEnv - **Description**: 原 AppEnv 的延续 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-17 - **Last Updated**: 2026-07-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AtomEnv AtomEnv 是一个 Android / Xposed 单模块工程,用于在本机离线伪装目标应用读取到的设备信息。项目无后端、无云端同步,配置保存在模块 App 本地。 ## 当前状态 | 项目 | 当前值 | |------|--------| | 主模块 | `app/` | | Java 包名 | `com.sollyu.android.appenv` | | Android namespace | `com.atomenv` | | official flavor applicationId | `com.atomenv` | | Xposed 入口 | `app/src/main/assets/xposed_init` -> `com.sollyu.android.appenv.MainXposedNew` | | Xposed API | Legacy `de.robv.android.xposed` API,LSPosed 中显示为 `legacy` | | Xposed 依赖 | `compileOnly("de.robv.android.xposed:api:82")` | | 构建链 | Gradle 8.7 / AGP 8.4.1 / Kotlin DSL / Java 17 / compileSdk 34 | | 支持范围 | Android 8-14 (API 26-34) 为当前构建目标;Android 15 待真机/框架验证 | | Root 依赖 | 无;不使用 `su` / `libsuperuser` | | 配置通道 | SharedPreferences XML + `makeConfigReadable()`;目标进程优先通过当前 XML / XSharedPreferences / ContentProvider 兜底读取 | | UI | 环境信息 / 加密 / 网络 三个 Tab | Route B 的 Modern libxposed API 100 方案已废弃。当前主线是 Route C:回归 Legacy Xposed API,以获得更宽的 LSPosed 版本兼容性。 ## 核心能力 - 伪装 `Build` / `Build.VERSION` / SystemProperties 设备字段。 - 伪装 Telephony 信息:IMEI、MEID、IMSI、SIM 序列号、手机号、运营商、ServiceState、CellSignalStrength 等。 - 伪装 Wi-Fi / Bluetooth / Settings / Locale / DPI / 网络类型相关入口。 - 伪装 CPU `/proc` / sysfs、存储容量、屏幕、GPS、传感器列表与 SensorEvent 实时值。 - 覆盖 GAID/OAID/VAID/AAID、GSF ID、App Set ID、Firebase Installation ID 和 GMS 版本名等标识入口;具体 SDK 版本命中仍需真机验证。 - 覆盖 GLES GPU vendor/renderer/version 与 MediaDrm/Widevine Java 属性入口;native/JNI 和硬件安全链路仍是验证边界。 - 覆盖 NetworkInfo / LinkProperties 的连接、接口、DNS、域名、代理和 Java 环境属性入口;LinkAddress / RouteInfo / APN 仍待确认。 - 覆盖 PackageManager Feature Flags 与 Camera2 稳定字段;输出尺寸、legacy Camera、HAL 能力仍待确认。 - 提供 HTTP 请求抓包、WebView JS HTTP 拦截、JS 加密日志记录,并在 App 内提供加密 / 网络日志 Tab。 - 按具体包名、`USER` 默认配置、`ALL` 全局配置合并;未配置字段可随机填充。 配置优先级: ```text 具体包名配置 > USER 配置 > ALL 配置 > 随机填充 ``` ## 数据资产 - `app/src/main/assets/phone.json`:26 个 canonical 分组,1016 条记录。 - `app/src/main/assets/socs.json`:317 个 key,7 个 SoC vendor。 - `app/src/main/assets/mcc_mnc.json`:995 条运营商记录,228 个国家/地区。 - 维护脚本:`tools/clean-assets.mjs`、`tools/validate-assets.mjs`、`tools/validate-vendor-profiles.mjs`。 - 维护说明:`docs/ASSET_DATA_MAINTENANCE.md`。 ## 构建与验证 ```powershell # Debug 构建 .\gradlew.bat assembleOfficialDebug # Release 构建 .\gradlew.bat assembleOfficialRelease # 单元测试 .\gradlew.bat --no-daemon --no-parallel --max-workers=1 testOfficialDebugUnitTest # 仅编译源码 .\gradlew.bat compileOfficialDebugSources # Android lint .\gradlew.bat lintOfficialDebug ``` Windows 用户名含非 ASCII 字符时,Gradle worker classpath 可能被系统默认 Gradle 缓存路径污染。当前 `gradlew.bat` 会在未显式设置 `GRADLE_USER_HOME` 时默认使用仓库内 `.gradle-user-home`,避免测试进程找不到 `GradleWorkerMain`。 Debug APK 通常输出到: ```text app/build/outputs/apk/official/debug/ ``` 实际 APK 名包含版本号、versionCode、flavor 和日期;每次安装前用文件时间定位最新 APK,不要硬写旧文件名。 ## 项目结构 ```text app/src/main/ ├── AndroidManifest.xml (含 xposedmodule meta-data) ├── assets/xposed_init (Legacy Xposed 入口声明) ├── java/com/sollyu/android/appenv/ │ ├── MainXposedNew.java (IXposedHookLoadPackage 入口) │ ├── MainApplication.java │ ├── MainConfig.java │ ├── activity/ │ ├── helper/ │ │ ├── ConfigReader.java (XML / XSharedPreferences / Provider 读取) │ │ ├── LibXposedHookHelper.java (HookGroup 编排器) │ │ ├── PrefsHelper.java (配置写入与可读性发布) │ │ ├── profile/ │ │ └── hook/ │ │ ├── BaseHookGroup.java (XC_MethodHook 封装) │ │ ├── BuildHookGroup.java │ │ ├── HttpHookGroup.java │ │ ├── CryptoHookGroup.java │ │ ├── WebViewDebugHookGroup.java │ │ └── ... │ ├── module/AppInfo.java (配置 JSON 协议) │ └── utils/ └── res/ ``` ## 文档 | 文档 | 说明 | |------|------| | `AGENTS.md` | AI 助手入口、当前事实、工作原则 | | `docs/PROJECT_MAINTENANCE.md` | 唯一的未完成项和后续路线维护清单 | | `docs/真机调试流程.md` | 构建、安装、LSPosed 日志、UI 真机验证和踩坑记录 | | `docs/ASSET_DATA_MAINTENANCE.md` | 本地资产清洗与验证流程 | | `docs/GAP_ANALYSIS.md` | DevCheck 设备信息读取点与覆盖差距参考 | | `docs/LSPOSED_KNOWLEDGE.md` | 当前 Legacy API 编码与调试知识 | | `docs/LSPOSED_MODULE_PRACTICES.md` | 外部模块实践中仍可复用的工程经验 | 历史迁移计划、已完成实现计划和旧 API 100 路线文档已清理;未完成项统一并入 `docs/PROJECT_MAINTENANCE.md`。 ## 开发注意 1. 不要随意重命名 `AppInfo` 的 public 字段,它们是配置 JSON 协议。 2. Xposed API 必须保持 `compileOnly`,不能打包进 APK。 3. official flavor 的 applicationId 是 `com.atomenv`,不同于源码 Java 包名 `com.sollyu.android.appenv`。 4. 修改 hook 行为前先读 `MainXposedNew.java`、`AppInfo.java`、`LibXposedHookHelper.java`。 5. 真机验证时需要在 LSPosed 中启用模块并勾选目标 App 作用域。 6. Xposed 注入侧日志统一通过 `XposedBridge.log()` 输出 `AppEnv` 前缀日志。 ## License Copyright Sollyu 2015-2016 / Atom 2026