1

我有一個多風味的Android應用程序。兩種口味(com.mycompany.base)的包名稱相同。在應用程序級gradle文件中,這兩種風格都有自己的應用程序ID(com.mycompany.firstflavor和com.mycompany.secondflavor)。FCM - onTokenRefresh從未被稱爲多風味的Android應用程序

過去,對於地圖等谷歌播放服務,我使用了兩個應用程序ID並獲取包含兩種風格信息的google-services.json文件。我只需要將這個json文件複製到我的應用程序中,一切正常。

最近我創建了一個FCM項目來實現推送通知,並像以前一樣使用它們的應用程序ID將每個flavor添加爲應用程序。起初,我只在應用程序中的建議位置包含了一個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文件現在出現在兩個地方,每個flavo下,例如app/src/firstflavor和app/src/secondflavor。但是這根本沒有幫助,我仍然有同樣的問題。這只是調試模式。

當我運行與生成變體設置爲釋放的應用程序,與兩種口味,我得到了錯誤消息:com.android.build.api.transform.TransformException:java.util.zip.ZipException:重複條目:com /谷歌/安卓/ GMS /普通/內部/ 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

更新您的構建依賴關係,使用「play-services- *」庫的9.2.1版本使其與「firebase- *」庫一致。 –

+0

@BobSnyder我按照你的建議,將play-services-maps,play-services-gcm和play-services-auth的版本更改爲9.2.1,以匹配fire-basemessaging的版本。因爲我使用了棄用的MapView.getMap,所以我必須將其更改爲使用MapFragmentFragment。變化之後,我以前的錯誤消失了,這是個好消息。非常感謝你。但onTokenRefresh仍然沒有被調用。如果我在其中一個活動中的其他位置調用FirebaseInstanceId.getInstanc()。getToken(),我可以像之前那樣獲取該標記。但我認爲這不能解決問題。 –

+0

我仍然需要Firebase消息傳遞服務。由於未調用Firebase實例服務的方法,因此我不認爲消息傳遞服務中的方法將被調用,其中包括我對消息的大量處理,並且對於推送通知實現很重要。我仍然認爲我放置google-services.json文件的方式有問題,或者使用applicationID而不是包名?但我也在我的Firebase控制檯中使用軟件包名稱添加了應用程序。因此,我的Firebase項目實際上有三個應用程序。 –

回答

0

經過幾天的爭論,我終於找到問題所在。在我的清單文件中,我錯誤地將服務操作的android名稱設置爲:come.google.firebase.INSTANCE_ID_EVENT,而不是com.google.firebase.INSTANCE_ID_EVENT。

+0

但我確實有另外一個問題。正如我在原始文章中所說的,我使用每個flavor的applicationID在我的firebase項目中創建應用程序。但是,我的android項目的包名稱與這些應用程序ID不同。 –

+0

當我在onMessageReceived()中處理firebase消息時,我需要構建一堆活動,其中我的應用可以轉到頂層。當用戶點擊後,它應該跟隨堆棧從頂部開始下一個,依此類推。問題是,在onMessageRecived()中,當我使用stackBuilder.addParentStack(activity.class)時,它會將applicationID附加到活動名稱,這是不正確的。如果使用完全限定名稱是不可避免的,我怎樣才能用真正的包名替換applicationID?謝謝 –

相關問題