安卓React-Native开发笔记(入门篇)

开发资料

使用工具

  • Visual Studio // 开发react
  • Android Studio // 安卓开发神器
  • Git
  • nodejs
  • Flow // 静态的JS类型检查工具

和原生交互

应用场景多,主要是js扩展功能调用Native实现。
官方文档有介绍,主要注意下@ReactMethod 参数类型与js映射关系。

Boolean -> Bool
Integer -> Number
Double -> Number
Float -> Number
String -> String
Callback -> function
ReadableMap -> Object
ReadableArray -> Array

WriteableMap和Java中map使用基本一样。

native 通知js

  • 应用场景:网络状态改变、用户登录状态、新消息(push)等等Native实现的功能,收到对应数据后需通知js。

  • Android 端伪代码

...
private void sendEvent(ReactContext reactContext,
                       String eventName,
                       @Nullable WritableMap params) {
  reactContext
      .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
      .emit(eventName, params);
}
...
WritableMap params = Arguments.createMap();
...
sendEvent(reactContext, "keyboardWillShow", params);
  • js端 伪代码
import { DeviceEventEmitter } from 'react-native';
...
  
// 兼容 ios用法 start
import { NativeModules, NativeEventEmitter } from 'react-native';

const MedEventEmitter = new NativeEventEmitter(NativeModules.MLRCTEventEmitter);
// 兼容 ios用法 end

var ScrollResponderMixin = {
  mixins: [Subscribable.Mixin],


  componentWillMount: function() {
    ...
    this.addListenerOn(DeviceEventEmitter,
                       'keyboardWillShow',
                       this.scrollResponderKeyboardWillShow);
    ...
  },
  scrollResponderKeyboardWillShow:function(e: Event) {
    this.keyboardWillOpenTo = e;
    this.props.onKeyboardWillShow && this.props.onKeyboardWillShow(e);
  }

app进入RN界面分发

  • 应用场景:如果是App部分功能使用了rn,不同模块进入的页面就会不一样。(纯rn项目,不用考虑这个。)
  • js端使用 NavigationNavigator 等'react-navigation'模块实现。
  • native 通过bundle传入数据,区分moduleName和routerName,供react解析。

控制台常用命令

$ npm start //开启本地服务
$ npm install //安装组件
$ react-native log-ios
$ react-native log-android

生成jsbundle文件

React-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

配置打包脚本

一行命令生成bundle并完成打包。

Makefile脚本实现

out := ios/JSBoudle/* android/app/src/main/assets/index.android.bundl*
version := 1.0.0
appName := xxx

.PHONY : all ios android
all: ios android

ios:
   react-native bundle --entry-file index.js --platform ios --dev false --bundle-output ./ios/JSBoudle/main.jsbundle --assets-dest ./ios/JSBoudle

droidBundle:
   react-native bundle --entry-file index.js --platform android --dev false --bundle-output ./android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

droidRelease:
   cd android && ./gradlew clean assembleReleaseChannels -PchannelList=medlinker

iosRelease: ios push

android:    droidBundle droidRelease

clean:
   rm -rf $(out)

Mac终端直接执行:make android 就ok。

Python脚本(主要为兼容windows)

import os
import sys
import platform

# 先拉取两个项目代码
print('update git repo start')
os.system('git pull')
os.system('cd android && git pull')
print('update git repo end')

print('gradle release apk file all channels ? ', 'all' in sys.argv)

# 区分平台执行打包任务
sysstr = platform.system()
cmdPrefix = './gradlew'
if(sysstr =="Windows"):
     print ("Call Windows tasks")
     cmdPrefix = 'gradlew'
elif(sysstr == "Linux"):
     print ("Call Linux tasks")
else:
     print ("Other System tasks")

if 'all' in sys.argv:
     os.system('cd android && %s clean assembleReleaseChannels' %(cmdPrefix))
else:
    os.system('cd android && %s clean assembleReleaseChannels -PchannelList=medlinker' %(cmdPrefix))

看到了吧,Python更加灵活,打包前先同步远程仓库代码,再分平台打包。(这是由于对Makefile不熟悉,才这样搞的,囧~)

自定义react UI组件

  • 使用场景:炫酷的自定义view、动效、触摸滑动事件等高级UI,需要Native来实现,然后封装给js使用。
  • 参考官方文档 看有文档胜过搜索。

热更新方案

我们使用的 Microsoft/react-native-code-push,有没有惊讶到,微软咋搞这个呢?是的,说实话,还搞的不错。已在线上使用两次热更新,效果不错。

动画效果实现Lottie for React-Native

iOS上表现不错,安卓上内存偏高,卡顿。(低端机上明显)

js View截图react-native-view-shot

遇到的坑

  • 版本兼容问题

    reactnative更新很快,我们上个版本开发是0.51.0,现在已经是0.53.RC。建议使用最新版,很多第三方库也不支持旧版本,尤其是0.49.0之前版本。

  • xxx uncompiled PNG file passed as argument. Must be compiled first into .flat file.

  • android/app/build/intermediates/res/merged/release/drawable-mdpi-v4/xxx.png
    Error:error: Duplicate file. --- 删除react-native生成的所有资源。

建议:遇到问题先看官方文档,不行再Google,基本都能找到答案。

总结

由于公司战略需要,我们项目尝试接入reactnative,部分新功能就开始使用rn来开发,本文就是对Android端开发rn过程的记录,包括使用了那些黑科技、踩过那些坑,希望对正在接入或者准备接入rn开发的你有帮助。

本文为原创内容,转载请说明出处,首发博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容