Android 编译版本升级target 33

升级结果整理

升级步骤一:选择编译版本

应用编译版本:

compileSdk = 33
minSdk = 26
targetSdk = 33

环境编译版本:

kotlin版本未改变,仅升级了,gradle编译版本。

build.gradle配置:
classpath 'com.android.tools.build:gradle:7.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10"
gradle-wrapper.properties 配置:
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip

升级步骤二:解决library编译问题

1、修改 library 的 build.gradle 文件
  • 编译版本修改
android {
    namespace 'com.yunzhijia.common.ui.v10'
    compileSdk rootProject.ext.compileSdk

    defaultConfig {
        minSdk rootProject.ext.minSdk
    }
 }
  • kotlin配置修改,在build.gradle增加配置 viewBinding
buildFeatures {
    viewBinding true
}
* 在build.gradle增加配置 jvmTarget
kotlinOptions {
    jvmTarget = "1.8"
}

不过可以全部配置。

allprojects {
    gradle.projectsEvaluated {
        tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile.class){
            kotlinOptions {
                jvmTarget = "1.8"
            }
        }
    }
}
2、修改library编译异常问题

library:包括基础库,func库,biz库,还有其他未分类的库,即除app以外的所有库。

主要有以下几大类问题:

  • 问题1:namespace不一致,导致R文件路径异常,直接修改R文件路径即可。

  • 问题2:资源使用异常,部分lib 使用的是app里面或者其他lib里面的资源,但是他们又不会去依赖他。
    解决:增加依赖资源代码,把资源下沉。包括 string、dimen、drawable等等

  • 问题3:menifest export 文件修改,增加配置即可。
    https://developer.android.com/about/versions/12/behavior-changes-12?hl=zh-cn#exported

  • 问题4: library 冲突问题修改
    这里碰到的冲突问题,例如zoom和腾讯会议,存在lib冲突,目前是zoom未使用,问题未解决。其他的冲突,通过导入同一个版本去处理。

升级步骤三:解决app编译问题

1、修改build.gradle

同library,这里仅增加target的修改

2、修改menifest文件

主要修改 menifest export

3、修改部分类的R文件路径

升级步骤四:解决app运行崩溃问题

1、处理api 31导致的崩溃

仅有蓝牙获取崩溃。

java.lang.RuntimeException: Unable to create application com.kdweibo.android.config.KdweiboApplication: java.lang.SecurityException: Settings key: <bluetooth_name> is only readable to apps with targetSdkVersion lower than or equal to: 31
Caused by: java.lang.SecurityException: Settings key: <bluetooth_name> is only readable to apps with targetSdkVersion lower than or equal to: 31
2、其他崩溃异常 - 未处理

由于其他崩溃,不影响使用,暂时就不去处理了。

升级过程记录

升级策略

策略1: 最开始我是直接对整个应用,进行target 33升级,然后去处理问题,结果不尽理想,很多问题,找不到原因,浪费了不少时间。
策略2: 既然整体搞不定,我们就变个方式,从 library 一层一层的开始处理

升级模式
方式1:直接升级到最新版本,更换编译语言,同最新的 as 创建的demo
gradle & kotlin 版本,build.gradle:

plugins {
id 'com.android.application' version '8.1.1' apply false
    id 'org.jetbrains.kotlin.android' version '1.8.10' apply false
}

插件导入,移入到 setting.gradle

pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.name = "My Application"
include ':app'

但是碰到的问题,接踵而至,语法有点不熟悉,写起来很费力,kotlin版本依赖不对,1.8太高了,之前都是用的1.6,而且最关键的问题是,jdk的版本问题,jdk8升级到jdk11,没多少语法&编译问题,但是使用 1.8,jdk要求17,
在这里插入图片描述
这个把我坑的不要不要的。很多编译问题,解不完,根本解不完。
最后我放弃了。
对了,说明一下吧,放弃的根本原因是,我调研的差不多的时候,想起来,flutter我还没进行处理,项目里面有flutter,然后我就尝试编译flutter,郁闷的事情来了,kotlin的版本,还是什么问题,flutter根本编译不通过,具体原因,我记不得了。
对了,提供一些flutter只是:
flutter 3.7.12版本支持 target33,官方在这个版本做了支持,由于我写文档有点晚,链接资料,都不能提供了。

方式2:我们就按照官方提供的,flutter项目的最高版本作为参考
build.gradle 文件,大家用 as 自动生成flutter项目,就能看到了。

buildscript {
    ext.kotlin_version = '1.7.10'
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:7.2.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
include ':app'

def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
def properties = new Properties()

assert localPropertiesFile.exists()
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }

def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"

官方kotlin的版本,也就1.7.10,由于项目大量使用1.6.10,我这里对这个也没进行升级,所以,最终考虑,使用版本为:
kotlin:1.6.10
gradle:7.2.0

// 文件:build.gradle
classpath 'com.android.tools.build:gradle:7.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10"
        
// 文件:gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip

编译问题:

编译报错 1

错误日志1:

> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
   > Duplicate class com.tencent.kapalaiadapter.ReflecterHelper found in modules jetified-ilivesdk-1.9.6-runtime (com.tencent.ilivesdk:ilivesdk:1.9.6) and jetified-xcast-3.12.203.42-runtime (com.tencent.wemeet.third-party:xcast:3.12.203.42)

在这里插入图片描述
错误日志2:
举例2:
Duplicate class androidx.window:window xxx
window里面的类的文件重复了。

解决方式: 查询模块之间的依赖关系
查询所有模块:

./gradlew :app:dependencies > deps.txt

查询单个模块:

./gradlew app:dependencyInsight > window.txt --configuration stgdebugRuntimeClasspath --dependency  androidx.window:window

第一个文件处理:
我这边查询到,这个类是2个第三方库导入的,但是我没想到什么好的解决方法,但是如果这个有问题,老版本应该也存在问题,最后查询到,老版本的导入的人,根本没处理这个问题,最后查询到,因为编译的时候,有一个模块根本不会编译到。尴尬了,我处理的时候,是都编译的,导致我浪费了不少时间。后续我在想想怎么处理。
在这里插入图片描述

编译报错 2

同样到,我这边碰到一个问题:

Execution failed for task ':app:minifyMilDebugWithProguard'.
> java.io.IOException: proguard.ParseException: Expecting type and name instead of just 'setExtensionCallback' before '(' in line 19 of file '/Users/amanda/.gradle/caches/transforms-2/files-2.1/6c359c85096a730900e9d7d240d81a88/window-1.0.0/proguard.txt'

This occurs when minifyEnabled and shrinkResources are both enabled, and the file in the error refers to the following code (begins at line 18):

`-if class androidx.window.layout.SidecarCompat {
  public setExtensionCallback(androidx.window.layout.ExtensionInterfaceCompat$ExtensionCallbackInterface);
}
-keep class androidx.window.layout.SidecarCompat$TranslatingCallback,
 androidx.window.layout.SidecarCompat$DistinctSidecarElementCallback {
  public onDeviceStateChanged(androidx.window.sidecar.SidecarDeviceState);
  public onWindowLayoutChanged(android.os.IBinder, androidx.window.sidecar.SidecarWindowLayoutInfo);
}`

在这里插入图片描述

同事回复:
https://groups.google.com/a/chromium.org/g/java/c/bf9if0l3VJ4/m/FY_NlzXUAwAJ

这个是人家说的解决方案,我在caches里的proguard.txt添加,能通过,但是在工程里添加,没用

解决办法:
方法1:

android.enableR8=false

改为true,或者删除,默认为true
我们担心改为true,有哪些隐藏问题,所以我们考虑有没有其他方法。

方法2:
开始查询了很久,网上没有很好的解决方法。
最终我的解决方法:
1、我查询window.aar 文件,发现错误地方是因为 aar 里面 proguard.txt 文件
2、然后我就在想,我要是把他修改了,问题是不是就解决了,所以
3、我对aar进行解压,然后修改,然后重打包,最后导入aar,编译

// 解压
unzip ×××.aar -d tmpDir
// 重打包
jar cvf ×××NewLib.aar -C tmpDir/ .

4、在一起都感觉 非常 nice的时候,我又遇到了类重复的问题。
有一个模块 androidx.window:window,你不知道哪里引入的,通过模块查询到

implementation project(path: ':flutter')

这里导入了,在这里 exclude即可。

编译报错 3

Execution failed for task ':app:processStgDebugMainManifest'.
> Manifest merger failed with multiple errors, see logs

如图
![在这里插入图片描述](https://img-blog.csdnimg.cn/e59ea416b22c4983bae396f35364d7f9.png
在这里插入图片描述报错的前后文,看不出来报错文案,增加编译条件:–stacktrace --debug --info --scan
前后文,也没有提示具体的错误信息。
在这里插入图片描述
查询资料:
https://blog.csdn.net/EthanCo/article/details/120565856

使用命令编译:

 ./gradlew  processstgDebugMainManifest --stacktrace --debug

很轻松的就查看到具体的报错,我这边的错误是之前编译我做测试,修改了 JDK,忘记改回来了。这里修改编译环境的 jdk 版本。
在这里插入图片描述

编译问题 4

mac版Android studio编译报错:Too many open files in system

Too many open files
 错误: 无法访问io

满满的屏幕,全是这个报错,看的我头皮发麻。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、开始我是先清空,然后编译,奇迹般,我成功了。
2、然后过了1-2次,又出现了,在清空 & 重启 n次,都没得用。
3、有去查询 dataBindingMergeDependencyArtifactsDebug kaptDebugKotlin 等报错问题,均没找到什么解决方法。

最后看到想起之前看到的文章,说的是文件数量过多的,可是当时我测试的时候,还是又问题,不过想想,可以试一下。
然后又去搜索了一下,找了一个博客:
https://blog.csdn.net/u014158743/article/details/125277209

查看 mac 支持的文件数量:

sysctl kern.maxfiles
sysctl kern.maxfilesperproc

修改数量:

sysctl -w kern.maxfiles=20480 (or whatever number you choose)
sysctl -w kern.maxfilesperproc=18000 (or whatever number you choose)

不过文章里面说的文件:/etc/sysctl.conf
我这边是没有的,所以,我最后仅仅执行命令:

sysctl -w kern.maxfilesperproc=60000

困扰我1天的问题,解决了。哎,好坑的问题。
在这里插入图片描述

在这里插入图片描述

编译问题 5

2023-09-20T17:13:48.795+0800 [ERROR] [com.android.build.gradle.tasks.ProcessApplicationManifest] /Users/80262786/workCode/teamtalk_android/app/src/main/AndroidManifest.xml:1009:9-1054:20 Error:
android:exported needs to be explicitly specified for element <activity#com.yunzhijia.contact.ThirstIntentToPersonContactActivity>. Apps targeting Android 12 and higher are required to specify an explicit value for android:exported when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.
在这里插入图片描述
这个问题就简单很多了,直接找到地方,修改即可。

运行导致崩溃的问题

问题1

java.lang.RuntimeException: Unable to create application com.kdweibo.android.config.KdweiboApplication: java.lang.SecurityException: Settings key: <bluetooth_name> is only readable to apps with targetSdkVersion lower than or equal to: 31
Caused by: java.lang.SecurityException: Settings key: <bluetooth_name> is only readable to apps with targetSdkVersion lower than or equal to: 31
在这里插入图片描述

网上很多
https://github.com/expo/expo/pull/19666
在这里插入图片描述
查询到其他人的修改,照抄一下。

问题2

java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx/xxxActivity}: java.lang.NullPointerException: Attempt to invoke virtual method ‘android.view.View androidx.databinding.ViewDataBinding.getRoot()’ on a null object reference
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method ‘android.view.View androidx.databinding.ViewDataBinding.getRoot()’ on a null object reference

android {
	defaultConfig {
		// 别写到这里面,我是从26升级上来的,开始写到这里,会报这个错
	}
    buildFeatures {
        dataBinding true
        viewBinding true
    }
 }

问题3 暂未解决

Failed to get FIS auth token
java.util.concurrent.ExecutionException: com.google.firebase.installations.FirebaseInstallationsException: Firebase Installations Service is unavailable. Please try again later.
at com.google.android.gms.tasks.Tasks.zza(com.google.android.gms:play-services-tasks@@18.0.1:5)
at com.google.android.gms.tasks.Tasks.await(com.google.android.gms:play-services-tasks@@18.0.1:8)
at com.google.firebase.messaging.GmsRpc.setDefaultAttributesToBundle(GmsRpc.java:260)
at com.google.firebase.messaging.GmsRpc.startRpc(GmsRpc.java:222)
at com.google.firebase.messaging.GmsRpc.getToken(GmsRpc.java:180)
at com.google.firebase.messaging.FirebaseMessaging.lambda$blockingGetToken$10$com-google-firebase-messaging-FirebaseMessaging(FirebaseMessaging.java:610)
at com.google.firebase.messaging.FirebaseMessaging$$ExternalSyntheticLambda6.start(Unknown Source:6)
at com.google.firebase.messaging.RequestDeduplicator.getOrStartGetTokenRequest(RequestDeduplicator.java:67)
at com.google.firebase.messaging.FirebaseMessaging.blockingGetToken(FirebaseMessaging.java:606)
 at com.google.firebase.messaging.SyncTask.maybeRefreshToken(SyncTask.java:121)
Caused by: com.google.firebase.installations.FirebaseInstallationsException: Firebase Installations Service is unavailable. Please try again later.

在这里插入图片描述

java.lang.RuntimeException: Unable to create application com.kdweibo.android.config.KdweiboApplication: java.lang.SecurityException: listen
Caused by: java.lang.SecurityException: listen

在这里插入图片描述

其他

开始不想写博客的,嫌麻烦,不过处理中,碰到很多问题,省的同路人也被坑吧,省点时间,就写一下吧。
还有很多编译问题,我随手就解决了,就不会在这里记录,花了好多时间,去升级版本,不容易啊。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值