在新环境下Windows系统如何使用gradle命令自定义包名及自定义APP名称打正式包apk

本文详细介绍了如何通过命令行在Windows环境下配置和修改Android项目,以实现在线自定义包名和APP名称,并一键打包生成正式APK。涉及到的步骤包括配置环境、修改gradle.properties和build.gradle文件,以及编写shell脚本自动化打包过程。此外,还探讨了将此功能应用于web端的可能性及潜在的安全问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

在web端集成命令来实现在线自定义Android项目的包名以及APP名称,并在线一键打包生成正式包

开始表演

环境(版本自己定,以下是我环境):
  1. 系统:Windows10
  2. jdk1.8
  3. gradle6.5:下载gradle并配置环境变量,cmd下"gradle -v"来验证是否配置成功
  4. android sdk:参考文章直接去看怎么配置:https://blog.youkuaiyun.com/mityuxuan/article/details/105811870
Android测试项目一份
  1. 之前运行成功的Android代码一份,需要修改project目录下gradle.properties,内容如下:
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
android.injected.testOnly=false
android.buildCacheDir=D\:\\gradle\\android-build-cache\\cache
# 包名,这里定义的是APP目录下的build.gradle中的applicationId,并不是修改代码包名,基于此实现后以此类推即可
pkgName=com.xxx.xxx
# App名称
#CUR_PROJECT=xxx
APP_NAME=xxx
# App logo图标
#APP_ICON=@drawable/xxx_logo
# 版本号
#VERSION_CODE=2

# 版本名称
#VERSION_NAME=1.0.2

# 调试开关
#DEBUG_TAG=false


  1. 接下来修改app目录下的build.gradle,注意defaultConfig部分对应上一步
apply plugin: 'com.android.application'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"
    aaptOptions.useNewCruncher = false
    aaptOptions.cruncherEnabled = false

    signingConfigs {
        release {
            storeFile file("../xxx.jks")
            keyAlias 'xxx'
            keyPassword '123456'
            storePassword '123456'
            v1SigningEnabled true
            v2SigningEnabled true
        }
    }
    defaultConfig {
        applicationId project.pkgName
        //java代码中引用的定义形式
        buildConfigField "String", "APP_NAME", "\"${APP_NAME}\""
        manifestPlaceholders = [
//                CUR_PROJECT : CUR_PROJECT,
                APP_NAME    : URLDecoder.decode(APP_NAME.toString(), "UTF-8"),
//                VERSION_CODE: VERSION_CODE,
//                VERSION_NAME: VERSION_NAME,
//                APP_ICON    : APP_ICON
        ]
//        buildConfigField project.requestParam
//        buildConfigField "String", "requestParam", "$requestParam"
        minSdkVersion 19
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    }
    buildTypes {
        release {
            //是否混淆
            minifyEnabled false
            //混淆的配置文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }
    //修改apk 的 文件名,这里是文件名
    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def date = new Date().format("yyyy_MM_dd_hh_mm", TimeZone.getTimeZone("GMT+08"))
            if (variant.buildType.name == "debug") {
                output.outputFileName = "${date}_arbitrator_v${android.defaultConfig.versionName}_debug_${android.defaultConfig.versionCode}.apk"
            } else if (variant.buildType.name == "release") {
                output.outputFileName = "${date}_arbitrator_v${android.defaultConfig.versionName}_release_${android.defaultConfig.versionCode}.apk"
            }
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
    implementation 'pub.devrel:easypermissions:3.0.0'
}

  1. 编写shell脚本,内容如下,写好后放在Android项目根目录下:
#!/usr/bin/env bash
# 进入项目工程
#cd $projectPath

# 复制icon图标到资源目录(绝对路径 -> 项目相对路径),这里可以延伸为自定义logo,开屏图之类的功能,
# 比如icon在项目根目录,后台可以编写接口来上传logo之类的图片,执行shell脚本打包apk的时候就可以实现修改logo等图片
cp icon/ic_launcher.png app/src/main/res/mipmap-hdpi/
cp icon/ic_launcher.png app/src/main/res/mipmap-mdpi/
cp icon/ic_launcher.png app/src/main/res/mipmap-xhdpi/
cp icon/ic_launcher.png app/src/main/res/mipmap-xxhdpi/
cp icon/ic_launcher.png app/src/main/res/mipmap-xxxhdpi/
#cp /xxx/xxhdpi/ic_launcher.png app/src/main/res/mipmap-xxhdpi/
#... (全部icon图标的路径)

# 复制启动图到资源目录
#cp /icon/img_welcome.png app/src/main/res/mipmap-xxhdpi/

# 执行打包命令,-P用于拼接参数
./gradlew assembleRelease -PpkgName=com.xxx.xxx -PAPP_NAME=xxx

运行

运行方式有多种:
  1. 直接cmd到Android项目根目录,xxx.sh运行即可
  2. 直接在Android项目根目录双击xxx.sh即可
  3. 运行结束后打包的apk在这个目录下:app\build\outputs\apk\release\
web端在线自定义包名打包apk
  1. Android项目代码编写完毕后上传至托管平台
  2. clone至本地
  3. web端表单提交自定义包名字符串、APP名称字符串、logo、开屏图接口上传至服务端
  4. 服务端接收信息后拼接为shell脚本文件
  5. 运行该脚本,打包结束后路径是固定的,web端可以展示url或二维码提供下载安装
思考拓展
  1. 项目本身放置到服务器,在线打包对用户开放使用的话,Android代码需要放到服务器,有一定的泄露风险,目前还没想好怎么处理,或者其他方式去实现此功能
参考
  1. https://www.zhihu.com/question/302394834/answer/1666308906
  2. https://blog.youkuaiyun.com/menglong0329/article/details/107846040
  3. https://blog.youkuaiyun.com/menglong0329/article/details/107846040
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值