Gói ứng dụng Android từ React Native: Bạn đã tải lên Gói ứng dụng APK hoặc Android với thông tin ký không hợp lệ hoặc thiếu cho một số tệp của nó


10

Tôi đang cố gắng xuất bản một ứng dụng lần đầu tiên lên Google Play Store. Tôi đã chọn tham gia Google Play Signing. Tôi biết rằng thực tế là tôi đang ký Gói ứng dụng Android bằng khóa bên phải vì khi tôi tải lên bằng một khóa khác, Bảng điều khiển sẽ bảo tôi tải lên bằng khóa khác với mã định danh SHA1 cụ thể. Tuy nhiên, khi tôi tải lên bằng khóa chính xác, tôi gặp lỗi này:

Bạn đã tải lên Gói ứng dụng APK hoặc Android với thông tin ký không hợp lệ hoặc thiếu cho một số tệp của nó.

Tôi đang xây dựng ứng dụng bằng Android Studio như vậy: Xây dựng> Tạo Gói đã ký / APK> Gói ứng dụng Android> Chọn kho khóa của tôi và nhập mật khẩu> phát hành> Kết thúc

Ứng dụng này là một ứng dụng React Native được xây dựng với Expo / ExpoKit tách rời. Tải lên Apple App Store chỉ hoạt động tốt, tôi chỉ gặp vấn đề với Play Store. Tôi đang thiếu gì?

Cập nhật 1 : Bây giờ tôi đã xóa hoàn toàn ứng dụng khỏi Google Play và tạo một ứng dụng mới. Đã không lựa chọn trong kế cho Google Play Ký lần này và tải lên một APK được ký. Vẫn cùng một lỗi.

Cập nhật 2 : Đã thử với kho khóa và khóa hoàn toàn mới. Vẫn giống nhau.

Dưới đây là tổng quan về thiết lập dự án nếu điều này bằng cách nào đó sẽ quan trọng: Tổng quan dự án

Và đây là 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
}

Cập nhật 3 : Tôi đã tạo APK có chữ ký ngay bây giờ và cố gắng xác thực chữ ký của nó bằng jarsigner:

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

Lệnh này tạo ra lỗi sau:

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

Đối với tôi có vẻ như đây có thể là một mảnh ghép quan trọng đối với câu đố. Tuy nhiên, cho đến nay tôi không thể tìm thấy bất kỳ thông tin hữu ích nào liên quan đến lỗi này.


Bạn có thể hiển thị android / app / build.gradlew của bạn không?
André Pinto

@ AndréPinto Đã thêm nó vào câu hỏi. Đã kiểm duyệt applicationId trong defaultConfig.
Maximilian Krause

Câu trả lời:


0

Vui lòng đảm bảo chọn tải lên làm bí danh chính khi tạo APK hoặc AAB, xem hình để tham khảo.

nhập mô tả hình ảnh ở đây


0

Có thể không phải là câu trả lời mà bạn đang tìm kiếm, nhưng bạn đã thử sử dụng dòng lệnh để tạo ra các kho khóa, trái ngược với việc sử dụng Android Studio.

Nếu điều này không hiệu quả, thì tôi sẽ bắt đầu xem xét các mô-đun, đặc biệt là các mô-đun, vì chúng đã gây cho tôi một số đau buồn trong những tuần qua.

Phản ứng hướng dẫn bản địa về xuất bản cho Android


0

Đi để trả lời câu hỏi của riêng tôi ở đây, mặc dù nó không hoàn toàn là một giải pháp cho vấn đề ban đầu, một số thông tin liên quan đến ExpoKit.

Bây giờ tôi đã loại bỏ hoàn toàn ExpoKit khỏi ứng dụng của chúng tôi. Trước đây chúng tôi đã chuyển từ quy trình làm việc Expo được quản lý sang ExpoKit vì chúng tôi cần các chức năng gốc khác như WebRTC chưa được Expo hỗ trợ. Tuy nhiên, để hoàn toàn trung thực ở đây, có lẽ chúng ta nên loại bỏ React Native trần thay vì ExpoKit bán tối ưu.

Nếu bạn có thể đi với quy trình làm việc được quản lý, tốt thôi, hãy làm đi! Chắc chắn làm cho một số công cụ dễ dàng hơn. Tuy nhiên, nếu bạn cần chức năng gốc khác, không được hỗ trợ, hãy tạo cho mình một ưu tiên và quay lại RN trần miễn là bạn có thể làm điều đó một cách dễ dàng.

Bởi vì, đi từ Expo Kit đến RN trần trụi không có gì quyến rũ. Phải khởi tạo một dự án RN hoàn toàn mới, sao chép JavaScript, cài đặt lại từng mô-đun, sửa một số vấn đề gốc, v.v. - hai ngày làm việc chỉ để ứng dụng chạy lại.

Tuy nhiên, sau tất cả những công việc đó, bây giờ chúng tôi đứng cùng một ứng dụng của mình, chỉ cần không có ExpoKit.

Ưu điểm:

  • Tải ứng dụng lên Google Play cuối cùng cũng hoạt động.
  • Giảm kích thước tải xuống ứng dụng hơn 70% (!)
  • Dễ dàng tự động nhấp qua RN 0,60 (mặc dù ExpoKit cũng hỗ trợ nó ngay bây giờ với SDK mới nhất - cập nhật SDK SDK là một khoa học cho chính nó mặc dù thường xuyên)
  • Chúng ta vẫn có thể sử dụng các mô-đun Expo mà chúng ta thực sự đã học để yêu thích như expo-safe-store thông qua các mô-đun.
  • Có thể là giả dược, nhưng hiệu suất của ứng dụng dường như cũng được cải thiện.
  • Thời gian xây dựng ứng dụng phát hành tăng khoảng 50% trên iOS, 60% trên Android
  • Khởi chạy ứng dụng có vẻ như tốc độ - trong khi trước đó mất khoảng 2 đến 3 giây trên iPhone 11 Pro để khởi chạy, thì bây giờ chỉ còn là một phần nghìn giây.

Nhược điểm: Không thể tìm thấy một cho đến nay.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.