Android App Bundle von React Native: Sie haben ein APK- oder Android App Bundle mit ungültigen oder fehlenden Signaturinformationen für einige seiner Dateien hochgeladen

10

Ich versuche zum ersten Mal, eine App im Google Play Store zu veröffentlichen. Ich habe mich für Google Play Signing entschieden. Ich weiß, dass ich das Android App Bundle mit dem richtigen Schlüssel signiere, da die Konsole mich beim Hochladen mit einem anderen Schlüssel anweist, mit dem anderen Schlüssel mit der spezifischen SHA1-ID hochzuladen. Wenn ich jedoch mit dem richtigen Schlüssel hochlade, wird folgende Fehlermeldung angezeigt:

Sie haben ein APK- oder Android-App-Bundle mit ungültigen oder fehlenden Signaturinformationen für einige seiner Dateien hochgeladen.

Ich erstelle die App mit Android Studio wie folgt: Erstellen> Signiertes Bundle / APK generieren> Android-App-Bundle> Auswählen meines Schlüsselspeichers und Eingabe des Passworts> Freigeben> Fertig stellen

Die App ist eine React Native-App, die mit getrenntem Expo / ExpoKit erstellt wurde. Das Hochladen in den Apple App Store funktioniert einwandfrei, ich habe nur Probleme mit dem Play Store. Was vermisse ich?

Update 1 : Ich habe die App jetzt vollständig aus Google Play gelöscht und eine neue erstellt. Ich habe mich diesmal nicht für Google Play Signing entschieden und eine signierte APK hochgeladen. Immer noch der gleiche Fehler.

Update 2 : Versucht mit einem völlig neuen Schlüsselspeicher und Schlüssel. Immer noch die gleichen.

Hier ist eine Übersicht über das Projekt-Setup, wenn dies irgendwie wichtig wäre: Projektübersicht

Und hier ist das 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
}

Update 3 : Ich habe jetzt eine signierte APK erstellt und versucht, ihre Signatur mit jarsigner zu validieren:

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

Dieser Befehl erzeugt den folgenden Fehler:

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

Für mich scheint dies ein wichtiger Teil des Puzzles zu sein. Bisher konnte ich jedoch keine hilfreichen Informationen zu diesem Fehler finden.

Maximilian Krause
quelle
Können Sie Ihr Android / App / Build.gradlew zeigen?
André Pinto
@ AndréPinto Fügte es der Frage hinzu. Zensierte die applicationId in der defaultConfig.
Maximilian Krause

Antworten:

0

Stellen Sie sicher, dass Sie Upload als Schlüsselalias auswählen, wenn Sie APK oder AAB erstellen. Siehe Abbildung als Referenz.

Geben Sie hier die Bildbeschreibung ein

B. Mohammad
quelle
0

Möglicherweise nicht die Antwort, nach der Sie suchen, aber haben Sie versucht, über die Befehlszeile Keystores zu generieren, anstatt Android Studio zu verwenden?

Wenn dies nicht funktioniert, würde ich mich mit den Modulen befassen, insbesondere mit den Ausstellungsmodulen, da sie mir in den letzten Wochen einige Sorgen bereitet haben.

Reagieren Sie auf die native Anleitung zum Veröffentlichen für Android

Ben B.
quelle
0

Ich werde hier meine eigene Frage beantworten, auch wenn dies keine Lösung für das ursprüngliche Problem ist, sondern eher etwas über ExpoKit.

Ich habe ExpoKit jetzt vollständig aus unserer App entfernt. Wir haben uns zuvor aus dem verwalteten Expo-Workflow in ExpoKit zurückgezogen, da wir andere native Funktionen wie WebRTC benötigten, die von Expo noch nicht unterstützt wurden. Um jedoch ganz ehrlich hier, sollten wir wahrscheinlich zu ausgeworfen nackten Reagieren india statt halb optimal ExpoKit.

Wenn Sie mit dem verwalteten Workflow arbeiten können, tun Sie es! Macht auf jeden Fall einiges einfacher. Wenn Sie jedoch andere, nicht unterstützte native Funktionen benötigen, tun Sie sich selbst einen Gefallen und kehren Sie zu RN zurück, solange Sie dies problemlos tun können.

Denn vom Expo Kit zum nackten RN zu wechseln, ist überhaupt kein Reiz. Musste ein ganz neues RN-Projekt initiieren, das JavaScript kopieren, die Module einzeln neu installieren, einige native Probleme usw. usw. beheben - zwei Arbeitstage, um die App wieder zum Laufen zu bringen.

Nach all dieser Arbeit stehen wir jetzt mit derselben App, nur ohne ExpoKit.

Vorteile:

  • Das Hochladen der App auf Google Play funktioniert endlich.
  • Reduzierte App-Download-Größe um über 70% (!)
  • Einfaches Autolinking über RN 0.60 (obwohl ExpoKit es jetzt auch mit dem neuesten SDK unterstützt - das Aktualisieren des Expo SDK ist eine ganze Wissenschaft für sich, wenn auch oftmals)
  • Wir können immer noch Expo-Module verwenden, die wir tatsächlich lieben gelernt haben, wie Expo-Secure-Store durch Unimodule.
  • Könnte ein Placebo sein, aber die Leistung der App scheint sich ebenfalls verbessert zu haben.
  • Die Erstellungszeiten für Release-Apps wurden unter iOS um etwa 50% und unter Android um 60% erhöht
  • Das Starten der App scheint schnell zu sein - während das Starten auf einem iPhone 11 Pro zuvor etwa 2 bis 3 Sekunden dauerte, ist es jetzt eine Frage von Millisekunden.

Nachteile: Bisher konnte ich keine finden.

Maximilian Krause
quelle