Pakiet aplikacji na Androida od React Native: przesłałeś pakiet APK lub pakiet aplikacji na Androida z nieprawidłowymi lub brakującymi informacjami o podpisywaniu niektórych jego plików

10

Próbuję opublikować aplikację po raz pierwszy w sklepie Google Play. Włączyłem podpisywanie w Google Play. Wiem na pewno, że podpisuję pakiet aplikacji na Androida odpowiednim kluczem, ponieważ kiedy przesyłam przy użyciu innego klucza, konsola każe mi przesyłać przy użyciu drugiego klucza z określonym identyfikatorem SHA1. Jednak gdy przesyłam z poprawnym kluczem, pojawia się ten błąd:

Przesłałeś pakiet APK lub pakiet aplikacji na Androida z nieprawidłowymi lub brakującymi informacjami na temat podpisywania niektórych jego plików.

Buduję aplikację za pomocą Android Studio w następujący sposób: Kompilacja> Wygeneruj podpisany pakiet / APK> Pakiet aplikacji na Androida> Wybieranie magazynu kluczy i wprowadzanie hasła> wydanie> Zakończ

Aplikacja jest aplikacją React Native zbudowaną z odłączonego Expo / ExpoKit. Przesyłanie do Apple App Store działa dobrze, mam tylko problemy ze Sklepem Play. czego mi brakuje?

Aktualizacja 1 : Teraz całkowicie usunąłem aplikację z Google Play i utworzyłem nową. Czy nie opt w Google Play za podpisanie tego czasu i przesłał podpisany APK. Wciąż ten sam błąd.

Aktualizacja 2 : Wypróbowano z całkowicie nowym magazynem kluczy i kluczem. Wciąż ten sam.

Oto przegląd konfiguracji projektu, jeśli byłoby to w jakiś sposób ważne: Przegląd projektu

A oto 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
}

Aktualizacja 3 : Utworzyłem podpisany plik APK i próbowałem zweryfikować jego podpis przy użyciu jarsigner:

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

To polecenie powoduje następujący błąd:

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

Wydaje mi się, że może to być ważny element układanki. Jednak jak dotąd nie mogłem znaleźć żadnych pomocnych informacji dotyczących tego błędu.

Maksymilian Krause
źródło
Czy możesz pokazać swoją aplikację na Androida / aplikację / build.gradlew?
André Pinto
@ AndréPinto Dodał to do pytania. Ocenzurowano applicationId w defaultConfig.
Maximilian Krause

Odpowiedzi:

0

Upewnij się, że wybierasz przesyłanie jako kluczowy alias podczas tworzenia APK lub AAB, patrz zdjęcie w celach informacyjnych.

wprowadź opis zdjęcia tutaj

B. Mohammad
źródło
0

Być może nie jest to odpowiedź, której szukasz, ale próbowałeś użyć wiersza polecenia do generowania magazynów kluczy, w przeciwieństwie do Android Studio.

Jeśli to nie zadziała, zacznę przeglądać moduły, szczególnie te związane z expo, ponieważ wywołały u mnie trochę żalu w ciągu ostatnich tygodni.

Reaguj natywny przewodnik po publikowaniu dla Androida

Ben B
źródło
0

Mam zamiar odpowiedzieć na moje własne pytanie tutaj, mimo że nie jest to całkiem rozwiązanie pierwotnego problemu, bardziej odpowiedzieć na pytanie dotyczące ExpoKit.

Teraz całkowicie usunąłem ExpoKit z naszej aplikacji. Wcześniej wyrzuciliśmy z zarządzanego przepływu pracy Expo do ExpoKit, ponieważ potrzebowaliśmy innych natywnych funkcji, takich jak WebRTC, które nie były jeszcze obsługiwane przez Expo. Jednak, aby być całkowicie szczery tutaj, prawdopodobnie powinien wysunięta do gołego React Native zamiast pół optymalnego ExpoKit.

Jeśli możesz zarządzać przepływem pracy, dobrze, zrób to! Zdecydowanie ułatwia niektóre rzeczy. Jeśli jednak potrzebujesz innej, nieobsługiwanej natywnej funkcjonalności, zrób sobie przysługę i wróć do czystej sieci RN, o ile możesz to zrobić z łatwością.

Ponieważ przejście z Zestawu Expo na samą RN nie jest żadnym urokiem. Musiałem zainicjować cały nowy projekt RN, skopiować JavaScript, ponownie zainstalować moduły jeden po drugim, naprawić niektóre natywne problemy itp. Itd. - Dwa dni pracy tylko po to, aby przywrócić działanie aplikacji.

Jednak po tych wszystkich pracach stoimy teraz przy tej samej aplikacji, bez ExpoKit.

Plusy:

  • Przesyłanie aplikacji do Google Play wreszcie działa.
  • Zmniejszony rozmiar pobierania aplikacji o ponad 70% (!)
  • Łatwość autolinkowania przez RN 0.60 (mimo że ExpoKit obsługuje go również teraz iirc z najnowszym SDK - aktualizacja Expo SDK to sama nauka, choć często)
  • Nadal możemy korzystać z modułów Expo, które tak naprawdę nauczyliśmy się kochać, jak bezpieczny expo sklep za pomocą unimodules.
  • Może to być placebo, ale wydajność aplikacji również się poprawiła.
  • Wydłużono czas kompilacji aplikacji w wersji na iOS o około 50%, a na Androida o 60%
  • Wydaje się, że uruchamianie aplikacji jest szybkie - podczas gdy uruchomienie iPhone'a 11 Pro trwało od około 2 do 3 sekund, teraz jest to kwestia milisekund.

Minusy: jak dotąd nie udało się znaleźć.

Maksymilian Krause
źródło