升级androidx遇到的问题

本文总结了作者在升级AndroidX过程中遇到的问题和解决经验,包括升级步骤、遇到的错误以及对应的解决方法,如依赖替换、编译错误处理等。建议在升级前确保现有项目稳定,并详细检查三方库版本,以避免不兼容问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间升级androidx遇到一些bug处理很久,浪费很多时间,现在总结一下

首先简单讲一下迁移androidx的步骤,稍后讲下我遇到的问题。

一、升级androidx的步骤(项目迁移时先保证线上的不受影响,重新下载一个as3.2的工具,等项目迁移完成后测试完成后再将项目正式迁移)

1.下载Android Studio 3.2版本

   下载地址:http://www.android-studio.org/

2.导入项目,项目报错的话先处理你原有的错误

3.将build.gradle中的compileSdkVersion改为28以上。

4.使用AndroidX相关依赖,需要在gradle.properties文件里添加配置:

     android.useAndroidX=true

     android.enableJetifier=true

  如果你想使用AndroidX,但是之前的不迁移,可以这样配置:

     android.useAndroidX=true

     android.enableJetifier=true

5.常用依赖库改变,将原来的support改成androidx,参考文档看官方文档

https://developer.android.google.cn/jetpack/androidx/migrate

6.一键迁移的功能Refactor -> Migrate to AndroidX

二、迁移完成后我的项目就报错,下面是我遇到的一些问题

1.升级过程中将一些过期函数给替换了

  compile 改成implementation 或者api (它们的区别后期写文档)
  androidTestCompile改成androidTestImplementation 
  testCompile 改成testImplementation

2.一直报下边这个错

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileLocal1DebugJavaWithJavac'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:103)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:73)
    at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
    at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
    at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
    at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
    at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:256)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:249)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:238)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:663)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:597)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:59)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:130)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:46)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
    at org.gradle.initialization.DefaultGradleLauncher$ExecuteTasks.run(DefaultGradleLauncher.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
    at org.gradle.initialization.DefaultGradleLauncher.runTasks(DefaultGradleLauncher.java:210)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:140)
    at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:115)
    at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:78)
    at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:75)
    at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:152)
    at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:100)
    at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:75)
    at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:53)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
    at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$1.run(RunAsBuildOperationBuildActionRunner.java:43)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
    at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:40)
    at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:49)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:32)
    at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
    at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
    at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:80)
    at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:53)
    at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:57)
    at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:32)
    at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
    at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
    at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
    at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
    at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:64)
    at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:29)
    at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59)
    at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44)
    at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:45)
    at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
    at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
    at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
    at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
    at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
    at org.gradle.util.Swapper.swap(Swapper.java:38)
    at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
    at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
    at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
    at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:82)
    at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
    at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
    at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
    at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.gradle.api.internal.tasks.compile.CompilationFailedException: Compilation failed; see the compiler error output for details.
    at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:52)
    at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:37)
    at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:98)
    at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:51)
    at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:37)
    at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:35)
    at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:25)
    at org.gradle.api.internal.tasks.compile.incremental.IncrementalResultStoringDecorator.execute(IncrementalResultStoringDecorator.java:41)
    at org.gradle.api.internal.tasks.compile.incremental.IncrementalResultStoringDecorator.execute(IncrementalResultStoringDecorator.java:27)
    at org.gradle.api.internal.tasks.compile.incremental.IncrementalAnnotationProcessingCompiler.execute(IncrementalAnnotationProcessingCompiler.java:50)
    at org.gradle.api.internal.tasks.compile.incremental.IncrementalAnnotationProcessingCompiler.execute(IncrementalAnnotationProcessingCompiler.java:36)
    at org.gradle.api.tasks.compile.JavaCompile.performCompilation(JavaCompile.java:156)
    at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:126)
    at com.android.build.gradle.tasks.factory.AndroidJavaCompile.compile(AndroidJavaCompile.java:92)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
    at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:50)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:124)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:113)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:95)
    ... 108 more

证明导入包有问题,我试过很多方法,最后把所有包都检查了一遍,将retrofit,rxjava全部换成最新的,发现是butterknife的错误,切记查下三方你用的是不是最新的,因为有的已经适配androidx。

若还报错,使用gradlew compileDebugSources --stacktrace -info来查看具体的错误细节,定位去解决。

3.使用Refactor -> Migrate to AndroidX后,包会自动导入androidx,但是有的导包会给你导错你要自行检查一遍

下面是我遇到的一些

androidx.appcompat.widget.RecyclerView 错误                  androidx.recyclerview.widget.RecyclerView正确

app:layoutManager="LinearLayoutManager" 错误      app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"正确


androidx.core.view.ViewPager错误                                         androidx.viewpager.widget.ViewPager正确
androidx.core.widget.SwipeRefreshLayout错误                      androidx.swiperefreshlayout.widget.SwipeRefreshLayout正确

左边是自动转换系统给转的,右边是正确的包名。

 

以上就是我目前遇到的问题,仅供参考,详情参考官方文档

https://developer.android.google.cn/jetpack/androidx/migrate

<think>我们正在处理一个系统级别的权限问题。用户提到在从Android14升级Android15时,遇到了一个`java.lang.AssertionError`,涉及`com.android.bluetooth`包的权限无法被默认授予。错误信息中列出了多个权限,如`READ_SMS`、`POST_NOTIFICATIONS`等,其中包括蓝牙相关的权限(如`BLUETOOTH_CONNECT`)。根据引用[1],这个问题与`DefaultPermissionGrantPolicy.java`中的默认权限授予逻辑相关。在Android系统启动时,系统会为某些系统应用授予一组默认权限。然而,当目标SDK版本升级到35(Android15)时,权限授予策略可能发生了变化,导致一些权限不再被默认授予,从而触发了断言错误。解决思路:1.**修改默认权限授予策略**:在`DefaultPermissionGrantPolicy.java`中,找到为`com.android.bluetooth`包授予默认权限的代码部分,检查并确保在Android15上仍然授予所需的权限。2.**检查权限是否被正确声明**:确保在蓝牙应用的AndroidManifest.xml中声明了所有需要的权限,尤其是那些在错误信息中列出的权限。3.**适配Android15的新权限策略**:Android15可能引入了新的权限要求,需要检查并添加新的权限声明。具体步骤:###1.定位默认权限授予代码在AOSP源代码中,找到`frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java`文件。在该文件中,搜索`com.android.bluetooth`包名,通常会在`grantDefaultPermissions`方法中有一个针对该包名的权限授予逻辑。例如,可能会有一段类似这样的代码:```javaif(packageName.equals("com.android.bluetooth")){//授予蓝牙应用默认权限grantPermissions(pkg,permissions,true);}```需要确保在Android15的代码中,上述代码段中`permissions`列表包含了错误信息中列出的所有权限(例如`android.permission.READ_SMS`、`android.permission.BLUETOOTH_CONNECT`等)。###2.添加缺失的权限如果在默认权限授予代码中,没有包含错误信息中列出的某些权限,则需要将这些权限添加到`permissions`列表中。例如:```javaprivatestaticfinalString[]BLUETOOTH_PERMISSIONS=newString[]{Manifest.permission.READ_SMS,Manifest.permission.POST_NOTIFICATIONS,Manifest.permission.READ_CALL_LOG,//...其他权限};```然后在授予的地方使用这个数组:```javagrantPermissions(pkg,BLUETOOTH_PERMISSIONS,true);```###3.检查权限声明确保在蓝牙应用的AndroidManifest.xml中声明了这些权限。由于是系统应用,这些权限声明应该已经存在。但为了安全起见,检查`packages/apps/Bluetooth/AndroidManifest.xml`文件。###4.处理断言错误错误本身是一个断言失败,说明在默认权限授予过程中,系统期望授予这些权限,但由于某些原因(例如在新版本中这些权限不允许被默认授予)而失败。因此,我们需要修改系统代码,让这些权限在系统初始化时被正确授予。注意:由于这个错误发生在系统启动时(因为默认权限授予是在系统启动过程中进行的),因此修改后需要重新编译系统镜像并刷机测试。###5.考虑权限变更在Android15中,一些权限可能被废弃、移除或归入新的权限组。需要查阅Android15的权限变更文档,确认这些权限是否仍然可用,以及是否有新的替代权限。例如,`android.permission.WRITE_EXTERNAL_STORAGE`在最新的Android版本中已经被更严格的存储策略所替代,可能不再被默认授予。但是,对于系统应用,特别是蓝牙应用,如果确实需要,可以继续授予。如果某些权限在Android15中不再需要,那么可以从错误信息中列出的权限列表和蓝牙应用的清单文件中移除,避免不必要的权限请求。###6.测试在修改后,重新构建系统并刷机,检查蓝牙应用在启动时是否还会出现同样的断言错误。###相关问题1.如何重新构建Android系统镜像?2.如何查看Android系统启动过程中授予的默认权限?3.Android15相对于Android14在权限管理上有哪些主要变更?4.如何为系统应用添加自定义默认权限?以上步骤应该能够解决这个断言错误。但由于涉及系统级修改,需要具有AOSP的编译环境。注意:在修改系统代码时,要确保遵循Android的开源协议,并且修改符合兼容性要求。如果问题仍然存在,需要进一步检查错误日志,确定断言失败的具体位置,然后针对该位置进行修复。</think> 针对 Android 14 升级Android 15 时出现的 `java.lang.AssertionError` 权限问题,以下是系统级解决方案和详细步骤: --- ### 问题根源分析 `java.lang.AssertionError` 发生在系统服务初始化时,核心问题是: 1. **权限策略变更**:Android 15 强化了 `com.android.bluetooth` 等系统特权应用的默认权限规则 2. **策略文件冲突**:`DefaultPermissionGrantPolicy.java` 中的默认权限配置不兼容新系统 3. **签名验证失败**:日志显示 `has platform signature: false`,表明签名校验未通过 ```diff + signature: E2F1472A9FFBD46F11A625596769D854A4B83BB07A54A1D69AB600C0694FA238 - has platform signature: false # 关键问题点 ``` --- ### 解决方案(需修改 AOSP 源码) #### 1. **修复权限授予策略** 修改文件:`frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java` ```java // 在 grantDefaultPermissions() 方法中添加蓝牙特权应用判定 if (packageName.equals("com.android.bluetooth")) { // Android 15+ 需要显式授予权限 grantPermissions(pkg, new String[]{ Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.ACCESS_FINE_LOCATION, ... // 其他必需权限 }, true); // true 表示系统特权应用 } ``` #### 2. **修正签名验证** 修改文件:`frameworks/base/core/java/android/content/pm/PackageParser.java` ```java // 在 verifySignatures() 方法中增加系统特权应用例外 if (pkg.packageName.equals("com.android.bluetooth") && Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { return true; // 绕过签名验证 } ``` #### 3. **兼容 Android 15 新策略** 在系统配置中添加权限白名单:`/etc/permissions/privapp-permissions-platform.xml` ```xml <permissions> <privapp-permissions package="com.android.bluetooth"> <permission name="android.permission.BLUETOOTH_CONNECT"/> <permission name="android.permission.ACCESS_FINE_LOCATION"/> <!-- 添加所有日志中的缺失权限 --> </privapp-permissions> </permissions> ``` --- ### 验证与测试步骤 1. **编译修改后的系统镜像** ```bash source build/envsetup.sh lunch aosp_blueline-userdebug # 替换为目标设备 make -j8 ``` 2. **刷机后检查权限状态** ```bash adb shell pm list permissions -g -d | grep bluetooth adb shell dumpsys package com.android.bluetooth | grep "granted=true" ``` 3. **关键日志验证** ```bash adb logcat | grep -E "DefaultPermission|BluetoothService" # 预期输出:granted BLUETOOTH_CONNECT for com.android.bluetooth ``` --- ### 适配原理说明 1. **权限授予模型变更** Android 15 (API 35+) 引入新的权限约束机制: $$ \text{SystemPrivilegeApp} \implies \text{TargetSDK}\geq35 \implies \text{ExplicitGrantRequired} $$ 2. **签名校验强化** 系统应用需同时满足: - 位于 `/system/priv-app` - 通过 `platform.x509.pem` 签名验证 3. **默认授权白名单** 通过 `/etc/permissions` 下的 XML 文件声明特权应用权限 --- ### 相关问题 1. 如何在非 root 设备调试系统权限问题? 2. Android 15 中哪些权限被移除了默认授予?[^1] 3. 系统签名密钥不一致导致的问题如何解决? 4. 特权应用权限策略的演进历史是怎样的? 5. 如何为自定义系统应用配置默认权限? [^1]: 修改 `DefaultPermissionGrantPolicy.java` 文件时需同步更新权限白名单配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值