一、开发环境

需要两个开发工具
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\"
}

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐