keytool -printcert -jarfile your_app.apk
keytool -genkey -v -keystore test.keystore -alias YYY -keyalg RSA -validity 4000
keytool -list -v -keystore test.keystore
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项目的Android为例
要在Flutter项目中配置APK签名,你可以按照以下步骤进行操作:
确保`key.properties`中指定的密钥库文件名与密钥文件名一致,在文件中添加以下内容,替换为真实的值:
```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)提供不同的配置,请取消注释相应的行,并为每个构建类型提供适当的值。
```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构建系统将使用指定的密钥库和密码进行签名。
#你可以通过直接在AS运行,生成已签名的APK文件,(默认生成debug版本签名)
Build > Flutter > Build APK
它将位于`build/app/outputs/flutter-apk/app-release.apk`路径下(对于release构建类型)
如果在命令行中运行,flutter build apk
注意:1.在使用APK签名之前,请确保密钥库文件和相关密码的安全性,并且备份好重要的文件和密码信息,以防止丢失或泄露。2.编译成功后,可以回到文章开头,验证是否签名成功。
参考反编译后打包签名:apk反编译和重新打包流程_apk反编译后重新打包_☆七年的博客-程序员宅基地
文章浏览阅读10w+次,点赞2次,收藏5次。我们用adb连接Android设备时会出现:adb devicesadb server is out of date. killing…ADB server didn’t ACK* failed to start daemon *error: unknown host service这是因为 adb的端口(5037)被占用了在命令行输入C:\Users\lizy>netstat ..._cannot bind 'tcp:5037
文章浏览阅读853次。ATMEAGl6L的中断系统什么是“中断”?顾名思义中断就是中断某一工作过程去处理一些与本工作过程无关或间接相关或临时发生的事件,处理完后,则继续原工作过程。比如:你在看书,电话响了,你在书上做个记号后去接电话,接完后在原记号处继续往下看书。如有多个中断发生,依优先法则,中断还具有嵌套特性。又比如:看书时,电话响了,你在书上做个记号后去接电话,你拿起电话和对方通话,这时门铃响了,你让打电话的对方稍..._0xfe在单片机中是什么意思
文章浏览阅读963次。实现代码如下<Form ref="resetPwdForm" :model="resetPwdForm" :rules="resetPwdRules"> <FormItem prop="password"> <p> <Icon slot="prefix" class="iconfont iconPC-2" /> <span>密码</span> </p> <Input v-mod_iview form怎么判断两次密码是否一样
文章浏览阅读2.8k次。个人经验,仅供参考下载Anaconda,我下载时未添加环境变量,是下载好之后把…/script路径手动添加到环境变量中的用户变量下载vscode在Anaconda中创建一个新环境打开vscode:file->reference->setting搜索python.pythonPath添加你的Anaconda下env的路径左下角这里点击可选择interpreter,选择xxx:conda(你的虚拟环境对应的解释器),建议选择前先重开vscode中断出现(base)说明操作成功,_vscode用anaconda作为解释器
文章浏览阅读2.4k次。浅谈 URI 及其转义URIURI,全称是 Uniform Resource Identifiers,即统一资源标识符,用于在互联网上标识一个资源,比如 https://www.upyun.com/products/cdn 这个 URI,指向的是一张漂亮的,描述又拍云 CDN 产品特性的网页。URI 的组成完整的 URI,由四个主要的部分构成:<scheme>://..._uri转义
文章浏览阅读1.1k次。Ubuntu安装opencv,一步到位。_ubuntu安装opencv3.4.5
文章浏览阅读571次,点赞6次,收藏10次。例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)_kubelet的6443端口未启动
文章浏览阅读1.2k次。经常使用电脑的朋友由于工作需要可能会需要设置定时开关机,那么定时关机设置起来比较简单,使用系统自带的或是软件都可以,定时开机会相对复杂一些,不管如何,下面小编就把电脑定时关机开机的方法分享给大家。一、电脑定时关机A:使用系统自带定时关机命令方法一:运行输入 at 18:00 shutdown -f -s1、打开开始菜单,选择运行2、输入 at 18:00 shutdown -f -s 即可在下午6..._c语言怎样把一个开机时间和一个关机时间的
文章浏览阅读253次。用户评论:roysimke atmicrosoftsfirstmailprovider dot com (18-Jun-201004:35)Never useaddslashes function to escape values you are goingto send to mysql. use mysql_real_escape_string or pg_escape atleast if ..._addslashes函数 java
文章浏览阅读4.8k次。本文采用的ElasticSearch和kibana的版本为7.17.3。在ElasticSearch的操作中:搜索Dev Tools 进入到命令栏,即可对Elastic Search进行操作。green 表示健康, yellow 表示亚健康, red 表示有问题。三、ElasticSearch的增删查改操作1、创建数据库创建game库、consoleGame表、向id为1添加数据PUT对应的修改内容为全局修改,是新的内容直接覆盖了旧的内容,如果要保持键的内容及数量不变,需要与旧的数据一_elasticsearch命令
文章浏览阅读1.4k次,点赞45次,收藏32次。3. 运行H2OUVE-W-GUIx64.exe,File->LoadImage,选择刚才的bak.bin,然后再File->Export,保存为Setup.txt。5. 在H2OUVE里,File->Import,选择Setup2.txt,等待片刻,File->Saveas,保存为mod.bin。2. 用IntelFPT软件,需要v12版本,备份你的BIOS,命令行fptw64.exe-bios-d bak.bin建议管理员。_机械师t58vbios更新工具下载
文章浏览阅读90次。说好的开始搞树形DP,前两天一直沉迷于游戏之中,昨天又玩了一整天炉石。ORZ今天搞搞憋出了第一道。中文题就不说题意了思路:dp[i][j]表示以i为根的子树攻克j个城堡的最大收获。一开始的时候要加一个零号结点上去,指向所有能被直接攻克的点。然后初始dp[v][1] = vex[v](状态转移从1开始)原因是先要攻克根才能攻克子树所以要更新子树的话根是一定要被攻克的。然后dp[v][k+j]..._hdu1561