metehankaygsz/dashline
GitHub: metehankaygsz/dashline
一款专为车载主机设计的极简 Android 启动器,无需 Google 服务即可在老旧设备上提供时钟、天气和媒体控制功能。
Stars: 4 | Forks: 0
# Dashline
[](https://github.com/metehankaygsz/dashline/actions/workflows/build.yml)
[](LICENSE)
[](https://developer.android.com/about/versions/android-4.4)
一款专为车载主机设计的简洁、极简的 Android 主屏幕启动器——适用于那些便宜的
aftermarket "Android radio" double-DIN 设备,而非 Android Auto。
使用 Kotlin 和经典 Views 开发,横屏优先,**不需要 Google Play Services**,并且
兼容一直追溯到 **Android 4.4 (KitKat)** 的版本,因此也能在老设备上运行。
## 截图 ### 仪表盘 左侧显示时钟、日期、当前天气状况和三天预报;右侧显示媒体和 电话;顶部是快速启动收藏栏。  ### 应用抽屉 搜索栏、常用应用条和完整的应用网格。  | 设置 | 颜色主题 | |---|---| |  |  | ## 功能 **仪表盘** - 大号时钟和日期、当前天气以及 3 天预报 - 实时媒体小部件:专辑封面、标题/艺术家、播放/暂停、下一曲/上一曲,以及 带有已播放/总时长且可拖动的进度条 - 顶部栏包含 5 个收藏应用的快速启动 dock - Wi-Fi 指示器(仅在连接时显示) - 六个标签页:**音频 · 收音机 · 电话 · 导航 · 应用 · 设置** **应用抽屉** - 实时搜索 - 基于你自身启动历史的“常用”应用条 - 长按任意应用可将其从抽屉中隐藏 - 在安装或卸载应用时自动刷新 **外观** - **7 种配色方案** — Midnight、Ocean、Sunset、Forest、Violet、Crimson、 Graphite — 每种方案都会在整个 UI 中应用渐变色和匹配的强调色 - 浅色和深色调色板;默认为深色,并提供 Auto(按时间切换)、浅色和 跟随系统选项 - 全屏运行并隐藏系统状态栏,在每个屏幕上使用应用内的返回/主页 导航 **设置与配置** - 引导式首次运行设置:语言、默认应用、权限,以及 设置为默认启动器的提示 - 所有内容日后均可在设置中重新配置 - **支持 10 种语言**:英语、土耳其语、西班牙语、德语、法语、意大利语、 葡萄牙语、俄语、简体中文、阿拉伯语(支持 RTL) ## 环境要求 | | | |---|---| | 最低 Android 版本 | 4.4 KitKat (API 19) 侧载 · 5.0 (API 21) 通过 Play | | 目标 Android 版本 | 16 (API 36) | | 屏幕方向 | 横屏 | | Google Play Services | 不需要 | | API keys | 无 | 专为常见的车载主机分辨率设计 — 1024×600 和 800×480 均可正常工作。 ## 安装 从[最新发布版](../../releases/latest)获取 APK 并进行侧载: ``` adb install -r dashline-v0.1.4.apk ``` 或者将 APK 复制到 U 盘,插入车载主机, 然后使用设备的自带文件管理器打开它。 ## 从源码构建 在 **Android Studio**(Giraffe 或更新版本)中打开项目。它将自动获取 正确的 Gradle 和 SDK 版本,并在首次同步时生成 Gradle wrapper。 然后,在命令行中运行: ``` ./gradlew assembleDebug ``` ``` ./gradlew installDebug ``` ### Build flavours Google Play 的安装程序拒绝任何低于 API 21 的应用,但许多廉价车载主机 仍然运行 Android 4.4。因此,该项目提供了同一个 app 的两个 flavour: | Flavour | minSdk | 发布位置 | |---|---|---| | `legacy` | 19 | GitHub Releases 上的可侧载 APK — 适用于 KitKat | | `play` | 21 | 上传到 Play Store 的 App Bundle | ``` ./gradlew assembleLegacyRelease # APK for sideloading ./gradlew bundlePlayRelease # AAB for the Play Console ``` 两者共享相同的 `applicationId`,因此任何特定的设备只会 将其中的一个识别为“该应用”。 ### 构建发布版 Release 构建使用 R8 进行压缩混淆,并且必须进行签名。只需创建一次密钥 — 在出现提示时输入你自己的密码: ``` keytool -genkey -v -keystore release.jks -alias release -keyalg RSA -keysize 2048 -validity 10000 ``` 将 `keystore.properties.example` 复制为 `keystore.properties` 并填入你的 数值,然后执行: ``` ./gradlew assembleRelease ``` `keystore.properties` 和 `*.jks` 已被 gitignore 忽略 — **切勿提交它们**。丢失 密钥意味着你将无法发布用于升级现有安装的更新,因此请将其 备份到安全的地方。 ### 发布 release 标记一个版本号即可自动构建并发布已签名的 APK: ``` git tag v0.1.4 && git push origin v0.1.4 ``` 这需要在 **Settings → Secrets and variables → Actions** 下配置四个仓库密钥:`KEYSTORE_BASE64` (`base64 -i release.jks`)、`KEYSTORE_PASSWORD`、 `KEY_ALIAS` 和 `KEY_PASSWORD`。 ### 将其设置为启动器 安装完成后,按下设备的 Home 键并选择此启动器,然后 选择“始终”。要在开发期间重置默认设置: ``` adb shell cmd package set-home-activity com.dashline.launcher/.HomeActivity ``` ## 权限 所有权限均为可选 — 启动器在没有这些权限的情况下也能正常运行。 | 权限 | 用于 | 没有该权限的影响 | |---|---|---| | Location | 本地天气 | 隐藏天气面板,时钟仍正常工作 | | 通知访问权限 | 读取正在播放的媒体 | 媒体小部件变为启动按钮 | | 查询所有包 | 列出已安装的应用 | 应用抽屉必需 | 通知访问权限无法通过常规的权限对话框授予 — Android 要求用户在系统设置中手动启用。设置页面会提供直达链接, 你可以随时在 **Settings → Media info access** 重新访问。 ## 天气 天气数据来自[Open-Meteo](https://open-meteo.com),该服务免费且 **不需要 API key 或账户**。位置信息通过平台自带的 `LocationManager` 读取,因此不依赖 Play Services。它每 15 分钟刷新一次, 你可以在设置中切换 °C 和 °F。 ## 项目结构 ``` app/src/main/ ├── AndroidManifest.xml # HOME intent-filter, notification listener ├── java/com/dashline/launcher/ │ ├── App.kt # applies saved language + theme at startup │ ├── BaseActivity.kt # locale, fullscreen, gradient, in-app nav │ ├── HomeActivity.kt # the dashboard │ ├── AppDrawerActivity.kt # app grid: search, frequent, hide │ ├── AppPickerActivity.kt # "choose an app for this role" │ ├── SetupActivity.kt # first-run onboarding │ ├── SettingsActivity.kt # settings │ ├── GradientPickerActivity.kt # colour scheme picker │ ├── GradientThemes.kt # the 7 colour schemes │ ├── ThemeManager.kt # light / dark / auto │ ├── LocaleManager.kt # in-app language override │ ├── MediaMonitor.kt # reads the active MediaSession │ ├── WeatherRepository.kt # Open-Meteo client │ ├── AppRepository.kt # query + launch installed apps │ ├── Prefs.kt # all persisted settings │ ├── Permissions.kt # runtime permission helpers │ └── Usage.kt # launch-count tracking └── res/ ├── values/ # strings, light palette, styles ├── values-night/ # dark palette ├── values-v21/ # API 21+ theme attributes └── values-{ar,de,es,fr,it,pt,ru,tr,zh}/ # translations ``` ## 兼容性说明 为了支持老旧车载主机,本项目在做出更改前,有几个决策值得你了解: - **依赖项已锁定**在最后兼容 KitKat 的版本上 (appcompat 1.4.2、core-ktx 1.9.0、recyclerview 1.2.1)。升级到 appcompat 1.6+ 或 core-ktx 1.10+ 会将 `minSdk` 提高到 21 并导致构建失败。 - **启动器图标以 PNG mipmap 格式提供**,因为在 Android 5.0 之前,vector 和 adaptive 图标无法 作为应用图标正常渲染。`mipmap-anydpi-v26` 中的 adaptive 图标 仅在 API 26+ 上使用。 - **API 21+ 的主题属性**存放在 `values-v21/` 中,以免影响 KitKat。 - **全屏模式**使用传统的 `systemUiVisibility` 标志,而不是 `WindowInsetsController`,因为后者在 API 30 以下不存在。 - **语言覆盖**功能通过包装每个 activity 的 context 实现,而不是使用 `AppCompatDelegate.setApplicationLocales`,因为后者需要 appcompat 1.6+。 - **媒体小部件需要 Android 5.0+**(`MediaSessionManager`)。在 KitKat 上它 将退化为一个启动按钮。 ## 路线图 - 可重新排序的收藏夹 dock(拖放) - 天气面板中的逐小时预报 - 使用 R8 压缩的签名 release 构建 - 可选的模拟时钟表盘 ## 许可证 MIT — 详见 [LICENSE](LICENSE)。
标签:Android, DSL, IPv6支持, Kotlin, UI/UX, 后台面板检测, 桌面启动器, 移动开发, 车载系统