React Native Expo应用第三方开源许可证合规上报问题咨询
React Native + Expo 应用开源依赖合规指南
一、核心义务与许可证要求
开源依赖的合规义务完全取决于其附带的许可证类型,核心要求分为以下几类:
- 宽松许可证(MIT、Apache 2.0、BSD等):
- 必须保留原库的版权声明和许可证文本
- 分发应用时,需在文档或应用内(如「关于」页面)注明使用了这些开源库
- 可自由修改、闭源分发,无需开源你的应用代码
- Copyleft许可证(GPLv3、LGPLv3、AGPLv3等):
- GPLv3:如果你的应用静态链接了该库,且以闭源商业形式分发,必须开源整个应用的代码
- LGPLv3:若以动态链接方式使用,可豁免开源你的应用,但需允许用户替换该库的版本;若静态链接,仍需遵循GPL类要求
- AGPLv3:若应用提供网络服务,即使闭源也需开源相关代码
- 其他特殊许可证(MPL、CC等):需严格遵循许可证内的条款,比如MPL要求修改后的库代码需以MPL许可证开源,但你的应用其他部分不受限
所有场景下,都不得篡改原库的版权标识或许可证文本,若修改了开源库代码,需在分发时注明修改内容。
二、需要上报的依赖范围
必须覆盖所有被应用实际打包使用的依赖——包括直接依赖和间接子依赖,但无需包含未被使用的开发依赖或构建临时依赖:
- 仅上报
npm ls --depth=0的顶层依赖是不够的:子依赖可能带有高风险的Copyleft许可证,会直接影响应用合规 - 排除开发依赖:执行
npm ls --production可只列出生产环境依赖(即最终打包进应用的部分),这是核心排查范围 - 过滤未使用的依赖:package-lock.json中的2万余个库,很多是Expo构建过程中临时下载但未实际打包的冗余依赖,可使用
depcheck工具检测并移除未被应用引用的依赖,减少合规工作量
三、Expo Android构建的Java依赖处理
npm ls确实无法覆盖Expo构建Android时自动下载的Java/Kotlin原生依赖,这类依赖的合规处理方式:
- 执行
expo prebuild生成Android原生项目,查看android/app/build.gradle和gradle.lockfile中的依赖列表 - Expo官方模块(如expo-camera、expo-location)大多采用MIT许可证,可直接查看其GitHub仓库的LICENSE文件确认
- Android SDK相关依赖的许可证,可在Android Studio的SDK管理器中查看对应组件的许可协议
四、高效获取合规清单(版本+许可证)
推荐用自动化工具替代手动整理:
- 生成许可证清单:执行
npx license-checker --production --csv --out licenses.csv,该命令会自动扫描生产依赖,输出包含库名称、版本、许可证、版权信息的CSV文件,直接用于上报 - 清理冗余依赖:执行
npx depcheck,识别并移除package.json中未被应用使用的依赖,缩小合规范围 - 补充原生依赖:通过
expo prebuild生成原生项目后,分别提取iOS(Podfile.lock)和Android的依赖信息,补充到合规清单中
五、关键避坑点
- 优先排查许可证为
GPLv3、AGPLv3的依赖,若应用是闭源商业产品,需替换为宽松许可证的替代库 - 对于标注为
UNLICENSED或SEE LICENSE IN <file>的依赖,必须找到对应的许可证文件确认条款,避免潜在风险 - 留存所有依赖的许可证文本和版权声明,若许可证要求,需在应用的「关于」页面或随附文档中公示开源依赖信息
内容的提问来源于stack exchange,提问作者Jonzho
相关产品推荐
相关产品推荐

