React Native零散的坑汇总

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应该对debugrelease两种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即可。

你可能感兴趣的:(React Native零散的坑汇总)