InShot (com.camerasideas.instashot) 逆向分析总报告

分析对象:Google Play 上的 com.camerasideas.instashot —— 原名 "InStaShot - Camera for Instagram",现为 InShot 视频编辑器(Video Editor & Maker),由杭州影笑科技(InShot Inc.)开发。 分析版本:v2.200.1530(versionCode 1530),APK 87.7MB,从 modyolo 镜像站获取(MOD 版:Pro 权益解锁 + 签名校验绕过,核心代码与官方一致)。 分析方法:jadx 1.5.6 全量反编译 → 30,794 个 Java 文件、~291 万行代码 → 4 个子代理并行深挖(视频编辑/图像编辑/商业化/库清单)。


1. 开发者与产品背景

项目 信息
开发者 杭州影笑科技有限责任公司(InShot Inc.,杭州)
产品演变 2014 年发布 "InStaShot - Camera for Instagram"(相机应用,包名沿用至今)→ 转型为全能视频/图片编辑器 InShot
全球用户 数亿级,支持 89 个语言目录(30+ 语言)
商业模式 Freemium:免费 + Pro 订阅(pro.permanent 永久 / vip.monthly / vip.yearly)+ 广告变现
竞争位置 Google Play 视频编辑类头部应用(与 CapCut、VN 同级)

2. 逆向工程过程(方法论可复用)

2.1 APK 获取

网络环境限制(大量 APK 镜像站 TCP 级不可达),最终路径:

  1. 探测可达主机 → 发现 modyolo.com(MOD 站)可用
  2. 分析其 WordPress 主题 JS → 找到下载接口 admin-ajax.php?action=k_get_download
  3. 拿到 CDN 直链 files-2.modyolo.com/.../Inshot_v2.200.1530-modyolo.apk(84MB)
  4. 注意:下载 CDN 对非浏览器 TLS 指纹有 WAF 拦截(curl/Node 均 403),但文件本体 CDN 放行

2.2 工具链(网络受限环境的替代方案)

2.3 关键判定:这是 MOD 包


3. 应用形态与技术基线

3.1 Manifest 关键信息

3.2 构建工具链(从 META-INF 取证)

工具 版本 证据
Gradle 8.14.3 kotlin-tooling-metadata.json
AGP 8.12.3 app-metadata.properties + databinding 版本文件
Kotlin 2.1.0 kotlin-tooling-metadata.json
Java 11 字节码目标
混淆 R8 全量模式(full mode)+ 资源收缩 代码单字母混淆、无 mapping 残留
插桩 Didi Booster(booster-android-instrument) ShadowAsyncTask/ActivityThreadHooker 等运行时类 + 应用代码调用
其他 DataBinding/ViewBinding 开启、6 dex multidex、baseline profiles(assets/dexopt/baseline.prof)
泄露 git commit e292e629d43aa300896807def7257c33af4e6a5c;构建窗口 ≈2025-01-29

3.3 原生库(47 个 .so × 2 ABI,仅 ARM;无 x86)

自研核心引擎(影笑自研 "is 系列"):


4. 总体架构

4.1 分层全景

┌─────────────────────────────────────────────────────────┐
│ 表现层:MainActivity + 60+ Activity + Fragment 双容器      │
│   (MVP: X3.A BaseMvpActivity → Presenter → IView 契约)   │
├─────────────────────────────────────────────────────────┤
│ 业务层:Fragment/Presenter 对(视频/图像/拼图/拼接/设置/商店)│
│   单例管理器集群:MediaClipManager / GraphicItemManager    │
│   / VideoPlayer / UserManager / BackForward(撤销重做)     │
├─────────────────────────────────────────────────────────┤
│ 框架层:自研 DI(ViewBinder)+ ButterKnife + EventBus        │
│   + 自研启动调度器(AnchorsManager 式 DAG)+ 远程配置门面    │
├─────────────────────────────────────────────────────────┤
│ 渲染层:GPUImage 移植 + Skia(ImageKit)+ 自研 GtrDrawable    │
│   + GL 线程渲染器(自研 EGL 循环)+ LUT 滤镜链(乒乓 FBO)     │
├─────────────────────────────────────────────────────────┤
│ 引擎层(JNI):isffmpeg/isvideoengine/isplayer + EditablePlayer│
│   + VideoEditorUtil + anim_engine_lib + MNN + YXAIEngine  │
├─────────────────────────────────────────────────────────┤
│ 基础设施:ReLinker/NativeLoader、xlog、MMKV、Coroutines、  │
│   OkHttp/Cronet、Gson(@SerializedName 稳定键草稿持久化)    │
└─────────────────────────────────────────────────────────┘

4.2 架构决策要点

  1. 纯 MVP(非 MVVM):X3.A<V,P> 基类模板方法(L3() 建 Presenter / N3() 布局 / I3() 回调),Activity 只当"接线板";跨层事件走 GreenRobot EventBus
  2. 文档模型(Project-as-DTO):整个编辑工程 = ParamInfo + 各 *ClipInfo Gson DTO,字段名用 @Jb.c("XX_n")(自打包 SerializedName)稳定契约 → 天然支持草稿持久化/跨页传递/云同步
  3. 单例管理器集群 + 观察者:MediaClipManager/AudioClipManager/PipClipManager/EffectClipManager 各自维护列表,变更经委托列表广播 → 桥接原生引擎
  4. 原生引擎是单一事实源:预览与导出共用 EditablePlayer(isplayer),导出仅切 mode=2 + 挂编码器;JNI 回调用 @Keep 静态方法 + WeakReference + 主线程 Handler;原生可反向回调 Java(selectMediaCodec 让 Java 选硬解解码器)
  5. 自研启动调度器:Application 里用 AnchorsManager 式 DAG(Project.kt)编排 InitializeApmTask → Env → Billing → State → Lib → Resource,优先级队列 + 主线程等待,任务间 dependOn 依赖;用 Didi Booster 插桩优化线程池/AsyncTask
  6. 双进程:视频导出跑 :videoprocess 前台服务,导出完成后通知主进程
  7. 防御性工程:黑屏检测、GL OOM 捕获、第三方 SDK 崩溃白名单静默(CrashHandler)、厂商机型黑名单修复(如 Transsion AIHelper 在 Android 15 的崩溃)、GLES 能力分级降级(低端机关闭高端特效)

4.3 安全/反分析(商业 App 常规操作)


5. 技术栈全景(第三方库清单,版本均来自代码常量/BuildConfig/META-INF)

媒体/图像

版本 用途
ExoPlayer 2.17.1 播放
Glide(InShotModule.java 即其 @GlideModule) 图片加载(89 个应用文件引用)
Fresco + SoLoader 图片管线(WebP/GIF/转码原生模块)
GPUImage(cyberagent) 2.x 滤镜;libgpuimage-*.so + 2 个 GLSL
PhotoView / AndroidGifDrawable / Picasso(遗留) 缩放查看 / GIF / 旧图片库
Volley(遗留)、AndroidYouTubePlayer 旧网络 / YouTube 嵌入

网络/序列化

OkHttp 4.11.0、Retrofit2 2.9.x(R8 混淆,KotlinExtensions 证明 ≥2.6)、RxJava2 2.2.x、Gson 2.9~2.10.x、protobuf-lite、Cronet(play-services-cronet 18.0.1)

广告(合计 ~6000 类,商业化大头)

Google/Firebase

Play Billing 7.1.1、App Update 2.1.0、Integrity 1.5.0、Firebase(analytics 22.5.0 / messaging / crashlytics / remoteconfig / appcheck / storage)、GMS 全家桶(7980 类)、UMP 3.2.0

工具/存储

MMKV + mars xlog(微信)、Coroutines 1.10.2、EventBus 3.x、ButterKnife 10.x、Booster、HiddenApiBypass、FMOD、vlayout(阿里)、UltraViewPager、Banner(youth)、KPSwitch、Commons Math3(残留)

明确结论


6. 四大模块深挖(详见分报告)

6.1 视频编辑(reports/video_editing.md,349 行)

6.2 图像编辑(reports/image_editing.md,564 行)

6.3 商业化(reports/monetization.md,783 行)

6.4 SDK/构建清单(reports/sdk_inventory.md)

见第 3、5 节;另:META-INF 87 个版本文件精确还原 AndroidX 版本(core 1.15.0、appcompat 1.7.1、material 1.12.0、lifecycle 2.9.2、room 2.2.5(旧)、datastore 1.1.3...)


7. 学习要点:开发者是怎么做这个 App 的

7.1 可借鉴的工程实践

  1. 核心能力自研、通用能力采购:FFmpeg/Skia/Lottie 深度 fork 改造成自研引擎(isffmpeg/anim_engine_lib/org.instory),MediaCodec/MediaMuxer 只当底层原语;AI 用 MNN(开源)做推理底座 + 自研 YX 系列封装
  2. 文档模型编辑架构:整个工程可序列化(Gson + 稳定字段名),草稿系统、跨页传递、进程迁移、云备份全链路打通 —— 这是编辑类 App 最核心的架构决策
  3. 统一渲染管线:GPUImage 滤镜链(乒乓 FBO)+ Skia 合成 + 离屏 EGL 导出,预览与导出同一引擎;黑屏/GL OOM 防御
  4. 启动性能工程:DAG 化启动任务 + 主线程空闲再初始化广告 + Booster 插桩 + baseline profiles + 异步 inflate
  5. 双进程导出 + 前台服务,导出不卡 UI
  6. 远程配置驱动一切:广告 waterfall/广告位/频控/AB 测试/功能开关全部 Firebase RC 下发,assets 完整本地回退(灰度可回滚)
  7. 商业化代码独立成 SDK(Shantanu)+ 强混淆,与业务代码解耦;订阅与广告权益单一门面判定
  8. 全球化的落地:89 个语言目录 + EU 隐私合规差异化

7.2 局限性/教训


8. 产出物清单

文件 说明
apk/Inshot_v2.200.1530.apk 原始 APK(87.7MB,MOD 版)
apk_extract/ 解包产物(assets/lib/META-INF/manifest 二进制)
out/jadx_src/ jadx 反编译源码(30,794 个 .java)+ 解码资源
reports/video_editing.md 视频编辑模块深挖(349 行)
reports/image_editing.md 图像编辑/滤镜/AI 抠图深挖(564 行)
reports/monetization.md 广告/订阅/埋点/APM 深挖(783 行)
reports/sdk_inventory.md 全量库清单/签名/构建痕迹
reports/FINAL_ANALYSIS.md 本总报告
tools/ 自装工具链(Corretto JDK17、jadx 组装版、aapt2 等)