Flutter打包Android APP

Flutter 2022-03-20 127

版本说明:Flutter 2.8.1+ Dart 2.15.1

1.检查 App Manifest

进入项目目录android>app>src>main>AndroidMainfest.xml,该文件可以配置应用名称,描述组件等

注意配置这四个,否则可能没网络

</application>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

详情可以看 https://www.jianshu.com/p/3b5b89d4e154

2.查看构建配置

你需要编辑applicationId,minSdkVersion 等

配置文件位于android>app>build.gradle,下面我摘取了部分配置

android {
    // 编译的安卓sdk版本,不是最终打包的版本,当使用的sdk版本与组件版本对照,提示开发者那些功能已经过时
    compileSdkVersion flutter.compileSdkVersion // 用于编译的SDK版本

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.huyu.org.flutter_trip2"
        minSdkVersion 24 // 应用支持的最小的SDK版本,低于此版本,应用将无法安装
        targetSdkVersion 24 // 目标版本,这个是最终打包的版本
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }
}

3.添加启动图标

当一个新的Flutter应用程序被创建时,它有一个默认的启动器图标。要自定义此图标:

  1. 查看Android启动图标 设计指南,然后创建图标。

  2. <app dir>/android/app/src/main/res/目录中,将图标文件放入使用配置限定符命名的文件夹中。默认mipmap-文件夹演示正确的命名约定。

  3. AndroidManifest.xml中,将application标记的android:icon属性更新为引用上一步中的图标(例如 <application android:icon="@mipmap/ic_launcher" ...)。

  4. 要验证图标是否已被替换,请运行您的应用程序并检查应用图标

4.app签名

打开cmd,输入

flutter doctor -v

进入下图标红处的路径的bin文件夹下

此文件下有一个keytool.exe文件,此文件将用于生成签名

在此文件夹下打开cmd,运行以下命令

keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

输入完成后,将在此文件夹下生成一个key.jws文件。

然后在android文件夹下新建一个文件夹用于存放签名文件,我这里新建了一个key_store文件夹用于存放文件

在android文件夹下,新建一个key.properties文件,内容如下:

storePassword=你输入的口令
keyPassword=你输入的口令
keyAlias=你输入的别名
storeFile=../key_store/flutter_trip_key.jks 存放文件的路径

在buid.gradle文件中配置签名

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

def keystorePropertiesFile = rootProject.file("key.properties")// 新增的配置项

def keystoreProperties = new Properties()// 新增的配置项
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))// 新增的配置项

android {
    signingConfigs { // 新增的配置项
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
//            signingConfig signingConfigs.debug
            signingConfig signingConfigs.release // 新增的配置项
        }
}

5.开启混淆

创建 /android/app/proguard-rules.pro 文件,并添加以下规则:

#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }

上述配置只混淆了 Flutter 引擎库,任何其他库(比如 Firebase)需要添加与之对应的规则。

开启混淆/压缩

打开 /android/app/build.gradle 文件,定位到 buildTypes 块。

在 release  配置中将 minifyEnabled  和 useProguard  设为 true,再将混淆文件指向上一步创建的文件。

 buildTypes {

        release {

            signingConfig signingConfigs.release

            minifyEnabled true
            useProguard true

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

        }
    }

完整的配置文件

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

// 用于打包的配置
def keystorePropertiesFile = rootProject.file("key.properties")

def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
    compileSdkVersion flutter.compileSdkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.huyu.org.flutter_trip2"
        minSdkVersion 24
        targetSdkVersion 24
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    // 用于打包
    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
        debug {
            
        }
    }

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

            minifyEnabled true // 压缩代码,减少体积
            useProguard true // 添加混淆

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            ndk {
                //直接是用"armeabi-v7a",此so可以兼容大部分的手机/设备,也是为了减少打包体积
                abiFilters "armeabi-v7a"
            }
        }
        
        // 可以配置debug下的应用
        debug {
            
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

6.打包应用

命令行运行

flutter build apk

打包好的发布APK位于<app dir>/build/app/outputs/apk/app-release.apk

当然你如果使用Android Studio,可以直接在工具栏找到build选项

标签:Flutter

文章评论

评论列表

已有0条评论