2016-12-06 87 views
1

我有一個可用的iOS反應本機應用程序(反應本機v 0.38)。我試圖在android中運行相同的應用程序。 enter image description here 我手動鏈接所有這些庫(我使用iOS中現在哪個):React Native:本機模塊AppStateModule試圖覆蓋AppStateModule的模塊名稱AppState

react-native-camera 
react-native-code-push 
react-native-device-info 
react-native-google-analytics-bridge 
react-native-i18n 
react-native-push-notification 
react-native-restart 
react-native-sqlite-storage 

Settings.gradle:

include ':app' 
 
include ':react-native-sqlite-storage' 
 
project(':react-native-sqlite-storage').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-sqlite-storage/src/android') 
 
include ':react-native-restart' 
 
project(':react-native-restart').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-restart/android') 
 
include ':react-native-push-notification' 
 
project(':react-native-push-notification').projectDir = file('../node_modules/react-native-push-notification/android') 
 
include ':app', ':react-native-i18n' 
 
project(':react-native-i18n').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-i18n/android') 
 
include ':react-native-google-analytics-bridge', ':app' 
 
project(':react-native-google-analytics-bridge').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-google-analytics-bridge/android') 
 
include ':react-native-device-info' 
 
project(':react-native-device-info').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-device-info/android') 
 
include ':app', ':react-native-code-push' 
 
project(':react-native-code-push').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-code-push/android/app') 
 
include ':react-native-camera' 
 
project(':react-native-camera').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-camera/android')

的build.gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules. 
 

 
buildscript { 
 
    repositories { 
 
     jcenter() 
 
    } 
 
    dependencies { 
 
     classpath 'com.android.tools.build:gradle:2.2.2' 
 

 
     // NOTE: Do not place your application dependencies here; they belong 
 
     // in the individual module build.gradle files 
 
    } 
 
} 
 

 
allprojects { 
 
    repositories { 
 
     mavenLocal() 
 
     jcenter() 
 
     maven { 
 
      // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 
 
      url "$rootDir/../node_modules/react-native/android" 
 
     } 
 
    } 
 
}

的Android /應用/的build.gradle:

apply plugin: "com.android.application" 
 

 
import com.android.build.OutputFile 
 

 

 
apply from: "../../node_modules/react-native/react.gradle" 
 
apply from: "../../node_modules/react-native-vector-icons/fonts.gradle" 
 
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle" 
 

 
def enableSeparateBuildPerCPUArchitecture = false 
 

 
def enableProguardInReleaseBuilds = false 
 

 
android { 
 
    compileSdkVersion 23 
 
    buildToolsVersion "23.0.1" 
 

 
    defaultConfig { 
 
     applicationId "com.opencampus" 
 
     minSdkVersion 16 
 
     targetSdkVersion 22 
 
     versionCode 1 
 
     versionName "1.0" 
 
     ndk { 
 
      abiFilters "armeabi-v7a", "x86" 
 
     } 
 
    } 
 
    splits { 
 
     abi { 
 
      reset() 
 
      enable enableSeparateBuildPerCPUArchitecture 
 
      universalApk false // If true, also generate a universal APK 
 
      include "armeabi-v7a", "x86" 
 
     } 
 
    } 
 
    buildTypes { 
 
     release { 
 
      minifyEnabled enableProguardInReleaseBuilds 
 
      proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 
 
     } 
 
    } 
 
    // applicationVariants are e.g. debug, release 
 
    applicationVariants.all { variant -> 
 
     variant.outputs.each { output -> 
 
      // For each separate APK per architecture, set a unique version code as described here: 
 
      // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits 
 
      def versionCodes = ["armeabi-v7a":1, "x86":2] 
 
      def abi = output.getFilter(OutputFile.ABI) 
 
      if (abi != null) { // null for the universal-debug, universal-release variants 
 
       output.versionCodeOverride = 
 
         versionCodes.get(abi) * 1048576 + defaultConfig.versionCode 
 
      } 
 
     } 
 
    } 
 
} 
 

 
dependencies { 
 
    compile fileTree(dir: "libs", include: ["*.jar"]) 
 
    compile "com.android.support:appcompat-v7:23.0.1" 
 
    compile "com.facebook.react:react-native:+" // From node_modules 
 
    compile project(':react-native-sqlite-storage') 
 
    compile project(':react-native-restart') 
 
    compile project(':react-native-push-notification') 
 
    compile ('com.google.android.gms:play-services-gcm:9.8.0') { 
 
     force = true; 
 
    } 
 
    compile project(':react-native-i18n') 
 
    compile project(':react-native-google-analytics-bridge') 
 
    compile project(':react-native-device-info') 
 
    compile project(':react-native-code-push') 
 
    compile project(':react-native-camera') 
 
} 
 

 
task copyDownloadableDepsToLibs(type: Copy) { 
 
    from configurations.compile 
 
    into 'libs' 
 
}

AndroidManifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
 
    package="com.opencampus" 
 
    android:versionCode="1" 
 
    android:versionName="1.0"> 
 

 
    <uses-permission android:name="android.permission.INTERNET" /> 
 
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> 
 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
 
    <uses-permission android:name="android.permission.BLUETOOTH"/> 
 
    <permission 
 
     android:name="${applicationId}.permission.C2D_MESSAGE" 
 
     android:protectionLevel="signature" /> 
 
    <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" /> 
 
    <uses-permission android:name="android.permission.VIBRATE" /> 
 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
 

 
    <uses-sdk 
 
     android:minSdkVersion="16" 
 
     android:targetSdkVersion="22" /> 
 

 
    <application 
 
     android:name=".MainApplication" 
 
     android:allowBackup="true" 
 
     android:label="@string/app_name" 
 
     android:icon="@mipmap/ic_launcher" 
 
     android:theme="@style/AppTheme"> 
 
     <activity 
 
     android:name=".MainActivity" 
 
     android:label="@string/app_name" 
 
     android:windowSoftInputMode="adjustResize" 
 
     android:configChanges="keyboard|keyboardHidden|orientation|screenSize"> 
 
     <intent-filter> 
 
      <action android:name="android.intent.action.MAIN" /> 
 
      <category android:name="android.intent.category.LAUNCHER" /> 
 
     </intent-filter> 
 
     </activity> 
 
     <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" /> 
 

 
     <receiver 
 
      android:name="com.google.android.gms.gcm.GcmReceiver" 
 
      android:exported="true" 
 
      android:permission="com.google.android.c2dm.permission.SEND" > 
 
      <intent-filter> 
 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
 
       <category android:name="${applicationId}" /> 
 
      </intent-filter> 
 
     </receiver> 
 

 
     <receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" /> 
 
     <receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver"> 
 
      <intent-filter> 
 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
 
      </intent-filter> 
 
     </receiver> 
 
     <service android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationRegistrationService"/> 
 
     <service 
 
      android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService" 
 
      android:exported="false" > 
 
      <intent-filter> 
 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
 
      </intent-filter> 
 
     </service> 
 
    </application> 
 

 
</manifest>

MainApplication.java:

package com.opencampus; 
 

 
import android.app.Application; 
 
import android.util.Log; 
 

 
import com.facebook.react.ReactApplication; 
 
import com.facebook.react.ReactInstanceManager; 
 
import com.facebook.react.ReactNativeHost; 
 
import com.facebook.react.ReactPackage; 
 
import com.facebook.react.shell.MainReactPackage; 
 
import com.facebook.soloader.SoLoader; 
 

 
import java.util.Arrays; 
 
import java.util.List; 
 

 
import com.avishayil.rnrestart.ReactNativeRestartPackage; 
 
import com.dieam.reactnativepushnotification.ReactNativePushNotificationPackage; 
 
import com.i18n.reactnativei18n.ReactNativeI18n; 
 
import com.idehub.GoogleAnalyticsBridge.GoogleAnalyticsBridgePackage; 
 
import com.learnium.RNDeviceInfo.RNDeviceInfo; 
 
import com.microsoft.codepush.react.CodePush; 
 
import com.lwansbrough.RCTCamera.RCTCameraPackage; 
 
import org.pgsqlite.SQLitePluginPackage; 
 

 
public class MainApplication extends Application implements ReactApplication { 
 

 
    private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { 
 
    @Override 
 
    protected boolean getUseDeveloperSupport() { 
 
     return BuildConfig.DEBUG; 
 
    } 
 

 
    // 2. Override the getJSBundleFile method in order to let 
 
    // the CodePush runtime determine where to get the JS 
 
    // bundle location from on each app start 
 
    @Override 
 
    protected String getJSBundleFile() { 
 
     return CodePush.getJSBundleFile(); 
 
    } 
 

 
    @Override 
 
    protected List<ReactPackage> getPackages() { 
 
     return Arrays.<ReactPackage>asList(
 
      new MainReactPackage(), 
 
      new SQLitePluginPackage(), 
 
      new MainReactPackage(), 
 
      new ReactNativePushNotificationPackage(), 
 
      new ReactNativeI18n(), 
 
      new GoogleAnalyticsBridgePackage(), 
 
      new RNDeviceInfo(), 
 
      new CodePush("-", MainApplication.this, BuildConfig.DEBUG), 
 
      new RCTCameraPackage() 
 
    ); 
 
    } 
 
    }; 
 

 
    @Override 
 
    public ReactNativeHost getReactNativeHost() { 
 
    return mReactNativeHost; 
 
    } 
 

 
    @Override 
 
    public void onCreate() { 
 
    super.onCreate(); 
 
    SoLoader.init(this, /* native exopackage */ false); 
 
    } 
 
}

任何解決方案嗎?

回答

7

我發現了這個問題。在MainApplication.java中,新的MainReactPackage()包含兩次。

package com.opencampus; 

import android.app.Application; 
import android.util.Log; 

import com.facebook.react.ReactApplication; 
import com.facebook.react.ReactInstanceManager; 
import com.facebook.react.ReactNativeHost; 
import com.facebook.react.ReactPackage; 
import com.facebook.react.shell.MainReactPackage; 
import com.facebook.soloader.SoLoader; 

import java.util.Arrays; 
import java.util.List; 

import com.avishayil.rnrestart.ReactNativeRestartPackage; 
import com.dieam.reactnativepushnotification.ReactNativePushNotificationPackage; 
import com.i18n.reactnativei18n.ReactNativeI18n; 
import com.idehub.GoogleAnalyticsBridge.GoogleAnalyticsBridgePackage; 
import com.learnium.RNDeviceInfo.RNDeviceInfo; 
import com.microsoft.codepush.react.CodePush; 
import com.lwansbrough.RCTCamera.RCTCameraPackage; 
import org.pgsqlite.SQLitePluginPackage; 

public class MainApplication extends Application implements ReactApplication { 

    private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { 
    @Override 
    protected boolean getUseDeveloperSupport() { 
     return BuildConfig.DEBUG; 
    } 

    // 2. Override the getJSBundleFile method in order to let 
    // the CodePush runtime determine where to get the JS 
    // bundle location from on each app start 
    @Override 
    protected String getJSBundleFile() { 
     return CodePush.getJSBundleFile(); 
    } 

    @Override 
    protected List<ReactPackage> getPackages() { 
     return Arrays.<ReactPackage>asList(
      new MainReactPackage(), 
      new SQLitePluginPackage(), 
      new MainReactPackage(), **<<<<< **** included two times** 
      new ReactNativePushNotificationPackage(), 
      new ReactNativeI18n(), 
      new GoogleAnalyticsBridgePackage(), 
      new RNDeviceInfo(), 
      new CodePush("-", MainApplication.this, BuildConfig.DEBUG), 
      new RCTCameraPackage() 
    ); 
    } 
    }; 

    @Override 
    public ReactNativeHost getReactNativeHost() { 
    return mReactNativeHost; 
    } 

    @Override 
    public void onCreate() { 
    super.onCreate(); 
    SoLoader.init(this, /* native exopackage */ false); 
    } 
} 
+0

你是否自己添加它或什麼? :D –

+0

@HenrikR你是什麼意思?是的,這是我自己的錯誤 – Ataomega