Pacote de aplicativos para Android do React Native: você enviou um APK ou pacote de aplicativos para Android com informações de assinatura inválidas ou ausentes para alguns de seus arquivos


10

Estou tentando publicar um aplicativo pela primeira vez na Google Play Store. Optei pela assinatura do Google Play. Sei que estou assinando o Android App Bundle com a chave certa, pois, quando estou carregando usando outra chave, o console diz para eu fazer upload usando a outra chave com o identificador SHA1 específico. No entanto, quando carrego com a chave correta, recebo este erro:

Você enviou um APK ou um pacote de aplicativos para Android com informações de assinatura inválidas ou ausentes para alguns de seus arquivos.

Estou criando o aplicativo usando o Android Studio da seguinte forma: Compilar> Gerar pacote assinado / APK> Pacote de aplicativos Android> Escolhendo meu keystore e digitando a senha> release> Concluir

O aplicativo é um aplicativo React Native criado com o Expo / ExpoKit desanexado. Carregar na Apple App Store funciona muito bem, só tenho problemas com a Play Store. o que estou perdendo?

Atualização 1 : agora excluí completamente o aplicativo do Google Play e criei um novo. Será que não opt in para Google Play assinatura deste tempo e enviou um APK assinado. Ainda é o mesmo erro.

Atualização 2 : Tentei com um keystore e chave completamente novos. Ainda o mesmo.

Aqui está uma visão geral da configuração do projeto, se isso de alguma forma seria importante: Visão Geral do Projeto

E aqui está o android/app/build.gradle:

buildscript {
  repositories {
    google()
    maven { url 'https://maven.fabric.io/public' }
  }

  dependencies {
    classpath 'io.fabric.tools:gradle:1.26.1'
  }
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
apply plugin: 'devicefarm'

repositories {
  maven { url 'https://maven.fabric.io/public' }
}

def safeExtGet(prop, fallback) {
  rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
}

android {
  compileSdkVersion safeExtGet("compileSdkVersion", 28)

  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }

  defaultConfig {
    applicationId 'de.***.android'
    minSdkVersion safeExtGet("minSdkVersion", 21)
    targetSdkVersion safeExtGet("targetSdkVersion", 28)
    versionCode 1
    versionName '1.0.2'
    ndk {
      abiFilters 'armeabi-v7a', 'x86'
    }
    multiDexEnabled true
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    // Deprecated. Used by net.openid:appauth
    manifestPlaceholders = [
        'appAuthRedirectScheme': 'host.exp.exponent'
    ]
  }
  dexOptions {
    javaMaxHeapSize System.getenv("DISABLE_DEX_MAX_HEAP") ? null : "8g"
  }

  signingConfigs {
    debug {
      storeFile file('../debug.keystore')
    }
    release {
      storeFile file(System.getenv("ANDROID_KEYSTORE_PATH") ?: "release-key.jks")
      storePassword System.getenv("ANDROID_KEYSTORE_PASSWORD")
      keyAlias System.getenv("ANDROID_KEY_ALIAS")
      keyPassword System.getenv("ANDROID_KEY_PASSWORD")
    }
  }
  buildTypes {
    debug {
      debuggable true
      ext.enableCrashlytics = false
    }
    release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      signingConfig signingConfigs.release
    }
  }
  lintOptions {
    abortOnError false
  }
  packagingOptions {
    pickFirst "**"
  }
}

devicefarm {
  projectName System.getenv("DEVICEFARM_PROJECT_NAME")
  devicePool System.getenv("DEVICEFARM_DEVICE_POOL")
  executionTimeoutMinutes 40
  authentication {

    accessKey System.getenv("AWS_ACCESS_KEY_ID")
    secretKey System.getenv("AWS_SECRET_ACCESS_KEY")
  }
}

configurations.all {
  resolutionStrategy {
    force 'org.webkit:android-jsc:r245459'
  }
}

// WHEN_PREPARING_SHELL_REMOVE_FROM_HERE

apply from: 'expo.gradle'

// WHEN_PREPARING_SHELL_REMOVE_TO_HERE

apply from: "../../node_modules/react-native-unimodules/gradle.groovy"

dependencies {
    implementation project(':react-native-torch')
    implementation project(':react-native-twilio-video-webrtc')
    implementation project(':react-native-exit-app')
    implementation project(':react-native-fs')
    implementation project(':react-native-document-picker')
    implementation project(':rn-fetch-blob')
    implementation project(':react-native-onesignal')
    implementation project(':react-native-vector-icons')
    implementation project(':react-native-randombytes')
  implementation fileTree(dir: 'libs', include: ['*.jar'])

  compile project(':tipsi-stripe')

  implementation 'com.android.support:multidex:1.0.1'

  // Our dependencies
  implementation "com.android.support:appcompat-v7:$supportLibVersion"

  // Our dependencies from ExpoView
  // DON'T ADD ANYTHING HERE THAT ISN'T IN EXPOVIEW. ONLY COPY THINGS FROM EXPOVIEW TO HERE.
  implementation "com.android.support:appcompat-v7:$supportLibVersion"
  implementation 'com.facebook.android:facebook-android-sdk:5.0.1'
  implementation('com.facebook.android:audience-network-sdk:5.1.1') {
    exclude module: 'play-services-ads'
  }
  compileOnly 'org.glassfish:javax.annotation:3.1.1'
  implementation 'com.jakewharton:butterknife:9.0.0'
  implementation 'de.greenrobot:eventbus:2.4.0'

  implementation 'com.squareup.picasso:picasso:2.5.2'
  implementation 'com.google.android.gms:play-services-gcm:15.0.1'
  implementation 'com.google.android.gms:play-services-analytics:16.0.1'
  implementation 'com.google.android.gms:play-services-maps:15.0.1'
  implementation 'com.google.android.gms:play-services-auth:15.0.1'
  implementation 'com.google.android.gms:play-services-location:15.0.1'
  implementation 'com.google.android.gms:play-services-ads:15.0.1'
  //annotationProcessor 'com.raizlabs.android:DBFlow-Compiler:2.2.1'
  //implementation "com.raizlabs.android:DBFlow-Core:2.2.1"
  //implementation "com.raizlabs.android:DBFlow:2.2.1"
  implementation "com.madgag.spongycastle:core:1.53.0.0"
  implementation "com.madgag.spongycastle:prov:1.53.0.0"
  debugImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1'
  // debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.4-beta1'
  releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1'
  implementation 'com.facebook.device.yearclass:yearclass:2.1.0'
  implementation 'commons-io:commons-io:1.4'
  implementation 'me.leolin:ShortcutBadger:1.1.4@aar'
  implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.0'
  implementation 'commons-codec:commons-codec:1.10'
  implementation 'com.segment.analytics.android:analytics:4.3.0'
  implementation 'com.google.zxing:core:3.3.3'
  implementation 'net.openid:appauth:0.4.1'
  implementation 'com.airbnb.android:lottie:2.5.6'
  implementation('io.nlopez.smartlocation:library:3.2.11') {
    transitive = false
  }
  implementation "com.android.support:exifinterface:${safeExtGet("supportLibVersion", "28.0.0")}"
  implementation 'com.squareup.okio:okio:1.9.0'
  implementation 'com.facebook.soloader:soloader:0.6.0'

  // expo-file-system
  implementation 'com.squareup.okhttp3:okhttp:3.10.0'
  implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.10.0'

  // Testing
  androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
  // We use a modified build of com.android.support.test:runner:1.0.1. Explanation in maven-test/README
  androidTestImplementation 'com.android.support.test:runner:1.0.1'
  androidTestImplementation "com.android.support:support-annotations:${safeExtGet("supportLibVersion", "28.0.0")}"
  androidTestImplementation 'com.google.code.findbugs:jsr305:3.0.0'
  androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
  androidTestImplementation 'com.azimolabs.conditionwatcher:conditionwatcher:0.2'

  testImplementation 'junit:junit:4.12'
  testImplementation 'org.mockito:mockito-core:1.10.19'
  testImplementation 'org.robolectric:robolectric:3.8'
  testImplementation 'com.android.support.test:runner:1.0.2-alpha1'
  testImplementation 'com.android.support.test:rules:1.0.2-alpha1'


  implementation('host.exp.exponent:expoview:35.0.0@aar') {
    transitive = true
    exclude group: 'com.squareup.okhttp3', module: 'okhttp'
    exclude group: 'com.squareup.okhttp3', module: 'okhttp-urlconnection'
  }




  api 'org.webkit:android-jsc:r245459' // needs to be before react-native
  api 'com.facebook.react:react-native:35.0.0'




  addUnimodulesDependencies([
      modulesPaths : [
        '../../node_modules'
      ],
      configuration: 'api',
      target       : 'react-native',
      exclude      : [
        // You can exclude unneeded modules here.
        // By default we exclude FaceDetector
        // and Stripe payments APIs.
        'unimodules-face-detector-interface',
        'expo-face-detector',
        'expo-payments-stripe'

        // Adding a name here will also remove the package
        // from auto-generated BasePackageList.java
      ]
  ])

}

// This has to be down here for some reason
apply plugin: 'com.google.gms.google-services'
googleServices {
  disableVersionCheck = true
}

Atualização 3 : criei um APK assinado agora e tentei validar sua assinatura usando o jarsigner:

jarsigner -verify -verbose -certs /***/app-release.apk

Este comando produz o seguinte erro:

jarsigner: java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

Para mim, parece que isso pode ser uma peça importante para o quebra-cabeça. No entanto, não consegui encontrar nenhuma informação útil sobre esse erro até o momento.


Você pode mostrar seu android / app / build.gradlew?
André Pinto

@ AndréPinto Adicionou à pergunta. Censurou o applicationId no defaultConfig.
Maximilian Krause

Respostas:


0

Certifique-se de selecionar o upload como alias-chave ao criar APK ou AAB, veja a imagem para referência.

insira a descrição da imagem aqui


0

Pode não ser a resposta que você está procurando, mas você tentou usar a linha de comando para gerar keystores, em vez de usar o Android Studio.

Se isso não funcionar, então eu começaria a examinar os módulos, especialmente os da exposição, pois eles me causaram algum pesar nas últimas semanas.

Reagir guia nativo sobre publicação para Android


0

Vou responder minha própria pergunta aqui, apesar de não ser uma solução completa para o problema original, mais algumas informações sobre o ExpoKit.

Agora eu removi completamente o ExpoKit do nosso aplicativo. Anteriormente, expulsamos o fluxo de trabalho gerenciado da Expo para o ExpoKit, pois precisávamos de outras funcionalidades nativas, como o WebRTC, que ainda não eram suportadas pela Expo. No entanto, para ser completamente honesto aqui, provavelmente deveríamos ter ejetado para descobrir o React Native em vez do ExpoKit semi-ideal.

Se você pode acompanhar o fluxo de trabalho gerenciado, tudo bem! Definitivamente facilita algumas coisas. No entanto, se você precisar de outra funcionalidade nativa não suportada, faça um favor a si mesmo e volte ao RN vazio, contanto que você possa fazê-lo facilmente.

Porque ir do Expo Kit para o RN vazio não é nenhum charme. Teve que iniciar um novo projeto do RN, copiar o JavaScript, reinstalar os módulos um por um, corrigir alguns problemas nativos, etc etc - dois dias de trabalho apenas para que o aplicativo voltasse a funcionar.

No entanto, depois de todo esse trabalho, agora estamos com o mesmo aplicativo, apenas sem o ExpoKit.

Prós:

  • O upload do aplicativo para o Google Play finalmente funciona.
  • Tamanho de download de aplicativos reduzido em mais de 70% (!)
  • Facilidade de vinculação automática através do RN 0.60 (embora o ExpoKit o suporte agora também com o SDK mais recente - atualizar o Expo SDK é uma ciência para si, embora muitas vezes)
  • Ainda podemos usar os módulos da Expo que aprendemos a amar como expo-secure-store através de unimodules.
  • Pode ser placebo, mas o desempenho do aplicativo parece ter melhorado também.
  • O tempo de criação do aplicativo de lançamento aumentou cerca de 50% no iOS e 60% no Android
  • O lançamento do aplicativo parece estar em alta velocidade - enquanto o iPhone 11 Pro demorava cerca de 2 a 3 segundos para ser lançado, agora é uma questão de milissegundos.

Contras: Não foi possível encontrar um até agora.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.