ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ente Photos Android 权限清单全解析:从 Manifest 声明到端到端加密的权限设计

Ente Photos Android 权限清单全解析:从 Manifest 声明到端到端加密的权限设计 Ente Photos Android 权限清单全解析从 Manifest 声明到端到端加密的权限设计【免费下载链接】ente End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/enteEnte Photos 是一款主打端到端加密E2EE的相册应用其 Android 端在 mobile/apps/photos/android/permissions.md 中明确列出了运行时申请的全部系统权限及用途。本文以该清单为主体结合 AndroidManifest.xml 及各构建变体的 Manifest 配置、Dart 层调用代码逐条解读每个权限的声明方式、版本限制与真实业务场景帮助开发者理解权限背后的存储、加密、后台备份与锁屏机制。权限清单总览Ente Photos Android 端在运行时申请以下 8 项系统权限覆盖媒体读取、位置元数据、磁盘写入、生物识别、开机启动、全屏通知与壁纸设置权限用途READ_EXTERNAL_STORAGE读取设备上的照片与视频ACCESS_MEDIA_LOCATION提取照片/视频拍摄地坐标上传前使用用户密钥加密WRITE_EXTERNAL_STORAGE将照片下载到磁盘USE_BIOMETRIC可选用系统锁屏界面锁定应用USE_FINGERPRINT可选用系统锁屏界面锁定应用RECEIVE_BOOT_COMPLETED设备开机后触发已拍摄照片/视频的后台上传USE_FULL_SCREEN_INTENT本地通知库展示往年今日回忆通知所需SET_WALLPAPER允许用户将某张照片设为壁纸媒体存储权限分版本声明与分区存储适配READ_EXTERNAL_STORAGE——读取相册内容READ_EXTERNAL_STORAGE用于读取设备上的照片与视频是应用备份功能的基础。在主 Manifest 中它带有maxSdkVersion32限制uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE android:maxSdkVersion32 /这是因为从 Android 13API 33起系统将媒体读取权限细分为READ_MEDIA_IMAGES与READ_MEDIA_VIDEO而旧的全量读取权限在更高版本上已不再适用。主 Manifest 中同时声明了这两个新权限uses-permission android:nameandroid.permission.READ_MEDIA_IMAGES / uses-permission android:nameandroid.permission.READ_MEDIA_VIDEO /从源码结构看应用通过 photo_manager 等媒体插件访问相册权限申请逻辑集中在 mobile/apps/photos/lib/services/permission/service.dart 的requestPermissionExtend系列方法中该文件对 Android 平台调用PhotoManager.requestPermissionExtend申请扩展读取权限。ACCESS_MEDIA_LOCATION——坐标读取与端到端加密ACCESS_MEDIA_LOCATION用于提取照片/视频的拍摄地坐标。这是 Ente 隐私设计的关键点该信息在上传到服务器之前会使用客户端的密钥加密服务器无法读取拍摄位置。这与 Ente Photos 的端到端加密理念一致——所有元数据包括 GPS 坐标都在设备本地加密后才离开设备。在 Dart 层文件上传服务会在适当时机显式申请该权限见 mobile/apps/photos/lib/module/upload/service/file_uploader.dartfinal permissionStatus await Permission.accessMediaLocation.request();权限状态会用于决定是否将照片的拍摄位置信息纳入上传与加密流程。WRITE_EXTERNAL_STORAGE——下载照片到磁盘WRITE_EXTERNAL_STORAGE用于将云端照片下载到设备磁盘。声明时带maxSdkVersion29限制并显式忽略 ScopedStorage 检查uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE android:maxSdkVersion29 tools:replaceandroid:maxSdkVersion tools:ignoreScopedStorage /maxSdkVersion29表明该权限仅对 Android 10API 29及以下系统生效。从 Android 10 起系统强制分区存储Scoped Storage应用不再需要也无法通过该权限直接写入共享存储Android 11 之后该权限对第三方应用基本失效。主 Manifest 中同时设置了android:requestLegacyExternalStoragetrueAndroidManifest.xml用于兼容 Android 10 上需要访问完整共享存储的场景。生物识别权限可选的锁屏保护USE_BIOMETRIC与USE_FINGERPRINT均用于可选地将应用锁定在系统锁屏界面之后。前者是 Android 9API 28引入的通用生物识别权限后者是面向指纹识别的兼容性权限。两者共同存在保证了在较老设备与较新设备上都能使用系统级生物识别作为应用锁。虽然当前仓库主 Manifest 未直接列出这两项权限它们由 lock_screen / local_auth 相关插件在 Manifest 合并阶段注入但在同为 Ente 系列的 mobile/apps/auth/android/app/src/main/AndroidManifest.xml 和 mobile/apps/locker/android/app/src/main/AndroidManifest.xml 中可以明确看到USE_BIOMETRIC的标准声明形式uses-permission android:nameandroid.permission.USE_BIOMETRIC/从仓库结构可以推断Ente Photos 通过 mobile/packages/lock_screen 与 mobile/packages/local_auth_linux 等插件实现指纹/面容解锁相册的可选功能用户可在设置中决定是否启用。开机启动权限保障后台备份不中断RECEIVE_BOOT_COMPLETED用于在设备重启后触发已拍摄照片/视频的后台上传。主 Manifest 中的声明为uses-permission android:nameandroid.permission.RECEIVE_BOOT_COMPLETED/对应地Manifest 中注册了ScheduledNotificationBootReceiver接收开机广播AndroidManifest.xmlreceiver android:exportedfalse android:namecom.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver intent-filter action android:nameandroid.intent.action.BOOT_COMPLETED/ action android:nameandroid.intent.action.MY_PACKAGE_REPLACED/ action android:nameandroid.intent.action.QUICKBOOT_POWERON / action android:namecom.htc.intent.action.QUICKBOOT_POWERON/ /intent-filter /receiver该接收器覆盖了标准开机、应用更新替换、以及部分厂商HTC的快速开机广播确保设备重启后系统能恢复备份任务调度让拍摄即备份的后台上传链路不因重启而中断。Dart 侧的后台任务调度封装在 mobile/apps/photos/lib/utils/bg_task_utils.dart与 flutter_local_notifications 的定时机制配合使用。全屏通知权限回忆Memories通知USE_FULL_SCREEN_INTENT是本地通知库flutter_local_notifications展示往年今日回忆通知所需的权限。回忆功能会在特定时刻用全屏意图弹出提醒这要求应用持有该权限才能在有通知打扰限制如勿扰模式时仍弹出全屏提醒。回忆功能的运行时权限申请逻辑见 mobile/apps/photos/lib/ui/home/memories/crafting_memories_card.dart它会调用NotificationService.instance.requestPermissions而通知服务封装于 mobile/apps/photos/lib/services/notification_service.dart。此外主 Manifest 还声明了POST_NOTIFICATIONSAndroid 13 通知运行时权限与SCHEDULE_EXACT_ALARM精确闹钟调度以支撑定时通知。壁纸权限插件级隔离声明SET_WALLPAPER允许用户将某张照片直接设为系统壁纸。与其它权限不同它并未出现在主 Manifest而是声明在平台插件的独立 Manifest 中——mobile/apps/photos/plugins/ente_photos_platform/android/src/main/AndroidManifest.xmluses-permission android:nameandroid.permission.SET_WALLPAPER / application android:supportsRtltrue activity android:nameio.ente.photos.WallpaperActivity android:exportedfalse ... android:themestyle/WallpaperTheme /activity /application该 Manifest 同时注册了WallpaperActivity源码位于 mobile/apps/photos/android/app/src/main/kotlin/io/ente/photos/WallpaperActivity.kt是设为壁纸功能的原生承载 Activity。这种权限随插件走的组织方式使插件在被其他应用复用时权限声明也能自动合并进宿主工程。SET_WALLPAPER属于 normal 级别权限系统会在安装时自动授予无需运行时请求。构建变体间的权限差异Ente Photos Android 工程包含多个构建源集各变体的 Manifest 权限声明存在差异值得开发者关注主 Manifestapp/src/main/AndroidManifest.xml完整权限集除上述外还包括INTERNET、ACCESS_NETWORK_STATE、MANAGE_MEDIA、CAMERA拍照、com.android.vending.BILLING应用内购买、POST_NOTIFICATIONS、SCHEDULE_EXACT_ALARM等。debug 与 dev 变体app/src/debug/AndroidManifest.xml、app/src/dev/AndroidManifest.xml仅声明INTERNET、READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE、ACCESS_NETWORK_STATE四项基础权限用于本地调试与开发环境。fdroid 变体app/src/fdroid/AndroidManifest.xml通过tools:noderemove移除com.android.vending.BILLINGF-Droid 构建不含 Google Play 计费并关闭 Sentry 自动初始化同时移除 MainActivity 的 launcher 入口由 independent 变体接管。playstore 变体app/src/playstore/AndroidManifest.xml同样移除 MainActivity 的 launcher 入口配合独立启动图标体系使用。这种通过 Manifest 合并与tools:node移除机制实现多渠道差异化权限的做法保证了同一套代码在 Play Store、F-Droid 与独立分发渠道上拥有恰当的权限边界。权限与端到端加密的关系理解 Ente Photos 的权限设计必须放在端到端加密的背景下读取权限只解决访问问题不解决明文问题。相册权限READ_EXTERNAL_STORAGE/READ_MEDIA_*仅让应用能读取设备本地文件文件内容在离设备前会在本地完成加密。位置元数据是显式加密的。ACCESS_MEDIA_LOCATION权限允许读取 GPS 坐标但正如权限清单所述This information is encrypted with the customers key before being sent to our servers——坐标用客户密钥加密后才上传服务端无法还原拍摄位置。权限越少、攻击面越小。Ente Photos 不申请联系人、通话记录、短信等无关权限权限清单严格对应备份、回忆、壁纸、锁屏、下载这五类核心功能符合最小权限原则。小结Ente Photos Android 的权限体系可以归纳为四个层次媒体读取备份上传、位置读取加密元数据、系统能力生物识别锁屏、开机恢复备份、全屏回忆通知、设备集成设置壁纸。每个权限都有对应的 Manifest 声明位置、版本限制如READ_EXTERNAL_STORAGE限定 32、WRITE_EXTERNAL_STORAGE限定 29和 Dart 层调用链并针对不同分发渠道Play Store / F-Droid / 独立版做了差异化裁剪。对于想要深入源码的读者建议从 permissions.md 出发对照 主 Manifest、上传服务 与 通知服务 三条主线逐层阅读即可完整还原权限从声明到使用的全链路。【免费下载链接】ente End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表