核心结论
本地工具
主转换链路在 Flutter/Dart 本地完成
无 IAP 证据
未见 paywall、billing、RevenueCat、商品 ID
无广告展示证据
有归因/Analytics 权限,未见 AdMob 类
Firestore 轻依赖
主要写 Android ID 与评分状态
可复刻
输入、编辑、压缩、PDF、保存分享模块清晰
输入证据
| 来源 | 路径 | 用途 |
|---|---|---|
| 静态报告 | research/app-package-forensics/image-to-pdf-png-to-pdf/apk-pure-latest/ | 包信息、权限、组件、SDK、endpoint 字符串 |
| blutter summary | data/extracted/package_forensics/runs/20260610-flutter-arm64-focus/image-to-pdf-png-to-pdf/deep-tools/deep-tool-summary.json | 确认 Flutter AOT 分析完成、Dart/架构信息 |
| AOT 输出 | .../deep-tools/flutter-aot/arm64-v8a/apk_contents__config.arm64_v8a.apk/ | objs.txt、pp.txt、blutter_frida.js、asm/ |
| 解包目录 | .../image-to-pdf-png-to-pdf/apk_contents/ | Manifest、properties、native libs、split APK 内容 |
产品 / 实现逻辑图
1. 启动
main() 初始化 Firebase、App Check、Analytics、Crashlytics,设置高刷新率和系统样式。2. Home
HomePage 读取 Isar 项目列表,展示 Select Photos 和项目历史。3. 输入
ImagePicker 多图/单图;CunningDocumentScanner 扫描文档。4. 编辑
Editor 管纸张、布局、选图、封面、压缩、预览、文件名。5. 压缩
compressImageFile1 支持 jpg/png/heic/webp,参数含 quality、resize、target size。6. 生成 PDF
createPdfFile 使用 Dart pdf 包、PageFormat、BoxFit 生成 Uint8List。7. 输出
savePdf 写外部目录;flutter_file_dialog 目录选择;sharePdf 系统分享。8. 状态
IsarProjectService 保存项目;Firestore users 记录 Android ID / isRating。证据矩阵
| 主题 | 直接证据 | 推断 / 静态止点 |
|---|---|---|
| 首屏与项目 | 直接 HomePage、_HomePageState、ProjectProvider、listProject、Select Photos | 推断 首屏是项目列表 + 创建入口;视觉和点击顺序需运行验证。 |
| 图片输入 | 直接 pickImage 调 pickMultiImage/pickImage;scanDocument 调 CunningDocumentScanner.getPictures | 推断 支持相册多选和文档扫描;相机入口是否露出需动态确认。 |
| 编辑器 | 直接 _paperConfig、_layoutConfig、_photosConfig、_coverConfig、_sliderCompressionValue | 推断 编辑面覆盖纸张、布局、封面、压缩、预览和文件名。 |
直接 createPdfFile、Document、PdfPageFormat、pdf_1_5、A3/A4/B5/Legal/Letter 等常量 | 推断 图片转 PDF 本地完成,不依赖服务器转换。 | |
| 保存/分享 | 直接 savePdf、writeAsBytes、.pdf、saveFileToDirectory、SharePlus.share | 推断 支持外部目录、目录选择和系统分享;Android 存储权限需机型验证。 |
| 后端 | 直接 Firebase Core/App Check/Analytics/Crashlytics;Firestore users、id、isRating | 推断 后端用于设备状态/评分/分析崩溃,不参与转换。 |
| 付费 | 直接 关键词检索未见购买、订阅、paywall、billing、RevenueCat 业务逻辑 | 推断 当前样本无明确付费墙;远端/商店条件触发仍需动态验证。 |
| 广告 | 直接 Manifest 有 AD_ID/Attribution/Install Referrer;AOT 有 Firebase Analytics | 推断 存在归因分析基础;未见广告展示 SDK,不能判断有广告变现。 |
Onboarding 与首次价值
直接证据:main.dart::main 在初始化后 runApp,随后查询 Isar 项目数量并发送 Android ID;AOT 中没有明确登录、账号、强制 onboarding 或订阅墙命名。
推断:首次价值大概率是“打开即选图/扫描,生成 PDF”,而不是账号体系或云服务。权限更可能在选图、扫描、保存动作上触发。
图片到 PDF 处理链路
| 阶段 | 证据 | 产品含义 |
|---|---|---|
| 选择图片 | ImagePicker.pickMultiImage、ImagePicker.pickImage、ImageSource.gallery | 相册多图/单图输入。 |
| 扫描文档 | CunningDocumentScanner.getPictures、MLKit document scanner activity | 用扫描补足图片转 PDF 的“文档化”场景。 |
| 编辑配置 | _showBottomSheetPaperSize、_showBottomSheetLayout、_showBottomSheetSelectedPhotos | 以 bottom sheet 承载细分配置。 |
| 压缩 | compressImageFile1、quality、resizePercentage、targetWidth、targetHeight | 控制 PDF 大小,是工具体验关键点。 |
| 生成 | pdf/widgets Document、PdfPageFormat、BoxFit.contain/fitWidth/cover | 离线生成 PDF,避免上传隐私图片。 |
| 输出 | writeAsBytes、flutter_file_dialog、SharePlus | 保存和分享闭环完整。 |
接口 / 后端依赖
报告不记录 FirebaseOptions 中的敏感字段值,只记录组件和用途。
- 直接:
Firebase.initializeApp、FirebaseAppCheck.activate、FirebaseAnalytics.instance、FirebaseCrashlytics.instance。 - 直接:
firebase_helper.dart通过 Firestoreusers集合写id和isRating。 - 直接:
android_idmethod channel 调getId。 - 直接:未见
Dio、baseUrl、自建 REST API、GraphQL 或 Remote Config 证据。
可复刻学习项
| 模块 | 可学点 | 复刻难度 | 注意点 |
|---|---|---|---|
| 首次价值 | 无登录,直接进入选图。 | 低 | 权限延迟到动作触发。 |
| 输入能力 | 相册多选 + 文档扫描。 | 中 | 处理无 GMS 或扫描插件失败路径。 |
| 编辑器 | 纸张、布局、封面、压缩、预览集中。 | 中 | 默认配置要好,避免功能堆叠。 |
| 本地项目 | Isar 保存草稿和历史。 | 中 | schema 迁移、删除、重排要稳。 |
| PDF 生成 | Dart 端离线生成。 | 中 | 大图内存、速度、质量是风险。 |
| 输出 | 外部目录、系统目录选择、分享。 | 低 | Android 版本差异明显。 |
动态验证点
- 首屏是否有隐藏 onboarding、权限引导、广告或 paywall。
- 创建 PDF bottom sheet 的实际选项和触发顺序。
- 压缩 slider 默认值、范围、输出大小和质量损耗。
- 不同纸张、方向、布局、封面、多图数量的 PDF 输出差异。
- Android 10/11/13/14 保存目录、SAF 和分享权限表现。
- Firestore 写入时机和失败降级:启动、保存后、评分后还是弹窗后。
- 远端或商店条件是否动态触发广告/paywall。
blutter_frida.js仍需替换fn_addr = 0xdeadbeef才能动态 dump 对象。
阻塞 / 不确定
- 阻塞:没有真机/模拟器运行证据,UI 顺序、弹窗、广告展示和权限路径不能静态定论。
- 阻塞:Frida 脚本仍是模板,未配置 hook 地址。
- 阻塞:静态 endpoint candidates 多为库/文件格式文档 URL,不能当真实业务接口。
- 阻塞:Firebase 静态配置含敏感字段,报告只保留组件级信息。