android - 为什么更改默认应用程序名称在使用颤振构建的 android productFlavors 中不起作用
问题描述
现在我正在使用 android productFlavors 将应用程序打包在颤振中,这是我的命令:
~/apps/flutter/bin/flutter build apk --release --flavor prod -t lib/main_pro.dart --no-sound-null-safety
但输出名称始终是app-prod-release.apk
:
$ ~/apps/flutter/bin/flutter build apk --release --flavor prod -t lib/main_pro.dart --no-sound-null-safety ‹ruby-2.7.2›
Changing current working directory to: /Users/dolphin/source/cruise-open
Building without sound null safety
For more information see https://dart.dev/null-safety/unsound-null-safety
Running Gradle task 'assembleProdRelease'...
Running Gradle task 'assembleProdRelease'... Done 7.1s
✓ Built build/app/outputs/flutter-apk/app-prod-release.apk (23.7MB).
(base)
这是我的android/app/build.gradle
gradle 配置:
flavorDimensions 'app'
productFlavors {
prod {
dimension 'app'
resValue "string", "app_name", "Cruise"
manifestPlaceholders = [
"APP_NAME" : "cruise-production"
]
}
}
现在我想要包名之类的cruise-prouction-release.apk
,而不是app-prod-release.apk
. 我应该怎么做才能更改默认包名称?我尝试将输出包名称更改为releaseApkName.apk
:
buildTypes {
release {
signingConfig signingConfigs.debug
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
println("releaseApkName")
output.outputFileName = "releaseApkName.apk"
}
}
}
}
但这似乎不起作用。这是我现在的完整配置:
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"
android {
compileSdkVersion 28
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
lintOptions {
disable 'InvalidPackage'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.earth.dolphin"
minSdkVersion 18
targetSdkVersion 28
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
buildTypes {
release {
signingConfig signingConfigs.debug
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
outputFileName = "a.apk"
}
}
}
}
flavorDimensions 'app'
productFlavors {
dev {
dimension 'app'
resValue "string", "app_name", "Cruise-dev"
applicationIdSuffix '.dev'
}
stage {
dimension 'app'
resValue "string", "app_name", "Cruise-stage"
applicationIdSuffix '.stage'
}
prod {
dimension 'app'
resValue "string", "app_name", "Cruise"
}
}
}
flutter {
source '../..'
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}
gradle 版本是 5.6.2。这是仍然使用默认名称的输出:
解决方案
最后我正在使用这个脚本,它可以工作:
buildTypes {
release {
signingConfig signingConfigs.debug
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
def buildType = variant.buildType.name
println("buildType=" + buildType)
if (buildType != "debug") {
def projectRootDir = "$rootDir"
def outputFileDir = new File(projectRootDir + File.separator, "apk")
println("outputFileDir=" + outputFileDir)
def productFlavorsName = productFlavors.name.toString()
def oldApkFlavorsName = productFlavorsName.replace("[", "").trim()
def newApkFlavorsName = oldApkFlavorsName.replace("]", "").trim()
println("newApkFlavorsName=" + newApkFlavorsName)
def apkFlavorsNameDir = new File(outputFileDir, newApkFlavorsName)
println("apkFlavorsNameDir=" + apkFlavorsNameDir)
// variant.getPackageApplicationProvider().get().outputDirectory = apkFlavorsNameDir
def appName
if (productFlavorsName.contains("dev")) {
appName = "cruise-dev"
} else if (productFlavorsName.contains("test")) {
appName = "cruise-beta"
} else if (productFlavorsName.contains("prod")) {
appName = "cruise-release"
}else{
appName = "cruise-beta"
}
def releaseApkName = "" + appName + "-" + defaultConfig.versionName + ".apk"
output.outputFileName = releaseApkName
}
}
}
}
}
包输出路径为:
/Users/dolphin/source/cruise-open/build/app/outputs/apk/prod/release
看起来像这样:
推荐阅读
- php - 提交后如何保留在foreachloop中选中的选定框
- java - FirebaseAuth 和 FirebaseDatabase 不保存 Google 注册
- tfs - TFS 在工作项中自动创建子任务(链接)
- c++ - 黑盒系统。自定义主机上的安全软件
- php - 为什么 Heroku 不使用 Laravel 链接存储来提供图像?
- powershell - 从 PowerShell 中的远程会话重定向详细流
- .htaccess - 我在重写规则方面需要帮助
- python - 访问和修改 Maya 撤消队列
- javascript - Vscode 中的 Google chrome “like”控制台
- excel - 如何在我的代码中使用最新的文件函数进行 vlookup