uni-app配置离线打包到android平台-基础篇

介绍

  1. 云打包使用官方提供的服务,方便简单;但打包需要等待,依赖网络环境。
  2. 离线打包使用本地环境,本地打包生成APK,无需等待打包速度快,可锁定SDK版本。版本对照参考

基本流程

  1. 下载安装 HBuilderX,创建一个uniapp的基础项目
  2. 申请签名证书
  3. 下载android studio 下载地址
  4. 使用android studio安装android sdk
  5. 下载uniapp android SDK,版本要和HBuilderX版本保持一致 下载地址
  6. 使用uniapp android SDK构建/配置出一个uniapp android项目工程
  7. 使用HBuilderX生成uniapp项目的打包资源
  8. 将生成的uniapp项目打包资源复制到android项目工程,执行打包命令生成apk

uniapp离线打包key

  1. 安装HBuilderX后, 创建项目, 生成项目的APPID。新生成的APPID表明该项目创建在HBuilderX当前登录人dcloud账号下。
  2. 登录dcloud开发者后台dev.dcloud.net.cn
  3. 我的应用中找到对应APPID的项目进入应用管理
  4. Android云端证书-创建证书创建证书
  5. 各平台信息新增平台信息,选择android平台,录入包名、SHA1、MD5、SHA256,后三项信息可以在证书详情中找到,保存提交后即可生成离线打包key

配置android开发环境

准备jdk环境

推荐使用1.8版本

  1. 官网下载地址:oracle.com/java/techno...
  2. 以mac为例选择对应芯片类型SDK的.dmg文件下载
  3. 双击dmg根据提示一步步安装
  4. 终端中执行java -version检查是否安装成功
  5. 终端中执行/usr/libexec/java_home -V查看JDK下载地址
  6. 配置环境变量(zsh修改~/.zshrc文件)
plain text 复制代码
编辑文本可以使用vim ~/.bash_profile
打开文件后按i进入编辑模式,编辑完成后按esc退出编辑模式,输入:wq保存并退出
具体可查看vim使用
  1. ~/.bash_profile中添加下面两行,替换自己真实路径
bash 复制代码
   export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home"
   export PATH="$JAVA_HOME/bin:$PATH"
  1. 执行source ~/.bash_profile使改动立即生效
  2. 执行echo $JAVA_HOME检查是否生效

准备android studio

  1. 官网下载地址:developer.android.google.cn/studio
  2. 选择对应版本的安装包下载,根据提示进行安装
  3. Hedgehog版本的AS为例,在选择项目窗口的右上角进入SDK Manager,或者进入项目界面进入Settings-Languages & Frameworks-Android SDK-SDK Platforms选择Android 11.0(R) API Level 30的SDK进行安装

配置android工程

生成打包资源

  1. 在HBuilderX中选择项目 发行-原生App本地打包-生成本地打包App资源
plain text 复制代码
如果不能生成并提示账号问题
检查当前HBuilderX登录账号是否有该APPID项目的权限
他人创建的项目需要项目创建人授权
找不到创建人可考虑重新生成APPID(注意查看风险提示)
左下角可以切换账号

示例目录生成的资源在dist目录下,是因为该项目是使用cli模式创建的,非cli模式项目生成资源在unpackage/resources目录下,具体查看HBuilderX控制台输出。

准备基础android项目

  1. 项目工程基于uniapp android SDK创建,下载的sdk版本应该与HBuidlerX版本保持一致 下载地址
  2. 以3.96版本SDK为例,包含以下目录
plain text 复制代码
	|-- HBuilder-Hello	   App离线打包演示应用
	|-- HBuilder-Integrate-AS  集成uni-app的最简示例
	|-- SDK			   SDK库文件目录
	|-- Feature-Android.xls	   Android平台各扩展Feature API对应的详细配置
	|-- Readme.txt		   版本说明文件及注意事项
	|-- UniPlugin-Hello-AS	   uni原生插件开发示例
  1. 基于HBuilder-Integrate-AS示例创建自己的android项目构建工程
  2. 使用android studio 打开HBuilder-Integrate-AS目录,等待编译完成
plain text 复制代码
如果编译失败,依赖没有安装成功,可以尝试更换网络环境(🪜)
或者在根级build.gradle中配置阿里镜像源[https://developer.aliyun.com/mvn/guide]

如果是"Your build is currently configured to use Java 17.0.7 and Gradle 6.5"
说明工程配置的sdk和Gradle版本不匹配
- 选择升级gradle;修改file-Project Structure-Project-Gradle Version的版本
- 选择降级java;修改settings-Build Execution deployment-Build Tools-Gradle-Gradle JDK的中的java版本

配置工程

  1. 打开刚才准备的基础工程,在左上角切换为Android视图
  2. 将生成的离线打包资源复制到simpleDemo-assets-apps目录下,删除示例的__UNI__A目录
  3. 修改文件simpleDemo/assets/data/dcloud_control.xml文件中的appid,修改为uniapp项目的APPID,也是离线打包资源的目录名
  4. 修改simpleDemo/src/main/res/values/strings.xml文件中的app_name,这个就是apk安装后显示的应用名称
  5. 修改simpleDemo/manifests/AndroidManifest.xml文件中的dcloud_appkey,修改为前面步骤中生成的离线打包key(在dcloud后台中查看)
  6. AS切换为project 视图,在dcloud后台下载之前申请的云端证书,防止在simpleDemo模块目录下,示例项目的.jks秘钥文件可以删除

实际上你可以将证书放在任何安全的地方,在打包时选择证书即可

  1. 修改simpleDemo模块下的build.gradle文件,包名、秘钥别名、秘钥密码可以在dcloud后台中查看
  2. 执行打包操作
  3. 打包成功 将.apk文件安装到模拟器中尝试
  4. 至此项目配套的android打包工程就已经配置完成,以后每次打包只需要替换生成的打包资源文件和修改build.gradle中的版本号versionCode``versionName即可

常见问题

  1. app打不开,apk体积过大 查看abiFilters配置是否匹配,参考阅读blog.csdn.net/yearningsee...
  2. 未使用到的依赖过多导致包体积过大,根据实际需要删减android工程中的依赖,可以参照官方文档中各个模块的依赖进行修改nativesupport.dcloud.net.cn/AppDocs/use...
  3. 生成打包资源复到android工程后还需要手动修改android工程中的版本号 在build.gradle文件中,可以添加一个函数自动读取打包资源中的manifest.json文件,然后在版本号配置里调用函数自动读取
java 复制代码
// 头部添加依赖
import groovy.json.JsonSlurper  
import org.json.JSONException  
import org.json.JSONObject

// 调用读取json方法,传参根据实际修改
JSONObject appConfig = readManifest("__UNI__6DBB581")  
println("版本号:" + appConfig.version.code.toString())

versionCode appConfig.version.code  
versionName appConfig.version.name

// 读取manifest.json方法
JSONObject readManifest(appPath){  
    try {  
        def appConfigJsonFile = file("${rootDir}/simpleDemo/src/main/assets/apps/${appPath}/www/manifest.json")  
        def appConfigJson = new JsonSlurper().parseText(appConfigJsonFile.text)  
        return appConfigJson  
    } catch (IOException | JSONException e) {  
        e.printStackTrace()  
    } 
    return null  
}
  1. 打包生成apk文件根据版本号自动重命名,默认打包的apk名称总是simpleDemo-release.apk可以写一段代码实现根据版本号/时间来重命名
java 复制代码
android.applicationVariants.configureEach { variant ->  
    variant.outputs.configureEach {  
        def createTime = new Date().format("yyyyMMddHHmm", TimeZone.getTimeZone("GMT+08:00"))  
        def fileName = "app_v${defaultConfig.versionCode}_${createTime}.apk"  
        outputFileName = fileName  
    } 
}
相关推荐
下雪天的夏风4 分钟前
TS - tsconfig.json 和 tsconfig.node.json 的关系,如何在TS 中使用 JS 不报错
前端·javascript·typescript
diygwcom16 分钟前
electron-updater实现electron全量版本更新
前端·javascript·electron
Hello-Mr.Wang32 分钟前
vue3中开发引导页的方法
开发语言·前端·javascript
程序员凡尘1 小时前
完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法,亲测有效!!!
前端·javascript·vue.js
编程零零七4 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
(⊙o⊙)~哦6 小时前
JavaScript substring() 方法
前端
无心使然云中漫步7 小时前
GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions
前端·javascript
Bug缔造者7 小时前
Element-ui el-table 全局表格排序
前端·javascript·vue.js
xnian_7 小时前
解决ruoyi-vue-pro-master框架引入报错,启动报错问题
前端·javascript·vue.js
麒麟而非淇淋8 小时前
AJAX 入门 day1
前端·javascript·ajax