关于 mPaaS PB 接入模式适配 64 位 CPU 架构中项目报错解决方案

背景:

2021 年末的时候,国内各个厂商应用市场就开始大力推行 app 进行 64 位架构的适配,并发布了相关规定,大致时间都是 2022 年 2 月份开始不接收仅支持 32 位的应用,9、10 月份开始就不支持接收包含 32 位的应用。

我们所用的手机现在都是多核 CPU,为了尽可能地兼容更多的应用,目前和内核都是兼容 32 位应用的,这就导致了一部分没有适配 64 位架构的应用依旧是使用的 32 位的指令集,没有发挥 64 位 CPU 的优势,无论是从性能,运行效率,用户体验上来看,都没有顺应时代的发展。

去年 arm 推出了 armv9 的 CPU 架构,这个新的架构取消了超大核和中核对于 32 位应用的兼容。

新的骁龙 8 Gen 1 处理器使用了最新的 armv9 架构,8 个内核中,有 3 个 2.5GHz 的 A710 大核、1 个 3.0GHz 的 X2 超大核 和 4 个 1.8GHz 的 A510 中核。如果某个应用没有做 64 位的适配,那么运行时只能用到 3 个内核,我们开发时经常会开多个线程做一些耗时的操作,那么对于这种 8 核手机只用到了 3 核 的情况,实在是不能接受的。

前言:

安卓做 64 位架构适配其实很简单,往前我写过一篇总结,需要的小伙伴可以往前翻一下。这篇文章主要是基于项目目前的架构(mPaaS 框架,Portal-Bundle 接入模式)做适配时遇到的一些问题和解决方案。

项目使用的是 mPaaS 框架的 Portal-Bundle 接入模式,由于一些历史原因,而该模式最初只支持 gradle 4.4 版本,此次很多冲突都是升级了 gradle 到 6.2 之后,检查规则更严格了,旧项目有很多很多不规范的用法导致的问题也随之暴露。

下面就是做个总结,也给需要的小伙伴参考一下。

一、64 位架构适配

(1)一个是升级gradle到6.2版本(可以更高,但是检查规则的更严会暴露出更多问题),详情您可以参考下该文档
mPaaS 支持多 CPU 架构 - 移动开发平台 mPaaS - 阿里云
(2)使用了新版本的 gradle 插件,还需要适配下 mPaaS 插件相关内容
常见问题 - 移动开发平台 mPaaS - 阿里云

二、解决编译报错

1、报错 Cannot change dependencies of dependency configuration ':api:provided' after it has been included in dependency resolution,如图:

关于 mPaaS PB 接入模式适配 64 位 CPU 架构中项目报错解决方案_第1张图片 

原因:官方文档上说不需要再引入 android gradle 插件,只需引入 mPaaS gradle 插件即可,但是实际使用上,不引入就会报上图的错误。

 

解决:引入 android gradle 官方插件

 

:很多老的项目里,大多使用了 provided 、compile 等已经被废弃的依赖方式,正好也趁这个机会,将这些都替换掉。(用法上的区别大家就自行百度了)

provided ----> compileOnly

compile -----> api / implementation

2、报错 android-apt plugin is incompatible with the Android Gradle plugin. Please use 'annotationProcessor'

原因:这个错应该也是用法上的改变导致的

解决

(1)通过 apt 依赖第三方的

// apt 'org.androidannotations:androidannotations:4.4.0'
//改成
annotationProcessor 'org.androidannotations:androidannotations:4.4.0'

(2)根目录 build.gradle 下使用了 

//classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
//这个需要删除或者注释掉

(3)build.gradle 中引用了  'android-apt' 插件的

//apply plugin: 'android-apt'
//这种用法也要删掉

3、报错 Could not find the AndroidManifest.xml file, using  generation folder 

原因:项目中依赖了org.androidannotations:androidannotations:4.4.0这个库。具体原理为什么我也不清楚

解决

(1)降低 gradle 的版本(我们就是为了做适配才升级了 gradle 4.4 到 6.2 ,所以这个方案不可行)

(2)在 build.gradle 中 defaultConfig 加入如下代码,哪个 moudle 依赖了就在哪个 moudle 中加上

android {
    defaultConfig {
      
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [
// 'resourcePackageName': "com.mobile.mbank.search",
"androidManifestFile": "$projectDir/src/main/AndroidManifest.xml".toString()
                ]
            }
        }
    }

}

上面配置包名的那一行我注释掉了,会导致另外的报错,只配置 androidmanifest.xml 也可以解决我目前的编译报错。

4、报错 The SourceSet 'flatDir' is not recognized by the Android Gradle Plugin. 

原因:我也不知道其他开发为什么会在 sourceSets 下面用 flatDir ,我查了也没有这样的用法,至于为什么以前没报错,也不清楚了,改成正确的用法就可以了。

解决

sourceSets {
        flatDir {
            assets.srcDirs = ['../api/src/main/assets']
        }
    }
// 改成下面这样
sourceSets {
        main {
            assets.srcDirs = ['../api/src/main/assets']
        }
    }

5、报错 error: item inner element must either be a resource reference or empty.

原因: gradle 资源格式校验更严格的问题了

解决

false
// 改成下面这样

其他资源格式问题可以参考下面这位大佬的文章,我也是看他的文章改的

解决 error: item inner element must either be a resource reference or empty._一碗单炒饭的专栏-CSDN博客错误描述error: < item> inner element must either be a resource reference or empty.新版本的Gradle对资源格式校验变得严格所以出现以上错误解决方法标签内容引用其他内容报错示例: 1...https://blog.csdn.net/djzhao627/article/details/105640432

6、报错 Caused by: com.android.tools.r8.utils.AbortException: Error: Program type already present: com.xxxx.xxx.xxx

原因:第三方依赖包重复引用的问题。由于是多 bundle 项目,加上开发人员前期不规范的操作,就会导致最终集成多个 bundle 进行打包的时候,出现同个第三方库重复依赖的冲突,甚至是不同第三方库下依赖的冲突(这种就比较麻烦一点)。

解决

(1)如果是只在当前 bundle 使用的,尽量使用 compileOnly 方式,可以最大程度避免打包时的依赖冲突。

(2)尽量将第三方依赖统一用一个 bundle 管理起来,通过 api moudle 使用 compile 方式对其他 bundle 提供访问。

(3)如果是不同的三方库出现依赖冲突,可以通过 gradle dependencies 命令查看是哪些库中冲突了,再在依赖时进行移除。具体方法可以百度。

你可能感兴趣的:(android,开发,Android,mpaas,android64位架构适配)