# shzu-schedule **Repository Path**: m1sucode/shzu-schedule ## Basic Information - **Project Name**: shzu-schedule - **Description**: 石大课表 - 石河子大学非官方课表 App(Java + WebView)。自动登录教务系统抓取整学期课表,支持课前提醒、桌面小组件、深浅主题与自定义背景。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-09-15 - **Last Updated**: 2026-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 石大课表 (SHZU Schedule) > **非官方声明**:本项目**非石河子大学官方软件**,由在校学生利用**课余时间**出于学习目的独立开发维护,与学校官方及教务部门无任何关联。 石河子大学课表安卓应用:自动登录学校统一身份认证(CAS),抓取教务系统整学期课表,本地离线渲染,支持深浅主题、自定义背景、自定义加课与桌面小组件。 ## 📥 下载 | 渠道 | 地址 | 说明 | |---|---|---| | **Gitee(国内直连)** | https://gitee.com/m1sucode/shzu-schedule/releases | **推荐国内用户使用**,无需代理,下载速度快 | | GitHub | https://github.com/DoGeMisu/shzu-schedule/releases | 海外或可正常访问 GitHub 的用户 | > 两处源码与版本完全同步,功能一致。若 Gitee 打不开,请改用 GitHub,反之亦然。 ![Platform](https://img.shields.io/badge/Platform-Android-3DDC84) ![Language](https://img.shields.io/badge/Language-Java-orange) ![UI](https://img.shields.io/badge/UI-WebView%20HTML%2FCSS%2FJS-blue) ![Version](https://img.shields.io/badge/Version-1.5.3-667eea) ## ✨ v1.5.3 更新日志 **新增功能** - 🛡 **更新包下载地址纳入域名白名单**:服务端返回的下载链接必须落在自有域名内,防止更新接口被入侵或配置错误时把安装包指向外部主机。 **优化** - 🔐 **更新链路全面升级为 HTTPS**:域名备案已完成,更新服务从 IPv4 明文直连切换到 `https://misuhub.top`,版本查询、公告与安装包下载全程走 TLS。 - 🚫 **默认禁止明文流量**:网络策略从「全局放行明文」改为默认关闭,只对校内域名 `*.shzu.edu.cn` 保留例外(教务系统根路径会跳转 http)。 - 📱 **兼容 Android 7.0 的证书校验**:内置 ISRG Root X1 根证书,修复 Android 7.0 设备可能出现的「永远检查不到更新」。 - 🧩 **个人信息页域名同步**:站点入口更新为 `misuhub.top`。 ## ✨ v1.5.2 更新日志 **新增功能** - 🛡 **更新包安装前校验包名与签名**:下载完成后除了大小与 SHA-256,还会比对包名和签名证书摘要,与当前应用不一致就拒绝安装并提示具体原因。 **优化** - ⚡ **桌面小组件不再空转耗电**:刷新改为进程内直接重绘,不再靠广播自触发,修掉了小组件长期占用高 CPU、进而拖慢系统的连锁问题。 - 🔒 **收紧证书与混合内容策略**:不再信任用户安装的根证书;三处 WebView 从「始终允许混合内容」改为兼容模式,主动混合内容会被拦下。 - 🌐 **限制 WebView 可导航范围**:所有 `loadUrl` 前先过校内域名白名单,教务页面里抓出来的课表入口同样需要校验。 - ⏱ **自动检查更新改为 12 小时节流**:不再每次冷启动都联网。 - 📦 **补充 Gradle Wrapper**:克隆后可直接用 `./gradlew` 构建,不再依赖本机预装的 Gradle 版本。 **修复** - 🩹 **修复第 6 大节起的课程被丢弃**:行号上限由写死的 5 改为实际网格行数,第 6 节以后的课不会再静默消失。 - 🩹 **修复课程名/地点含英文单引号时卡片显示异常**:属性转义改用 HTML 实体,含 `'` 的课程数据不再截断卡片内容。 - 🩹 **修复单双周混排的课程整门消失**:`1-8周(单),9-16周(双)` 这类写法此前 16 周全部判为不上课,现按周次段分别判断单双。 - 🩹 **修复教务结果表可注入标签**:结果表改为白名单重建,只保留表格结构与排版属性。 - 🩹 **诊断包自动脱敏**:导出前抹掉学号、姓名、手机号、身份证号与邮箱。 ## ✨ v1.5.1 更新日志 **新增功能** - 📅 **点「第 N 周」可直接跳到指定周**:点标题下方的周次会弹出周次列表,选哪一周就落到哪一周,不用再一格一格地翻。 - 👆 周次按钮加了小块浅色底与圆角,一眼就能看出它可以点。 **优化** - 🪟 **自定义背景下的页面观感统一**:切到「我的」「设置」等页面时,顶部状态栏、页面主体与底部导航栏显示的是同一块背景,不再出现顶部透明、页面发暗两种颜色并存。 - 🌫 底部导航栏改为完全透明:去掉那层由浅到深的渐变压暗,背景图原样透出,与顶部保持一致。 - 🧱 页面里的卡片改为半透明玻璃底,标题、返回箭头与设置齿轮在背景上换成深色描边字,既看得清又不挡背景。 - ⚡ **主题切换改为整屏同时换色**:深浅主题互相切换时,标签栏、按钮、开关与页面不再先后错开变色,一次性完成。 - 🪟 页面叠页面时不再层层加叠半透明,二级页面看起来更干净。 - 🖐 快速连滑切周时,新手势会先结算上一次翻页,不再出现卡住不动。 **修复** - 🩹 **修复底部导航栏与页面之间有一条细缝**:两者高度对齐,接缝处不再透出背景。 - 🩹 **修复打开周次选择、课程详情时手势条区域没被遮住**:底部那条 home 横线所在的区域现在会跟随浮层一起压暗或铺同色底。 - 🩹 修复在「我的」「设置」页里标题与齿轮在浅色背景上看不见。 ## ✨ v1.5.0 更新日志 **新增与改进** - 🔔 **新增通知栏常驻课程**:设置里开启后,通知栏常驻显示「正在上课 / 下一节课」的课程名、时间、地点与教师,每分钟自动刷新;采用前台服务保证进程被回收后依然准确,不打扰(静音、不震动、不响铃)。 - 🎨 **全新应用图标**:以校徽行书为主角重新设计 —— 青绿渐变底上一张被长尾夹夹住的课表纸,右上角一枚白色书签,行书叠在格线上方并自动擦除周围的格线。 - ✒️ 通知栏小图标同步换为校徽行书剪影,与应用图标呼应。 **内部** - 🧹 图标资源按自适应图标规范重新拆层:背景层纯渐变矢量,前景层内容缩进安全区,圆形/方形遮罩下四角均完整。 - ⚡ 代码整理与性能优化(见提交记录)。 ## ✨ v1.4.7 更新日志 **新增与改进** - 🔠 **新增字体大小调节**:设置 → 通用设置里加了滑块与「小 / 标准 / 大 / 特大」四档,80%~150% 连续可调,拖动时页面文字实时变化,不用重启也不用重载页面。 - 🧱 **课表格子内温和缩放**:格子高度是均分的,跟着整体字号同步放大会把地点挤没,所以网格内只按 45% 的增量跟随,放大后课名与地点都还看得见。 **修复** - 🩹 **修复拖动课表卡片的操作栏被底部导航栏挡住**:「应用 / 取消更改 / 撤销」三个按钮原本贴在屏幕最底部,被新加的标签栏整块盖住,现已抬到标签栏上方显示。 - 🩹 页面内的轻提示(toast)同样避开底部标签栏,不再贴着导航栏边缘显示。 ## v1.4.6 更新日志(自 v1.4.4 起的全部改动) **新增与改进** - 🧩 重叠加课:加课模式下点已有课的格子也能加课,同一格可以叠多门课,并在表单里提示这一格已压了几门课。 - 🟠 重叠双色提示:自己主动叠在同一格的用琥珀色描边,教务同步后新撞上的才用红色描边加感叹号。 - 🔔 同步前先说清楚:「课表有更新」弹窗会说明这次更新会让几门自定义课程被撞上,并给出一个可核对的位置。 - 🏫 新增「查询教室」(更多功能):按校区 + 教学楼 + 周次/星期/节次查看教室占用,还能再选一间具体教室只看这一间。 - 🪑 新增「找空教室」(更多功能):按同样条件列出该时段没有课的教室,并按楼栋分组。 - 🔍 教室卡片可点开看详情:占用卡片显示课程、教师、周次、班级,空教室卡片可一键跳到该间教室的课表。 - 🎛 选择器改为自绘底部面板:校区/教学楼/教室/周次/星期/节次不再用系统下拉,改为可搜索的底部列表,长列表也能快速定位。 - 🔔 **自动检查更新**:每次进入软件都会检查一次新版本,进入「检查更新」页也会自动再查一次,无需手动点。 - 🩹 **修复升级后「我的」页不显示姓名**:改为启动后主动到教务首页抓一次姓名与学号,「重新获取资料」也直接重抓,不必退出账号重新登录。 - 🧭 新增底部标签栏:「课表 / 我的 / 更多功能」三标签,任何页面下都可见。 - 👤 新增「我的」页:显示登录后从教务读取的姓名与学号(只存本机、不上传),右上角齿轮进入设置。 - 🎛 周切换并入按钮行:左右切换移到「刷新课表」「+ 加课」两侧,「第 N 周」移到日期旁并用正文色加粗。 - 🎨 去掉顶部紫色色块:状态栏改为跟随页面底色,深色主题下同步变深。 - 🔑 更新服务启用 App API Key:版本接口与下载链接改用不限次签名通道,不再受匿名通道每天 5 次的额度限制。 - 🌐 更新服务改为 IPv4 直连:域名备案完成前客户端不出现任何域名,备案后由新版安装包切回。 - 🔍 下载校验升级为字节数 + SHA-256 双重校验:任一不符立即删除并提示。 **修复** - 🩹 修复开屏动画在部分系统上只有白屏:动画改到首帧之后才起跑,首帧即完整开屏画面,并加了收尾兜底与开屏期间的触摸屏蔽。 - 🩹 修复教室查询结果串台与数据不全:同一条件连查两次行数不一致、查 A 教室却显示 B,改为每次查询使用全新 iframe 并等表格逐行渲染完成再取结果。 - 🩹 修复教室名含「教室」被当成表头过滤:「博学A-203(智慧教室)」这类教室现在能正常显示。 - 🐛 修复检查更新页显示空态:更新信息此前被当作字符串注入,导致页面取不到版本号与更新日志。 - 🧭 更新错误按状态码分类:401 密钥失效、403 链接过期(自动换新链接重试)、404 下架、429 额度用尽、503 熔断各有对应提示。 - 🔐 退出登录一并清除加密密码:此前加密密码仍留在本地,重启后会解密回来自动登录。 ## v1.4.3 更新亮点(历史) > ⚠️ 本版把更新服务切到 HTTPS 域名 `misuhub.cc.cd`,该入口现已不可用。v1.4.4 起改回 IPv4 直连 + API Key,因此 **v1.4.3 用户需要手动安装一次 v1.4.4**,之后自动更新恢复。 - 🐛 **修复打开软件不检查更新**:更新服务切换到 HTTPS 域名 `misuhub.cc.cd`。此前用 HTTP IP 时,Android 的网络策略 `` 只匹配主机名、不支持 IP 字面量,明文放行实际不生效,检查请求被静默拦截 - 🐛 **修复检查更新页不显示最新版本**:页面骨架改为固定结构,检查到新版本后「立即更新」按钮与更新日志一定会出现(此前首次打开页面时按钮元素根本不存在) - 📄 **检查到新版本即展示更新日志**:版本号、发布时间、安装包大小、更新内容、公告一并展示;公告里的【前缀】会着色区分 - ⬇️ **下载可取消**:进度条旁新增「取消下载」,取消后保留已下载文件,下次可继续 - 🔧 **下载超时随包大小动态调整**(不低于 120 秒),请求 User-Agent 带应用标识 - 🧹 **安装完成后自动清理临时安装包** - ℹ️ 关于页「开源与作者」新增个人站点地址 ## ✨ v1.4.1 更新亮点 - 🔄 **自动更新**:设置 → 检查更新,或启动后自动检查(每天最多一次)。从服务器拉取最新版本、更新内容与公告,一键下载安装 - 📝 **更新内容三处展示**:收到更新提示时弹窗展示、安装完成后启动时展示本版更新内容、检查更新页常驻展示,都来自服务器同一份数据 - 🔐 **安装包 SHA-256 校验**:下载完成后必须校验哈希才交给系统安装器,防止下载损坏或传输被篡改;校验失败直接删除文件并提示 - 📢 **服务端公告**:维护通知、使用提示等公共内容随版本接口一并下发,有变化才提示,可关闭 - 🔒 **权限仅新增一项**:只增加 `REQUEST_INSTALL_PACKAGES`(安装更新包必需),通知 / 悬浮窗 / 自启动等权限依然为零 - ⚙️ **关于页更新**:新增检查更新入口,并说明自动更新的工作方式 ## ✨ v1.4.0 更新亮点 - 🧹 **移除课前提醒**:整套提醒功能(前台服务、悬浮窗、响铃、权限引导)已删除,不再申请通知 / 悬浮窗 / 自启动 / 前台服务等权限,安装包只保留网络权限 - 🎨 **全新应用图标**:改为青绿渐变底 + 书法笔触 + 课程卡片列表书签的圆角方形标识,深色与浅色桌面上都清晰 - 🗂 **通用设置按使用频率重排**:课表背景 → 开屏动画 → 桌面小组件 → 冲突优先级 → 重置布局 → 数据诊断,常用的不再需要往下翻 - 📌 **单次加课**:加课表单新增「仅本周一次」,选中后自动隐藏周次输入,卡片只在这一周出现 - 📐 **修复课表底部多出一行**:教务作息表里的「延时时段」(如 22:20-22:40)不再被当成第 6 大节,底部不会凭空多出一行空节次 ## v1.3.1 更新亮点 - ➕ **自定义加课**:课表页「+ 加课」→ 点任意空白格子,即可添加一门自己的课;课程名、地点、教师、周次、备注、卡片颜色都能填,随时可改可删 - 🔀 **两套通道互不干扰**:自定义课程单独存储,刷新/覆盖教务课表不会动它;退出登录清的是教务数据,自己加的课保留 - 🚨 **位置冲突红框提示**:与教务课程落在同一格时,卡片描红边框并挂感叹号,打开详情能看到具体冲突说明 - ⚖️ **冲突优先显示可调**:设置 → 通用设置里可切换「教务课程优先 / 自定义课程优先」,决定冲突格卡片的主色与地点取哪一门 - 🔔 自定义课程同样支持桌面小组件与长按拖动调整位置 - 🎛 **开屏动画改为单个开关**:与其他设置项同一行布局,点一下即切换,不再是一排两个按钮 ## v1.3.0 更新亮点 - 🔄 **自动检查课表更新**:每次打开先用本地缓存秒开,随后在后台静默登录教务系统比对一次课表;**只有真的变了**才弹窗询问是否更新,不会打断正在看的课表 - 🔒 **后台刷新不影响前台**:静默刷新走独立的隐藏 WebView,页面与拖动布局都不会被改动;不确认就绝不落盘 - 🤫 **安静降级**:需要短信验证码、网络异常、找不到课表入口等情况会直接放弃,不弹错、不打扰 - ⚙️ 沿用 v1.2.1 的开屏动画开关与分周加载 ## v1.2.1 更新亮点 - ⚙️ **开屏动画可关闭**:设置 → 通用设置新增开关,关闭后启动**直接进入课表**,不再播放 Logo 动画 - ⚡ **课表分周加载**:启动只渲染「今天所在周」并立即出图,页面显示后再在后台逐周预生成相邻周次,切周几乎零等待 - 🧹 **全新安装旧数据扫描**:首次启动会检测是否有旧版本残留(旧课表 / 账号凭据 / 自定义背景 / 抓取缓存),命中时提示一键清理,避免拿着旧数据看新课表 - 🔑 **更换签名密钥**:本版起**不能覆盖安装**,需先卸载旧版再装(卸载会清空旧数据,属预期) ## v1.2.0 更新亮点 - 🐛 **修复多段周次漏课**:`3-6,8-9,12-13(周)` 这类周次表达式以前只识别第一段,导致部分周次整门课从课表消失 - 🔔 **连带修复提醒与小组件**:周次判定与课表渲染、桌面小组件、课前提醒共用,同一门课漏掉的那几周提醒也已恢复正常 - 📐 **修复第 6 大节不显示**:课表行数不再硬性截断为 5 大节,有第 6 大节(如中午延时课)的学校作息可完整显示 - 🩺 **诊断导出补全**:从本地缓存直接进入课表时,导出的诊断包也会带上解析结果,便于反馈问题 ## ✨ v1.1.3 更新亮点 - 🐛 **修复切应用回来闪白**:在澎湃 OS 等机型上切屏或切到其他应用再切回来时界面闪动、深色主题下先闪一下白的问题已修复(背景图改异步解码 + 避免无谓重绘 + 窗口底色跟随主题) - 🐛 **修复小组件课程位置**:在课表里拖动调整过位置的课程,桌面小组件现在会同步显示到新位置,不再停留在原始位置 - 🐛 **修复自定义背景下的课程详情弹窗**:使用自定义背景图时,弹窗弹出动画结束后会跳成不透明纯白,现正确保持半透明毛玻璃 - 🐛 **修复弹窗闪烁**:打开课程详情时页面「先暗一下再亮」、关闭时「缩小后又闪一下」 - 🐛 **修复点击高亮**:点卡片和按钮时出现的蓝色背景块已去除 ## v1.1.2 更新亮点 - 🪟 **桌面小组件(全新)**:主屏直接显示接下来的课程,按时间先后排序,可同时列出多节;课程名用课程配色,下方标注地点与时间 - 🎨 **小组件玻璃拟态**:半透明磨砂玻璃背景,圆角与系统组件一致,不遮挡壁纸 - 🌗 **小组件深浅主题**:自带浅色 / 深色两套配色,**随小组件尺寸自动适配**,也可点卡片上的切换按钮手动换 - 📐 **多尺寸适配**:支持 1×2 / 1×3 / 2×2 等桌面网格,行数随组件高度自动增减 - 🐛 **修复弹窗闪烁**:打开课程详情时页面「先暗一下再亮」、关闭时「缩小后又闪一下」的问题已修复 - 🐛 **修复点击高亮**:点卡片和按钮时出现的蓝色背景块已去除 ## v1.1.1 更新亮点 - 🛡 **权限体检清单**:设置页一眼看出缺哪项权限,点任一项直接跳转去开(该功能已在 v1.4.0 随提醒一起移除) - 📱 **机型专属指引**:按小米红米、华为荣耀、OPPO/realme/一加、vivo/iQOO、魅族、三星分别给出**具体设置路径**(同上,已移除) ## v1.1.0 主要更新 - 🔔 ~~课前提醒全面重做~~(v1.4.0 已移除):课程卡片右上角铃铛一键开关,到点用**悬浮窗**弹提醒页面,**来电式循环响铃 + 震动** - 📅 **整学期课表**:一次拉取全学期并本地保存,总周数从教务教学周历自动获取(不再写死),无需再按窗口反复刷新 - 🎨 **外观可定制**:深色 / 浅色主题一键切换(带过渡动画),支持**从相册选图当课表背景**,卡片自动半透明 - 🔒 **安全加固**:密码改用系统密钥库加密存储,网络请求限校内域名白名单,禁止明文流量与外部跳转 - 🧩 **细节优化**:重叠课程(同一时段多门课)详情完整展示、空课周提示、切周不再闪屏、卡片放大展开动画 ## 功能特性 ### 课表 - **自动登录**:学号密码一次保存,CAS 统一认证自动续期,Cookie 持久化免频繁登录 - **MFA 兼容**:CAS 触发短信二次验证时自动停留验证页,手动验证后流程无缝继续 - **整学期课表**:一次抓取全学期数据本地保存,按周快速过滤渲染 - **周次自动识别**:从教务教学周历接口获取第 1 周周一日期与学期总周数,拒绝硬编码 - **节次时间动态提取**:作息时间表(如 1-2 节 10:00-11:40)从教务页面实时提取 - **课程详情**:点击卡片放大展开,重叠课程(同一格多门课)逐门完整展示 - **拖动调位置**:长按 700ms(含震动反馈)进入拖动模式,松手后可撤销/应用,随时一键重置布局 - **交互体验**:滑动切周、同课同色、今日高亮、空课周提示、开屏动画(可在设置中一键开关) - **分周加载**:启动只渲染本周并立即显示,其余周次在页面出图后后台预生成,切周直接复用缓存 - **自动检查更新**:启动后后台静默比对一次教务课表,有差异才弹窗询问,不打扰正常使用 - **自定义加课**:点「+ 加课」再点格子,即可添加自己的课程(自习、社团、旁听等),**已有课的格子也能叠着加**;可选「仅本周一次」只在这一周显示一张卡片;与教务课表分两套通道存储,刷新教务数据不会覆盖 - **重叠提示**:自己主动叠加的格子用琥珀色描边;教务同步后新撞上的用红色描边 + 感叹号,并可在设置里选择重叠时优先显示哪一门 ### 外观 - 深色 / 浅色主题切换,全局 0.35s 过渡 - 自定义图片背景(相册选取),课程卡片、星期栏、按钮自动半透明,网格无白底 - 自适应图标:前景位图 + 同色系渐变背景,适配圆形 / 方形 / 水滴等系统遮罩 ### 桌面小组件(v1.1.2 新增) - **接下来的课程**:主屏直接显示按时间先后排序的后续课程,一门一行 - **课程配色**:每行课程名使用与课表一致的课程颜色,左侧有同色标记条 - **地点与时间**:课程名下方标注「地点 · 时间段」,今天 / 明天用相对日期 - **玻璃拟态**:半透明磨砂背景 + 细描边,圆角 22dp,不遮挡壁纸 - **深浅自适应**:浅色 / 深色两套配色,按小组件尺寸自动选择,也可点顶部 ◐ 按钮手动切换 - **多尺寸**:支持 1×2 / 1×3 / 2×2 等网格,高度越大显示行数越多(最多 4 行) > ⚠️ **注意**:部分国产 ROM(如 ColorOS / 澎湃 OS)会屏蔽第三方应用的小组件, > 小组件中心可能不显示「石大课表」。这是系统限制,非应用问题。 ## 技术架构 ``` ┌────────────────── Java 层(原生逻辑)──────────────────┐ │ MainActivity CAS登录 / 状态机 / 抓取调度 / HTML生成 │ │ ScheduleStore 课表数据存取(内存缓存)/ 周次计算 │ │ NextCourse 下一节课计算(排序 / 配色 / 周次过滤) │ │ NextCourseWidgetProvider 桌面小组件 RemoteViews 渲染 │ │ util/ 密码加密(Android Keystore) │ └────────────────────────┬───────────────────────────────┘ │ addJavascriptInterface ↔ evaluateJavascript ┌────────────────────────▼───────────────────────────────┐ │ WebView 层(学校页面 + 自绘界面) │ │ · CAS/教务页面:注入 JS 自动化操作(登录、DOM 解析课表) │ │ · 课表展示页:Java 拼接 HTML/CSS/JS 渲染 + 交互动画 │ └─────────────────────────────────────────────────────────┘ ``` - 语言:Java(零 Kotlin) - 界面:WebView + HTML/CSS/JS(课表、弹窗、动画全部为网页实现) - 兼容:Android 7.0+(minSdk 24),适配 Android 12+ 系统 SplashScreen ## 工作原理 1. **登录链路**:访问教务系统 → 无会话则 302 到 CAS → 注入 JS 自动填表登录 →(如触发短信验证则等待用户手动完成)→ 凭据在到达教务系统后才落盘 2. **课表入口探测**:教务首页扫描链接(href 特征 xskb/kbcx → 文字特征“课表”)→ 空结果复扫 → 超时转入预设 URL 猜测,多层兜底 3. **DOM 解析**:金智教务课表表格按 `th`(节次+时间)/`td`(7 列课程)结构提取,`font[title]` 属性区分教师/教室/周次/班级/备注等字段,支持同格多课程拆分 4. **周次推导**:教学周历接口获取第 1 周周一日期与学期覆盖范围 → 推算总周数 → `weekMatches()` 解析“3-16(周)”“单双周”等表达式 ## 构建 环境要求:JDK 21、Android SDK(compileSdk 34,需含 `platforms/android-34` 与 `build-tools/34.0.0`)、Gradle 8.4 + AGP 8.3.2 ```bash # 国内推荐(Gitee,直连) git clone https://gitee.com/m1sucode/shzu-schedule.git # 或 GitHub git clone https://github.com/DoGeMisu/shzu-schedule.git cd shzu-schedule gradle assembleDebug # 产物路径:app/build/outputs/apk/debug/(具体文件名见下方命名规则) ``` 产物按版本号自动命名(由 `applicationVariants.all` 完成,无需手动改名): | 构建类型 | 文件名 | |---|---| | release | `shzu-schedule-v.apk` | | debug | `shzu-schedule-v-debug.apk` | > **更新服务 Key 是可选项**:`BuildConfig.UPDATE_API_KEY` 取本地 `keystore.properties` 的 > `updateApiKey`(不入库),也可以在 `gradle.properties` 里用 `shzuUpdateApiKey` 覆盖。 > 未配置时构建仍可成功,但会退化为匿名受限下载通道(每 IP 每天 5 次),不影响其它功能。 > **首次构建必须自行配置 SDK 路径**:在项目根目录新建 `local.properties`,写入本机 Android SDK 的绝对路径(该文件**不入库**,每个人的路径都不同): > > ```properties > sdk.dir=C\:\\Android\\Sdk > ``` > > 注意 Windows 路径需按 Java Properties 规则转义(`\` 写成 `\\`,冒号写成 `\:`)。 > 也可以用环境变量 `ANDROID_HOME` 代替,或在 Android Studio 中打开项目,IDE 会自动生成该文件。 > > 若报 `Failed to apply plugin 'com.android.internal.application'`,通常是 SDK 路径不对或缺少 `platforms/android-34`、`build-tools/34.0.0`,用 SDK Manager 补齐即可。 ## 隐私与安全 - **密码加密存储**:学号密码使用 Android Keystore(AES-256-GCM)加密后落盘,密钥不出安全硬件;旧版明文凭据打开应用时自动迁移 - **网络白名单**:WebView 导航仅允许 `*.shzu.edu.cn`(http/https),`javascript:` / `data:` / `about:` 与外部站点一律拦截 - **证书校验**:只信任系统 CA(不再信任用户安装的 CA);SSL 错误仅对校内域名放行,其余拒绝 - **混合内容**:三处 WebView 均为 `MIXED_CONTENT_COMPATIBILITY_MODE`,不再无条件允许主动混合内容 - **更新链路全程 HTTPS**:v1.5.3 起更新服务走 `https://misuhub.top`,下载地址强制落在自有域名内 - **更新包校验**:下载后同时校验文件大小、SHA-256、包名与签名证书摘要,任一不符即拒绝安装 - **不参与备份**:`allowBackup=false`,应用数据无法被备份导出 - **诊断包脱敏**:导出的诊断包在落盘前会抹掉学号、姓名、手机号、身份证号与邮箱 ### 明文流量策略 v1.5.3 起 `base-config` 为 `cleartextTrafficPermitted="false"`,**默认禁止明文**,唯一例外是校内域名 `*.shzu.edu.cn`。 历史上之所以全局放开明文,是因为更新服务曾是 IPv4 直连地址,而 Android 的 `` 只匹配主机名、**不支持 IP 字面量**,给 IP 单独写 `domain-config` 不会生效(v1.4.1「打开软件不检查更新」即由此而来)。域名备案完成后改用域名 + HTTPS,这个限制不再存在。 校内域名保留明文的原因:`authserver.shzu.edu.cn` 的根路径**会 302 跳转到 `http://`**,完全关闭会导致登录失败。`jwgl.shzu.edu.cn` 则带 HSTS(`max-age=15768000`)且全程 https。 ### 关于内置的 ISRG Root X1 `res/xml/network_security_config.xml` 为 `misuhub.top` 额外内置了 ISRG Root X1 根证书(`res/raw/isrg_root_x1.pem`)。这是兼容措施,不是放宽校验: - `misuhub.top` 的证书由 Let's Encrypt 新的「Generation Y」层级签发:`misuhub.top ← YR2 ← ISRG Root YR ←(交叉签名)← ISRG Root X1` - Let's Encrypt 官方说明 `ISRG Root YR` 尚未进入任何主流信任库,验证必须依赖交叉签名回到 `ISRG Root X1` - 而 `ISRG Root X1` 是 **Android 7.1.1(API 25)** 才进入系统信任库的,本项目 `minSdk` 为 24(Android 7.0) - 若不内置,Android 7.0 设备会直接 `CertPathValidatorException: Trust anchor for certification path not found`,表现为「永远检查不到更新」 内置的是根证书本身,签名仍需一路验到该根,中间人无法伪造;且该信任锚**只对本域生效**,不影响其他主机。 ## 权限说明 | 权限 | 用途 | |---|---| | 网络 / 网络状态 | 访问学校教务系统、检查应用更新 | | 安装未知应用 | 安装自动更新下载的新版本安装包(Android 8+ 需用户在系统设置里手动授权) | > v1.4.0 移除课前提醒后,通知、悬浮窗、前台服务、开机自启、震动与音频设置等权限已全部删除;v1.4.1 为支持自动更新增加了「安装未知应用」一项。 > > 自动更新相关说明: > - 更新服务器:`https://misuhub.top`(ICP 备案已完成,全程 HTTPS) > - 只从服务器接口返回的 `download_url` 下载,且该地址必须落在 `misuhub.top` 白名单内(重定向的每一跳都会重新校验),不接受其他来源的更新地址 > - 安装包下载后必须通过 SHA-256 校验才会交系统安装器,校验失败直接删除并提示 > - 断网 / 接口超时静默跳过,不影响课表正常使用 > - 下载过程可取消,取消后保留文件便于重试;安装完成后自动清理 ## 免责声明 - 本项目为**非官方**的学生业余作品,与石河子大学及其教务部门无任何关联 - 由在校学生在**业余时间**独立开发,仅供学习交流 - 请合理使用,遵守学校相关规定 - 使用本项目产生的一切后果由使用者自行承担 ## License [MIT](LICENSE)