安卓应用打包排队,自己手动打包

前景:朋友用uniapp开发的app应用,然后抱怨云打包一直排队,大概最近ai的应用太多了,导致排队太多太久了,问我有什么方法可以手动打包的,之前没有接触过安卓打包,然后用ai搜了下可以实现,然后感觉这也是一个商机嘛,自己建一个打包的平台,然后研究了下。 整个流程 Node.js CLI工具 ↓ 调...
安卓应用打包排队,自己手动打包
安卓应用打包排队,自己手动打包

前景:朋友用uniapp开发的app应用,然后抱怨云打包一直排队,大概最近ai的应用太多了,导致排队太多太久了,问我有什么方法可以手动打包的,之前没有接触过安卓打包,然后用ai搜了下可以实现,然后感觉这也是一个商机嘛,自己建一个打包的平台,然后研究了下。

  • 整个流程
Node.js CLI工具
   ↓
调用 Capacitor
   ↓
自动生成 Android 项目
   ↓
调用 Gradle 打包 APK
  1. 安装工具
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. 操作步骤
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重新同步至安卓包就可以,其他的可以不做操作**
  1. 用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
}

  1. 把apk复制到模拟器或者安卓真机中,或者执行 npx cap run android 可以直接运行到模拟器中
  2. 注意事项
  • 如果是用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">

  1. 总结
  • 可以用capacitor来本地打包成安卓应用
  • 打包的时候jdk版本会有要求,以及插件中kotlin会有版本冲突
  • 网络请求不兼容,需要手动修改请求工具类满足请求,可以用fetch或者axios,建议开发的时候用axios开发
  • 安卓对http请求禁用,http网络请求需要混合模式开始,也没找到方法,后面升到https
  • 可以打包简单的安卓应用,也没有试调用系统的功能入相机或其他功能

6 个帖子 - 4 位参与者

阅读完整话题

来源: linux.do查看原文