Google Play 控制台不接受 Flutter 发布的 apk

Flutter release apk not accepted by Google Play Console

我按照 official flutter page.

中的说明一步一步创建了一个密钥和密钥库并签署了我的 apk

但是当我尝试将它上传到 Google Play 管理中心时,出现了这个错误:

"You uploaded an APK or Android App Bundle that was signed in debug mode. You need to sign your APK or Android App Bundle in release mode"

之前问过

A similar question,但是没有解决我的问题

这是我的 app/build.gradle:

的相关部分
android {
compileSdkVersion 28

lintOptions {
    disable 'InvalidPackage'
}

defaultConfig {
    // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
    applicationId "my.package.name"
    minSdkVersion 16
    targetSdkVersion 28
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
    //testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

signingConfigs {
    release {
        keyAlias keystoreProperties['keyAlias']
        keyPassword keystoreProperties['keyPassword']
        storeFile file(keystoreProperties['storeFile'])
        storePassword keystoreProperties['storePassword']
    }
}

buildTypes {
    release {
        signingConfig signingConfigs.release

        minifyEnabled true
        useProguard true

        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

这是我的 Android Studio 版本的屏幕截图(Android SDK 为红色与此无关。):

我的 output.json 文件:

[
  {
    "outputType": {
      "type": "APK"
    },
    "apkInfo": {
      "type": "MAIN",
      "splits": [
        
      ],
      "versionCode": 1,
      "versionName": "1.0.0",
      "enabled": true,
      "outputFile": "app-release.apk",
      "fullName": "release",
      "baseName": "release"
    },
    "path": "app-release.apk",
    "properties": {
      
    }
  }
]

构建 APK 时需要 select release 选项

为Windows

Apple

似乎没有任何建议有效。然后,

flutter clean

所有问题都解决了。我可以通过 Android Studio 或命令行创建 apk。感谢 VikaS 和 Harsha pulikollu

flutter clean 也不适合我。所以我手动签署了 apk,它被 Google Play Console 接受了。在此处找到路线 https://developer.android.com/studio/publish/app-signing#sign-manually

如何手动签署 apk

要手动签署 apk,您需要 运行 在 Windows.

的命令提示符下的终端中执行以下命令

1 - 确保 apk 使用调试密钥签名:

<build-tools-path>/<sdk-vesion>/apksigner verify --print-certs app-release.apk(将“app-release.apk”替换为您的 apk 文件名

如果使用调试密钥签名,输出将类似于

Signer #1 certificate DN: C=US, O=Android, CN=Android Debug
Signer #1 certificate SHA-256 digest: 384cf54f892877ea6d934bbc335bf3aa61b8dd3d89e27feb49c0bc7e62b0bbb7
Signer #1 certificate SHA-1 digest: c7a8384ff8fe2d1e99dbdba45db93180ed53b9ff
Signer #1 certificate MD5 digest: ca13ad2688257283319bf2596f360f8c

2 - 运行 zipalign 以对齐第一个字节并减少 RAM 使用

<build-tools-path>/<sdk-vesion>/zipalign -v -p 4 app-release.apk app-aligned.apk

它将列出文件并以 Verification succesful 消息结束。

3 - 运行 应用程序签名者:

<build-tools-path>/<sdk-vesion>/apksigner sign --ks <path to .jks file> --out app-signed.apk app-aligned.apk

它将提示输入密钥库密码并静默完成作业。

4 - 验证它是否使用您的密钥签名:

<build-tools-path>/<sdk-vesion>/apksigner verify --print-certs app-signed.apk

如果签名正确,输出将与第一步类似,但输出的不是“Android Debug”,而是您的证书数据。

尝试

flutter clean

flutter clean 命令在很多情况下都非常有用,只要应用程序显示出一些荒谬的行为。

当 apk 或 android 应用程序包在调试模式下签名并上传时会发生这种情况。

所以确保你在 build.gradle

中有 release
buildTypes {
    release {
        minifyEnabled true
        // TODO: Add your own signing config for the release build.
        // Signing with the debug keys for now, so `flutter run --release` works.
        signingConfig signingConfigs.release
    }
}

以及将 yourkeystore.jks 文件放入 android/app/yourkeystore.jks 这样你就不会不得不提完整路径。

现在路径将是

storePassword=yourkeystore
keyPassword=yourkeystore
keyAlias=yourkeystore
storeFile=yourkeystore.jks