在路径:DexPathList上找不到类“ com.onesignal.GcmBroadcastReceiver”

问题描述

我是Xamarin的新手,正在尝试让Onesignal推送通知在Android中工作。运行模拟器时,我从Onesignal发出了一个推送通知,该通知成功地在模拟器上通过。但是,当我通过Play商店部署应用程序并打开应用程序时,触发推送通知会使应用程序崩溃,并出现以下错误

java.lang.RuntimeException: Unable to instantiate receiver com.onesignal.GcmbroadcastReceiver: java.lang.classNotFoundException: Didn't find class "com.onesignal.GcmbroadcastReceiver" on path: DexPathList[[zip file "/data/app/com.woodfordgroup.whybuycars-Bl5_t81uXklo5mpGZRvJcw==/base.apk"],nativeLibraryDirectories=[/data/app/com.woodfordgroup.whybuycars-Bl5_t81uXklo5mpGZRvJcw==/lib/arm64,/data/app/com.woodfordgroup.whybuycars-Bl5_t81uXklo5mpGZRvJcw==/base.apk!/lib/arm64-v8a,/system/lib64]]
    at android.app.ActivityThread.handleReceiver(ActivityThread.java:3432)
    at android.app.ActivityThread.access$1400(ActivityThread.java:207)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1712)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:201)
    at android.app.ActivityThread.main(ActivityThread.java:6831)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:927)
Caused by: java.lang.classNotFoundException: Didn't find class "com.onesignal.GcmbroadcastReceiver" on path: DexPathList[[zip file "/data/app/com.woodfordgroup.whybuycars-Bl5_t81uXklo5mpGZRvJcw==/base.apk"],/system/lib64]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:171)
    at java.lang.classLoader.loadClass(ClassLoader.java:379)
    at java.lang.classLoader.loadClass(ClassLoader.java:312)
    at android.app.AppComponentFactory.instantiateReceiver(AppComponentFactory.java:84)
    at androidx.core.app.CoreComponentFactory.instantiateReceiver(UnkNown Source:0)
    at android.app.ActivityThread.handleReceiver(ActivityThread.java:3425)
    ... 8 more

这是因为版本中未包含Onesignal库吗?我也看到过提及AndroidX或多dex问题。这是android清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="15" android:versionName="1.0" package="com.woodfordgroup.whybuycars" android:installLocation="auto">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29" />
    <application android:label="WhyBuyCars" android:theme="@style/MainTheme" android:icon="@drawable/whybuycars_icon_512x512">
        <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true">
            <Meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" />
        </provider>
        <receiver android:name="com.onesignal.GcmbroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.woodfordgroup.whybuycars" />
            </intent-filter>
        </receiver>
    </application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-feature android-name="android.hardware.camera" android:required="false" android:glEsversion="0x00030002" />
    <permission android:name="com.woodfordgroup.whybuycars.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="com.woodfordgroup.whybuycars.permission.C2D_MESSAGE" />
</manifest>

这是我的android项目属性(目标版本为29):

enter image description here

我还想知道在我从Nuget安装Onesignal时是否由于包含各种库而出错。这是我的项目参考列表:

enter image description here

解决方法

我遇到了完全相同的问题,如果在设置中禁用 R8 代码收缩器(或在 android .csproject 文件中的 <AndroidR8ExtraArguments>--no-tree-shaking</AndroidR8ExtraArguments> 之后添加 <AndroidLinkTool>r8</AndroidLinkTool>),我可以收到通知而不会崩溃。 onesignal 广播接收器类的收缩器似乎存在一些问题

,

将此添加到 proguard 文件中。

-keep class com.onesignal.** { *; }

来源:参见 oncky 对问题的评论。