情景

热部署时,我们期望升级包中包括js代码与图片资源。

bundle的热部署网上已经有两种方案了,一种是用反射,一种是利用RN自带函数。将bundle初始化时直接放到指定文件夹下,之后通过替换bundle文件实现代码热部署。

我们希望图片也能够实现热部署,以下是一个比較简单的解决方式。

详细需求:client解析从server下发的压缩包(zip),当中含js源文件index.android.bundle 和 图片包,解压后ReactNative指向 解压后index.android.bundle中的js代码,js代码中使用的图片资源指向

解压后的图片资源。(data/data/files/或sdcard里)

client依据执行场景 debug or release 决定从server 或者  本地解压文件夹获取图片资源,也就是一个url兼容在不同场景下訪问不同资源。

Image 使用演示样例

//1.请求react native server的图片
<Image source={require('./image/help.png')} style={styles.helpImage}/>
//2.请求网络的图片
<Image source={uri:'http://xxxxxx/image/help.png'} style={styles.helpImage}/>
//3.请求native图片
<Image source={{uri:'help'}} style={styles.helpImage}/>
//4.请求手机指定路径图片
<Image source={{uri:'file:///sdcard/help.png'}}

上面两种都会发送网络请求

期望:本地开发时,图片来自1,上线后,图片来自4.为了让两者在代码形式上一致

须要自己定义协议:http-cage://xxx/xxx.png 类似这样的形式,在不同环境下获取不同路径的图片。

Image载入资源机制

涉及类:

js: RCTImage.js, AssetRegistry.js,resolveAssetSource.js,Image.android.js,AssetRegistry.js

Native:ReactImageView.java

调用顺序关系:

1:遍历检測使用外部资源(比方RNserver上的图片)。检測到一处调用AssetRegistry

2:AssetRegistry.registerAsset

将资源增加到AssetRegistry的assets数组中,将id返回,也就是资源在assets中的索引值。

3 检測到<Image 标签 触发 Image.android.js  render

4:resolveAssetSource.resolveAssetSource(source)

source可能是object类型,封装了图片url。或者是number类型。也就是资源id,id值由 步骤2 决定。

5: 推断资源类型

object:非本地资源(网络、sdcard、apk中图片)跳6

number: 资源id (RNserver) 跳7

6: return object   跳10

7: 依据id从AssetRegistry的assets中取出资源asset。

 var asset = AssetRegistry.getAssetByID(source);

8:拼接资源路径

1.获取RNserver地址

  var devServerURL = getDevServerURL(); //获取RN server地址。 通常是 http://localhost:8081/

2.取到server地址,依据地址与asset中的路径拼接,"http://localhost:8081/assets/image/open.png?

platform=android&hash=ff54b39af9b07e7380a4eda7e0212643"

3.取不到server地址,从压缩包中获得地址 getPathInArchive。

地址返回。9

9: 依据url 构建和 6类似的object

function assetToImageSource(asset): ResolvedAssetSource {
var devServerURL = getDevServerURL();
return {
__packager_asset: true,
width: asset.width,
height: asset.height,
uri: devServerURL ? getPathOnDevserver(devServerURL, asset) : getPathInArchive(asset),
scale: pickScale(asset.scales, PixelRatio.get()),
};
}

10:Image.android.js 收到 object,与 NativeProps合并,

var nativeProps = merge(this.props, {
style,
src: source.uri,
});

11:合并后的NativeProps传入 RCTImage

12: RCTImage解析NativeProps将uri传给java的ReactImageView.java setSource

协议自己定义方案

在11到12之间进行协议推断。改动Image.android.js文件及resolveAssetSource.js。

Image.android.js

 render: function() {
...
var prefix = 'http-cage://';
var match = nativeProps.src.indexOf(prefix);
if(match == 0){//以http-cage://开头
console.log(__DEV__);
var realUrl = nativeProps.src.substring(prefix.length,nativeProps.src.length);
if(debug){//debug 情况 RN server:http://10.0.3.5:8081/assets/image/help.png
nativeProps.src = resolveAssetSource.getDevServerURL()+realUrl;
}else {//release 情况 图片路径:file:///sdcard/image/help.png
nativeProps.src = 'file://'+'/sdcard/'+realUrl;
}
}
}

resolveAssetSource.js

//使 getDevServerURL 外部可用
module.exports.getDevServerURL = getDevServerURL;

自己定义协议使用演示样例

//測试版本号0.13.2

<Image source={{uri: 'http-cage://image/finance.png'}} style={styles.phoneImage}/>

0.14開始图片放到 根文件夹 img文件下而且在js中被require,就会被打入bundle中。压缩比非常夸张,不知道用了什么压缩算法。

<Image source={require('./img/help.png')} style={styles.helpImage}/>

后记

经同事验证,img目录下的图片被打到了apk的res中去,之前误导大家了,sorry

React Native for Android 热部署图片自己定义方案的更多相关文章

  1. React native 之android的图标和启动图片

    哎哎呀呀,上篇说到了react native的IOS的图标和启动图片的设置,其实最主要的是尺寸!相应的尺寸设定好了以后就不会报错了! ok~这篇说的是React native的android的图标和启 ...

  2. React Native拆包及热更新方案 · Solartisan

    作者:solart 版权声明:本文图文为博主原创,转载请注明出处. 随着 React Native 的不断发展完善,越来越多的公司选择使用 React Native 替代 iOS/Android 进行 ...

  3. React Native For Android 架构初探

    版权声明:本文由王少鸣原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/171 来源:腾云阁 https://www.qclo ...

  4. 【React Native开发】React Native For Android环境配置以及第一个实例(1)

    年9月15日也公布了ReactNative for Android,尽管Android版本号的项目公布比較迟,可是也没有阻挡了广大开发人员的热情.能够这样讲在2015年移动平台市场上有两个方向技术研究 ...

  5. React Native for Android 学习

    前言 Facebook 在2015.9.15发布了 React Native for Android,把 JavaScript 开发技术扩展到了移动Android平台.基于React的React Na ...

  6. 在React Native中集成热更新

    最近,在项目DYTT集成了热更新,简单来说,就是不用重新下载安装包即可达到更新应用的目的,也不算教程吧,这里记录一下. 1.热更新方案 目前网上大概有两个比较广泛的方式,分别是 react-nativ ...

  7. React Native for android 项目驱动教程

    第一节 搭建开发环境 第二节 显示页面标题 第三节 实现页面布局 # React native是什么? React Native,是颠覆性的移动开发技术.它使用js开发,又是原生应用,不同于Hybri ...

  8. React Native for Android应用名及图标修改

    应用开发完了,总不能顶着MyProject和小机器人图标就发布了吧?在发布之前,有多处需要修改的地方.今天我们来全面的看一下 应用ID 俗称PackageName,或APP ID.注意,在gradle ...

  9. react native 之 Android物理返回键

    基本用法 根据文档,安卓back键的处理主要就是一个事件监听: BackAndroid.addEventListener('hardwareBackPress', this.onBackPressed ...

随机推荐

  1. python opencv3 轮廓检测

    git:https://github.com/linyi0604/Computer-Vision # coding:utf8 import cv2 import numpy as np # 创建一个2 ...

  2. eclipse转idea, 快捷键设置

    设置快捷键的途径: 打开idea的配置,找到Keymap,设置为eclipse 另外还要手动设置某些快捷键 上下移动 点击类打开 代码提示 查询 重命名 快速实现接口 回到上一次光标处

  3. 【洛谷】4317:花神的数论题【数位DP】

    P4317 花神的数论题 题目背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 题目描述 话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我 ...

  4. bzoj3173 Splay 维护前缀中的最大值

    大致题意: 有一个空序列,依次插入1~N到该序列中,每次指定插入的位置,每次插入完成返回当前序列的LIS的长度. 题解: 设dp[i]表示 前缀1~i的最长上升子序列的长度. 因为是按照递增顺序插入的 ...

  5. Windows Phone background Audio 后台音频

    Windows Phone 后台音频的确不是什么新鲜的话题了,但发现目前在WP平台的音频播放应用多多少少会有一些瑕疵,所以在此给大家在此介绍下这个功能给有需要的朋友们. 首先介绍下我们的应用在后台播放 ...

  6. Linux学习之CentOS(十三)--CentOS6.4下Mysql数据库的安装与配置(转)

    原文地址:http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html 如果要在Linux上做j2ee开发,首先得搭建 ...

  7. Qt 4.7.2移植到ARM教程

    Qt的移植包括步骤如下: 1.下载并安装VMware WorkStation 12(最好比较高级的版本,早期的版本共享目录在虚拟机里可能显 示不了). 2.下载ubuntu 14.0.4(最好是lts ...

  8. Android性能优化之渲染

    Google近期在Udacity上发布了Android性能优化的在线课程,目前有三个篇章,分别从渲染,运算与内存,电量三个方面介绍了如何去优化性能,这些课程是Google之前在Youtube上发布的A ...

  9. P2P通信原理与实现(C++)

    1.简介 当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信.这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还 ...

  10. 第三方网站返回hybrid app H5页面缓存问题应对策略

    最近负责公司各产品线购买模块的开发,各项功能如期开发完成后测试那边反馈回来一个问题:IOS手机在点击支付宝购买后,跳转到支付宝网站时不输入支付密码,直接点返回,返回到我们自己的APP购买界面发现页面显 ...