1.android
新增buildType
打包
项目遇到一个需求,需要增加一种打包类型,每日构建给质量部的测试包,所以在build.gradle
下新增了一中buildType
-offline
,代表是非线上使用的包。测试包在每日构建时可自动在末尾版本号上面加1。
所以我们新增了一种buildType
,代码如下:
buildTypes {
debug {
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
signingConfig signingConfigs.debug
}
release {
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
signingConfig signingConfigs.release
}
offline { //测试版本配置
initWith(buildTypes.release)
signingConfig signingConfigs.offline
}
}
并在signingConfigs
中新增一种offline
签名配置,可以同release包的配置一样。于是兴高采烈地参考该文章进行gradle
版本号自动构建配置,
安卓gradle自动构建总结
but...在使用gradlew assembleOffline
打出来包后却一直卡在欢迎界面,开始分析原因:
服务器配置的问题?
由于App会配置一个全局Url地址,所以初步怀疑是地址不匹配导致的,但最终发现使用使用gradlew assembleRelease
却是对的,所以排除此可能。自动改版本号导致不匹配的问题?
对于此点,也使用正常的release
包进行了验证,发现也是对的。。和版本号无关系。-
anything else?
此时处于一个丈二和尚摸不着头脑的阶段,为什么会卡在欢迎界面呢,在stackoverFlow
是搜索了相关信息,发现有一个关键点,maybe the jsbundle not packing in your source file.
恍然大悟,很有可能我们使用这个命令打包时,
jsbundle
文件根本就没有打包进去。于是打开apk
包进行验证,发现在assets目录下果然不存在index.androud.bundle
文件,重新走回了正路上。
那么该怎么解决这个问题呢?
初步分析,RN
应该对debug
和release
两种buildType
做了相应处理,在react-native
目录下,发现了这个文件react.gradle
,里面执行了打包jsbundle
的相关配置。
// Set up dev mode
def devEnabled = !targetName.toLowerCase().contains("release")
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
commandLine("cmd", "/c", *nodeExecutableAndArgs, "node_modules/react-native/local-cli/cli.js", "bundle", "--platform", "android", "--dev", "${devEnabled}", "--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraPackagerArgs)
} else {
commandLine(*nodeExecutableAndArgs, "node_modules/react-native/local-cli/cli.js", "bundle", "--platform", "android", "--dev", "${devEnabled}", "--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraPackagerArgs)
}
enabled config."bundleIn${targetName}" ||
config."bundleIn${buildTypeName.capitalize()}" ?:
targetName.toLowerCase().contains("release")
我们可以看到,这里面有一个devEnabled
参数,发现其为true时,则开启dev
模式,不会将jsbundle
打入包中,而其值取决于打包命令是否包含release
这个字段= =...RN
真的有点坑。。。
解决方法
1.修改react.gradle
的源码使其支持其他参数,如offline
不推荐
,改源码这种事,被RN
爸爸知道了,今后的维护是灾难。
2.修改命令增加release
字段
wonderful
,我们只需将buildTypes下的的offline
修改为offlineRelease
即可。