升级结果整理
升级步骤一:选择编译版本
应用编译版本:
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
如图
报错的前后文,看不出来报错文案,增加编译条件:–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
文章来源:https://www.toymoban.com/news/detail-755548.html
其他
开始不想写博客的,嫌麻烦,不过处理中,碰到很多问题,省的同路人也被坑吧,省点时间,就写一下吧。
还有很多编译问题,我随手就解决了,就不会在这里记录,花了好多时间,去升级版本,不容易啊。文章来源地址https://www.toymoban.com/news/detail-755548.html
到了这里,关于Android 编译版本升级target 33的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!