Android15适配16kb完整版

Android15适配16kb完整版

前言:

之前适配过Android15中MMKV的16kb,但是项目的其他库没有给出来详细方案,这里给出一个完整项目的视频,主要是第三方库和sdk的版本升级等.

1.Google Play 16 KB 兼容性要求:

自 2025 年 11 月 1 日起,所有提交到 Google Play 且以 Android 15 或更高版本设备为目标平台的新应用和现有应用更新都必须在 64 位设备上支持 16 KB 的页面大小。

详细了解 →

从历史上看,Android 仅支持 4 KB 内存页面大小,这优化了系统内存性能,以适应 Android 设备通常拥有的平均总内存量。从 Android 15 开始,AOSP 支持配置为使用 16 KB 页面大小的设备(16 KB 设备)。如果您的应用直接或通过 SDK 间接使用任何 NDK 库,则需要重新构建应用,才能在这些 16 KB 设备上运行。

随着设备制造商不断制造出具有更大物理内存 (RAM) 的设备,许多此类设备将采用 16 KB(最终甚至更大)的页面大小来优化设备性能。添加对 16 KB 页面大小设备的支持,可让您的应用在这些设备上运行,并帮助您的应用受益于相关的性能改进。如果不重新编译,应用将无法在未来 Android 版本的 16 KB 设备上运行。

为帮助您为应用添加支持,我们提供了相关指南,介绍了如何检查应用是否受到影响、如何重新构建应用(如果适用),以及如何使用模拟器(包括 Android 模拟器的 Android 15 系统映像)在 16 KB 环境中测试应用

官网地址:

https://developer.android.com/guide/practices/page-sizes?utm_source=android-studio-app&utm_medium=app&hl=zh-cn#compile-16-kb-alignment

2.概念:

什么是16K页面对齐?告别4K时代

在计算机操作系统中,内存以固定大小的"页面"为单位进行管理。长久以来,安卓系统一直沿用4KB作为标准的页面大小。所谓"页面对齐",就是确保内存中的数据块(尤其是应用的可执行文件和库)从能被页面大小整除的地址开始存放。

随着硬件的飞速发展,现代智能手机配备了越来越大的内存(RAM),4KB的页面大小在管理庞大内存时逐渐显得力不从心,导致了性能瓶颈。为了突破这一限制,安卓系统从安卓15开始引入了对16KB页面的支持,并将在安卓16及更高版本中将其作为一项强制性的技术要求,特别是对于搭载大内存的设备。这意味着,应用和系统进程将以16KB为单位进行内存的分配和管理。

3.16kb优势:

优势和性能提升

配置为使用 16 KB 页面大小的设备平均会使用略多一些的内存,但系统和应用的性能也会得到各种提升:

  • 缩短了系统内存压力时的应用启动时间:平均降低了 3.16%;对于我们测试的某些应用而言,改进幅度更大(最高可达 30%)

  • 应用启动期间的功耗降低:平均降低了 4.56%

  • 相机启动更快:热启动速度平均提高了 4.48%,冷启动速度平均提高了 6.60%

  • 缩短了系统启动时间:平均缩短了 8%(约 950 毫秒)

这些改进基于我们的初始测试,实际设备上的结果可能会有所不同。随着测试的继续进行,我们将进一步分析应用的潜在收益。

4.16kb打包方式变更:

AGP 版本 8.5 或更低版本

注意 : 在 AGP 版本 8.3 至 8.5 中,应用默认按 16 KB 对齐。不过,bundletool 默认情况下不会对 APK 进行 zipalign。因此,该应用可能看起来可以正常运行,但从 Play 中的 bundle 构建时,它将无法安装。

如果您无法将 AGP 升级到 8.5.1 版或更高版本,则可以改用压缩共享库。更新 Gradle 配置,以便 Gradle 在打包应用时压缩共享库,从而避免因共享库未对齐而导致的应用安装问题。

GroovyKotlin

build.gradle 文件中,添加以下选项:

kotlin 复制代码
android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging true
      }
  }
}
AGP 版本 8.0 或更低版本

如果您使用的 AGP 版本不高于 8.0,还需要在 gradle.properties 文件中为 App Bundle 停用未压缩的原生库选项:

kotlin 复制代码
android.bundle.enableUncompressedNativeLibs=false

5.mmkv适配:

根据官方文档,mmkv适配16kb需要回退版本到1.3.14.

kotlin 复制代码
  implementation 'com.tencent:mmkv:1.3.14'

详细官方参考文档:

https://github.com/Tencent/MMKV/issues/1602

https://github.com/Tencent/mmkv/releases/tag/v1.3.14

修改前so:

修改后so:

6.ZlwAudioRecorder录音适配:

kotlin 复制代码
implementation 'com.github.zhaolewei:ZlwAudioRecorder:v1.16'

参考文档:

https://github.com/zhaolewei/ZlwAudioRecorder/commit/075adbb4aac3644c99aecebd9bee92ab0759748b

打包验证:

7.easyble蓝牙库适配:

参考文档:https://github.com/wandersnail/easyble-x/releases

kotlin 复制代码
    //    低功耗蓝牙库
    implementation 'cn.wandersnail:easyble-x:1.5.6'
    implementation 'cn.wandersnail:commons-android:1.5.0'

8.EpMedia适配:

https://github.com/yangjie10930/EpMedia/issues/287

https://github.com/SoarY/EpMedia-16kb

9.探鸽适配:

参考文档:

https://tange-ai.feishu.cn/wiki/wikcnxrR004MfDnSN0oAoWayLMh

plaintext 复制代码
//探鸽依赖库
implementation('com.tange.ai:shell_core:2026.1.2') {
    exclude group: 'org.json', module: 'json'
}
implementation 'com.tange.ai:core_ap_scan_oversea:2022.1208.1'
implementation 'com.tange.ai:base_qrcode_mainland:2022.1031.2'

10.tuya适配:

参考文档:

https://developer.tuya.com/cn/docs/app-development/changelog?id=Ka6o3br3pb4fo

kotlin 复制代码
    implementation('com.thingclips.smart:sweeper:6.7.1') {
        exclude group: 'org.eclipse.paho'
    }
    implementation 'com.thingclips.smart:thingsmart-ipcsdk:6.7.3'
    api enforcedPlatform("com.thingclips.smart:thingsmart-BizBundlesBom:6.7.12")

11.极光推送适配:

参考文档:

https://docs.jiguang.cn/jpush/jpush_changelog/updates_Android

修改后版本:

plaintext 复制代码
    // 推送
       def jpushVersion = '6.2.0'
    Lefant_yingyongbaoImplementation "cn.jiguang.sdk:jpush:$jpushVersion"
    Lefant_google_selfImplementation "cn.jiguang.sdk:jpush-google:$jpushVersion"
    Lefant_googleImplementation "cn.jiguang.sdk:jpush-google:$jpushVersion"
    OKP_yingyongbaoImplementation "cn.jiguang.sdk:jpush:$jpushVersion"
    OKP_google_selfImplementation "cn.jiguang.sdk:jpush-google:$jpushVersion"
    OKP_googleImplementation "cn.jiguang.sdk:jpush-google:$jpushVersion"
    // 接入华为厂商
    implementation 'com.huawei.hms:push:6.13.0.301'
    implementation 'cn.jiguang.sdk.plugin:huawei:6.2.0'
    // 极光厂商插件版本与接入 JPush 版本保持一致,下同
    implementation "cn.jiguang.sdk.plugin:fcm:$jpushVersion"
    // 接入 OPPO 厂商
    implementation "cn.jiguang.sdk.plugin:oppo:6.2.0"
    //以下为 OPPO 3.1.0 aar需要依赖
    implementation 'commons-codec:commons-codec:1.22.0'
    implementation 'androidx.annotation:annotation:1.10.0'
    // 接入小米厂商
    implementation "cn.jiguang.sdk.plugin:xiaomi:$jpushVersion"
    // 荣耀厂商
    Lefant_yingyongbaoImplementation "cn.jiguang.sdk.plugin:honor:10.0.13.305"
    OKP_yingyongbaoImplementation "cn.jiguang.sdk.plugin:honor:10.0.13.305"
    implementation 'androidx.activity:activity:1.13.0'
    implementation 'androidx.core:core:1.19.0'
    implementation 'com.google.android.gms:play-services-auth:21.6.0'
    implementation 'com.google.android.gms:play-services-base:18.10.0'
    implementation 'com.google.android.gms:play-services-analytics:18.1.1'
    // 推送

12.pl.droidsonroids.gif:

由于pl.droidsonroids.gif:android-gif-drawable:1.2.29找不到依赖库使用换成1.2.32版本,如果实在不行去掉此库,使用glide加载gif动画

implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.32'

https://github.com/koral--/android-gif-drawable/issues/859?issue=koral--|android-gif-drawable|857

13.android-pdf-viewer适配:

参考文档:

https://github.com/barteksc/AndroidPdfViewerV2/issues/35

kotlin 复制代码
  implementation 'io.github.oothp:android-pdf-viewer:3.2.0-beta06'

需要修改一个方法:

适配前:

适配后:

14.buyly适配:

plaintext 复制代码
implementation 'com.tencent.bugly:crashreport:4.1.9.3'

升级到专业版此问题解决,如果公司有成本考虑不升建议直接去掉此sdk即可

15.阿里云iotsdk适配:

plaintext 复制代码
dependencies {
    api 'com.aliyun.iot.aep.sdk:apiclient:0.1.9'
    api 'com.aliyun.iot.aep.sdk:sdk-framework:1.1.8'
    api 'com.aliyun.iot.aep.sdk:iot-credential:0.0.4.1'
    api 'com.aliyun.alink.linksdk:api-client-biz:1.0.3'
    api 'com.aliyun.iot.sdk:account-oa-ui:1.0.0.6'
    api 'com.alibaba.sdk.android.openaccount:openaccount-ui-default:3.7.17'
    api 'com.aliyun.alink.linksdk:connectsdk:1.0.3.2'
    api 'com.aliyun.iot.aep.sdk:jsbridge-external:0.1.8.4'
    api 'com.aliyun.iot.aep.component:router-external:0.1.20'
    api('com.alibaba.ailabs.iot:aisbase:1.0.0.131-aisbase') {
        exclude group: 'com.taobao.android', module: 'mtopsdk_allinone'
    }
//不使用breeze SDK功能,baseutils�?要集成上,如集成了breeze-biz,baseutils可不额外集成
    api 'com.alibaba.ailabs.tg:baseutils:1.0.2.10'

//长连接SDK
    api 'com.aliyun.iot.aep.sdk:connectchannel:0.1.5.1'
    api 'com.aliyun.alink.linksdk:public-channel-mobile:1.5.7'

//配网、设备模型SDK
    api 'com.aliyun.alink.linksdk:public-tmp:2.1.7'
    api('com.aliyun.alink.linksdk:devicecenter:1.10.6.8')
    api('com.aliyun.alink.linksdk:devicecenter-provision-core:1.10.6.8')
    api('com.aliyun.alink.linksdk:devicecenter-provision-reserve:1.10.6.8')
    api('com.alibaba.ailabs.iot:meshsdk:1.0.9.6') {
        exclude(group: 'com.alibaba.ailabs.iot', module: 'multiendinonebridge')
    }
    api('com.alibaba.ailabs.iot:gattlibrary:1.0.0.39-gatt')
    api('com.alibaba.ailabs.iot:bluetoothleSDK:1.0.0.48')
    api 'com.alibaba.ailabs.iot:multiendinonebridge:1.0.0.27'

    api 'com.aliyun.ams:alicloud-android-utdid:2.6.0'

//https://help.aliyun.com/document_detail/140717.html
    api('com.aliyun.iotx:linkvisual-media:2.7.4-ilop')
}

16.16kb适配第三方工具:

https://www.npmjs.com/package/verify-16k-page-align

https://github.com/fzer0x/SoPageAligner

17.适配后的截图:

最后还剩8个,需要联系第三方sdk,这里根据你自己的项目进行适配,因为我们最终第三方sdk给出了新版本,所以适配基本上解决了,其实核心就是更换升级第三方sdk.

18.完整的适配后的版本:

kotlin 复制代码
// offline log
implementation 'com.thingclips.smart:thingsmart-logsdk:5.0.1'
implementation 'com.thingclips.smart:thing-log-sdk:6.7.0'

//语言快绑引入的依赖库
api enforcedPlatform("com.thingclips.smart:thingsmart-BizBundlesBom:7.8.0")
api 'com.thingclips.smart:thingsmart-bizbundle-amazon_google_bind'
api 'com.thingclips.smart:thingsmart-bizbundle-mall'

implementation 'androidx.sqlite:sqlite:2.2.0'
implementation 'net.zetetic:sqlcipher-android:4.17.0@aar'

implementation 'androidx.core:core-ktx:1.19.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.11.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0'

def jpushVersion = '6.2.0'
Lefant_yingyongbaoImplementation "cn.jiguang.sdk:jpush:$jpushVersion"
Lefant_google_selfImplementation "cn.jiguang.sdk:jpush-google:$jpushVersion"
Lefant_googleImplementation "cn.jiguang.sdk:jpush-google:$jpushVersion"
OKP_yingyongbaoImplementation "cn.jiguang.sdk:jpush:$jpushVersion"
OKP_google_selfImplementation "cn.jiguang.sdk:jpush-google:$jpushVersion"
OKP_googleImplementation "cn.jiguang.sdk:jpush-google:$jpushVersion"
// 接入华为厂商
implementation 'com.huawei.hms:push:6.13.0.301'
implementation 'cn.jiguang.sdk.plugin:huawei:6.2.0'
// 极光厂商插件版本与接入 JPush 版本保持一致,下同
implementation "cn.jiguang.sdk.plugin:fcm:$jpushVersion"
// 接入 OPPO 厂商
implementation "cn.jiguang.sdk.plugin:oppo:6.2.0"
//以下为 OPPO 3.1.0 aar需要依赖
implementation 'commons-codec:commons-codec:1.22.0'
implementation 'androidx.annotation:annotation:1.10.0'
// 接入小米厂商
implementation "cn.jiguang.sdk.plugin:xiaomi:$jpushVersion"
// 荣耀厂商
Lefant_yingyongbaoImplementation "cn.jiguang.sdk.plugin:honor:10.0.13.305"
OKP_yingyongbaoImplementation "cn.jiguang.sdk.plugin:honor:10.0.13.305"
implementation 'androidx.activity:activity:1.13.0'
implementation 'androidx.core:core:1.19.0'
implementation 'com.google.android.gms:play-services-auth:21.6.0'
implementation 'com.google.android.gms:play-services-base:18.10.0'
implementation 'com.google.android.gms:play-services-analytics:18.1.1'

18.1 如果是老版本的kotlin和core库会有一些冲突,统一版本:

kotlin 复制代码
configurations.all {
    resolutionStrategy {
        // 强制使用 OkHttp 4.10.0
        force 'com.squareup.okhttp3:okhttp:4.10.0'
        // 强制关联的 Okio 版本
        force 'com.squareup.okio:okio:2.10.0'
        force 'androidx.core:core:1.15.0'
        force "androidx.core:core-ktx:1.13.0"
        force "androidx.activity:activity:1.9.0"
        force "androidx.fragment:fragment:1.6.1"
    }
}

18.2 过滤一些so冲突配置:

kotlin 复制代码
packagingOptions {
    pickFirst 'lib/*/liblog.so'
    pickFirst 'lib/*/libgnustl_shared.so'
    pickFirst 'lib/*/libc++_shared.so'
    pickFirst 'lib/*/libyuv.so'
    pickFirst 'lib/*/libopenh264.so'
    pickFirst 'lib/*/libv8wrapper.so'
    pickFirst 'lib/*/libv8android.so'
    pickFirst 'lib/*/libsqlcipher.so'
    pickFirst 'lib/*/libGifLib.so'
    exclude 'META-INF/INDEX.LIST'
    exclude 'META-INF/*.SF'
    exclude 'META-INF/*.DSA'
    exclude 'META-INF/*.RSA'
}
相关推荐
杉氧1 小时前
跨平台持久化:Flutter 本地数据库的多线程安全与架构设计实践
android·前端·flutter
小孔龙2 小时前
Compose 布局与绘制:LayoutNode、DisplayList 与 GraphicsLayer
android·android jetpack
淡淡的香烟2 小时前
Android常用adb命令
android·adb
艾莉丝努力练剑4 小时前
【MYSQL】MYSQL学习的一大重点:事务(上)- 原子性与持久性
android·数据库·学习·mysql·面试
plainGeekDev15 小时前
工厂模式 → Hilt
android·java·kotlin
雨白15 小时前
深入理解 Kotlin 协程 (十):引而不发,探秘 Flow 冷流机制与异常透明性
android·kotlin
plainGeekDev15 小时前
Application 单例 → Hilt Singleton
android·java·kotlin
程序员码歌17 小时前
我全程用 AI开发了一款微信小游戏,上线了
android·前端·游戏开发
黄林晴18 小时前
你敢信吗?同样是跨端,KMP 跟 RN 居然差这么多!
android·前端