Pacchetto app Android di React Native: hai caricato un APK o un pacchetto app Android con informazioni di firma non valide o mancanti per alcuni dei suoi file


10

Sto provando a pubblicare un'app per la prima volta sul Google Play Store. Ho aderito a Google Play Signing. So per certo che sto firmando il pacchetto di app Android con la chiave giusta poiché, quando sto caricando con un'altra chiave, la Console mi dirà di caricare utilizzando l'altra chiave con l'identificatore SHA1 specifico. Tuttavia, quando eseguo il caricamento con la chiave corretta, ottengo questo errore:

Hai caricato un APK o un pacchetto di app Android con informazioni di firma non valide o mancanti per alcuni dei suoi file.

Sto costruendo l'app usando Android Studio in questo modo: Build> Genera pacchetto firmato / APK> Pacchetto app Android> Scelta del keystore e immissione della password> rilascio> Fine

L'app è un'app React Native costruita con Expo / ExpoKit distaccato. Il caricamento su App Store di Apple funziona bene, ho solo problemi con il Play Store. Cosa mi sto perdendo?

Aggiornamento 1 : ora ho eliminato completamente l'app da Google Play e ne ho creata una nuova. Forse non opt-in per Google Play La firma di questo tempo e caricato un APK firmato. Ancora lo stesso errore.

Aggiornamento 2 : provato con un keystore e una chiave completamente nuovi. Ancora lo stesso.

Ecco una panoramica della configurazione del progetto se questo sarebbe in qualche modo importante: Panoramica del progetto

Ed ecco il 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
}

Aggiornamento 3 : ho creato un APK firmato ora e ho provato a convalidare la sua firma usando jarsigner:

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

Questo comando produce il seguente errore:

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

Per me sembra che questo potrebbe essere un pezzo importante del puzzle. Tuttavia, finora non ho trovato informazioni utili su questo errore.


Puoi mostrare il tuo Android / app / build.gradlew?
André Pinto,

@ AndréPinto L'ha aggiunto alla domanda. Censurato applicationId in defaultConfig.
Maximilian Krause,

Risposte:


0

Assicurati di selezionare il caricamento come alias chiave quando fai APK o AAB, vedi l'immagine per riferimento.

inserisci qui la descrizione dell'immagine


0

Potrebbe non essere la risposta che stai cercando, ma hai provato a utilizzare la riga di comando per generare keystore, invece di utilizzare Android Studio.

Se questo non funziona, allora inizierei a esaminare i moduli, in particolare quelli expo, poiché mi hanno causato un po 'di dolore nelle ultime settimane.

Reagisci alla guida nativa sulla pubblicazione per Android


0

Vado a rispondere alla mia domanda qui, anche se non è proprio una soluzione al problema originale, più un po 'di sfogo su ExpoKit.

Ora ho rimosso completamente ExpoKit dalla nostra app. In precedenza avevamo espulso dal flusso di lavoro di Expo gestito a ExpoKit poiché avevamo bisogno di altre funzionalità native come WebRTC che non era ancora supportato da Expo. Tuttavia, per essere completamente onesto qui, probabilmente dovevamo espulso a nudo Reagire nativo invece di semi-ottimale ExpoKit.

Se riesci ad andare con il flusso di lavoro gestito, bene, fallo! Rende sicuramente alcune cose più facili. Tuttavia, se hai bisogno di altre funzionalità native non supportate, fatti un favore e torna a nudo RN finché puoi farlo facilmente.

Perché passare da Expo Kit a RN nudo non è affatto un fascino. Ho dovuto avviare un progetto RN completamente nuovo, copiare JavaScript, reinstallare i moduli uno per uno, risolvere alcuni problemi nativi ecc. - due giorni di lavoro solo per riavviare l'app.

Tuttavia, dopo tutto quel lavoro, ora stiamo con la nostra stessa app, solo senza ExpoKit.

Professionisti:

  • Il caricamento dell'app su Google Play funziona finalmente.
  • Riduzione delle dimensioni di download delle app di oltre il 70% (!)
  • Facilità di collegamento automatico tramite RN 0.60 (anche se ExpoKit lo supporta anche ora con il più recente SDK - l'aggiornamento di Expo SDK è una scienza per sé sebbene spesso volte)
  • Possiamo ancora usare i moduli Expo che in realtà abbiamo imparato ad amare come expo-secure-store attraverso unimoduli.
  • Potrebbe essere un placebo, ma anche le prestazioni dell'app sembrano essere migliorate.
  • I tempi di creazione delle app di rilascio sono aumentati di circa il 50% su iOS, il 60% su Android
  • Il lancio di un'app sembra essere sulla velocità, mentre in precedenza ci sono voluti dai 2 ai 3 secondi su un iPhone 11 Pro per avviarsi, ora è questione di millisecondi.

Contro: Impossibile trovarne uno finora.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.