React Native For Android

Gradle DSL method not found: 'url()'
Possible causes:The project '***' may be using a version of the Android Gradle plug-in that does not contain the method (e.g. 'testCompile' was added in 1.1.0).
<a href="fixGradleElements">
Upgrade plugin to version 3.0.0-alpha1 and sync project
The project '***' may be using a version of Gradle that does not contain the method.

解决办法:用来设置node_modules的父目录,如果在根目录下直接删掉,如果你很执着,同步后,就会报错:
“Failed to resolve: com.facebook.react:react-native:0.x.x”
参考:http://www.cnblogs.com/details-666/p/RN.html

Warning:Conflict with dependency 'com.google.code.findbugs:jsr305'. Resolved versions for app (3.0.1) 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:1.3.9'
}

参考:http://blog.csdn.net/qq_23089525/article/details/52777520

Error:Dex writing phase: classes.dex has too many IDs. Try using multi-dex

解决办法:打开Dex分包开关,具体如下

   1. android {  
        defaultConfig {  
            // Enabling multidex support.  
            multiDexEnabled true  
        }  
    } (**添加在主module中,子module如果比较大,也可以添加**)

   2. dependencies {  //noinspection GradleCompatible
    compile 'com.android.support:multidex:1.0.1'} (**注意multidex为小写**)

   3.在自己的Application中重写

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

参考:http://blog.csdn.net/t12x3456/article/details/40837287

添加了百度sdk的可能会抛出 libBaiduMapSDK_base_v4_3_1.so” is 32-bit instead of 64-bit
解决办法:
将arm64-v8a,armeabi,armeabi-v7a包都放在lib下
并且在app的build.gradle的android标签下sourceSets {
main() {
jniLibs.srcDirs = [‘libs’]
}
}
不然会报错: No implementation found for int com.baidu.platform.comjni.tools.JNITools.initClass

could find DSO to load: libreactnativejni.so
解决办法:
build.gradle中加入:

android {    
  ...
  defaultConfig {        
    ...  
    ndk { 
        abiFilters "armeabi-v7a", "x86"     
     }  
  }    

参考:http://www.jianshu.com/p/35ae1990673a

ConnectivityManagerCompat.()’ is inaccessible to class ‘com.facebook.react.modules.netinfo.NetInfoModule’
解决办法:compile ‘com.android.support:appcompat-v7:23.0.1’ 导入此版本的v7包
确认项目的maven路径是否正确,Gradle配置成在线编译,不然gradle可能本地编译不通过

allprojects {
    repositories {
        jcenter()
        maven {  url "$rootDir/node_modules/react-native/android"
        }
    }
}

No virtual method setCallWebSocket(Lokhttp3/Call;)V in class Lokhttp3/internal/Internal; or its super classes (declaration of ‘okhttp3.internal.Internal’ appears in /data/app/。。/。。.apk)
解决办法:
在app的build.gradle里添加

android{
    configurations.all {
        .....
        resolutionStrategy.force 'com.squareup.okhttp3:okhttp:3.4.1'
    }
}

react native 错误:evaluating ReactInternals.ReactCurrentOwner
解决办法:
切到项目主目录,执行命令行 yarn add react@16.0.0-alpha.12 重启服务:npm start
参考:https://segmentfault.com/q/1010000009822772

打包时存在的坑
解决办法:请移步http://blog.csdn.net/u011965040/article/details/53331859?locationNum=15&fps=1
调试
模拟器:按双R没反应,可能和某些软件冲突了,或者没有开发者菜单键,可以将开发者菜单设置成其他监听:
比如设置成音量键监听

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        //当我们点击菜单的时候打开发者菜单,一个弹窗(此处需要悬浮窗权限才能显示)
        if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && mReactInstanceManager != null) {
            mReactInstanceManager.showDevOptionsDialog();
            return true;
        }
        return super.onKeyUp(keyCode, event);
    }

这样点击音量键的时候就弹出开发者菜单,同理,可以设置其他监听
真机调试:
连接不了服务:
可以修改真机访问的主机名:
开发者菜单 => Dev Settings => Debug server host&port for device
查看电脑主机ip地址:cmd => ipconfig
将主机地址填入host输入框,如 xx.xx.xx.xx:8081 , 摇晃手机reload

Refusing to install react as a dependency of itself

解决方法:

你不能把你的项目取名为 react

你项目的 package.json 里面 name 的值不能是 react

也不能是你项目其他依赖包的名字

也就是和依赖包不能重名

undefined is not an object (evaluating ‘_react2.default.NativeModules.*

解决办法:根据官网的配置,但是还是在调用android本地方法的时候还是抛出异常,查看js代码调用android的方法是: React.NativeModules.自定义的module.本地方法;
正确的调用方法是:NativeModules.自定义的module.本地方法;

tried to show an alert while not attached to an activity
解决办法:将rn嵌入到现有项目中,根据官网的文档进行嵌入:http://reactnative.cn/docs/0.45/integration-with-existing-apps.html#content 有的人可能会遗漏一些细节,出现上面这个问题的原因是
:没有将onPause,onResume,onDestory也加进加载React的Activity中:

public class IntentReactActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
    private static final int OVERLAY_PERMISSION_REQ_CODE = 1;
    private ReactRootView mReactRootView;
    private ReactInstanceManager mReactInstanceManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mReactRootView = new ReactRootView(this);
        mReactInstanceManager = ReactInstanceManager.builder()
                .setApplication(FIFApplication.getInstance())
                .setBundleAssetName("index.android.bundle")
                .setJSMainModuleName("index.android")
                .addPackage(new MainReactPackage())
                .addPackage(new IntentReactPackage(this))
                .setUseDeveloperSupport(com.fif.wisdie.BuildConfig.DEBUG)
                .setInitialLifecycleState(LifecycleState.RESUMED)
                .build();
        // 注意这里的HelloWorld必须对应“index.android.js”中的
        // “AppRegistry.registerComponent()”的第一个参数
        mReactRootView.startReactApplication(mReactInstanceManager, "***", null);
        setContentView(mReactRootView);
    }

    @Override
    protected void onPause() {
        super.onPause();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostPause(this);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostResume(this, this);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostDestroy();
        }
    }
    @Override
    public void onBackPressed() {
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onBackPressed();
        } else {
            super.onBackPressed();
        }
    }
}

adb devices检测不到夜神模拟器
解决办法:
1、dos下,cd进入到夜神模拟器的bin目录
代码:
nox_adb connect 127.0.0.1:62001
2.dos下,进入进Android SDK下的platform-tools目录
代码:
adb connect 127.0.0.1:62001

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RNPolymerPo 是一个基于 React Native 的生活类聚合实战项目,目前由于没有 MAC 设备,所以没有适配 iOS,感兴趣的可以自行适配 app 目录下相关 JS 代码即可。 获取代码与编译调试打包 如下所有步骤及说明均为 React Native Android 的 DIY,涉及命令均为 Ubuntu 环境,Windows 类推即可。 1. 获取代码及模块安装和签名配置 执行如下命令进行代码下载及模块安装: $ git clone https://github.com/yanbober/RNPolymerPo.git $ cd RNPolymerPo $ npm install //如果觉得慢可以先切换到国内 npm 镜像源再执行此命令 配置 Gradle 个人签名路径及属性: //1. 把你个人的签名 my-release-key.keystore 文件(不知道如何生成请自行搜索)放到 RNPolymerPo 工程的 android/app 文件夹下。 //2. 编辑工程的 gradle.properties 文件,添加如下的代码(注意把其中的****替换为你自己相应密码)。 MYAPP_RELEASE_STORE_FILE=my-release-key.keystore MYAPP_RELEASE_KEY_ALIAS=my-key-alias MYAPP_RELEASE_STORE_PASSWORD=***** MYAPP_RELEASE_KEY_PASSWORD=***** 2. 编译打包 APK 文件 编译生成在线快速调试 Debug 开发包,执行如下命令: $ adb reverse tcp:8081 tcp:8081 $ react-native start //开启本地 JS 服务 $ react-native run-android //新终端的 RNPolymerPo 目录下执行 编译生成 release 包,执行如下命令: $ cd android && ./gradlew assembleRelease 拓展规划 下一个版本准备做的事情: 兼容性处理; 夜间模式; 热修复及 PHP 服务端编写; 多语言切换等问题评估;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值