Image to PDF - PNG to PDF Flutter AOT 深挖

样本:com.tapuniverse.phototopdf / version 1.0.7 / 日期:2026-06-10

口径:基于静态报告、blutter AOT 输出、反汇编函数名与常量;动态行为需要真机验证。

核心结论

本地工具
主转换链路在 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 summarydata/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.txtpp.txtblutter_frida.jsasm/
解包目录.../image-to-pdf-png-to-pdf/apk_contents/Manifest、properties、native libs、split APK 内容

产品 / 实现逻辑图

1. 启动main() 初始化 Firebase、App Check、Analytics、Crashlytics,设置高刷新率和系统样式。
2. HomeHomePage 读取 Isar 项目列表,展示 Select Photos 和项目历史。
3. 输入ImagePicker 多图/单图;CunningDocumentScanner 扫描文档。
4. 编辑Editor 管纸张、布局、选图、封面、压缩、预览、文件名。
5. 压缩compressImageFile1 支持 jpg/png/heic/webp,参数含 quality、resize、target size。
6. 生成 PDFcreatePdfFile 使用 Dart pdf 包、PageFormat、BoxFit 生成 Uint8List
7. 输出savePdf 写外部目录;flutter_file_dialog 目录选择;sharePdf 系统分享。
8. 状态IsarProjectService 保存项目;Firestore users 记录 Android ID / isRating

证据矩阵

主题直接证据推断 / 静态止点
首屏与项目直接 HomePage_HomePageStateProjectProviderlistProjectSelect Photos推断 首屏是项目列表 + 创建入口;视觉和点击顺序需运行验证。
图片输入直接 pickImagepickMultiImage/pickImagescanDocumentCunningDocumentScanner.getPictures推断 支持相册多选和文档扫描;相机入口是否露出需动态确认。
编辑器直接 _paperConfig_layoutConfig_photosConfig_coverConfig_sliderCompressionValue推断 编辑面覆盖纸张、布局、封面、压缩、预览和文件名。
PDF直接 createPdfFileDocumentPdfPageFormatpdf_1_5、A3/A4/B5/Legal/Letter 等常量推断 图片转 PDF 本地完成,不依赖服务器转换。
保存/分享直接 savePdfwriteAsBytes.pdfsaveFileToDirectorySharePlus.share推断 支持外部目录、目录选择和系统分享;Android 存储权限需机型验证。
后端直接 Firebase Core/App Check/Analytics/Crashlytics;Firestore usersidisRating推断 后端用于设备状态/评分/分析崩溃,不参与转换。
付费直接 关键词检索未见购买、订阅、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.pickMultiImageImagePicker.pickImageImageSource.gallery相册多图/单图输入。
扫描文档CunningDocumentScanner.getPictures、MLKit document scanner activity用扫描补足图片转 PDF 的“文档化”场景。
编辑配置_showBottomSheetPaperSize_showBottomSheetLayout_showBottomSheetSelectedPhotos以 bottom sheet 承载细分配置。
压缩compressImageFile1qualityresizePercentagetargetWidthtargetHeight控制 PDF 大小,是工具体验关键点。
生成pdf/widgets DocumentPdfPageFormatBoxFit.contain/fitWidth/cover离线生成 PDF,避免上传隐私图片。
输出writeAsBytesflutter_file_dialogSharePlus保存和分享闭环完整。

接口 / 后端依赖

报告不记录 FirebaseOptions 中的敏感字段值,只记录组件和用途。

可复刻学习项

模块可学点复刻难度注意点
首次价值无登录,直接进入选图。权限延迟到动作触发。
输入能力相册多选 + 文档扫描。处理无 GMS 或扫描插件失败路径。
编辑器纸张、布局、封面、压缩、预览集中。默认配置要好,避免功能堆叠。
本地项目Isar 保存草稿和历史。schema 迁移、删除、重排要稳。
PDF 生成Dart 端离线生成。大图内存、速度、质量是风险。
输出外部目录、系统目录选择、分享。Android 版本差异明显。

动态验证点

  1. 首屏是否有隐藏 onboarding、权限引导、广告或 paywall。
  2. 创建 PDF bottom sheet 的实际选项和触发顺序。
  3. 压缩 slider 默认值、范围、输出大小和质量损耗。
  4. 不同纸张、方向、布局、封面、多图数量的 PDF 输出差异。
  5. Android 10/11/13/14 保存目录、SAF 和分享权限表现。
  6. Firestore 写入时机和失败降级:启动、保存后、评分后还是弹窗后。
  7. 远端或商店条件是否动态触发广告/paywall。
  8. blutter_frida.js 仍需替换 fn_addr = 0xdeadbeef 才能动态 dump 对象。

阻塞 / 不确定