Flutter Build IOS版本基本都很顺畅,所以文中就不在说明。但是如果你使用flutter create的项目,使用模板中的gradle配置编译Android APK总是会遇到一些问题。下面,我们一步一步来避开这些坑。

由于Flutter编译是原生的编译,在IOS下使用Xcode。在Android上自然使用Gradle。所以你遇到的问题,基本上就是gradle配置的问题。

1、Android X

如果你的项目不支持AndroidX,可能有的插件就没有办法编译了。如果你创建项目的时候选择了支持AndroidX,那么你可以跳过这个环节。

如何判断你的项目是否支持AndroidX

打开android/gradle.properties 或 .android/gradle.properties 看看里面是否包含了

android.useAndroidX=true
android.enableJetifier=true

如果你新建一个项目,为了让Flutter支持Android,那么你需要使用下面的命令

flutter create --androidx -t <project-type> <new-project-path>

手动升级

1、修改 android/gradle/wrapper/gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip

2、更新 android/build.gradle,将过去的版本更新为3.3.0至少

dependencies {
    classpath 'com.android.tools.build:gradle:3.3.0'
}

3、修改 android/gradle.properties

android.enableJetifier=true
android.useAndroidX=true

4、现在修改SDK version,打开 android/app/build.gradle targetSdkVersion最少28

defaultConfig {
        minSdkVersion 17
        targetSdkVersion 28
}

升级AndroidX与否,是根据你自身的情况来决定,不会影响后续的文章内容

2、自动签名配置

gradle编译时,可以为你自动签名,这样省去了编译后手动签名的步骤。

1、创建签名文件

此处忽略如何创建.keystore格式的签名,请自行创建keystore签名。

2、新增 key.properties文件

在android目录中创建一个key.properties文件,这个文件将包含签名文件的重要信息

文件内填入一下配置信息

storePassword= 自己配置的签名密码
keyPassword= 自己配置的签名密码
keyAlias= keyAlias
storeFile= .keystore文件存储目录

3、在 android/app/build.gradle下按照下面的格式,新增到 android{} 内

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

并修改同级的buildTypes,在release中使用配置中的签名,debug模式无需签名

buildTypes {
        release {
            signingConfig signingConfigs.release
        }

        debug {
        }
    }

3、abi配置

gradle打包时,将自动把不同的abi(兼容不同处理器的ABI)打包到APK中,默认模板中没有配置其他的ABI,所以会出现有的设备无法安装或者安装后闪退的情况。

下面我们将 android/app/build.gradle 中的 buildTypes 修改。

我们区分release和debug修改。debug中的abi根据你的调试设备进行配置

下面的配置基本可以兼容市面上很多的安卓设备,包含了64位的ABI,试错后,这是最佳的配置。仅供参考,根据自身情况修正。

buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            shrinkResources true
            ndk{
                abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
                abiFilters.clear()
            }
        }

        debug {
            ndk {
                //调试的时候用模拟器的就可以了,不然调试打包安装太慢
                abiFilters "x86"
            }
        }
    }

4、编译打包

现在你可以使用flutter build apk来进行编译。默认的情况下 flutter build apk即为--release。

注意:Flutter官方推荐使用 flutter build apk --split-per-abi 来分开打包编译不同的ABI版本,Google Play中可以按照不同ABI版本上传。但是国内的基本没有上传时可以区分不同ABI针对不同用户群体的功能,所以我们还是一次性打包。

现在你可以使用 adb install ./android.apk将编译的结果安装到你的设备啦