Gradle升级7.3.3后React Native项目AAPT2资源编译失败排查
Gradle 6.1升级7.3.3 React Native多模块项目构建失败修复方案
问题根因
日志里的两个报错是独立问题,核心崩溃由Gradle升级后的组件行为变更触发:
- 开头的
:app:processLollipopDebugManifestForPackage任务依赖警告不会直接导致构建失败:Gradle 7.x新增了任务输入输出依赖的强校验,React Native 0.66及以下版本的插件没有按新规范声明copy*BundledJs任务和Manifest处理任务的依赖关系,只会导致增量编译、任务执行优化被禁用,不会中断构建。 - 后续的资源编译崩溃是核心阻塞点:Gradle 7.3.3配套使用的Android Gradle Plugin(AGP)7.x版本绑定了新版AAPT2,该版本AAPT2在伪本地化资源生成逻辑中移除了旧版的边界容错:处理带占位符的字符串时,如果占位符标记的起始下标大于结束下标(也就是报错里的
begin 38, end 33非法区间),旧版AAPT2会直接容错跳过,新版会直接调用字符串截取方法触发StringIndexOutOfBoundsException。这类非法下标字符串通常来自两个地方:一是项目自身strings.xml中写错位的<xliff:g>占位符,二是0.67以下版本React Native核心库自带的字符串资源。旧配置下(Gradle6.1+AGP4.x+compileSdk30)因为AAPT2带容错逻辑,所以可以正常编译。
修复步骤
按顺序执行以下操作即可解决问题:
- 修复任务依赖警告,避免后续增量构建异常
在app模块的build.gradle文件末尾添加以下配置,显式声明JS拷贝任务和Manifest处理任务的依赖关系:
afterEvaluate { tasks.matching { it.name.startsWith("process") && it.name.endsWith("ManifestForPackage") }.configureEach { String flavorName = it.name.replace("process", "").replace("ManifestForPackage", "") Task jsCopyTask = tasks.findByName("copy${flavorName}BundledJs") if (jsCopyTask != null) { dependsOn(jsCopyTask) inputs.dir(jsCopyTask.destinationDir) } } }
- 修复核心AAPT2崩溃问题,按需选择方案:
- 无伪本地化调试需求的场景(90%以上业务场景选这个即可):直接在app模块的android配置块中关闭debug构建的伪本地化生成,绕开有bug的校验逻辑,不影响正式包功能:
android { // 保留原有compileSdk、defaultConfig等配置 buildTypes { debug { // 关闭debug包伪本地化生成 pseudoLocalesEnabled false // 保留原有debug构建的其他配置 } // 保留release等其他构建类型配置 } }- 需要保留伪本地化调试能力的场景:
- 全局搜索所有模块
res/values*目录下的strings.xml文件,排查所有带<xliff:g>标签的字符串,修正占位符顺序错位、索引写反的问题 - 将React Native版本升级到0.67及以上,官方已经在该版本修复了核心库自带字符串的占位符下标错位问题
- 全局搜索所有模块
- 版本兼容性校验:确认项目根目录
build.gradle中配置的AGP版本为7.2.2,Gradle7.3.3和该版本AGP兼容性最好,避免AGP版本过高带来额外适配问题。
内容的提问来源于stack exchange,提问作者Sunny
相关产品推荐
相关产品推荐

