Ensemble d'applications Android de React Native: vous avez téléchargé un fichier APK ou un ensemble d'applications Android avec des informations de signature non valides ou manquantes pour certains de ses fichiers

10

J'essaie de publier une application pour la première fois sur le Google Play Store. J'ai activé la signature Google Play. Je sais pertinemment que je signe le bundle d'applications Android avec la bonne clé car, lorsque je télécharge à l'aide d'une autre clé, la console me dira de télécharger à l'aide de l'autre clé avec l'identifiant SHA1 spécifique. Cependant, lorsque je télécharge avec la bonne clé, j'obtiens cette erreur:

Vous avez téléchargé un fichier APK ou un ensemble d'applications Android avec des informations de signature non valides ou manquantes pour certains de ses fichiers.

Je crée l'application à l'aide d'Android Studio comme suit: Build> Generate Signed Bundle / APK> Android App Bundle> Choisir mon keystore et entrer le mot de passe> release> Finish

L'application est une application React Native construite avec Expo / ExpoKit détaché. Le téléchargement sur l'App Store d'Apple fonctionne très bien, je n'ai que des problèmes avec le Play Store. Qu'est-ce que je rate?

Mise à jour 1 : j'ai maintenant complètement supprimé l'application de Google Play et j'en ai créé une nouvelle. Cette fois, je n'ai pas activé la signature Google Play et j'ai téléchargé un fichier APK signé. Toujours la même erreur.

Mise à jour 2 : essayé avec un magasin de clés et une clé complètement nouveaux. Toujours le même.

Voici un aperçu de la configuration du projet si cela est important: Aperçu du projet

Et voici 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
}

Mise à jour 3 : j'ai créé un APK signé maintenant et j'ai essayé de valider sa signature à l'aide de jarsigner:

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

Cette commande produit l'erreur suivante:

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

Il me semble que cela pourrait être une pièce importante du puzzle. Cependant, je n'ai trouvé aucune information utile concernant cette erreur jusqu'à présent.

Maximilian Krause
la source
Pouvez-vous montrer votre android / app / build.gradlew?
André Pinto
@ AndréPinto L'a ajouté à la question. Censuré l'applicationId dans le defaultConfig.
Maximilian Krause

Réponses:

0

Veuillez vous assurer de sélectionner le téléchargement comme alias de clé lors de la création d'APK ou d'AAB, voir l'image pour référence.

entrez la description de l'image ici

Mohammad
la source
0

Ce n'est peut-être pas la réponse que vous recherchez, mais avez-vous essayé d'utiliser la ligne de commande pour générer des magasins de clés, par opposition à l'utilisation d'Android Studio.

Si cela ne fonctionne pas, je commencerais à examiner les modules, en particulier ceux de l'expo, car ils m'ont causé des ennuis au cours des dernières semaines.

Guide natif React sur la publication pour Android

Ben B
la source
0

Je vais répondre à ma propre question ici, même si ce n'est pas tout à fait une solution au problème d'origine, plus de ventilation concernant ExpoKit.

J'ai maintenant complètement supprimé ExpoKit de notre application. Auparavant, nous étions éjectés du flux de travail géré d'Expo vers ExpoKit car nous avions besoin d'autres fonctionnalités natives comme WebRTC qui n'étaient pas encore prises en charge par Expo. Cependant, pour être tout à fait honnête, nous aurions probablement dû éjectées à nu React indigène au lieu de ExpoKit semi-optimale.

Si vous pouvez utiliser le workflow géré, très bien, faites-le! Rend certainement certaines choses plus faciles. Cependant, si vous avez besoin d'autres fonctionnalités natives non prises en charge, rendez-vous service et revenez à RN nu tant que vous pouvez le faire facilement.

Parce que passer d'Expo Kit à RN nu n'a aucun charme. J'ai dû lancer un tout nouveau projet RN, copier le JavaScript, réinstaller les modules un par un, résoudre certains problèmes natifs, etc., etc. - deux jours de travail juste pour faire fonctionner l'application.

Cependant, après tout ce travail, nous en sommes maintenant à notre même application, juste sans ExpoKit.

Avantages:

  • Le téléchargement de l'application sur Google Play fonctionne enfin.
  • Taille de téléchargement des applications réduite de plus de 70% (!)
  • Facilité de liaison automatique via RN 0.60 (même si ExpoKit le prend également en charge maintenant avec le dernier SDK - la mise à jour du SDK Expo est une science pour elle-même bien souvent)
  • Nous pouvons toujours utiliser des modules Expo que nous avons réellement appris à aimer comme expo-secure-store via des unimodules.
  • Peut-être un placebo, mais les performances de l'application semblent également s'être améliorées.
  • Les temps de construction des applications de publication ont augmenté d'environ 50% sur iOS, 60% sur Android
  • Le lancement de l'application semble être à la vitesse - alors qu'il fallait auparavant environ 2 à 3 secondes sur un iPhone 11 Pro pour le lancer, c'est maintenant une question de millisecondes.

Inconvénients: impossible d'en trouver un jusqu'à présent.

Maximilian Krause
la source