草庐IT

android - 重复条目 : com/google/android/gms/internal/zzahl. 类

coder 2023-12-09 原文

这是我在构建项目时遇到的错误:

Error:Execution failed for task ':transformClassesWithJarMergingForDebug'.
com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/google/android/gms/internal/zzahl.class

我似乎无法弄清楚是什么导致了错误,我怀疑这是我在我的 gradle 或 Java Activity 中搞砸了。这是代码:

Gradle :

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.2'
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.13.0' // version plugin support
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        classpath 'com.google.gms:google-services:3.0.0'
    }
}

plugins {
    id "org.sonarqube" version "2.1" // https://plugins.gradle.org/plugin/org.sonarqube
}

apply plugin: 'com.android.application'
apply plugin: 'com.github.ben-manes.versions' // ./gradlew dependencyUpdates -Drevision=release
apply plugin: 'sonar-runner'
apply plugin: 'android-apt'
apply plugin: 'com.google.gms.google-services'

repositories {
    jcenter()
}

def versionMajor = 1
def versionMinor = 0
def versionPatch = 0
def versionBuild = 0
def versionMajorMinorPatchBuild = "${versionMajor}.${versionMinor}.${versionPatch}.${versionBuild}"
def versionString = "${versionMajor}.${versionMinor}.${versionPatch}"
def versionStringFull = "${versionMajor}.${versionMinor}.${versionPatch}.${versionBuild}"

android {
    compileSdkVersion 25
    buildToolsVersion "24.0.3"

    dexOptions {
        javaMaxHeapSize "4g"
    }

    defaultConfig {
        applicationId "skipasses.android.abc.123.skipasses"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
        vectorDrawables.useSupportLibrary = true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    // set dummy signing values if not defined in ~/.gradle/gradle.properties
    if (!project.hasProperty('SkiPassKeyStoreFile')) {
        println "Using dummy signing values"
        project.ext.setProperty('SkiPassKeyStoreFile', 'dummy.keystore')
        project.ext.setProperty('SkiPassKeyStorePassword', 'dummy!')
        project.ext.setProperty('SkiPassKeyAlias', 'dummy')
        project.ext.setProperty('SkiPassKeyPassword', 'dummy!')
    }

    // defined on the build server in the /usr/share/tomcat/.gradle/gradle.properties
    signingConfigs {
        release {
            storeFile file(SkiPassKeyStoreFile)
            storePassword SkiPassKeyStorePassword
            keyAlias SkiPassKeyAlias
            keyPassword SkiPassKeyPassword
        }
        lwa {
            storeFile file('keystore.jks')
            keyAlias 'androiddebugkey'
            keyPassword 'android'
            storePassword 'android'
        }
    }

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
    }

    buildTypes {
        release {
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField "String", "VERSION_NAME_FULL", "\"${versionString}\""
            signingConfig signingConfigs.release
        }
        debug {
            versionNameSuffix '-DEV'
            buildConfigField "String", "VERSION_NAME_FULL", "\"${versionStringFull}${versionNameSuffix}\""
        }
        beta {
            versionNameSuffix '-BETA'
            //noinspection GroovyAssignabilityCheck
            signingConfig android.signingConfigs.debug
            zipAlignEnabled true
            buildConfigField "String", "VERSION_NAME_FULL", "\"${versionStringFull}${versionNameSuffix}\""
        }
    }

    lintOptions {
        abortOnError false
    }
}

ext {
    // versions for libraries that multiple dependencies
    supportLibVersion = '25.0.0'
    dagger = '2.7'
    butterknife = '8.4.0'
    pocketknife = '3.2.1'
}

dependencies {
    // Support Libraries
    compile "com.android.support:appcompat-v7:${supportLibVersion}"
    compile "com.android.support:design:${supportLibVersion}"

    // Dependency Injection dependencies
    compile "com.google.dagger:dagger:${dagger}"
    apt "com.google.dagger:dagger-compiler:${dagger}"

    // View Binding
    compile "com.jakewharton:butterknife:${butterknife}"
    apt "com.jakewharton:butterknife-compiler:${butterknife}"

    compile "com.vikingsen:pocketknife-core:${pocketknife}"
    apt "com.vikingsen:pocketknife-compiler:${pocketknife}"

    // Unit Testing
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    // Firebase
    compile 'com.google.firebase:firebase-auth:9.8.0'
    compile 'com.firebaseui:firebase-ui-database:0.6.1'
    compile 'com.firebaseui:firebase-ui-auth:0.6.1'
    compile 'com.google.firebase:firebase-core:9.8.0'
    compile 'com.android.support:support-v4:25.0.0'
    compile 'com.android.support:recyclerview-v7:25.0.0'
    testCompile 'junit:junit:4.12'
    provided 'javax.annotation:jsr250-api:1.0'
}

sonarqube { //./gradlew sonarqube aDebug
    properties {
        if (!project.hasProperty("abc123SonarHostUrl")) {
            println '!!!! ABC123 Sonar properties must be set in your gradle.properties !!!!'
            return
        }

        // Project Information
        property "sonar.projectKey", "SkiPasses"
        property "sonar.projectName", "SkiPasses"
        property "sonar.projectVersion", versionMajorMinorPatchBuild

        // Sonar Information
        property "sonar.host.url", abcSonarHostUrl
        property "sonar.jdbc.url", abcSonarJdbcUrl
        property "sonar.jdbc.driverClassName", abcSonarJdbcDriver
        property "sonar.jdbc.username", abcSonarUsername
        property "sonar.jdbc.password", abcSonarPassword

        properties["sonar.sources"] = "src/main" //android.sourceSets.main.java.srcDirs
        properties["sonar.tests"] = android.sourceSets.androidTest.java.srcDirs

        if (file("build/intermediates/classes/debug").exists()) {
            properties["sonar.binaries"] = [file("build/intermediates/classes/debug")]
        }
        if (file("build/intermediates/classes/beta").exists()) {
            properties["sonar.binaries"] = [file("build/intermediates/classes/beta")]
        }
    }
}

和 Activity :

package abc123.android.abc.123.skipasses.ui.activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;

import com.google.firebase.auth.FirebaseAuth;

import abc123.android.abc.123.skipasses.R;

public class DashboardActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dashboard);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();
        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        //Todo: figure out why the BuildConfig is not being fetched
//        TextView textView = (TextView) findViewById(R.id.version_text);
//        textView.setText(getString(R.string.version_number, BuildConfig.VERSION_NAME));
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        int id = item.getItemId();
        //TODO Create fragments for each menu item
        if (id == R.id.nav_my_reservations) {
        } else if (id == R.id.nav_make_reservation) {
        } else if (id == R.id.nav_settings) {
        } else if (id == R.id.nav_log_out) {
            FirebaseAuth.getInstance().signOut();
            Intent loginIntent = new Intent(DashboardActivity.this, LoginActivity.class);
            startActivity(loginIntent);
        }
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}

我试过做一个干净的构建。我找不到重复的库。我看不到哪里有播放服务和 firebase 没有在版本号中排队。我只是不明白这个错误是怎么发生的。任何指导将不胜感激。

最佳答案

有同样的问题,我发现我的一个依赖项使用的 PlayServices 版本与 firebase 依赖项行中给出的版本不同。

compile 'com.google.android.gms:play-services-analytics:9.6.1'
compile 'com.google.firebase:firebase-messaging:9.8.0'

改为

compile 'com.google.android.gms:play-services-analytics:9.6.1'
compile 'com.google.firebase:firebase-messaging:9.6.1'

此外,如前所述,您应该将 apply plugin: 'com.google.gms.google-services' 在你的 build.gradle 文件的底部。

关于android - 重复条目 : com/google/android/gms/internal/zzahl. 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40365556/

有关android - 重复条目 : com/google/android/gms/internal/zzahl. 类的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby - 正则表达式 - 保存重复捕获的组 - 2

    这就是我做的a="%span.rockets#diamonds.ribbons.forever"a=a.match(/(^\%\w+)([\.|\#]\w+)+/)putsa.inspect这是我得到的#这就是我想要的#帮助?我尝试过但失败了:( 最佳答案 通常,您不能获得任意数量的捕获组,但如果您使用扫描,您可以为您想要捕获的每个标记获得一个匹配:a="%span.rockets#diamonds.ribbons.forever"a=a.scan(/^%\w+|\G[.|#]\w+/)putsa.inspect["%span","

  3. ruby - Google-api-ruby-client 翻译 API 示例 - 2

    很高兴看到google代码:google-api-ruby-client项目,因为这对我来说意味着Ruby人员可以使用GoogleAPI-s来完善代码。虽然我现在很困惑,因为给出的唯一示例使用Buzz,并且根据我的实验,Google翻译(v2)api的行为必须与google-api-ruby-client中的Buzz完全不同。.我对“Explorer”演示示例很感兴趣——但据我所知,它并不是一个探索器。它所做的只是调用一个Buzz服务,然后浏览它已经知道的关于Buzz服务的事情。对我来说,Explorer应该让您“发现”所公开的服务和方法/功能,而不一定已经知道它们。我很想听听使用这个

  4. Ruby 从数组中删除重复的对象 - 2

    我无法使用传统的Ruby方法从下面的数组user_list中删除所有重复对象,从而获得预期的结果。有解决这个问题的聪明方法吗?users=[]user_list.eachdo|u|user=User.find_by_id(u.user_id)users 最佳答案 这个怎么样?users=User.find(user_list.map(&:user_id).uniq)这具有作为一个数据库调用而不是user_list.size数据库调用的额外好处。 关于Ruby从数组中删除重复的对象,我们在

  5. Ruby 删除可枚举列表中的重复项 - 2

    ruby中有没有一个很好的方法来删除可枚举列表中的重复项(即拒绝等) 最佳答案 对于数组你可以使用uniq()方法a=["a","a","b","b","c"]a.uniq#=>["a","b","c"]所以如果你只是(1..10).to_a.uniq或%w{antbatcatant}.to_a.uniq因为无论如何,几乎所有您实现的方法都将作为Array类返回。 关于Ruby删除可枚举列表中的重复项,我们在StackOverflow上找到一个类似的问题: h

  6. ruby - 重复排列 - 2

    我知道如何创建值数组的排列。例如:[*1..3].permutation(2)这导致以下六种排列:[1,2][1,3][2,1][2,3][3,1][3,2]但这个结果缺少三个排列,它们是相同值的组合,即:[1,1][2,2][3,3]如何获得所有排列,包括上面重复的排列? 最佳答案 尝试#repeated_permutation:[*1..3].repeated_permutation(3).to_a>pp[*1..3].repeated_permutation(3).to_a[[1,1,1],[1,1,2],[1,1,3],[1

  7. ruby - 在 Ruby 数组中收集重复项的最快/单行方法? - 2

    像这样转换数组的最快/单行方法是什么:[1,1,1,1,2,2,3,5,5,5,8,13,21,21,21]...进入像这样的对象数组:[{1=>4},{2=>2},{3=>1},{5=>3},{8=>1},{13=>1},{21=>3}] 最佳答案 要获得所需的格式,您可以附加一个调用以映射到您的解决方案:array.inject({}){|h,v|h[v]||=0;h[v]+=1;h}.map{|k,v|{k=>v}}虽然它仍然是单行的,但它开始变得凌乱了。 关于ruby-在Ruby

  8. ruby - 如何从 URL 中删除 Google 跟踪参数 (UTM)? - 2

    我有一堆要清理的URL。它们都包含UTM参数,在这种情况下不是必需的,或者是有害的。示例:http://houseofbuttons.tumblr.com/post/22326009438?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+HouseOfButtons+%28House+of+Buttons%29所有可能的参数都以utm_开头。如何使用ruby​​脚本/结构轻松删除它们而不破坏其他潜在的“好”URL参数? 最佳答案 您可以将正则表达式应用于url以清

  9. ruby-on-rails - 从 ruby​​ 中的数组中删除重复项 - 2

    我想输出一个散列数组,其中name对所有散列都是唯一的。我将如何使用ruby​​执行此操作?这是我的输入:input=[{:name=>"Kutty",:score=>2,:some_key=>'value',...},{:name=>"Kutty",:score=>4,:some_key=>'value',...},{:name=>"Baba",:score=>5,:some_key=>'value',...}]我希望输出看起来像这样:output=[{:name=>"Kutty",:score=>4,:some_key=>'value',...},{:name=>"Baba",:s

  10. sql - Rails:使用 Postgres 创建对象时重复 ActiveRecord::RecordNotUnique? - 2

    我正在使用Rails4应用程序,它需要创建大量对象以响应来自另一个系统的事件。当我调用create!时,主键列上出现非常频繁的ActiveRecord::RecordNotUnique错误(由PG::UniqueViolation引起)我的模型之一。我在SO上找到了其他答案,建议挽救异常并调用retry:beginTableName.create!(data:'here')rescueActiveRecord::RecordNotUnique=>eife.message.include?'_pkey'#Onlyretryprimarykeyviolationslog.warn"Retr

随机推荐