Flutter给APK签名—两种方式(android 安装包)

2024-03-31 1037阅读

温馨提示:这篇文章已超过411天没有更新,请注意相关的内容是否还可用!

前提:给未签名的apk签名,可以先检查下apk有没有签名
通过命令行查看:打开终端或命令行界面,导入包含APK文件的目录,并执行以下命令:
keytool -printcert -jarfile your_app.apk
将 your_app.apk替换为要检查的APK文件名。执行命令后,你将看到与APK文件关联的签名信息。 Flutter给APK签名—两种方式(android 安装包) 注意:上述命令基于Java Development Kit (JDK) 中的 keytool工具,因此请确保你的系统上已安装JDK,并且 keytool命令可以在命令行中使用。

方式一、手动签名

1. 生成密钥文件,选个文件目录,cmd命令行输入以下命令
keytool -genkey -v -keystore test.keystore  -alias YYY -keyalg RSA -validity 4000
( YYY是 别名,4000是有效天数4000天 生成密钥文件 test.keystore) 执行命令之后会提示你设置密码,以及一些公司名称之类的;密码一定要记住,其他随意 Flutter给APK签名—两种方式(android 安装包)Flutter给APK签名—两种方式(android 安装包) 其中Keytool 是Java提供的密钥(Key)和证书(Certificate)管理工具,用于管理公钥/私钥对以及相关证书。 Keytool是Java自带的工具,安装Java即可。位于Java安装的bin目录中, 比如C:\Program Files\Java\jre1.8.0_131\bin。
2. 查看证书信息  
  keytool -list -v -keystore test.keystore  
Enter keystore password: //输入密码,回车 Flutter给APK签名—两种方式(android 安装包)
3. 开始签名
格式: jarsigner -verbose -keystore 签名 -signedjar  签名文件后的文件名 需要签名文件  证书里alias别名 接着输入密码
  jarsigner -verbose -keystore E:\xxx\test.keystore  -signedjar 
 xxxx签名后的xxx.apk D:\xxx\未签名的xxx.apk  testalias
如下 :jarsigner -verbose -keystore D:\test1.keystore -signedjar flutter_demo.apk 
E:\Flutter\flutterdemo\build\app\outputs\flutter-apk\app-release.apk YYY
其中文件拖到命令行界面就可以,不需要自己拼路径

Flutter给APK签名—两种方式(android 安装包)

Flutter给APK签名—两种方式(android 安装包)

方式二、配置自动签名

以下以Flutter项目的Android为例

要在Flutter项目中配置APK签名,你可以按照以下步骤进行操作:

1. 在Android项目的根目录下创建一个sign的文件夹,将你的密钥库文件(.keystore)复制该目录下。
2.再创建名为`key.properties`的文件

确保`key.properties`中指定的密钥库文件名与密钥文件名一致,在文件中添加以下内容,替换为真实的值:

Flutter给APK签名—两种方式(android 安装包)

  ```properties

   storePassword=your_store_password

   keyPassword=your_key_password

   keyAlias=your_key_alias

   storeFile=your_keystore_file.jks

  

   # 如果你在构建不同的构建类型(例如,debug和release),需要提供不同的配置,可以创建以下配置:

   # storePassword.debug=debug_store_password

   # keyPassword.debug=debug_key_password

   # keyAlias.debug=debug_key_alias

   # storeFile.debug=debug_keystore_file.jks

   #

   # storePassword.release=release_store_password

   # keyPassword.release=release_key_password

   # keyAlias.release=release_key_alias

   # storeFile.release=release_keystore_file.jks

-`your_store_password`:密钥库(keystore)文件的密码。

   - `your_key_password`:密钥的密码。

   - `your_key_alias`:密钥的别名。

   - `your_keystore_file.jks`:密钥库文件的名称。

 如果你需要为不同的构建类型(例如,debug和release)提供不同的配置,请取消注释相应的行,并为每个构建类型提供适当的值。

3. 在Flutter项目的`android/app/build.gradle`文件中,找到`android`块,并在其中添加以下代码:

   ```groovy

//声明 获取签名配置 配置文件路径

def signProperties = rootProject.file("sign/keystore.properties")

def props = new Properties()

props.load(new FileInputStream(signProperties))

def file = file(props['storeFile'])

android {

    signingConfigs {

        release {

            //如果秘钥库文件和配置文件存在就签名,否则不签名

            if (file.exists() && signProperties.exists()) {

                keyAlias props['keyAlias']

                keyPassword props['keyPassword']

                storeFile file

                storePassword props['storePassword']

            }

        }

    }

       // ...

   

 buildTypes {

    release {

        //混淆

        minifyEnabled true

        //去除无用res文件

        shrinkResources true

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

        //使用签名文件

        signingConfig signingConfigs.release

     }

   }

   

 }

   ```

这将读取你在`key.properties`中配置的值,并在`release`构建类型中应用签名配置。

请注意,确保替换`keyAlias`、`keyPassword`、`storeFile`和`storePassword`值为你自己的实际值。

完整的build.gradle

plugins {
    id "com.android.application"
    id "kotlin-android"
    id "dev.flutter.flutter-gradle-plugin"
}
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}
//声明 获取签名配置 配置文件路径
def signProperties = rootProject.file("sign/keystore.properties")
def props = new Properties()
props.load(new FileInputStream(signProperties))
def file = file(props['storeFile'])
android {
    signingConfigs {
        release {
            //如果秘钥库文件和配置文件存在就签名,否则不签名
            if (file.exists() && signProperties.exists()) {
                keyAlias props['keyAlias']
                keyPassword props['keyPassword']
                storeFile file
                storePassword props['storePassword']
            }
        }
    }
    namespace "com.example.flutter_demo_android_java"
    compileSdk flutter.compileSdkVersion
    ndkVersion flutter.ndkVersion
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.example.flutter_demo_android_java"
        // You can update the following values to match your application needs.
        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
        minSdkVersion flutter.minSdkVersion
        targetSdkVersion flutter.targetSdkVersion
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }
    buildTypes {
        release {
            //混淆
            minifyEnabled true
            //去除无用res文件
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            //使用签名文件
            signingConfig signingConfigs.release
        }
    }
    android.applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith(".apk")) {
                if (variant.buildType.name == "release") {
                    outputFileName = "v" + defaultConfig.versionName + "_" + ".apk"
                } else {
                    outputFileName = "v" + defaultConfig.versionName + "_" + ".apk"
                }
            }
        }
    }
}
flutter {
    source '../..'
}

完成这些步骤后,你的Flutter项目将配置APK签名。

在构建发行版本时,Android构建系统将使用指定的密钥库和密码进行签名。

4.编译签名apk

#你可以通过直接在AS运行,生成已签名的APK文件,(默认生成debug版本签名)

Build > Flutter > Build APK

Flutter给APK签名—两种方式(android 安装包)

它将位于`build/app/outputs/flutter-apk/app-release.apk`路径下(对于release构建类型)

如果在命令行中运行,flutter build apk

Flutter给APK签名—两种方式(android 安装包)

注意:1.在使用APK签名之前,请确保密钥库文件和相关密码的安全性,并且备份好重要的文件和密码信息,以防止丢失或泄露。2.编译成功后,可以回到文章开头,验证是否签名成功。

参考反编译后打包签名:apk反编译和重新打包流程_apk反编译后重新打包_☆七年的博客-CSDN博客

创造价值,乐哉分享!776147358
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]