uniapp创建并实现离线打包成安卓app
一、开发环境
需要两个开发工具
1、Android studio(Android Studio Panda 2 )
2、HubilderX(HBuilderX.5.05.2026032417)
参考HbuilderX官网安卓离线打包,下载最新的开发工具
二、下载Android离线SDK
在官网找到安卓sdk资源包,选择和Hbuilder版本是相同版本的sdk

将下载下来的sdk解压![]()

HBuilder-Integrate-AS文件夹就是存放Hbuilder编译后的资源,用于打包成apk,将这个文件夹复制到一个不存在中文名称的目录中。
三、使用android studio 对该项目进行配置
HBuilder-Integrate-AS 在android studio中打开
1、配置gradle-wrapper.properties
打开这个项目,打开gradle->wrapper->gradle-wrapper.properties文件。
修改distributionUrl的地址为
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-bin.zip
zip文件使用sdk原来的文件名。可以进入到替换后的地址查看zip的版本是否存在。
1.注意:这里选择的是不同的 展示不同的文件内容 这里先选择project
2.注意:当前版本是gradle-8.11.1-bin.zip
2、配置使用的jdk
打开项目中simpleDemo的build.gradle文件,查看compleOptions配置的jdk版本,
此处的jdk1.8不影响打包

file->settings,打开settings配置文件 ,搜索gradle,修改gradle JDK引用的jdk,推荐使用jdk21

若是更换的话可选择其他的
**add jdk from disk …**打开本地的jdk,也可以直接 Download JDK直接下载指定jdk,我是直接Download下载的,点击Apply,然后点击ok,关闭settings。
3、获取安卓离线key
(1)、创建uniapp项目
打开HbuilderX,选择文件->新建->项目在打开的弹框中选择uni-app->默认模板,,输入项目名称,选择项目地址,点击右下角的创建。
项目创建成功。
(2)、进入到开发者中心
此时可以进入到开发者中心中查看,在开发者工具中右上角点击开发者后台,打开应用列表。
在应用列表的项目中看到appid和创建的项目中mainfest.json->基础配置->uni-app应用标识(AppId)相同

点击应用名称打开应用信息页面

(3)、创建云端证书
选择Android云端证书,点击创建证书,此时需要等待一段时间,然后刷新页面。这个证书用于安卓打包时使用。

(4)、复制证书中需要用到的信息
复制别名、MD5、SH1、SHA256、证书密码的信息,记录下来保存到一个文件中,证书密码的信息点击查看证书密码按钮查看



(5)、添加各平台信息
选择个平台信息标签,点击新增。进入到配置信息

配置平台为Android App,版本为正式版,刚刚保存的信息和包名,
注意:包名不能和其他项目重复,否则会被认定为同一个软件,包名也保存一下,后期要用,点击“提交”,生成一条记录,用户创建离线key

(6)、创建离线key
在刚生成的记录中,点击创建离线key按钮,打开配置信息弹框,点击“创建”,此时离线key创建成功

(7)、下载并替换离线证书
进入到Android云端证书标签,点击下载证书。

回到Android Studio,将下载的证书文件替换为simpleDemo项目的test.jks文件,名字还是test.jks,用来离线打包
注意这里可以做调整
我保持了原有的后缀名 改了名称
4、修改simpleDemo的配置文件
(1)、修改AndroidManifest.xml 配置文件
选择simpleDemo->AndroidManifest.xml,打开这个文件,
修改mata-data中android:value的值为刚刚生成的离线key

在这个文件中可以修改安卓app的名字,按住ctrl键点击这个名字,打开,strings.xml,将项目名改成你项目的名字。

(2)、修改strings.xml配置文件
打开下图中的dcloud_control.xml文件,这个地方的appid修改成之前保存的别名

(3)、修改build.gradle配置文件
打开build.gradle文件修改文件中的包名为之前获取离线key时配置的包名
修改config配置,keyAlias为之前保存的别名,keyPassword和storePassword为之前记录的证书密码。
keyPassword为证书的密码
四、打包安卓项目
1、生成本地打包资源
打开HbuilderX,选择发行->App Android/ios本地打包->生成本地打包App资源
等待安装依赖

复制这个文件夹
2、将资源包替换到SimpleDemo中
打开Android Studio,在AS项目中选择SimpleDemo->src->main->assets->apps文件下的,
可以先删除原来已经存在的资源包,将刚生成的资源包存放到assets中
替换后的
注意:这里的文件夹的层级一定要找对!!!
注意:这里的文件夹的层级一定要找对!!!
注意:这里的文件夹的层级一定要找对!!!
不然生成的apk的包不是自己的内容
为了防止找错文件夹 可在这里调整
此处apps.__UNI…在一个目录上,可以在菜单栏这三个如下图将Compact Middle Packages的勾取消掉。

3、安卓打包
(1)、修改打包模式
在Android Studio,选择build->select Build Variant…,选择打包模式,改为release

(2)、添加权限
在hbuilder中点击manifest.json,在安卓/ios模块配置中勾选需要添加的配置
暂时选择的我想要的权限 若是有调整的话可再次进行调整
在权限配置中复制生成的配置信息
将复制的权限粘贴到下图的AndroidManitest.xml文件的上面
(2)、打包
选择build->Generate App Bundles or Apks->Generabte APKs

选择Choose existing…,选择之前生成的test.jks证书,我这里已经改为了自己的名称
breedingbeef.keystore
两个密码都是证书密码,key alias是证书别名,点击next。

等待中。。。
创建的apk在这个位置

注意:调整包名
调整打包之后的app的图标和启动的画面 (这是Hbuilder默认的)
完成了❤️❤️❤️,,,开心
进阶的操作 下面只是自己的探索 仅供参考 待完善 下面的正在验证中 上面的已经验证可行
1.将整个的打包的放入到前端的项目中
2.控制版本号 统一的由manifest.json 控制
2. Android Studio 打 APK:从 manifest.json 读进去HBuilder-Integrate-AS/simpleDemo/build.gradle 里写死了:只认项目根目录的 manifest.json,再写到 Android 的 versionCode / versionName:
// 与 uni-app 根目录 manifest.json 的 versionCode / versionName 保持一致(改版本只改 manifest.json)
def uniManifestFile = file("${projectDir}/../../manifest.json")
def uniVersionCode = 1
def uniVersionName = "1.0"
if (uniManifestFile.exists()) {
def mf = new groovy.json.JsonSlurper().parseText(uniManifestFile.getText("UTF-8"))
uniVersionCode = mf.versionCode.toString().toInteger()
uniVersionName = mf.versionName.toString()
}
versionCode uniVersionCode
versionName uniVersionName

3.还可以自动的将生成的包自动的打包为apk 一句指令即可
# Sync uni-app resource pack into HBuilder-Integrate-AS and build signed release APK.
# Requires: Node/npm, Android SDK (ANDROID_HOME), JDK; keystore configured in simpleDemo/build.gradle.
param(
[string] $AppId = "__UNI__367EC02",
[ValidateSet("cli", "hbuilder")]
[string] $Source = "cli",
[switch] $SkipBuild,
[string] $JavaHome = ""
)
$ErrorActionPreference = "Stop"
function Test-ValidJavaHome([string] $Path) {
return $Path -and (Test-Path -LiteralPath (Join-Path $Path "bin\java.exe"))
}
function Resolve-JavaHomeFromJavaExe([string] $JavaExe) {
try {
$full = [System.IO.Path]::GetFullPath($JavaExe.Trim())
} catch { return $null }
if ($full -notmatch '[\\/]bin[\\/]java\.exe$') { return $null }
$home = Split-Path (Split-Path $full -Parent) -Parent
if (Test-ValidJavaHome $home) { return $home }
return $null
}
# Gradle needs JDK: explicit param / env override, then JAVA_HOME, then auto-discover.
$explicit = $JavaHome
if (-not $explicit) { $explicit = $env:PACK_ANDROID_JAVA_HOME }
if ($explicit -and (Test-ValidJavaHome $explicit)) {
$env:JAVA_HOME = $explicit.TrimEnd('\', '/')
Write-Host "Using JAVA_HOME from -JavaHome / PACK_ANDROID_JAVA_HOME: $($env:JAVA_HOME)"
}
elseif (-not (Test-ValidJavaHome $env:JAVA_HOME)) {
$pf86 = [Environment]::GetEnvironmentVariable("ProgramFiles(x86)")
$roots = @(
$env:ProgramFiles,
$pf86,
(Join-Path $env:LOCALAPPDATA "Programs")
) | Where-Object { $_ }
$candidates = [System.Collections.Generic.List[string]]::new()
foreach ($r in $roots) {
[void]$candidates.Add((Join-Path $r "Android\Android Studio\jbr"))
}
foreach ($d in @('C', 'D', 'E', 'F')) {
if (Test-Path "${d}:\") {
[void]$candidates.Add("${d}:\Program Files\Android\Android Studio\jbr")
}
}
$tb = Join-Path $env:LOCALAPPDATA "JetBrains\Toolbox\apps\AndroidStudio"
if (Test-Path -LiteralPath $tb) {
Get-ChildItem -LiteralPath $tb -Recurse -Filter java.exe -Depth 10 -ErrorAction SilentlyContinue |
Where-Object { $_.FullName -match '[\\/]jbr[\\/]bin[\\/]java\.exe$' } |
ForEach-Object {
$jbrRoot = Split-Path (Split-Path $_.FullName -Parent) -Parent
if (Test-ValidJavaHome $jbrRoot) { [void]$candidates.Add($jbrRoot) }
}
}
$picked = $candidates | Where-Object { Test-ValidJavaHome $_ } | Select-Object -First 1
if (-not $picked) {
$cmd = Get-Command java -CommandType Application -ErrorAction SilentlyContinue | Select-Object -First 1
if ($cmd -and $cmd.Source -notmatch 'javapath') {
$picked = Resolve-JavaHomeFromJavaExe $cmd.Source
}
}
if (-not $picked) {
$whereLine = & where.exe java 2>$null | Where-Object { $_ -and $_ -notmatch 'javapath' } | Select-Object -First 1
if ($whereLine) { $picked = Resolve-JavaHomeFromJavaExe $whereLine.Trim() }
}
if ($picked) {
$env:JAVA_HOME = $picked
Write-Host "Using JAVA_HOME=$($env:JAVA_HOME)"
}
}
if (-not (Test-ValidJavaHome $env:JAVA_HOME)) {
throw @"
JAVA_HOME is not set or invalid, and no usable JDK was found on this PC.
Do this once (recommended):
Android Studio -> Settings -> Build, Execution, Deployment -> Build Tools -> Gradle -> Gradle JDK
Copy the JDK path shown there, then set user environment variable JAVA_HOME to that folder
(the folder that directly contains subfolder `bin` with `java.exe` inside).
Or pass the path when running the script:
powershell -File ./scripts/pack-android.ps1 -JavaHome `"D:\YOUR\PATH\jbr`" -Source hbuilder -SkipBuild
Or set env PACK_ANDROID_JAVA_HOME to the same path (no quotes in System env dialog).
"@
}
$Root = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path
$DestWww = Join-Path $Root "HBuilder-Integrate-AS\simpleDemo\src\main\assets\apps\$AppId\www"
$SrcCli = Join-Path $Root "dist\build\app"
$SrcHbuilder = Join-Path $Root "unpackage\resources\$AppId\www"
if (-not $SkipBuild -and $Source -eq "cli") {
Set-Location $Root
npm run build:app-plus
if (-not (Test-Path $SrcCli)) {
throw "Expected CLI output not found: $SrcCli"
}
}
$Src = if ($Source -eq "cli") { $SrcCli } else { $SrcHbuilder }
if (-not (Test-Path $Src)) {
throw "Resource source not found: $Src`n cli: run without -SkipBuild or run: npm run build:app-plus`n hbuilder: 先在 HBuilder 中生成本地打包资源,路径应为 unpackage\resources\$AppId\www"
}
New-Item -ItemType Directory -Force -Path $DestWww | Out-Null
Get-ChildItem -LiteralPath $DestWww -Force -ErrorAction SilentlyContinue | Remove-Item -Recurse -Force
Copy-Item -Path (Join-Path $Src "*") -Destination $DestWww -Recurse -Force
$AsRoot = Join-Path $Root "HBuilder-Integrate-AS"
Set-Location $AsRoot
& .\gradlew.bat :simpleDemo:assembleRelease --no-daemon
if ($LASTEXITCODE -ne 0) {
throw "Gradle failed (exit code $LASTEXITCODE). Fix JAVA_HOME / ANDROID_HOME and SDK, then retry."
}
$Apk = Join-Path $AsRoot "simpleDemo\build\outputs\apk\release\beefbreeding.apk"
$ApkMirror = Join-Path $AsRoot "simpleDemo\release\beefbreeding.apk"
if (Test-Path $Apk) {
Write-Host "APK (Gradle output): $Apk"
New-Item -ItemType Directory -Force -Path (Split-Path $ApkMirror) | Out-Null
Copy-Item -LiteralPath $Apk -Destination $ApkMirror -Force
Write-Host "APK (copy for convenience): $ApkMirror"
} else {
Write-Warning "APK not at expected path: $Apk. Check simpleDemo\build\outputs\apk\"
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)