Android React Native在Android Studio中执行bundleReleaseJsAndAssets 打包失败的解决方法

这个坑在文章记一次在Windows上搭建React Native Android环境踩过的坑中我已经提到过,当时找不到解决方法,只能开一个命令提示符终端独立执行打包。就像这样子

react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output C:\Users\Administrator\Desktop\AwesomeProject\android\app\build\intermediates\assets\release\index.android.bundle --assets-dest C:\Users\Administrator\Desktop\AwesomeProject\android\app\build\intermediates\res\merged\release 

然而这不是最好的解决方法,我们最求的是自动化打包。这个bug更详细的描述见can’t build release for android - Windows 7。无意之下看到这个个issue,在该issue下的链接中找到了问题的解决方法,原文地址react-native-windows-apks,发现差不多该仓库的主人也是最近遇到这个问题,因为看它的提交时间,基本上就是昨天提交的,而我遇到这个问题还要早它个几天,但是当时由于技术水平,没有找到解决方法,现在看到它这个暂时的解决方法真是开心啊。不多说,下面贴出解决方法。

由React Native生成的android项目,在app目录下有一个react.gradle文件,该文件中的内容如下

def config = project.hasProperty("react") ? project.react : [];

def bundleAssetName = config.bundleAssetName ?: "index.android.bundle"
def entryFile = config.entryFile ?: "index.android.js"

// because elvis operator
def elvisFile(thing) {
    return thing ? file(thing) : null;
}

def reactRoot = elvisFile(config.root) ?: file("../../")
def jsBundleDirDebug = elvisFile(config.jsBundleDirDebug) ?:
        file("$buildDir/intermediates/assets/debug")
def jsBundleDirRelease = elvisFile(config.jsBundleDirRelease) ?:
        file("$buildDir/intermediates/assets/release")
def resourcesDirDebug = elvisFile(config.resourcesDirDebug) ?:
        file("$buildDir/intermediates/res/merged/debug")
def resourcesDirRelease = elvisFile(config.resourcesDirRelease) ?:
        file("$buildDir/intermediates/res/merged/release")
def inputExcludes = config.inputExcludes ?: ["android/**", "ios/**"]

def jsBundleFileDebug = file("$jsBundleDirDebug/$bundleAssetName")
def jsBundleFileRelease = file("$jsBundleDirRelease/$bundleAssetName")

task bundleDebugJsAndAssets(type: Exec) {
    // create dirs if they are not there (e.g. the "clean" task just ran)
    doFirst {
        jsBundleDirDebug.mkdirs()
        resourcesDirDebug.mkdirs()
    }

    // set up inputs and outputs so gradle can cache the result
    inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
    outputs.dir jsBundleDirDebug
    outputs.dir resourcesDirDebug

    // set up the call to the react-native cli
    workingDir reactRoot
    commandLine "react-native", "bundle", "--platform", "android", "--dev", "true", "--entry-file",
            entryFile, "--bundle-output", jsBundleFileDebug, "--assets-dest", resourcesDirDebug

    enabled config.bundleInDebug ?: false
}

task bundleReleaseJsAndAssets(type: Exec) {
    // create dirs if they are not there (e.g. the "clean" task just ran)
    doFirst {
        jsBundleDirRelease.mkdirs()
        resourcesDirRelease.mkdirs()
    }

    // set up inputs and outputs so gradle can cache the result
    inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
    outputs.dir jsBundleDirRelease
    outputs.dir resourcesDirRelease

    // set up the call to the react-native cli
    workingDir reactRoot
    commandLine "react-native", "bundle", "--platform", "android", "--dev", "false", "--entry-file",
            entryFile, "--bundle-output", jsBundleFileRelease, "--assets-dest", resourcesDirRelease

    enabled config.bundleInRelease ?: true
}

gradle.projectsEvaluated {
    // hook bundleDebugJsAndAssets into the android build process
    bundleDebugJsAndAssets.dependsOn mergeDebugResources
    bundleDebugJsAndAssets.dependsOn mergeDebugAssets
    processDebugResources.dependsOn bundleDebugJsAndAssets

    // hook bundleReleaseJsAndAssets into the android build process
    bundleReleaseJsAndAssets.dependsOn mergeReleaseResources
    bundleReleaseJsAndAssets.dependsOn mergeReleaseAssets
    processReleaseResources.dependsOn bundleReleaseJsAndAssets
}

而这个gradle当时写的时候应该是针对mac来写的,所以在windows上可能遇到了那么一点问题,我们需要对该gradle文件进行一点细微的修改,在该文件最上面添加

import org.apache.tools.ant.taskdefs.condition.Os

将task bundleDebugJsAndAssetsbundleReleaseJsAndAssets中的执行语句注释掉,也就是下面两句语句进行注释

commandLine "react-native", "bundle", "--platform", "android", "--dev", "true", "--entry-file",
            entryFile, "--bundle-output", jsBundleFileDebug, "--assets-dest", resourcesDirDebug
commandLine "react-native", "bundle", "--platform", "android", "--dev", "false", "--entry-file",
            entryFile, "--bundle-output", jsBundleFileRelease, "--assets-dest", resourcesDirRelease

对应的替换为

    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        commandLine "cmd", "/c", "react-native", "bundle", "--platform", "android", "--dev", "true", "--entry-file",
                entryFile, "--bundle-output", jsBundleFileDebug, "--assets-dest", resourcesDirDebug
    } else {
        commandLine "react-native", "bundle", "--platform", "android", "--dev", "true", "--entry-file",
                entryFile, "--bundle-output", jsBundleFileDebug, "--assets-dest", resourcesDirDebug
    }

  if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        commandLine "cmd","/c", "react-native", "bundle", "--platform", "android", "--dev", "false", "--entry-file",
                entryFile, "--bundle-output", jsBundleFileRelease, "--assets-dest", resourcesDirRelease
    } else {
        commandLine "react-native", "bundle", "--platform", "android", "--dev", "false", "--entry-file",
                entryFile, "--bundle-output", jsBundleFileRelease, "--assets-dest", resourcesDirRelease
    }

也就是对操作系统进行判断,假设是windows,就在命令前面加上cmd /c,之后后面紧跟原命令,否则就像原来那样执行。

相信这个bug在不就的将来会得到解决,这个只是临时的解决方法,文章写作时,React Native Android的版本为0.14.2

时间: 2024-10-12 11:48:34

Android React Native在Android Studio中执行bundleReleaseJsAndAssets 打包失败的解决方法的相关文章

VM虚拟机中Ubuntu中执行apt-get update失败的解决方法(可能有效)

首先确保虚拟机是连接网络的,可以用ping命令检测一下看是否连通网络.采用nat网络的时候确保服务是开的. 如果之前执行过apt-get update命令但是失败了,执行一下      rm -rf /var/lib/apt/lists/partial/*     和  sudo apt-get clean 命令,之后更换源,网上有很多可以试一下,这里推荐一下这个网址      https://launchpad.net/ubuntu/+archivemirrors,用gedit /etc/ap

Microsoft Visual Studio Web 创作组件安装失败的解决方法

在网上查一下说是Office2007的问题.我把Office2007卸载了还是不行. 然后用Windows Install Clean Up工具清理,还是不行. 郁闷了.然后在安装包中的下面路径下找到\WCU\WebDesignerCore找到“Visual Studio Web 创作组件”的安装程序WebDesignerCore.EXE,双击出现提示“提取失败”,看来是安装包的这个组件在从别的地方copy的时候出现问题了.于是让同事给我重新发一个WebDesignerCore.EXE,再双击就

在win8/win8.1中wamp启动curl失败的解决方法

因为最近准备好好学习一下cURL,所以在我的win8.1本本上安装了一个wamp,安装完毕之后一切正常,准备操练一下cURL的时候,出现报错,说是没有定义curl_init();这个函数.用phpinfo()看了一下配置,果然没有发现加载cURL.检查了php.ini文件,配置确实没有错误,然后就在网上进行了搜索,发现还真是有不少同样的情况,他们说的解决办法也很多,什么修改这个配置那个配置了,把三个***.dll文件复制到system32文件夹下了,但是我的直觉是就是php_curl.dll文件

Android React Native使用原生UI组件

Android React Native 已经将几个常用的原生组件进行了封装,比如 ScrollView 和 TextInput,但是并不是所有系统的原始组件都被封装了,因此有的时候我们不得不自己动手封装一下,从而能够使用那些React Native没有为我们封装的原生组件,比如WebView,官方并没有提供Android端的实现,那么我们现在就动手封装一下WebView. 之前写过一篇文章Android React Native使用原生模块,而使用原生UI组件的方法和使用原生模块的方法十分类似

React Native嵌入Android原生应用中

开发环境准备 首先你要搭建好React Native for Android开发环境, 没有搭建好的可以参考:React Native for Android Windows环境搭建 用Android Studio新建Android原生项目 我创建了一个名叫ReactNativeDemo的原生项目. 把React Native集成到原生项目当中 利用Windows命令行在项目根目录(ReactNativeDemo文件夹)下执行下面三行命令: npm init npm install –save

【React Native开发】React Native For Android环境配置以及第一个实例

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50456967 本文出自:[江清清的博客] (一)前言 FaceBook早期开源发布了React Native For IOS,终于在2015年9月15日也发布了ReactNative for Android,虽然Android版本的项目发布比较迟,但是也没有阻挡了广大开发者的热情.可以这样讲在2015年移动平台市场上有两个方向技术研究比较火,第一种为阿里,百度,腾讯

Android React Native组件的生命周期及回调函数

熟悉android的童鞋应该都清楚,android是有生命周期的,其很多组件也是有生命周期.今天小编和大家分享的React Native组件的生命周期,还不了解的童鞋,赶紧来围观吧 在android开发中,React Native组件的生命周期,大致分为三个阶段,分别是: 1.组件第一次绘制阶段,这个阶段主要是组件的加载和初始化: 2.组件在运行和交互阶段,这个阶段组件可以处理用户交互,或者接收事件更新界面: 3.组件卸载消亡的阶段,这个阶段主要是组件的清理工作. 在Android React

Android React Native组件的生命周期

和Android一样,React的组件也有对应的生命周期.Android React Native组件的生命周期可以总的概括为下面这一张图. 可以把组件生命周期大致分为三个阶段: 第一阶段:是组件第一次绘制阶段,如图中的上面虚线框内,在这里完成了组件的加载和初始化: 第二阶段:是组件在运行和交互阶段,如图中左下角虚线框,这个阶段组件可以处理用户交互,或者接收事件更新界面: 第三阶段:是组件卸载消亡的阶段,如图中右下角的虚线框中,这里做一些组件的清理工作. 生命周期回调函数总共有10个. obje

React Native For Android 架构初探

Facebook 在2015.9.15发布了 React Native for Android,把JavaScript 开发技术扩展到了Android平台.React Native 让开发者使用 JavaScript 和 React 编写应用,利用相同的核心代码就可以创建 基于Web,iOS 和 Android 平台的原生应用.本文将浅析Android React的架构及相关基础知识.环境搭建及调试相关知识参考官网文档即可,本文不再赘述. 一.React架构分析 1.层次架构: Java层:ja