我开发了一个React Native应用,从0.54升级到0.59.1后,由于以下错误,该应用不再在设备上运行:
java.lang.RuntimeException:无法启动活动ComponentInfo {com.ferrometal12 / host.exp.exponent.MainActivity}:java.lang.NullPointerException:尝试调用虚拟方法'boolean java.lang.String.equals(java .lang.Object)”上的空对象引用 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778) 在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 在android.app.ActivityThread.-wrap11(未知来源:0) 在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1589) 在android.os.Handler.dispatchMessage(Handler.java:106) 在android.os.Looper.loop(Looper.java:164) 在android.app.ActivityThread.main(ActivityThread.java:6501) 在java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:438) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'boolean java.lang.String.equals(java.lang.Object)' 在host.exp.exponent.ExponentManifest.fetchCachedManifest(ExponentManifest.java:292) 在host.exp.exponent.AppLoader.start(AppLoader.java:78) 在host.exp.exponent.experience.DetachActivity.onCreate(DetachActivity.java:88) 在android.app.Activity.performCreate(Activity.java:7026) 在android.app.Activity.performCreate(Activity.java:7017) 在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215) 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731) 在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 在android.app.ActivityThread.-wrap11(未知来源:0) 在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1589) 在android.os.Handler.dispatchMessage(Handler.java:106) 在android.os.Looper.loop(Looper.java:164) 在android.app.ActivityThread.main(ActivityThread.java:6501) 在java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:438) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
我不知道升级后发生了什么,但我不再能够成功运行该应用程序,gradle能够成功构建并安装了该应用程序,但是当它打开时会崩溃!
知道我想念什么吗?
我的清单文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<manifest
package="host.exp.exponent"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<permission
android:name="com.ferrometal12.permission.C2D_MESSAGE"
android:protectionLevel="signature"/>
<uses-permission android:name="com.ferrometal12.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- ADD PERMISSIONS HERE -->
<!-- BEGIN OPTIONAL PERMISSIONS -->
<!-- <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />-->
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- <uses-permission android:name="android.permission.USE_FINGERPRINT" />-->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<!-- These require runtime permissions on M -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- <uses-permission android:name="android.permission.CAMERA" />-->
<!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->
<!-- <uses-permission android:name="android.permission.READ_CALENDAR" />-->
<!-- <uses-permission android:name="android.permission.WRITE_CALENDAR" />-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- <uses-permission android:name="android.permission.RECORD_AUDIO" />-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- <uses-permission android:name="android.permission.WRITE_SETTINGS" />-->
<!-- END OPTIONAL PERMISSIONS -->
<!-- ADD TEST PERMISSIONS HERE -->
<uses-feature android:glEsVersion="0x00020000" android:required="false" />
<application
android:name=".MainApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true">
<activity
android:name=".LauncherActivity"
android:exported="true"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
<!-- ADD SHELL SCHEME HERE -->
</activity>
<activity
android:name=".experience.ExperienceActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:theme="@style/Theme.Exponent.Light"
android:windowSoftInputMode="adjustResize">
</activity>
<activity
android:name=".MainActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:theme="@style/Theme.Exponent.Splash"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".experience.ShellAppActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:theme="@style/Theme.Exponent.Splash"
android:windowSoftInputMode="adjustResize">
<!-- ADD SHELL INTENT FILTERS HERE -->
</activity>
<activity
android:name=".experience.HomeActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@style/Theme.Exponent.Light">
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity"/>
<!-- ADD DEV SETTINGS HERE -->
<activity android:name="abi26_0_0.com.facebook.react.devsupport.DevSettingsActivity"/>
<activity android:name="abi25_0_0.com.facebook.react.devsupport.DevSettingsActivity"/>
<activity android:name="abi24_0_0.com.facebook.react.devsupport.DevSettingsActivity"/>
<activity android:name="abi23_0_0.com.facebook.react.devsupport.DevSettingsActivity"/>
<activity android:name="abi22_0_0.com.facebook.react.devsupport.DevSettingsActivity"/>
<activity android:name="abi21_0_0.com.facebook.react.devsupport.DevSettingsActivity"/>
<activity android:name="abi20_0_0.com.facebook.react.devsupport.DevSettingsActivity"/>
<activity
android:name=".ExponentDevActivity"
android:exported="true"
android:label="@string/dev_activity_name"
android:screenOrientation="portrait"
android:theme="@style/Theme.Exponent.Dark"
android:windowSoftInputMode="adjustPan">
</activity>
<activity
android:name=".oauth.OAuthWebViewActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.Exponent.Light">
</activity>
<activity
android:name="net.openid.appauth.RedirectUriReceiverActivity"
tools:node="replace">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="com.ferrometal12" android:path="oauthredirect"
tools:ignore="AppLinkUrlError" />
</intent-filter>
</activity>
<activity
android:name=".oauth.OAuthResultActivity">
</activity>
<activity
android:name=".chrometabs.ChromeTabsManagerActivity">
</activity>
<activity
android:name=".experience.ErrorActivity"
android:theme="@style/Theme.Exponent.Dark"
android:screenOrientation="portrait">
</activity>
<activity
android:name=".experience.InfoActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.Exponent.Light">
</activity>
<activity
android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
tools:replace="android:theme" />
<activity
android:name="com.facebook.ads.InterstitialAdActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<service
android:name=".ExponentIntentService"
android:exported="false" />
<!-- Analytics -->
<receiver
android:name="host.exp.exponent.referrer.InstallReferrerReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
<!--
This crashes: https://code.google.com/p/analytics-issues/issues/detail?id=667
TODO: turn it back on when it's fixed
<service
android:name="com.google.android.gms.analytics.CampaignTrackingService"
android:enabled="true"
android:exported="false" />-->
<receiver android:name="com.google.android.gms.analytics.AnalyticsReceiver"
android:enabled="true">
<intent-filter>
<action android:name="com.google.android.gms.analytics.ANALYTICS_DISPATCH" />
</intent-filter>
</receiver>
<service android:name="com.google.android.gms.analytics.AnalyticsService"
android:enabled="true"
android:exported="false"/>
<!-- ImagePicker native module -->
<activity
android:name="com.theartofdev.edmodo.cropper.CropImageActivity"
android:theme="@style/Base.Theme.AppCompat">
</activity>
<!-- ADD FABRIC CONFIG HERE -->
<!-- BEGIN FABRIC CONFIG -->
<meta-data
android:name="io.fabric.ApiKey"
android:value="a25fafe9f9edee11a9882b32e0cd7a26df6e2c42"/>
<!-- END FABRIC CONFIG -->
<!-- ADD GOOGLE MAPS CONFIG HERE -->
<!-- BEGIN GOOGLE MAPS CONFIG -->
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="AIzaSyCPyKmt6in3JwAsogYikNNjor8qgU9stRQ"/>
<!-- END GOOGLE MAPS CONFIG -->
<!-- ADD BRANCH CONFIG HERE -->
<!-- The Facebook SDK runs FacebookInitProvider on startup and crashes if there isn't an ID here -->
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="fb0"/>
</application>
</manifest>
MainActivity.java如下所示:
package host.exp.exponent;
import android.os.Bundle;
import com.facebook.react.ReactPackage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import host.exp.exponent.generated.DetachBuildConstants;
import host.exp.exponent.experience.DetachActivity;
public class MainActivity extends DetachActivity {
@Override
public String publishedUrl() {
return "exp://exp.host/@lulzimfazlija/ferrometal12";
}
@Override
public String developmentUrl() {
return DetachBuildConstants.DEVELOPMENT_URL;
}
@Override
public List<String> sdkVersions() {
return new ArrayList<>(Arrays.asList("26.0.0"));
}
@Override
public List<ReactPackage> reactPackages() {
return ((MainApplication) getApplication()).getPackages();
}
@Override
public boolean isDebug() {
return BuildConfig.DEBUG;
}
@Override
public Bundle initialProps(Bundle expBundle) {
// Add extra initialProps here
return expBundle;
}
}
MainApplication。 Java看起来像:
package host.exp.exponent;
import com.facebook.react.ReactPackage;
import java.util.Arrays;
import java.util.List;
// Needed for `react-native link`
// import com.facebook.react.ReactApplication;
public class MainApplication extends ExpoApplication {
@Override
public boolean isDebug() {
return BuildConfig.DEBUG;
}
// Needed for `react-native link`
public List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
// Add your own packages here!
// TODO: add native modules!
// Needed for `react-native link`
// new MainReactPackage()
);
}
@Override
public String gcmSenderId() {
return getString(R.string.gcm_defaultSenderId);
}
@Override
public boolean shouldUseInternetKernel() {
return BuildVariantConstants.USE_INTERNET_KERNEL;
}
}