【问题标题】:One Signal missing support library- Android SDKOne Signal 缺少支持库 - Android SDK
【发布时间】:2018-10-21 00:12:09
【问题描述】:

更新 我添加到 proguard rules -keep class firebase,所以现在我可以获得 GCM 令牌。 但是 OneSignal 检测到我的应用仍然缺少 Android 支持库。 我之前有一个应用程序,我可以在其中构建一个签名的 apk 并使用 One Signal。 但是现在当我检查这个应用程序时,我体验到我能够使用 Build->Build APK(s) 将 minifyEnabled 设置为 false 来构建调试 apk,但是当我将 minifyEnabled 设置为 true 时,我得到了同样的错误项目也。 在我尝试添加 -keep class com.android.support. ** 和 -keep interface com.android.support. ** 但 One Signal 仍然检测到我的应用不包含支持库(无论如何支持库??)。

我在我的应用中实现了 One Signal。 如果我在 Android Studio 中通过“运行应用程序”启动应用程序,一切正常。 但是,如果我通过“Build->Build apk(s)”构建了一个 Apk,或者我生成了一个签名的 apk,那么在我安装它之后,一个 Signal 仪表板会显示“缺少 Android 支持库”。 我已经阅读了 One Signal 网站上的全天教程,但我无法解决这个问题。 我该如何解决?

我收到此错误

05-10 21:12:21.054 17990-18243/com.aff.index.main.debug E/OneSignal:获取 GCM 令牌的未知错误 java.lang.NoClassDefFoundError:解析失败:Lcom/google/android/gms/gcm/GoogleCloudMessaging; 在 com.onesignal.av.a(PushRegistratorGCM.java:41) 在 com.onesignal.at.a(PushRegistratorAbstractGoogle.java:97) 在 com.onesignal.at.a(PushRegistratorAbstractGoogle.java:37) 在 com.onesignal.at$1.run(PushRegistratorAbstractGoogle.java:84) 在 java.lang.Thread.run(Thread.java:762) 原因:java.lang.ClassNotFoundException:在路径上找不到类“com.google.android.gms.gcm.GoogleCloudMessaging”:DexPathList [[zip 文件“/system/framework/com.sec.android.app.multiwindow .jar", zip 文件 "/data/app/com.aff.index.main.debug-1/base.apk"],nativeLibraryDirectories=[/data/app/com.aff.index.main.debug-1/ lib/arm64, /data/app/com.aff.index.main.debug-1/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]] 在 dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:380) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:312) 在 com.onesignal.av.a(PushRegistratorGCM.java:41) 在 com.onesignal.at.a(PushRegistratorAbstractGoogle.java:97) 在 com.onesignal.at.a(PushRegistratorAbstractGoogle.java:37) 在 com.onesignal.at$1.run(PushRegistratorAbstractGoogle.java:84) 在 java.lang.Thread.run(Thread.java:762)

【问题讨论】:

  • 同样的问题
  • 我现在通过设置 minifyEnabled=false 和 multidexEnable=true 解决了(因为没有它,我无法构建我的应用,因为 65k 方法限制)。
  • @user3057944 显示你的 progurd-rules 和 gradle 文件

标签: android android-support-library onesignal


【解决方案1】:

经过大量尝试和错误,我刚刚找到了解决方案,我在 app/build.gradle 中使用了这些行:

plugins {
    id 'com.onesignal.androidsdk.onesignal-gradle-plugin' version '0.8.1'
}
apply plugin: 'com.onesignal.androidsdk.onesignal-gradle-plugin'

apply plugin: 'com.android.application'

android {
    ...
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    ...
    implementation 'com.onesignal:OneSignal:**3.8.4**'
}

apply plugin: 'com.google.gms.google-services'

注意:3.8.4 是重点,它被用来代替 [3.8.3, 3.99.99]

以及 project/build.gradle 中的这些依赖项:

buildscript {
    repositories {
        jcenter()
        google()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath 'com.google.gms:google-services:3.2.0'
    }
}

allprojects {
    repositories {
        jcenter()
        google()
        mavenCentral()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

【讨论】:

    【解决方案2】:

    这是 OneSignal v3.9.0 的问题。将这些行添加到您的 proguard 规则中:

    -keep class android.support.v4.view.MenuCompat
    -keep class android.support.v4.content.WakefulBroadcastReceiver
    -keep class android.support.v4.app.NotificationManagerCompat
    -keep class android.support.v4.app.JobIntentService
    -keep class com.google.firebase.messaging.FirebaseMessaging
    

    他们的存储库中有一个已关闭的问题 https://github.com/OneSignal/OneSignal-Android-SDK/issues/533

    OneSignal v3.9.0 的完整工作 proguard 规则:

    -dontwarn com.onesignal.**
    
    # These 2 methods are called with reflection.
    -keep class com.google.android.gms.common.api.GoogleApiClient {
        void connect();
        void disconnect();
    }
    
    
    -keep class com.onesignal.ActivityLifecycleListenerCompat** {*;}
    
    
    # Observer backcall methods are called with reflection
    -keep class com.onesignal.OSSubscriptionState {
        void changed(com.onesignal.OSPermissionState);
    }
    
    -keep class com.onesignal.OSPermissionChangedInternalObserver {
        void changed(com.onesignal.OSPermissionState);
    }
    
    -keep class com.onesignal.OSSubscriptionChangedInternalObserver {
        void changed(com.onesignal.OSSubscriptionState);
    }
    
    -keep class ** implements com.onesignal.OSPermissionObserver {
        void onOSPermissionChanged(com.onesignal.OSPermissionStateChanges);
    }
    
    -keep class ** implements com.onesignal.OSSubscriptionObserver {
        void onOSSubscriptionChanged(com.onesignal.OSSubscriptionStateChanges);
    }
    
    -keep class com.onesignal.shortcutbadger.impl.AdwHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.ApexHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.AsusHomeLauncher { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.DefaultBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.EverythingMeHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.HuaweiHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.LGHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.NewHtcHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.NovaHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.OPPOHomeBader { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.SamsungHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.SonyHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.VivoHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.XiaomiHomeBadger { <init>(...); }
    -keep class com.onesignal.shortcutbadger.impl.ZukHomeBadger { <init>(...); }
    
    -dontwarn com.google.firebase.messaging.**
    -dontwarn com.amazon.**
    
    # Proguard ends up removing this class even if it is used in AndroidManifest.xml so force keeping it.
    -keep public class com.onesignal.ADMMessageHandler {*;}
    
    -keep class com.onesignal.JobIntentService$* {*;}
    
    -keep class com.onesignal.OneSignalUnityProxy {*;}
    
    -keep class android.support.v4.view.MenuCompat
    -keep class android.support.v4.content.WakefulBroadcastReceiver
    -keep class android.support.v4.app.NotificationManagerCompat
    -keep class android.support.v4.app.JobIntentService
    -keep class com.google.firebase.messaging.FirebaseMessaging
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多