摸着石头过河,重新支棱起Capacitor老项目

背景

最近接手了一个混合移动应用项目,使用的混合框架是Capacitor。 先简明扼要的介绍一下Capacitor。Capacitor是由 Ionic 团队开发的一款跨平台 Web-Native 桥接框架,用于将 Web 应用(如 Vue、React、Angular)打包成原生 iOS、Android、Electron 应用。H5页面的功能开发完了,老板要拿出去给客户演示,给客户发一个链接打开H5应用显得有点low, 所以产品经理希望能做成App应用。我看了一下这个项目中package.json中的脚本命令,发现有生成Android应用安装包的相关指令,之前写这个项目的人离职了,没人熟悉如何编译生成apk安装包,在我之前有个同事调研了一天,包打出来了,但是安装之后一片空白,他短时间内未能解决,不了了之。我对工作一般是正向思考,觉得这是个不错的在实际项目中练手的好机会,产品再次提及时主动认领了这个工作任务,于是就有了这篇文章。

第一步 熟悉Capacitor常用指令

如何开始? 在项目中的package.json看到这么一条指令:

js 复制代码
"open-android": "npx cap sync && npx cap open android",

看样子是跟打包Android apk安装包有关, 以此为线索,开启摸着石头过河之旅。一般要想了解一条指令,就得了解这条指令背后的一连串相关指令。让我们看看Capacitor常用的指令有哪些?

指令功能 指令
安装 Capacitor npm install @capacitor/core @capacitor/cli
初始化项目 npx cap init appName app.id
添加平台 npx cap add android npx cap add ios
将构建Web资源复制到原生项目中 npx cap copy
复制 Web 资源 + 同步插件/依赖 npx cap sync
打开 Android Studio / Xcode npx cap open android npx cap open ios

所以上面指令的含义是 复制构建好的Web资源 + 同步插件/依赖到原生项目,并打开Android-Studio,再Android-Studio中对项目进行编译打包,生成Android应用安装包。

第二步 搭建Android开发环境

搭建Android开发环境是以Android-Studio为中心展开的。包括Android-Studio的下载-->安装-->配置-->新建/导入项目-->运行和调试。

重点是第三步的配置,国内开发者要对项目做两个配置:

  1. 因为国内的网络环境可能会导致访问国外 Maven 仓库较慢或不稳定,为了提升gradle依赖库下载速度,需要将Maven仓库替换成阿里云的镜像。确保能够顺利从镜像源获取所需的库和工具.

在android/build.gradle(根目录)下的 repositories 里面添加

rust 复制代码
allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/jcenter' }
        maven { url 'https://maven.aliyun.com/repository/central' }
        google()
        mavenCentral()
    }
}
  1. 因为 Gradle 的官方镜像服务器位于国外,国内用户访问时可能会遇到较慢的下载速度或连接不稳定的情况,尤其是初次设置或更新 Gradle 版本时,通过使用腾讯云的镜像源,国内用户能够更快速地下载 Gradle 发行版。

android/gradle/wrapper/gradle-wrapper.properties,做如下修改

ini 复制代码
distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-7.5-all.zip

第三步 熟悉Android项目目录结构

初次接触Android项目,对Android项目每个文件夹,每个文件的作用肯定是不清楚的,有必要了解一下什么资源放置在什么地方。典型的Android项目目录如下:

md 复制代码
android/
├── .gradle/
├── .idea/
├── app/
│   ├── build/
│   ├── libs/
│   ├── src/
│   │   ├── androidTest/
│   │   ├── main/
│   │   │   ├── java/
│   │   │   ├── res/
│   │   │   └── AndroidManifest.xml
│   │   └── test/
│   ├── build.gradle
│   └── proguard-rules.pro
├── build/
├── gradle/
├── gradle.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── build.gradle

每个目录和文件说明如下: 菜鸟务必要从头到尾看一遍,有个初步印象。

android/ :​项目的根目录

  • .gradle/ :​Gradle 构建工具的缓存目录,存储构建过程中产生的临时文件。​

  • .idea/ :​存放与项目相关的 IntelliJ IDEA(Android Studio 基于此)配置文件。

  • app/ :​应用模块的目录,包含应用的源代码和资源文件。​

    • build/ :编译时自动生成的目录,包含构建输出,如 APK 文件。

    • libs/ :用于存放第三方库的目录,放置 .jar.aar 文件。

    • src/ :源代码目录,包含应用的代码和资源。

      • androidTest/ :用于存放针对 Android 设备的集成测试代码。

      • main/ :主源代码集,包含应用的主要代码和资源。

        • java/ :存放 Java 或 Kotlin 源代码。
        • res/ :存放应用的资源文件,如布局、图片和字符串等。
        • AndroidManifest.xml:应用的清单文件,描述应用的基本信息和组件。
      • test/ :用于存放本地单元测试代码。

    • build.gradle:模块级的 Gradle 构建脚本,定义模块的构建配置和依赖项。

    • proguard-rules.pro:ProGuard 混淆规则文件,用于代码混淆配置。

  • build/ :​项目级的构建输出目录,存放构建过程中生成的文件。​

  • gradle/ :​Gradle Wrapper 的目录,包含用于构建的 Gradle 包装器文件。​

  • gradle.properties:​Gradle 的属性配置文件,用于设置构建相关的属性。​

  • gradlewgradlew.bat:​用于在不同操作系统上执行 Gradle 构建的脚本文件。​

  • settings.gradle:​项目的设置文件,定义包含在构建中的模块。​

  • build.gradle:​项目级的 Gradle 构建脚本,定义全局的构建配置和依赖项。

看完android项目的目录和文件介绍之后,你会发现有个名词gradle,出现的频率特别高,这个gradle是什么东东,和android开发有什么关系,为什么还区分模块和项目级别?

Gradle 是一个强大的构建自动化工具,广泛应用于软件开发中,包括 Android 应用的编译,测试和打包。与传统的 XML 配置方式不同,Gradle 使用基于 Groovy 或 Kotlin 的领域特定语言(DSL)来编写构建脚本,使其更具灵活性和可读性。在 Android 开发中,Gradle 通过 Android Gradle 插件(AGP)与 Android Studio 集成,为开发者提供了灵活高效的构建系统。

Gradle 与 Android 的关系:

  • 构建系统基础:Android Studio 的构建系统以 Gradle 为基础,利用其灵活性和可扩展性来管理应用的构建过程。
  • Android Gradle 插件(AGP) :AGP 是专为构建 Android 应用而设计的 Gradle 插件,提供了许多特定于 Android 的功能,如生成 APK 文件、管理 Android 特定的依赖项等。
  • 版本兼容性:确保 AGP 与 Gradle 版本的兼容性对于构建过程的顺利进行至关重要。不同版本的 AGP 需要对应的 Gradle 版本支持。

在 Gradle 中,构建脚本通常分为项目级和模块级两个层次,分别对应于不同的配置范围:

级别 位置 作用
项目级 位于项目的根目录 定义整个项目的全局构建配置和依赖项,这些设置适用于项目中的所有模块。用于配置全局的插件、依赖库仓库等
模块级 位于每个模块的目录中 针对各个模块进行具体的构建配置,如应用的版本信息、特定的依赖项等。这些设置仅适用于各自的模块。用于指定该模块的编译选项、资源文件夹等。

这种区分使得构建配置更具层次性和灵活性,有助于在大型、多模块项目中更好地管理构建过程。

第四步 打包与测试Android apk

  1. 清除上一次编译文件并重新打包web资源
bash 复制代码
rm -rf android/app/src/main/assets/public && pnpm run build
  1. 复制 Web 资源 + 同步插件/依赖到Android原生项目,打开Android-Studio
bash 复制代码
npx cap sync && npx cap open android
  1. 在Android-Studio中构建apk安装包

在菜单栏中,选择 Build -> Build Bundle / APK -> Build APK(s),构建过程完成后,访问 app/build/outputs/apk/ 目录下找到生成的 APK 文件。

  1. 在手机上安装应用包

将Android手机设置成USB调试模式,执行adb devices,查看设备是否连接成功。如果连接不成功,检查一下数据线与电脑USB接口的连接处是不是松了,还有是否在手机上已经授权电脑访问。连接上之后,切换到apk目录,在终端下执行应用包的安装指令

bash 复制代码
adb install -r app-debug.apk

安装完之后,打开发现页面一片空白,遇到了跟同事一模一样的问题。离成功只差一步之遥了,这次必须解决。

  1. 解决界面白屏问题

用 chrome inspect调试了一下,发现是资源路径不对。改了一下capacitor.config.ts中server.url配置,让其访问线上环境,问题解决。

js 复制代码
import { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
  // ...
  server: {
    url: 'https://xxx/path',
    cleartext: false,
  },
};
export default config;

如果想要项目执行打包进apk中的web资源逻辑,需要改两处:

  1. 修改vite.config.ts中的资源基础路径
js 复制代码
export default defineConfig(({ command }) => {
  return {
    base: './',
  }
}
  1. 注释掉capacitor.config.ts中server.url配置
js 复制代码
import { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
  // ...
  server: {
    // url: 'https://xxx/path',
    cleartext: true,
  },
};
export default config;

至此,打包出了一个可以正常安装使用的Android应用。开心三分钟,今天过得比较充实,所谓的充实,就是心灵有收获感。希望你读完此文也收获充实感。

相关推荐
仙魁XAN27 分钟前
Flutter 学习之旅 之 flutter 在设备上进行 全面屏 设置/隐藏状态栏/隐藏导航栏 设置
前端·学习·flutter
hrrrrb1 小时前
【CSS3】化神篇
前端·css·css3
蓝莓浆糊饼干1 小时前
请简述一下String、StringBuffer和“equals”与“==”、“hashCode”的区别和使用场景
android·java
木木黄木木1 小时前
HTML5拼图游戏开发经验分享
前端·html·html5
不能只会打代码2 小时前
六十天前端强化训练之第十七天React Hooks 入门:useState 深度解析
前端·javascript·react.js
PagiHi2 小时前
iWebOffice2015 中间件如何在Chrome107及之后的高版本中加载
前端·javascript·chrome·中间件·edge·js
曾富贵2 小时前
【eslint 插件】导入语句排序
前端·eslint
NaZiMeKiY2 小时前
HTML5前端第八章节
前端·html·html5
远之喵3 小时前
js基础知识-考点
前端
如此风景3 小时前
TS装饰器
前端