likes
comments
collection
share

Flutter 打包 android端 apk

作者站长头像
站长
· 阅读数 23

本次所记录的打包流程全部都是在Android Studio上完成,建议不要直接参考官方文档的打包流程,不然很大几率会出错

android studio终端生成签名文件

keytool -genkey -v -keystore <存放的路径>/文件名字.jks -keyalg RSA -keysize 2048 -validity 有效时间 -alias 别名

例:keytool -genkey -v -keystore D:/flutterPackageSignature/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias sign

  1. genkey : 产生密钥
  2. keystore :
  3. <存放的路径>/key.jks :证书的存放路径和名字
  4. keyalg RSA -keysize 2048 :使用 2048 位 RSA 算法对签名加密
  5. validity 10000 :有效期时间,这里是 10000天
  6. alias sign : 别名 sign

输入正确命令然后回车,即会请求输入密码(密码不要忘记)

Flutter  打包 android端  apk

此时运行正确的命令不出意外会在D:/flutterPackageSignature中生成一个key.jks文件,注意此文件不要上传分享给别人

项目配置

Flutter  打包 android端  apk

  1. 导入签名文件key.jks

在Flutter工程中/android/app目录下创建key文件夹,然后把sign.jks复制进来(注意保存在电脑本地的文件夹中还得有存在key.jks文件)

  1. 配置/android/app/build.gradle文件

在flutter的/android/app/build.gradle文件中的android前加入; 如果你的signingConfigs里面使用的是绝对路径,则不需要加这个

def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

在android里的signingConfigs加入release

     signingConfigs {
            release {
                keyAlias 'sign'  //别名
                keyPassword '生成签名时输入的密码'
                storeFile file('D:/flutterPackageSignature/signfile.jks')  //签名文件路径
                storePassword '生成签名时输入的密码'
            }
        }

        buildTypes {
         release {   
           minifyEnabled true
           shrinkResources true //移除未使用的资源
           signingConfig signingConfigs.release
           proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
               }
         debug {
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            debuggable true
                }
        }

  1. 创建 key.properties 文件

  • storePassword= 刚刚创建密钥库时的密码
  • keyPassword= 刚刚创建密钥的密码
  • keyAlias=sign(别名)
  • storeFile=D:/flutterPackageSignature/key.jks

减小APK包的体积(推荐使用第二种)

一:在主工程的AndroidManifest.xml配置中,在application标签,添加android:extractNativeLibs=true属性

android:extractNativeLibs=true

或者

二:在 android/app/build.gradle 增加对应内容:

对于 Android Gradle Plugin 8 以上,增加 packaging

android {
    packaging {
        dex {
            useLegacyPackaging true
        }
        jniLibs {
            useLegacyPackaging true
        }
    }
}

其他版本增加 packagingOptions

android {
    packagingOptions {
        dex {
            useLegacyPackaging true
        }
        jniLibs {
            useLegacyPackaging true
        }
    }
}

原因:android:extractNativeLibs = true或者useLegacyPackaging true时,gradle打包时会对工程中的so库进行压缩,最终生成apk包的体积会减小。但用户在手机端进行apk安装时,系统会对压缩后的so库进行解压,从而造成用户安装apk的时间变长。

生成apk

配置完成后在项目终端输入生成apk命令

flutter build apk --target-platform android-arm --split-per-abi(apk包)

flutter build apk --target-platform android-arm --split-per-abi --debug (apk debug包)

或者

flutter build apk(相对上面那个命令,此命令打包的apk相对大一些)

或者

flutter build appbundle (aab包)

Flutter  打包 android端  apk 当出现如图所示即打包成功,Build后为apk存放的路劲

查看生成的签名文件里面的信息

keytool -list -v -keystore key.jks
注:1. key.jks是我本地的文件名,需替换你的文件名才可以
    2. 该命令需要在key.jks所在的文件夹里面打开终端运行

生成apk过程遇到的一些坑

BUG1

Flutter  打包 android端  apk

如图,当出现图中bug时我们就检查项目的/android/gradle.properties文件,看是否存在android.enableR8=true(最好不要加上android.enableR8这行,但有时候默认会生成的,所以我们讲true改成false就可以解决此bug)

BUG2

Flutter  打包 android端  apk

综上,当我们把true改为false时解决bug1,但是会出现图中的bug2

解决方法:将下图中的old部分换成new部分即可

Flutter  打包 android端  apk

BUG3

项目中换取使用阿里镜像时buildscript repositories和allprojects repositories都需要更改,不然会出错

啊里镜像

maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }

BUG 4

Flutter  打包 android端  apk

BUG 5

Flutter  打包 android端  apk

问题所在:此类基本上就是Gradle的配置需要改 解决方法:

  1. 参考BUG3,更换镜像
  2. 翻墙开全局模式

隔绝密钥方法

为了实现每个人都有一套签名的目标,你可以考虑以下几种方法:

  1. Git 忽略敏感信息: 在提交代码之前,你可以在项目的根目录下创建一个名为 .gitignore 的文件,并将包含密码别名的配置文件添加到该文件中。这样,Git 在提交代码时会自动忽略这些文件,确保它们不会被上传到远程仓库中。其他人在克隆项目时将无法看到这些文件。

  2. 使用本地配置文件: 将密码别名和其他敏感信息存储在本地配置文件中,而不是直接在 build.gradle 文件中配置。可以在项目根目录下创建一个名为 local.properties 的文件,并在其中添加类似以下内容的配置:

keystore.password=your_password
key.alias=your_alias
key.password=your_key_password

然后在 build.gradle 文件中引用这些属性,如下所示:

def keystorePropertiesFile = rootProject.file("key.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
    // ...

    signingConfigs {
        release {
            storeFile file('your_keystore_file.jks')
            storePassword project.properties['keystore.password']
            keyAlias project.properties['key.alias']
            keyPassword project.properties['key.password']
        }
    }

    // ...
}

这样,你可以将 local.properties 添加到 .gitignore 文件中,确保敏感信息不会被上传到 Git。

  1. 使用环境变量: 可以在本地设置环境变量来存储密码别名等敏感信息,并在 build.gradle 文件中引用这些环境变量。例如,在 Windows 上,你可以使用以下命令设置环境变量:
setx KEYSTORE_PASSWORD your_password
setx KEY_ALIAS your_alias
setx KEY_PASSWORD your_key_password

然后在 build.gradle 文件中使用这些环境变量:

android {
    // ...

    signingConfigs {
        release {
            storeFile file('your_keystore_file.jks')
            storePassword System.getenv('KEYSTORE_PASSWORD')
            keyAlias System.getenv('KEY_ALIAS')
            keyPassword System.getenv('KEY_PASSWORD')
        }
    }

    // ...
}

这样,每个人可以在自己的环境中设置适合自己的环境变量,从而实现每人一套签名的目标。

无论使用哪种方法,请确保在版本控制系统中不存储包含敏感信息的文件,以保护你的应用程序的安全性。

引用参考

Flutter打包apk: wcdxg.com/2020/04/29/…

Flutter打包apk:www.jianshu.com/p/fabcfd621…

Flutter Andorid 真机或打包 APK 杂症记录:xie.infoq.cn/article/e85…

转载自:https://juejin.cn/post/6944000831465193480
评论
请登录