Android targetSdkVersion 升级为34 问题处理


原因是发布到GooglePlay遭到拒绝,需要最低API level为34。之前为31,感觉还挺高的,但是GooglePlay需要的更高。
记录下处理问题:

1.升级gradle版本为8.0.2

之前是:

classpath 'com.android.tools.build:gradle:7.1.0-alpha11'
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.2-bin.zip

升级为:

classpath 'com.android.tools.build:gradle:8.0.2'
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.0-bin.zip

应该会有更高的版本,但是升级到8.9-bin.zip时会有问题,然后看到有开发者用的8.0-bin.zip,就切到了这个版本

2.升级Android Studio Ladybug | 2024.2.1

Build #AI-242.21829.142.2421.12409432, built on September 25, 2024

Cannot convert string value 'UNIFIED_TEST_PLATFORM' to an enum value of type 'com.android.builder.model.AndroidGradlePluginProjectFlags$BooleanFlag'
遇到上述问题,需要升级编辑器

3.Namespace not specified 问题

How do I fix ‘namespace not specified’ error in Android Studio?
过程中遇到了

Namespace not specified. Please specify a namespace in the module's build.gradle file like so:
android {
	·namespace 'com.example.namespace'
}

解决方案比较麻烦
1.将清单文件AndroidManifest.xml里的package="cn.xx.xx"删掉
2.在module(如果有依赖的library也要添加)的build.gradle文件下添加

android {
    namespace 'cn.xx.xx'

3.在项目project根目录的build.gradle下添加

    // This code is where all the magic happens and fixes the error.
    subprojects {
        afterEvaluate { project ->
            if (project.hasProperty('android')) {
                project.android {
                    if (namespace == null) {
                        namespace project.group
                    }
                }
            }
        }
    }

4.dataBinding 和 buildConfig 处理

Android BuildConfig不生成的解决办法

android {
    buildFeatures {
        dataBinding = true
        buildConfig = true
    }
}

5.JDK升级为17

Android Studio 中的 Gradle JDK 配置

android {
	compileOptions {
	        targetCompatibility JavaVersion.VERSION_17
	        sourceCompatibility JavaVersion.VERSION_17
    }
}

旧版本Android Studio可直接在编辑器里下载

然后在新编辑器里选择版本17

如果是新版本的话,可去JDK官网下载,然后再配置jdk环境变量

49 = Java 5
50 = Java 6
51 = Java 7
52 = Java 8
53 = Java 9
54 = Java 10
55 = Java 11
56 = Java 12
57 = Java 13
58 = Java 14
59 = Java 15
60 = Java 16
61 = Java 17
62 = Java 18
63 = Java 19
64 = Java 20
65 = Java 21

6.kotlin_version 最低版本为:1.6.20

    dependencies {
        classpath 'com.android.tools.build:gradle:8.0.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.20"
    }

7.可使用AGP Upgrade Assistant引导修改

8.动态广播接收器处理

Android14 适配之——targetSdkVersion 升级到 34 需要注意些什么?

val filter = IntentFilter("alarmReceiver_custom_action")
val listenToBroadcastsFromOtherApps = true
val receiverFlags = if (listenToBroadcastsFromOtherApps) {
    ContextCompat.RECEIVER_EXPORTED    // 该接收器对其他应用开放
} else {
    ContextCompat.RECEIVER_NOT_EXPORTED    // 该接收器不对其他应用开放
}
// 这里的 registerReceiver 方法必须设置 receiverFlags 参数
registerReceiver(requireContext(), AlarmReceiver(), filter, receiverFlags)

// 发送广播
val intent = Intent("alarmReceiver_custom_action")    // 方式1
//val intent = Intent(requireActivity(), AlarmReceiver::class.java)    // 方式2
requireActivity().sendBroadcast(intent)

9.switch 报错

Android中使用switch-case遇到case R.id.xxx报错
需要在gradle.properties中添加

android.enableJetifier=true
android.defaults.buildfeatures.buildconfig=true
android.nonTransitiveRClass=true
android.nonFinalResIds=false

10.targetSdk minSdk compileSdk

targetSdkVersion 改为 targetSdk
minSdkVersion 改为 minSdk
compileSdkVersion 改为 compileSdk

11.打release问题

1.retrofit2 R8 / ProGuard 混淆文件更新

proguard/retrofit2.pro

2.Gson 混淆文件更新

Gson R8 proguard rules (java.lang.runtimeexception: missing type parameter.)

-keep class com.google.gson.reflect.TypeToken
-keep class * extends com.google.gson.reflect.TypeToken
-keep public class * implements java.lang.reflect.Type

3.JDK 版本高无法找到 sun.misc.BASE64Encoder 的 jar 包

https://blog.****.net/YKenan/article/details/109747568

下载jar:org.apache.commons.codec
替换引入和方法:

  1. import sun.misc.BASE64Encoder;替换为:import org.apache.commons.codec.binary.Base64;
  2. return new BASE64Encoder().encode(encryptedBytes);替换为:return Base64.encodeBase64String(encryptedBytes);
  3. byte[] encryptedBytes = new BASE64Decoder().decodeBuffer(content);替换为:byte[] encryptedBytes = Base64.decodeBase64(content);
上一篇:SpringBoot美发门店系统:数据驱动的决策


下一篇:利用Excel数据合并到Word功能,官方名为“Word邮件合并”