前景:朋友用uniapp开发的app应用,然后抱怨云打包一直排队,大概最近ai的应用太多了,导致排队太多太久了,问我有什么方法可以手动打包的,之前没有接触过安卓打包,然后用ai搜了下可以实现,然后感觉这也是一个商机嘛,自己建一个打包的平台,然后研究了下。
- 整个流程
Node.js CLI工具
↓
调用 Capacitor
↓
自动生成 Android 项目
↓
调用 Gradle 打包 APK
- 安装工具
1. 安装commandlinetools
- 安卓打包需要的环境
- 设置环境变量在cmdline-tools上层目录设ANDROID_HOME
- 安装组件sdkmanager "platform-tools" "platforms;android-33" "build-tools;33.0.2"
- sdkmanager --licenses 一路y确认
2. 安装capacitor
- 前端资源转换成安卓源码
- npm install @capacitor/core @capacitor/cli
3. 安装gradlew
- 用来打包安卓应用
- 操作步骤
1. 先用npm打包
- 我这边用的uniapp,npm run build:h5
2. 用capacitor初始化配置
- npx cap init
- 生成安卓应用的基础信息
- 然后我看有些有执行前端资源路径的,我的版本没有看到,然后去capacitor.config.json这个文件中设置webDir,设置前端打包以后的路径,默认是dist,如果静态地址不是这个需要修改
- npx cap android
* 生成对应的android文件夹
- npx cap sync android
* 把前端资源同步至android包内
**这边如果前端修改了,只需要npx cap sync重新同步至安卓包就可以,其他的可以不做操作**
- 用gradle打包安卓应用
- 到android,执行**gradlew assembleRelease/gradlew assembleDebug**,release好像是要验证应用签名的,我这边就没有试
- 然后文件就会在**android\app\build\outputs\apk\debug\xxx.apk** 这个目录中,如果是release会在apk下release文件夹中
- 打包都时候有可能jdk版本不兼容问题
- 添加configurations.all和ext这两项
- 我用的新的版本,说jdk17就可以了,但是老是报版本低,后面系统jdk升到21就可以
- 还有打包的时候有些插件打完以后会有多个版本的kotlin,需要兼容下
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.7.2'
classpath 'com.google.gms:google-services:4.4.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
apply from: "variables.gradle"
ext {
kotlin_version = '1.8.22'
}
allprojects {
configurations.all {
resolutionStrategy {
force "org.jetbrains.kotlin:kotlin-stdlib:1.8.22"
force "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.22"
force "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22"
}
}
repositories {
google()
mavenCentral()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
- 把apk复制到模拟器或者安卓真机中,或者执行 npx cap run android 可以直接运行到模拟器中
- 注意事项
- 如果是用uniapp的uni.request网络请求的话,有可能是用不了,换成fetch就可以,之前封装的uni.request请求工具类,怎么试都打不到后端,后面试了下fetch可以打到后端,但是回报跨域问题,后面后端开启支持跨域就可以了,查了下uniapp是用原生的okhttp去请求做了封装,然后capacitor是用XMLHttpRequest去做请求的。如果换成fetch需要改工具类,有些不规范的接口也需要调整,比如用post请求,但是参数放到url连接中的也会报错,这个请求必须要有body,然后自己需要改接口,改成formdata格式后面就可以。
- 如果后端http请求,可以添加capacitor配置文件中添加capacitor配置文件中添加或者AndroidManifest.xml中添加android:usesCleartextTraffic=“true”,但是我怎么试都没用,不知道怎么回事
capacitor.config.json配置文件中添加
"server": {
"cleartext": true
}
-------
AndroidManifest.xml文件中添加
<application
android:usesCleartextTraffic="true"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
- 总结
- 可以用capacitor来本地打包成安卓应用
- 打包的时候jdk版本会有要求,以及插件中kotlin会有版本冲突
- 网络请求不兼容,需要手动修改请求工具类满足请求,可以用fetch或者axios,建议开发的时候用axios开发
- 安卓对http请求禁用,http网络请求需要混合模式开始,也没找到方法,后面升到https
- 可以打包简单的安卓应用,也没有试调用系统的功能入相机或其他功能
6 个帖子 - 4 位参与者