闪之轨迹2大猩猩怎么打

| 漏洞检测 |
| 隐藏捆绑 |
安卓转战React-Native之签名打包成Apk并极速多渠道打包
搞安卓的开发应该知道开发好的apk都是需要上传到应用市场给用户下载的,当然有些公司的产品是不用上传到应用市场的(比如我们公司放七牛云)但是也需要放在云上
搞安卓的开发应该知道开发好的apk都是需要上传到应用市场给用户下载的,当然有些公司的产品是不用上传到应用市场的(比如我们公司放七牛云)但是也需要放在云上面给用户下载。react-native直接run-android默认是产生一个debug的版本apk显然这是不符合开发需求的,理由很简单debug版本apk是没有进行代码混淆的这是很危险的,所以我们需要个release的版本,下面我们来详细看一下怎么样进行签名打包React Native应用并且多渠道打包。
debug和release版本apk反编译后比较
先下载反编译工具包:dex2jar-2.0、jd-gui、apktool
先把apk解压获取classes.dex,再获得classes-dex2jar.jar
使用jd-gui查看源代码(debug版本效果)
当然这里只是helloword做个例子,并没有写什么代码即使混淆了也看不出什么效果(因为第三方的包都不能混淆),但是混淆后效果还是好点:看下其他的例子(直接偷郭霖的图):(release版本效果)
Android签名文件生成
Android签名文件包含2种格式:.keystore和.jks
安卓签名文件的生成不外乎2种方式:我现在给大家讲解两种签名生成的方法:①:keytool命令方式生成 ,②:Android Studio IDE和Eclipse IDE进行生成。
keytool命令生成keystore文件(如果没有安装androidStudio或eclispe)
以前我也有写过用蓝贝儿多渠道打包里面介绍了使用自带的keytool命令生成签名文件,这里再来介绍一下
keytool -genkey -v -keystore losileeya.keystore -alias losileeya(别名) -keyalg RSA(算法) -keysize 2048(密钥长度) -validity 10000(有效期,天单位)
个人比较倾向于使用ide这一种方法,首先是图形界面的,而且少了命令行书写的问题,而且以前我记得在使用Eclipse开发Android的时候也一直使用这种方式,下面我们来看一下生成签名的具体步骤:
IDE 工具生成签名文件
1.Android Studio IDE生成jks文件
build&&Generate Signed apk
2.Eclipse IDE生成keystore文件
Gradle配置
(1)把刚才生成的.jks文件考入到项目android/app文件夹下面
(2)直接在工程目录下得android/app/build.gradle中以下节点添加如下内容:
方法一:gradle的全局配置:
修改项目中gradle.properties文件
MYAPP_RELEASE_STORE_FILE=losileeya.jks
MYAPP_RELEASE_KEY_ALIAS=losileeya
MYAPP_RELEASE_STORE_PASSWORD=losileeya
MYAPP_RELEASE_KEY_PASSWORD=losileeya
直接在工程目录下得android/app/build.gradle中以下节点添加如下内容:
signingConfigs {
storeFile file(MYAPP_RELEASE_STORE_FILE)
storePassword MYAPP_RELEASE_STORE_PASSWORD
keyAlias MYAPP_RELEASE_KEY_ALIAS
keyPassword MYAPP_RELEASE_KEY_PASSWORD
buildTypes {
signingConfig signingConfigs.release
方法二:gradle的局部配置:
signingConfigs {
storeFile file(&C://Users/Administrator/ZyReact/android/app/losileeya.jks&)//这里可以写绝对位置或者相对位置
storePassword &losileeya&
keyAlias &losileeya&
keyPassword &losileeya&
buildTypes {
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile(&proguard-android.txt&), &proguard-rules.pro&
signingConfig signingConfigs.release
记得把enableProguardInReleaseBuilds改为true,最好把enableSeparateBuildPerCPUArchitecture = true,然后各种签名参数的值都不能错否则打包失败,基本上build.gradle的配置也就这些了。当然代码混淆文件proguard-rules.pro自己配置。
例如我上个项目:
# This is a configuration file for ProGuard.
# #manual/usage.html
# 指定代码的压缩级别0~7
-optimizationpasses 5
# 是否使用大小写混合
-dontusemixedcaseclassnames
# 是否混淆第三方jar
-dontskipnonpubliclibraryclasses
# 混淆时是否做预校验
-dontpreverify
-renamesourcefileattribute SourceFile
#保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.
-keepattributes SourceFile,LineNumberTable
# 混淆时是否记录日志
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#不压缩输入的类文件
-dontshrink
#不优化输入的类文件
-dontoptimize
#优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification
-libraryjars libs/volley.jar
-libraryjars libs/android-support-v4.jar
-libraryjars libs/gson-2.3.1.jar
-libraryjars libs/locSDK_6.13.jar
-libraryjars libs/zxing-core-3.1.0.jar
#-libraryjars libs/MarsorUtils-1.0.0-SNAPSHOT.jar
-libraryjars libs/dom4j-2.0.0-RC1.jar
-libraryjars libs/mta-sdk-1.6.2.jar
-libraryjars libs/open_sdk_r5509.jar
-libraryjars libs/libammsdk.jar
-libraryjars libs/WeiboSDKCore_3.1.2.jar
-libraryjars libs/alipaySDK-.jar
-libraryjars libs/CMISUBTSwiper_sdk_v1.3.jar
-libraryjars libs/CMSETSwiper_SDK_V3.6.jar
-libraryjars libs/dspread_android_sdk_2.4.6.jar
-libraryjars libs/message_lib.jar
-libraryjars libs/meSdk-1.1.7snapshot_ruiyin.jar
-libraryjars libs/disklrucache-2.0.1.jar
-libraryjars libs/httpclient-4.2.5.jar
-libraryjars libs/httpcore-4.2.4.jar
-libraryjars libs/universal-image-loader-1.9.5.jar
-keepattributes *Annotation*
-keep class android.** {*; }
-keep public class * extends android.view
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.pm
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.app.Fragment
-keep public class com.android.vending.licensing.ILicensingService
-keep class android.support.v4.app.** { *; }
-keep class android.support.v7.** { *; }
-keep class com.google.gson.** { *; }
-keep class com.baidu.mapapi.** { *; }
-keep class com.baidu.platform.** { *; }
-keep class com.baidu.vi.** { *; }
-keep class com.baidu.location.** { *; }
-keep class org.apache.http.** { *; }
-keep class org.json.** { *; }
-keep class com.nostra13.universalimageloader.** { *; }
# keep 所有的 javabean
-keep class com.richerpay.ryshop.bean.** { *; }
# # -------------------------------------------
############### volley混淆
###############
# # -------------------------------------------
-keep class com.android.volley.** {*;}
-keep class com.android.volley.toolbox.** {*;}
-keep class com.android.volley.Response$* { *; }
-keep class com.android.volley.Request$* { *; }
-keep class com.android.volley.RequestQueue$* { *; }
-keep class com.android.volley.toolbox.HurlStack$* { *; }
-keep class com.android.volley.toolbox.ImageLoader$* { *; }
-keep class org.dom4j.** { *; }
-keep class android.support.annotation.** { *; }
-keep class com.tencent.mm.sdk.** {*;}
-keep class com.tencent.tauth.** {*;}
-keep class com.tencent.open.TDialog$*
-keep class com.tencent.open.TDialog$* {*;}
-keep class com.tencent.open.PKDialog
-keep class com.tencent.open.PKDialog {*;}
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.misu.btswiper.**{*;}
-keep class com.shxy.cardswiper.**{*;}
-keep class com.dspread.xpos.QPOSService.**{*;}
-keep class com.bypay.swiper.**{*;}
-keep class com.newland.ruiyin.**{*;}
# 保持自己定义的类不被混淆
-keep class com.richerpay.ryshop.view.**{*;}
-keep class com.richerpay.ryshop.volly.**{*;}
-keep class com.richerpay.ryshop.widget.**{*;}
-dontwarn org.apache.http.**
-keepclassmembers class * {
public (org.json.JSONObject);
-keep public class com.hrbcb.studentloans.R$*{
public static final int *;
-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}
# 新浪微博
-keep class com.sina.**{*;}
#枚举不被混淆
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
# 保持自定义控件类不被混淆
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet);
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet, int);
#点击事件不被混淆
-keepclasseswithmembers class * {
void onClick*(...);
-keepclasseswithmembers class * {
*** *Callback(...);
#get 和set
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
-keepclasseswithmembernames class * {
# activity
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
#实现Parcelable 接口的不被混淆
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
#R文件属性不被混淆
-keepclassmembers class **.R$* {
#缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。
-dontwarn android.support.**
# 实现Serializable 接口的不被混淆
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentF
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
#dom4j不被混淆
-keepclassmembers class org.dom4j.** {*;}
-keepclassmembers class com.baidu.location.** {*;}
-keepattributes Signature
# Gson混淆
## ----------------------------------
########## Gson混淆
##########
## ----------------------------------
-keepclassmembers class com.google.gson.** {*;}
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }
# Application classes that will be serialized/deserialized over Gson
##---------------End: proguard configuration for Gson
----------
-ignorewarnings
-dontwarn org.xmlpull.v1.XmlSerializer
-keepattributes Signature
这个只是规则可以参考下,毕竟react-native没有什么activity这写东西,如果你对这个还是不了解,可以去看郭神的反编译与混淆技术完全解析(下)
打包文件的生成2种方式
对存在react.gradle文件的项目打包
命令很简单:
cd android && ./gradle assembleRelease
(责任编辑:幽灵学院)
------分隔线----------------------------
荆楚之窗最新《科技》栏目新闻:Google助手已确认:支持所有A...
面向家庭成员 联想推出四款Android平板,android android平板...
运行Android 7.0系统 华 Mate9售3650元,...
这样的结果是一面是iPhone,一面是Android设备。Eye共享iPho...
引用来自“很拽De土豆”的评论Android Studio 2.2 Preview 5...
电子发烧友为您提供的努比亚z13曝光:率先搭载Android7.1,...
工作日:9:00-21:00
周 六:9:00-18:00
&&扫一扫关注幽灵学院> 博客详情
从下载JDK并安装。请注意选择x86还是x64版本。
推荐将JDK的bin目录加入系统PATH环境变量。
安装Android SDK
可以单独安装Android SDK,也可以通过Eclipse ADT或者Android Studio一并安装。推荐使用Android Studio,以下说明会默认以Android Studio的方式说明。请注意选择x86还是x64版本。
为了加速下载,推荐从下载。
然后进入SDKManager(可通过Android Studio菜单Tools-Android-SDK Manager),确保以下项目已经安装并更新到最新:
Tools/Android SDK Tools (24.3.3)
Tools/Android SDK Platform-tools (22)
Tools/Android SDK Build-tools (23.0.1)
Android 6.0 (API 23)/SDK Platform (1)
Extras/Android Support Library(23.0.1)
推荐使用腾讯Bugly的镜像加速下载。
推荐将SDK的platform-tools子目录加入系统PATH环境变量。
安装C++环境
推荐从下载并安装Visual Studio 。也可选择Windows SDK、cygwin或mingw等其他C++环境。编译node.js的C++模块时需要用到。
安装node.js
从下载node.js的官方4.1版本或更高版本。
安装react-native命令行工具
官方的安装方法是
npm&install&-g&react-native-cli
但是由于npm上的版本在windows下存在BUG,因此需要安装github上的master支线,否则会在下一步骤报以下错误:
This&will&walk&you&through&creating&a&new&React&Native&project&in&***&events.js:141&&&&&&&throw&&//&Unhandled&'error'&event&&&&&&&^&Error:&spawn&npm&ENOENT&&&&&at&exports._errnoException&(util.js:837:11)&&&&&at&Process.ChildProcess._handle.onexit&(internal/child_process.js:178:32)&&&&&at&onErrorNT&(internal/child_process.js:344:16)&&&&&at&doNTCallback2&(node.js:429:9)&&&&&at&process._tickCallback&(node.js:343:17)&&&&&at&Function.Module.runMain&(module.js:477:11)&&&&&at&startup&(node.js:117:18)&&&&&at&node.js:951:3
如果您看到本文时0.12已经发布,那很可能直接输入上面的命令就行了。如果0.12还没有发布,请进行以下步骤:
在右侧点击Download ZIP,下载后解压,并执行以下代码:
cd&**解压的目录**&cd&react-native-cli&npm&install&-g
进入你的工作目录,运行
react-native&init&MyProject
并耐心等待数分钟。
运行packager
首先要修复package在windows下的两处BUG。
1、参考,在node_modules/react-native/packager/react-packager/src/DependencyResolver/Module.js的getName()方法中,将
return&path.join(name,&path.relative(p.root,&this.path));
return&path.join(name,&path.relative(p.root,&this.path)).replace(/\\/g,&'/');
注意,如果你在修改此行代码之前运行过packager,那你可能需要去C:\Users\你的用户名\AppData\Local\Temp中找到并删除所有 react-packager-cache 开头的文件。
2、参考,在node_modules/react-native/packager/react-packager/src/DependencyResolver/DependencyGraph/ResolutionRequest.js的_resolveNodeDependency(fromModule, toModuleName)方法中,将
for&(let&currDir&=&path.dirname(fromModule.path);&&&&&&&&&&&&&&&&&currDir&!==&'/';&&&&&&&&&&&&&&&&&currDir&=&path.dirname(currDir))&{
for&(let&currDir&=&path.dirname(fromModule.path);&&&&&&&&&&&&&&&&&path.dirname(currDir)&!=&currD&&&&&&&&&&&&&&&&&currDir&=&path.dirname(currDir))&{
随后可以运行packager。
如果你有cygwin,可以在cygwin环境中进入工程目录,运行
如果没有cygwin或不在cygwin环境中,可以进入工程目录,运行
node&node_modules\react-native\packager\packager.js
可以用浏览器访问看看是否可以看到打包后的脚本。第一次访问通常需要十几秒,并且在packager的命令行可以看到进度条。如果迟迟看不到进度条,请检查上面的修改是否已经做到。
运行模拟器
推荐使用不过要小心它推送的广告和垃圾应用。
如果有真机,可以不必运行模拟器,要配置好驱动,使得adb devices可以看到对应的设备。
保持packager开启,另外打开一个命令行窗口,然后在工程目录下运行
react-native&run-android
首次运行需要等待数分钟并从网上下载gradle依赖。
运行完毕后可以在模拟器或真机上看到应用自动启动了。
如果gradle依赖下载出现报错,请多试几次,或者设置VPN加速。
如果apk安装运行出现报错,请检查platform-tools是否已经设到了PATH环境变量中,运行adb devices能否看到设备。
至此,应该能看到APP运行,并报错 Unable to download JS bundle
摇晃设备或按Menu键(Bluestacks模拟器按键盘上的菜单键,通常在右Ctrl的左边 或者左Windows键旁边),可以打开调试菜单,点击Dev Settings,选Debug server host for device,输入你的局域网IP,再按back键返回,再按Menu键,在调试菜单中选择Reload JS,就应该可以看到运行的结果了。
目前Windows下无法自动打开chrome进行调试,所以手动打开chrome,访问如下地址:&即可。
=====================================================================
已按该教程搭建完成。以下是截图
人打赏支持
码字总数 9645
我这边博客也是转载的。我按照博客的步骤成功在安卓手机运行了示例app(见文章最后截图)。请问你是哪一步没有成功?
有具体错误信息吗?
引用来自“jackzlz”的评论有具体错误信息吗?解决了,是找不到git,把git路径加入到path环境变量里就好了
加这个群。(React Native),找群里的大神问问。。。
我遇到了,你解决了吗?
引用来自“睡着的兔子”的评论我遇到了,你解决了吗?你的白屏问题解决了吗?
Starting the app (C:\Users\ls\AppData\Local\Android\sdk/platform-tools/adb shell am start -n com.oopi/.MainActivity)...
open: Permission denied
open: Permission denied
Starting: Intent { cmp=com.oopi/.MainActivity }
http://blog.csdn.net/u/article/details/ Android之Windows下搭建React Native Android开发环境(差不多搞了一天) 这是我的文章,里面的每一步都有图,而且错误都总结了,比这个详细多了,去了绝对让你不后悔
http://blog.csdn.net/u/article/details/ Android之Windows下搭建React Native Android开发环境(差不多搞了一天) 这是我的文章,里面的每一步都有图,而且错误都总结了,比这个详细多了,去了绝对让你不后悔
http://blog.csdn.net/u/article/details/ Android之Windows下搭建React Native Android开发环境(差不多搞了一天) 这是我的文章,里面的每一步都有图,而且错误都总结了,比这个详细多了,去了绝对让你不后悔
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥ok!百度出来的东西很杂,所以,这里介绍一种最简单,最合适我们(新手,应该是吧)的APK的打包方式!
当然!这种打包是基于Android Studio的,所以,注意喽!!!!
废话不多说开始吧!
首先,我们要整理我们的思路,第一步是给APK签名~第二步是完成打包&
第一步:签名
打开Android Studio 然后在菜单栏的Build&&&Generate Signed APK 在打开的界面点击Next,会弹出下面的界面
然后点击create new在弹出的界面中选择填写秘钥存放的位置,名称,密码。同样还要写别名的名字,证书的所有者,国家,组织以及城市相关信息。
注释:我们这里app的名称是jd,别名是jd_alias, 名称的密码和别名的密码都一样
点击OK,会默认填写上创建好的签名的信息,
最后点击finish会生成签名秘钥
&通过以上几步就已经将APP的签名完成了!下面开始真正的打包了哦!
1.Gradle配置:
& 1.首先我们要把刚刚生成的签名文件复制到项目android/app文件夹下面(你的xxx.jks文件路径可能和我不同,但是没关系复制到这个andrid/app路径下就可以)
然后进行修改项目中gradle.properties文件,进行添加如下的代码(注意下面的签名和别名的名称和上一步放入的test.jks要一样,下面两项分别填写签名和别名的密码)-我取的密码为ztt12345
这一步我们是进行全局的gradlde进行变量化的配置,后边我们会在后边的步骤中给相应的应用进行签名。
[注意].以上的签名秘钥请大家一定要妥善保管,因为在应用发布的时候需要的。
& 2。给应用添加签名-配置局部应用Gradle文件直接在工程目录下得android/app/build.gradle中以下节点添加如下内容:
注释:这里面的内容就不需要改了哈!位置放对即可
最后:查看有没有react.gradle文件(一般init化都会有,具体路径如图所示的底部)
ok!只要有了这个文件~我们就可以开始打包了~进入项目根目录!(是根目录哦)执行以下命令:
cd android&&&&./gradlew assembleRelease &
然后会开始打包~~(打包的时间会很长~十分钟)然后会出现以下的图!
ok~打包完成~~
然后我们就进入,会在android/app/build/outputs/apk目录下面生成app-release.apk该文件
好了!你就可以发布啦!还有一点的是!若你修改了文件,重新打包就可以直接去运行打包命令(cd android&&&&./gradlew assembleRelease &)而无需去配置其他东东了!!!!
参考文档:http://www.lcode.org/%E3%80%90react-native%E5%BC%80%E5%8F%91%E3%80%91react-native%E8%BF%9B%E8%A1%8C%E7%AD%BE%E5%90%8D%E6%89%93%E5%8C%85%E6%88%90apk/
阅读(...) 评论()如何把React Native嵌入到原生android应用中 - 推酷
如何把React Native嵌入到原生android应用中
原生应用不仅可以跳转到RN页面,也可以把RN的组件放到原生应用中,作为原生应用的一个控件或者一部分。
首先介绍如何把React Native嵌入到Android中,然后再介绍如何把RN嵌入到iOS中;
第一部分:将RN嵌入到android中的步骤如下
一、用Android Studio 创建一个程序,我的是RnInAndroid;
二、打开命令行终端,进入RnInAndroid,
2.1、输入以下命令:
然后会创建一个package.json的文件,搞过RN的我们知道,这是RN的配置文件,下面需要我们输入一些信息:
2.2、输入yes,创建好package.json文件,然后输入:
npm install–save
React react-native
会自动联网下载rn的组件库node_modules,
2.3、接着输入:
curl-o.flowconfig
/facebook/react-native/master/.flowconfig
2.4、进入项目下面,打开刚才创建的package.json,在”scripts”–》
“test”的这一行后面添加个逗号,要不然报错的,这是json的格式,然后在test的下一行,添加一行代码:
“start”:
“node node_modules/react-native/local-cli/cli.js start”
2.5、然后在项目目录下穿件一个index.android.js的文件,然后把下面的代码拷贝到文件中,下面的代码是RN的代码,现实的是一个页面,里面有一个Text的组件,相当于android中的textview:
React from ‘react’;
AppRegistry,
StyleSheet,
from ‘react-native’;
classHelloWorld
这就是RN的页面哦
StyleSheet.create({
container:{
justifyContent:’center’,
fontSize:20,
textAlign:’center’,
margin:10,
AppRegistry.registerComponent(‘HelloWorld’,()=&
HelloWorld);
2.6、把你的项目下面的app(我的是
RnInAndroid/app)下的build.gradle文件打开,
dependencies 的代码块内,添加如下代码:
compile”com.facebook.react:react-native:+”
2.7、在项目根目录的build.gradle(我的是:RnInAndroid/build.gradle)中添加react
native 路径,这个文件和上面的那个build.gradle文件不一样哦:找到 allprojects代码块,找到repositories ,在这个代码块内添加如下的代码:
// All of React Native (JS, Android binaries) is installed from npm
url &$rootDir/../node_modules/react-native/android&
2.8、打开项目名/app/src/main/AndroidManifest.xml,在manifest标签内,和application同一级,添加联网权限:
三、添加原生代码
3.1、在项目名/app/src/main/Java/com/项目名…/rninandroid/,在这个目录下面创建一个java文件,文件名为:MyReactActivity.java,
然后复制下面的代码:
package com.example.vittorio.
import android.app.A
import android.os.B
import com.facebook.react.LifecycleS
import com.facebook.react.ReactInstanceM
import com.facebook.react.ReactRootV
import com.facebook.react.modules.core.DefaultHardwareBackBtnH
import com.facebook.react.shell.MainReactP
* Created by vittorio on .
public class MyReactActivity extends Activity implements DefaultHardwareBackBtnHandler {
private ReactRootView mReactRootV
private ReactInstanceManager mReactInstanceM
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mReactRootView = new ReactRootView(this);
mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setBundleAssetName(&index.android.bundle&)
.setJSMainModuleName(&index.android&)
.addPackage(new MainReactPackage())
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
//.setUseOldBridge(true) // uncomment this line if your app crashes
mReactRootView.startReactApplication(mReactInstanceManager, &HelloWorld&, null);
setContentView(mReactRootView);
public void invokeDefaultOnBackPressed() {
super.onBackPressed();
3.1.1、如果你用的是android studio的话,点击最上面的build菜单,clean project,然后会提示你有些包没有导入,按 alt + enter,一个一个的导入包;
3.1.2、上面代码的第一行:package是你自己的包名,在AndroidManifest.xml里面的package属性值里面有;
3.1.3、如果你的index.android.js的
AppRegistry.registerComponent(‘Liucheng’, () =& Liucheng),那就把上面代码中的”HelloWorld”改成“Liucheng”,我这里是Liucheng举个例子,
mReactRootView.startReactApplication(mReactInstanceManager, “Liucheng”, null);点击
3.1.4、如果出现下面的错误:
Error:Conflict with dependency ‘com.google.code.findbugs:jsr305’. Resolved versions for app (3.0.0) and test app (2.0.1) differ. See
http://g.co/androidstudio/app-test-app-conflict for details
解决办法:需要在你的根目录的build.gradle中的android代码快内,添加如下的代码:
configurations.all {
resolutionStrategy.force ‘com.google.code.findbugs:jsr305:3.0.0’
如下图所示:
3.1.5、重新编译:在android studio(简称:AS)中点击上边的build菜单,选择rebuild project;
3.2、在AndroidManifest.xml文件中,注册刚才新建的activity(MyReactActivity),并为它指定一个主题:
3.3、在 MyReactActivity.java文件中添加生命周期函数:
protected void onPause() {
super.onPause();
if (mReactInstanceManager != null) {
mReactInstanceManager.onPause();
protected void onResume() {
super.onResume();
if (mReactInstanceManager != null) {
mReactInstanceManager.onResume(this, this);
protected void onDestroy() {
super.onDestroy();
if (mReactInstanceManager != null) {
mReactInstanceManager.onDestroy();
// We also need to pass back button events to React Native:
public void onBackPressed() {
if (mReactInstanceManager != null) {
mReactInstanceManager.onBackPressed();
super.onBackPressed();
3.4、添加按键的响应,默认的意思是摇动设备出来菜单,但是在模拟器中不好使,所以我们需要添加相应的代码来处理物理按键,用as的模拟器按下ctrl+M会触发响应的按键:下面的代码也是在MyReactActivity.java文件中添加的哦:
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {
mReactInstanceManager.showDevOptionsDialog();
return super.onKeyUp(keyCode, event);
3.5、在MainActivity.java的布局中(activity_main.xml中)添加一个按键,并在MAinActivity中添加这个按键的作用,作用是按下这个按键,就跳转到RN的界面,也就是跳转到MyReactActivtiy,具体代码如下:
3.6、现在命令行中启动nodejs服务器:
3.7、打开模拟器(我用的是Genymotion,你也可以用as自带的模拟器或者真机测试),然后在AS运行点击Run:
四、坑爹了,原生的代码能正常显示,但是点击跳转RN的界面,就退出了,
4.1、报错如下:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.vittorio.rninandroid, PID: 13885
android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@d6bfdbd — permission denied for window type 2003
at android.view.ViewRootImpl.setView(ViewRootImpl.java:702)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
at android.app.Dialog.show(Dialog.java:316)
at com.facebook.react.devsupport.DevSupportManagerImpl.handleReloadJS(DevSupportManagerImpl.java:538)
at com.facebook.react.ReactInstanceManagerImpl$3$1.run(ReactInstanceManagerImpl.java:386)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
解决办法:增加权限:
4.2、但是依旧报错,在activit的点击事件里面添加:
4.3、依旧报错:
java.lang.IllegalAccessError: Method ‘void android.support.v4.net.ConnectivityManagerCompat.()’ is inaccessible to class ‘com.f
acebook.react.modules.netinfo.NetInfoModule’ (declaration of ‘com.facebook.react.modules.netinfo.NetInfoModule’ appears in
/data/app/package.name-2/base.apk)
解决办法:(老外也遇到了这样的问题/facebook/react-native/issues/6152#issuecomment-)
在项目下修改以下的文件内容:
.gitignore(在该文件里添加排除项,node_modules/ 和 npm-debug.log)
app/build.gradle (将 ‘com.android.support:appcompat-v7:24.2.1’ 改为 ‘com.android.support:appcompat-v7:23.0.1’)
gradle.properties (在文件末尾添加,android.useDeprecatedNdk=true)
undefined is not a function (evaluating ‘remoteModules.forEach’)
解决办法:
在项目下面的build.gradle为把
// All of React Native (JS, Android binaries) is installed from npm
url “$rootDir/../node_modules/react-native/android”
// All of React Native (JS, Android binaries) is installed from npm
url “$rootDir/node_modules/react-native/android”
,因为$rootDir就是你的项目目录,如果用../的话,找不到这个目录就会报错的
4.5.依旧报错啊,报错啊:
Error:(52, 34) 错误: 找不到符号
符号: 方法 onPause()
位置: 类型为ReactInstanceManager的变量 mReactInstanceManager
Error:(61, 34) 错误: 找不到符号
符号: 方法 onResume(MyReactActivity,MyReactActivity)
位置: 类型为ReactInstanceManager的变量 mReactInstanceManager
Error:(70, 34) 错误: 找不到符号
符号: 方法 onDestroy()
位置: 类型为ReactInstanceManager的变量 mReactInstanceManager
解决原因:找了好长时间的答案,也没有找到原因在哪儿,只能先把onpause、onResume、onDestroy这三个方法注释掉,
编译成功啦!!!真高兴啊真高兴;
4.6、但是进入RN的页面后按下Ctrl+M,没反应,不能调出调试菜单:
在AndroidMenifest.xml文件中添加:
五、将RN作为组件嵌入到android中作为一个控件使用:
5.1、我们注意到在MyReactActivtiy.java文件中,我们发现其实这个activity加载页面也用的是
setContentView(mReactRootView);
只要我们新建一个xml的布局文件,布局中添加一个linearlayout或者relativelayout布局,然后在代码中把这个RN的布局添加进去就行了,或者是在xml中直接添加RN布局代码:
下面就两种凡是贴出代码,供大家参考使用:
第一种新建一个myreactactivity.xml布局文件:
在MyReactActivtiy.java中修改代码,红色部分为增加的内容:
package com.example.vittorio.
import android.app.A
import android.os.B
import android.view.KeyE
import android.widget.LinearL
import com.facebook.react.ReactInstanceM
import com.facebook.react.ReactRootV
import com.mon.LifecycleS
import com.facebook.react.modules.core.DefaultHardwareBackBtnH
import com.facebook.react.shell.MainReactP
* Created by liucheng on .
public class MyReactActivity extends Activity implements DefaultHardwareBackBtnHandler {
private ReactRootView mReactRootV
private ReactInstanceManager mReactInstanceM
private LinearL
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mReactRootView = new ReactRootView(this);
mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setBundleAssetName(&index.android.bundle&)
.setJSMainModuleName(&index.android&)
.addPackage(new MainReactPackage())
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
//.setUseOldBridge(true) // uncomment this line if your app crashes
mReactRootView.startReactApplication(mReactInstanceManager, &HelloWorld&, null);
setContentView(R.layout.myreactactivity);
initView();
private void initView() {
ll = (LinearLayout) findViewById(R.id.ll);
ll.addView(mReactRootView);
第二种方法直接在布局中引用ReactRootView控件:
代码文件为:
public class MyReactActivity extends Activity implements DefaultHardwareBackBtnHandler {
private ReactRootView mReactRootV
private ReactInstanceManager mReactInstanceM
// private LinearL
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.myreactactivity);
// mReactRootView = new ReactRootView(this);注释掉这一行,不新建一个RN的view了,因为我们已经引用了,不需要重新创建了
mReactRootView = (ReactRootView)findViewById(R.id.rnview);
mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(getApplication())
.setBundleAssetName(“index.android.bundle”)
.setJSMainModuleName(“index.android”)
.addPackage(new MainReactPackage())
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
//.setUseOldBridge(true) // uncomment this line if your app crashes
mReactRootView.startReactApplication(mReactInstanceManager, “HelloWorld”, null);
// initView();
//记得把上面新建的的initView()方法给删除其他的和上面类似
六、今天到此为止吧,本来还想把IOS端的搞一下,明天再发一篇文章吧,各种坑各种坑!!!我在修路我在补坑,让你们踏着我们的肩膀跑的更高看的更远;
留个小问题:RN页面如何返回到原生页面上,如何处理android的物理返回按键,等我后天处理教大家哦!
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

 

随机推荐