Android、Flutter为不同的CPU架构包打包APK(v7a、v8a、x86)

默认情况下,Android和Flutter打包出来的Apk都是包含了所有架构的,这样打出来的apk体积相对于单架构的apk有点大。

这时,我们就需要分别打出不同的架构包。

架构

一般来说,x86代表32位CPU,x64(或者叫x86-64)代表64位CPU。

在Android中,支持专有cpu架构也是Application Binary Interface(ABI)。

Android开发者官网文档中支持的ABI。
在这里插入图片描述

armeabi-v7a

此 ABI 适用于基于 32 位 ARM 的 CPU,2016年之前大部分Android手机的cpu都是此架构。

arm64-v8a

此 ABI 适用于基于 ARMv8-A 的 CPU,支持 64 位 AArch64 架构,一般从2016年开始,主流Android手机的cpu架构都是arm64的。

x86

此ABI支持X86架构,像Intel、AMD的cpu都是基于此架构。
在2012-2016这段时间,为了赶上移动互联网的浪潮,Intel和Nvidia专门为Android手机和平板推出过X86架构的CPU,可惜都失败了。现在一般不需要适配此架构,除非APK需要安装在Intel平板上。

x86_64

此ABI支持x86-64位架构的CPU。同上

对于mipsmips64armeabi这些架构来说,Android从Android Plugin for Gradle 3.1.0(对应gradle 4.4)后不再支持,因为从NDK r17开始,不再将这些 ABI 作为支持的目标。

APK分包

Android

在模块级的build.gradle文件中,在android代码块中添加splits模块。
基本配置如下。

android {
  ...
  splits {

    // 基于不同的abi架构配置不同的apk
    abi {

      // 必须为true,打包才会为不同的abi生成不同的apk
      enable true
     
      // 默认情况下,包含了所有的ABI。
      // 所以使用reset()清空所有的ABI,再使用include指定我们想要生成的架构armeabi-v7a、arm-v8a
      reset()

      // 逗号分隔列表的形式指定 Gradle 应针对哪些 ABI 生成 APK。只与 reset() 结合使用,以指定确切的 ABI 列表。
      include "armeabi-v7a", "arm64-v8a"

      // 是否生成通用的apk,也就是包含所有ABI的apk。如果设为 true,那么除了按 ABI 生成的 APK 之外,Gradle 还会生成一个通用 APK。
      universalApk false
    }
  }
}

Flutter

使用以下命令后,会自动生成v7a、v8a、x86-64三种架构的apk。

flutter build apk --split-per-abi

生成位置在build/app/outputs/flutter-apk/。
在这里插入图片描述

### 使用 Air780E 模块发送中文短信的方法 在使用 Air780E 模块发送中文短信时,需要确保模块配置支持 Unicode 编码,因为中文字符属于扩展字符集。通常情况下,可以通过 AT 命令设置 SMS 文本模式并指定编码方式。 #### 配置 SMS 参数 为了能够成功发送中文短信,首先要进入文本模式,并设定 PDU 或者 TEXT 模式的编码为 UCS2: ```plaintext AT+CMGF=1 // 设置为文本模式 OK AT+CSCS="UCS2" // 设置字符集为 UCS2 OK ``` 上述命令用于初始化环境以便处理非 ASCII 字符串[^2]。 #### 构建和发送短信内容 构建含中文字符的消息体需要注意转义序列以及字符串长度限制。下面是一个完整的流程实例化过程,在此之前假设已经完成了必要的初始化工作如网络注册等。 ```lua -- Lua 脚本片段 (适用于 LuatOS 平台) local sim = require "sim" function sendChineseMessage(phoneNumber, messageText) local cmd = string.format('AT+CMGS="%s"\r\n', phoneNumber) -- 将输入的信息转换成 UCS2 编码形式 local ucs2EncodedMsg = "" for i = 1,#messageText do local charCode = string.byte(messageText,i) ucs2EncodedMsg = ucs2EncodedMsg .. string.format("%04X",charCode) end log.info("Sending Chinese Message:",ucs2EncodedMsg) -- 执行发送指令 sim.write(cmd..ucs2EncodedMsg..string.char(26)) -- 添加 Ctrl-Z 结束标志 end sendChineseMessage("+861XXXXXXXXXX","你好世界") -- 替换电话号码与实际要发的内容 ``` 这段代码展示了如何利用 Lua 脚本来调用底层 API 完成中文短信的创建与传输动作。注意这里采用的是简单的逐字节转换方法来实现 UTF-8 到 UCS2 的转变;对于多字节字符可能还需要进一步优化转换逻辑以适应不同情况下的需求[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值