1

나는 여러 가지 맛의 안드로이드 애플 리케이션을 가지고. 패키지 이름은 두 가지 유형 (com.mycompany.base)에서 동일합니다. 앱 레벨 gradle 파일에서 두 가지 맛은 고유 한 애플리케이션 ID (com.mycompany.firstflavor 및 com.mycompany.secondflavor)를가집니다.FCM - onTokenRefresh는 멀티 맛의 안드로이드 애플 리케이션에서 결코 호출되지 않습니다

예전에는지도와 같은 Google Play 서비스의 경우 애플리케이션 ID를 모두 사용하고 두 가지 맛의 정보가 포함 된 google-services.json 파일을 받았습니다. 난 단지 내 애플 리케이션에이 json 파일을 복사해야하며 모든 일을 잘.

최근에는 푸시 알림을 구현하기 위해 FCM 프로젝트를 만들었고 이전과 같이 애플리케이션 ID를 사용하여 각 풍미를 앱으로 추가했습니다. 처음에는 응용 프로그램의 제안 된 위치에 하나의 json 파일 만 포함 시켰습니다. 한 가지 맛으로 앱을 실행했을 때 Firebase가 성공적으로 초기화되었다고합니다. 그러나 onTokenRefresh 메서드는 호출되지 않습니다. 인터넷에서 검색 한 결과 몇 가지 관련 주제가 있었지만 내 경우에는 아무런 해결책도 없었습니다. 다른 맛으로 앱을 실행하면 다음과 같은 오류 메시지가 표시되어 앱이 계속 충돌합니다. java.lang.NoSuchMethodError : 정적 메서드 없음 zzb (Ljava/lang/Object; Ljava/lang/Object;) Ljava/lang/Object; Lcom/google/android/gms/common/internal/zzab 클래스의 또는 슈퍼 클래스 ('com.google.android.gms.common.internal.zzab'선언은 /data/app/com.suran.dwmobile-2/base.apk:classes2.dex에 표시됨). 문제는 실제 기기와 시뮬레이터 모두에서 발생했습니다. 그런 다음 온라인으로 읽은 일부 제안 된대로 json 파일을 두 위치에 복사했습니다. 이제 동일한 json 파일이 app/src/firstflavor 및 app/src/secondflavor와 같은 각 flavo 아래의 두 위치에 나타납니다. 그러나 이것은 전혀 도움이되지 않았고 나는 여전히 같은 문제가있었습니다. 그리고 이것은 단지 디버그 모드입니다.

릴리스 변형 세트로 앱을 실행했을 때 두 가지 버전 모두에서 오류 메시지가 표시됩니다. com.android.build.api.transform.TransformException : java.util.zip.ZipException : 중복 항목 : com/google/android/gms/common/internal/zzv $ zza $ zza.class. 비슷한 문제에 대한 답변을 찾았지만 아무도 내 문제를 해결할 수 없습니다. 여기

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:amazon="http://schemas.amazon.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    package="com.mycompany.base" 
    android:versionCode="1" 
    android:versionName="1.0"> 

    <uses-sdk 
     android:minSdkVersion="10" 
     android:targetSdkVersion="21" 
    /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.GET_TASKS" /> 
    <uses-permission android:name="archos.permission.FULLSCREEN.FULL" /> 
    <uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/> 
    <uses-permission android:name="android.permission.SEND_SMS" android:required="false" /> 
    <uses-permission android:name="android.permission.CAMERA" android:required="false"/> 

    <uses-feature android:name="android.permission.ACCESS_NETWORK_STATE" android:required="false"/> 
    <uses-feature android:name="android.permission.ACCESS_COARSE_LOCATION" android:required="false" /> 
    <uses-feature android:name="android.permission.ACCESS_FINE_LOCATION" android:required="false" /> 

    <uses-feature android:name="android.hardware.camera" android:required="false" /> 
    <uses-feature android:name="android.hardware.camera.front" android:required="false" /> 
    <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" /> 
    <uses-feature android:name="android.hardware.telephony" android:required="false" /> 
    <uses-feature android:glEsVersion="0x00020000" android:required="false"/> 

    <application 
    android:name=".application.BaseApplication" 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:largeHeap="true" 
    android:theme="@style/CompanyTheme" 
    > 
     <service android:name=".FBInstanceService"> 
      <intent-filter> 
       <action android:name="come.google.firebase.INSTANCE_ID_EVENT" /> 
      </intent-filter> 
     </service> 

     <service android:name=".FBMessagingService"> 
      <intent-filter> 
       <action android:name="com.google.firebase.MESSAGING_EVENT" /> 
      </intent-filter> 
     </service> 
    </application> 
</manifest> 

내 응용 프로그램 수준 Gradle을 파일입니다 :

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion '25.0.0' 
    useLibrary 'org.apache.http.legacy' 

    defaultConfig { 
     minSdkVersion 10 
     targetSdkVersion 23 
     multiDexEnabled true 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 

    } 

    signingConfigs { 
     firstflavorRelease { 
      storeFile file("XXXXXX.jks"); 
      storePassword("XXXXXXX"); 
      keyAlias "XXXXXXX"; 
      keyPassword "XXXXXXX"; 
     } 

     secondflavorRelease { 
      storeFile file("XXXXXXX.jks"); 
      storePassword("XXXXXXXX"); 
      keyAlias "XXXXXXXXX"; 
      keyPassword "XXXXXXXX"; 
     } 
    } 

    buildTypes { 
     release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 

    } 

    productFlavors { 
     firstflavor { 
      applicationId = "com.mycompany.firstflavor" 
      signingConfig signingConfigs.firstflavorRelease 
      versionCode 1000 
      versionName "1.9.2" 
     } 

     secondflavor { 
      applicationId = "com.mycompany.secondflavor" 
      signingConfig signingConfigs.secondflavorRelease 
      versionCode 1000 
      versionName "1.2.2" 
     } 
    } 

    testOptions { 
     unitTests.returnDefaultValues = true 
    } 
} 

dependencies { 
    compile project(':myappCore') 
    compile files('libs/amazonmaps-1.0.2.jar') 
    compile files('libs/zbar.jar') 
    testCompile 'junit:junit:4.12' 
    testCompile 'org.mockito:mockito-core:1.9.5' 
    androidTestCompile 'com.linkedin.dexmaker:dexmaker-mockito:2.2.0' 

    androidTestCompile 'com.android.support:support-annotations:23.4.0' 
    androidTestCompile 'com.android.support.test:runner:0.5' 
    androidTestCompile 'com.android.support.test:rules:0.5' 
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' 
    androidTestCompile "com.android.support.test.espresso:espresso-intents:2.2.1" 
    testCompile 'org.powermock:powermock-api-mockito:1.6.1' 
    testCompile 'org.powermock:powermock-module-junit4-rule-agent:1.6.1' 
    testCompile 'org.powermock:powermock-module-junit4-rule:1.6.1' 
    testCompile 'org.powermock:powermock-module-junit4:1.6.1' 
    testCompile "org.robolectric:robolectric:3.2.2" 


    compile 'com.android.support:appcompat-v7:23.4.0' 
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' 
    compile 'com.google.code.gson:gson:2.2.4' 
    compile 'com.google.android.gms:play-services-maps:9.0.0' 
    compile 'com.google.android.gms:play-services-gcm:9.0.0' 
    compile 'com.google.android.gms:play-services-auth:9.0.0' 
    compile 'com.android.support:support-v4:23.4.0' 
    compile 'com.android.support:mediarouter-v7:23.4.0' 
    compile 'com.google.firebase:firebase-core:9.2.1' 
    compile 'com.google.firebase:firebase-messaging:9.2.1' 
    compile 'org.jsoup:jsoup:1.10.2' 
} 

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

그리고 여기 내 프로젝트 수준 Gradle을 파일 : 여기에

은 디버깅에 유용 할 수 있습니다 내 매니페스트 파일의 일부입니다

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

allprojects { 
    repositories { 
     jcenter() 
    } 
} 

도움을 주시면 대단히 감사하겠습니다.

+0

'firebase- *'라이브러리와 일관되게 만들기 위해'play-services- *'라이브러리 버전 9.2.1을 사용하도록 빌드 의존성을 업데이트하십시오. –

+0

@BobSnyder 나는 fire-basemessaging의 버전과 일치시키기 위해 play-services-maps, play-services-gcm 및 play-services-auth의 버전을 9.2.1로 변경하라는 귀하의 제안을 따랐습니다. 사용되지 않는 MapView.getMap을 사용했기 때문에 MapFragmentFragment를 사용하도록 변경해야합니다. 변화가 있은 후에, 나는 전에 가지고 있던 오류가 사라졌고 이것은 아주 좋은 소식입니다. 그 점에 대해 대단히 감사합니다. 그러나 onTokenRefresh는 여전히 호출되지 않습니다. FirebaseInstanceId.getInstanc(). getToken()을 다른 액티비티의 다른 곳으로 호출하면 이전과 같이 토큰을 얻을 수 있습니다. 그러나 나는 그 문제를 해결했다고 생각하지 않는다. –

+0

아직 파이어베이스 메시징 서비스가 필요합니다.firebase 인스턴스 서비스의 메소드가 호출되지 않았기 때문에 메시징 서비스의 메소드가 호출 될 것이라고 생각하지 않습니다.이 메소드에는 메시지 처리가 많이 포함되어 있으며 푸시 알림 구현에 중요합니다. 나는 여전히 google-services.json 파일을 두거나 패키지 이름 대신 applicationID를 사용하는 방식에 문제가 있다고 생각합니까? 그러나 Firebase 콘솔에 packagename을 사용하여 app을 추가했습니다. 따라서 내 firebase 프로젝트에는 실제로 세 가지 응용 프로그램이 있습니다. –

답변

0

문제로 고생하고 며칠 후, 마침내 문제가있는 부분을 발견했습니다. 내 매니페스트 파일에서 서비스 작업의 Android 이름을 com.google.firebase.INSTANCE_ID_EVENT 대신 come.google.firebase.INSTANCE_ID_EVENT로 잘못 설정했습니다.

+0

하지만 다른 질문이 있습니다. 원래 게시물에서 말했듯이 각 flavor의 applicationID를 사용하여 firebase 프로젝트에서 응용 프로그램을 만들었습니다. 그러나 내 안드로이드 프로젝트의 패키지 이름은이 애플리케이션 ID와 다릅니다. –

+0

onMessageReceived()에서 firebase 메시지를 처리 ​​할 때, 내 앱이 맨 위로 갈 수있는 액티비티 스택을 만들어야합니다. 사용자가 뒤로를 클릭하면 스택을 따라 가기를 따라 가야합니다. 문제는 onMessageRecived()에서 올바르지 않은 stackBuilder.addParentStack (activity.class)을 사용할 때 activityID에 applicationID를 추가한다는 것입니다. 완전한 이름을 사용하는 것이 불가피한 경우 applicationID를 실제 패키지 이름으로 어떻게 바꿀 수 있습니까? 감사 –