# calc **Repository Path**: PedenetLink/calc ## Basic Information - **Project Name**: calc - **Description**: 个人 Kotlin Multiplatform (KMP) 跨平台开发学习项目,开发了一款支持在鸿蒙、安卓、IOS、Windows、Linux上运行的超级科学计算器。 - **Primary Language**: Kotlin - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-08 - **Last Updated**: 2026-09-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SciCalc KMP — 跨平台科学计算器 ![Version](https://img.shields.io/badge/version-1.0.0.a-blue) ![License](https://img.shields.io/badge/license-MIT-green) ![Author](https://img.shields.io/badge/author-wusn-orange) **作者:wusn** · **协议:[MIT](LICENSE)** · **版本:1.0.0.a** 对 `base.apk`(com.nstudio.calc.casio.business,Casio 风格科学计算器)的**去恶意功能重实现**。 基于 Kotlin Multiplatform + Compose Multiplatform,一套代码运行于: | 平台 | 目标 | 入口 | |---|---|---| | Android | `androidTarget` | `composeApp/src/androidMain/.../MainActivity.kt` | | iOS | `iosArm64` / `iosSimulatorArm64` / `iosX64` | `MainViewController.kt`(ComposeUIViewController) | | Windows | `desktop`(JVM) | `composeApp/src/desktopMain/.../Main.kt` | | Linux | `desktop`(JVM) | 同上 | ## 已复刻功能 - **科学计算器**:表达式求值引擎(递归下降解析器),支持四则、幂、阶乘、取模、隐式乘法(`2π`、`3(4+1)`) - **三角/反三角/双曲函数**(DEG / RAD / GRAD 三种角度制) - **对数指数**:ln、log、log2、logb、exp - **组合数学**:nCr、nPr、gcd、lcm、factorial - **存储器**:M+/M-/MR/MC、A–F 寄存器、Ans、历史记录 - **BASE-N 模式**:BIN/OCT/DEC/HEX,支持 and/or/xor/nand/not/shl/shr - **统计模式(STAT)**:n、Σx、Σx²、均值、中位数、方差(总体/样本)、标准差、分位数 - **方程模式(EQN)**:一元二次(含复根)、三次、2×2 与 3×3 线性方程组 - **单位换算**:长度、质量、面积、体积、速度、时间、数据、能量、压力、角度、温度(全离线) - **函数绘图(Graph)**:绘制 f(x),拖拽平移、按钮缩放、网格与坐标轴、渐近线断线处理 - **科学常数库**:普朗克常数、光速、阿伏伽德罗常数等 26 项 - **主题**:深色/浅色,DEG/RAD/GRAD 切换 - **素因数分解**(引擎内置) ## 已移除的恶意功能(相对原 APK) 见根目录 `../apk_analysis_report.md`。要点: 1. ❌ Google Ads SDK 的 `DexClassLoader` 运行时远程代码加载(RCE 风险) 2. ❌ Firebase/Analytics 读取 Google 账户并上传遥测 3. ❌ `INSTALL_PACKAGES` / `INSTALL_SHORTCUT` 越权静默装包能力 4. ❌ 明文 HTTP 网络访问(原用于拉汇率) 5. ❌ Crashlytics 崩溃上报、内购付费墙 本应用 **0 权限、0 网络、0 遥测**,全部计算本地完成。 ## 构建方法 要求:JDK 11+(建议 17/21)、Android SDK(构建 Android 时)、Xcode(构建 iOS 时)。 ```bash # Android APK ./gradlew :composeApp:assembleDebug # 产物: composeApp/build/outputs/apk/debug/composeApp-debug.apk # Windows / Linux 桌面(直接运行) ./gradlew :composeApp:run # Windows 安装包 (MSI) / Linux 安装包 (DEB) ./gradlew :composeApp:packageDistributionForCurrentOS # iOS:先产框架再由 Xcode 打包(见 composeApp/iosApp 说明) ./gradlew :composeApp:linkDebugFrameworkIosSimulatorArm64 ``` iOS 端在 Xcode 中新建 App,添加本地 Podfile 指向生成的 framework,或使用 Kotlin 1.9.20+ 的 Xcode integration(详见 [KMP 文档](https://kotlinlang.org/docs/multiplatform-project-setup.html))。 `MainViewController()` 已暴露 `ComposeUIViewController`,SwiftUI 中直接 `UIViewControllerRepresentable` 包装即可。 > 注:`gradle/wrapper/gradle-wrapper.properties` 的发行包下载源为腾讯镜像 > (`mirrors.cloud.tencent.com/gradle/`),国内网络可直接 `./gradlew` 首次构建; > 海外环境可改回 `services.gradle.org`。 ## 安装包 预构建包位于 `dist/`: | 文件 | 平台 | 大小 | 说明 | |---|---|---|---| | `scicalc-1.0.0.a.apk` | Android | 6.6 MB | 已用自签密钥签名(v2 签名方案),可 `adb install` 或直接安装 | | `scicalc-1.0.0.a-setup.exe` | Windows | 62 MB | Inno Setup 制作,**自带 JRE 21**,双击安装到 Program Files | | `scicalc-1.0.0.a-1.noarch.rpm` | Linux | 47 MB | 需系统预装 Java 11+;`rpm -ivh` 或 `dnf install` | | `scicalc-1.0.0.a-portable.zip` | 跨平台 | 47 MB | 跨 Windows/Linux/macOS,需 Java 11+;解包后运行 `bin/scicalc` / `bin/scicalc.bat` | ### 版本号说明 - App 身份 = **1.0.0.a**(项目版本、APK `versionName`、Inno 显示名、RPM 名称、桌面文件) - Inno / jpackage 内部版本 = **1.0.0**(数字格式,受 Windows Installer 与 jpackage 限制) - 不影响用户可见身份 ### 从源码重新打包 需要 JDK 17+、Android SDK(含 platform-35、build-tools 35.0.0、platform-tools)、Inno Setup 6+。 ```bash # 1. APK(需 ANDROID_HOME 或 local.properties 指向 SDK) ./gradlew :composeApp:assembleRelease # 2. 便携分发(jar + 依赖 + 启动器) ./gradlew :composeApp:portableDist # 3. Windows JRE 映像(给 Inno 打包用) ./gradlew :composeApp:createDistributable WIX_PATH=/path/to/wix311 ./gradlew :composeApp:createDistributable # Windows 必需 # 4. Inno Setup exe 安装包 "$(ProgramFiles)/Inno Setup 6/ISCC.exe" packaging/scicalc.iss # 5. RPM(纯 Python,跨平台) python packaging/build_rpm.py ``` ## 单元测试 ```bash ./gradlew :composeApp:desktopTest # 16 个测试用例,覆盖:算术、优先级/结合性、隐式乘法、角度制、 # 对数幂、组合数学、位运算关键字、变量、错误处理、BASE-N、统计、 # 素因数分解、方程求解、单位换算、格式化、函数绘图 ``` ## 工程结构 ``` SciCalcKMP/ ├── composeApp/ │ ├── build.gradle.kts # KMP targets + Compose 配置 │ └── src/ │ ├── commonMain/kotlin/scicalc/ │ │ ├── App.kt # 根导航 + 全局状态 │ │ ├── engine/ # 纯 Kotlin 计算引擎(可独立复用) │ │ │ ├── Engine.kt # 表达式求值(lexer/parser/evaluator) │ │ │ ├── BaseN.kt # 进制计算与位运算 │ │ │ ├── Statistics.kt # 统计 │ │ │ ├── EqnSolver.kt # 方程求解 │ │ │ ├── Units.kt # 单位换算 │ │ │ └── SciConstants.kt# 常数库 + 素因数分解 │ │ ├── screens/ # 7 个功能界面 │ │ └── ui/ # 主题与按键组件 │ ├── androidMain/ # Android 入口(Manifest 零权限) │ ├── desktopMain/ # Windows/Linux 入口 │ └── iosMain/ # iOS 入口 ├── gradle/libs.versions.toml # 版本目录 └── settings.gradle.kts ``` ## 扩展指引 - 新增数学函数:在 `engine/Engine.kt` 的 `applyFunction()` 中加一个分支即可 - 新增换算类别:在 `engine/Units.kt` 的 `categories` 列表中追加 - 新增常数:在 `engine/SciConstants.kt` 的 `constants` 列表中追加