news 2026/4/29 1:59:22

Android14 修改 Frameworks_base 解决当两个第三方 apk 使用相同的 authority 时导致其中一个 apk 无法安装的问题 (2026年4月28日 14_27_21)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android14 修改 Frameworks_base 解决当两个第三方 apk 使用相同的 authority 时导致其中一个 apk 无法安装的问题 (2026年4月28日 14_27_21)

Android14 修改 Frameworks/base 实现当两个第三方 apk 使用了相同的 authority,导致其中一个无法安装的问题

问题描述
两个第三方 apk,authority name 相同,当已安装了一个 apk 后,另一个 apk 将无法安装,提示 INSTALL_FAILED_CONFLICTING_PROVIDER
log
C:\Users\lzz>adb install D:\Users\llk\Desktop\DeviceUnite_national_release_0.2.10_202603262020_release_202603262020.apk Performing Streamed Install adb: failed to install D:\Users\llk\Desktop\DeviceUnite_national_release_0.2.10_202603262020_release_202603262020.apk: Failure [INSTALL_FAILED_CONFLICTING_PROVIDER: Scanning Failed.: Can't install because provider name sohostbconfig (in package com.komect.device) is already used by com.cmcc.jarvis] // 反编译查看 AndroidManifest.xml // com.komect.deviceunite <provider android:name="com.komect.deviceunite.DeviceContentProvider" android:exported="true" android:authorities="sohostbconfig" // 相同 android:grantUriPermissions="true"/> // com.cmcc.jarvis <provider android:name="com.cmcc.jarvis.providers.AjLoginPhoneProviders" android:exported="true" android:authorities="sohostbconfig"/> // 相同
具体修改实现(Framework 层 hook)
a.扫描 apk 阶段改掉其中一个 apk 的 authority b.运行时根据包名做 authority 重定向 例子中 jarvis 较复杂牵扯太多,故针对 deviceUnite hook// aframeworks/base/services/core/java/com/android/server/am/ContentProviderHelper.java diff--git a/services/core/java/com/android/server/am/ContentProviderHelper.java b/services/core/java/com/android/server/am/ContentProviderHelper.java index3f7d8ba..4fda73a100644---a/services/core/java/com/android/server/am/ContentProviderHelper.java+++b/services/core/java/com/android/server/am/ContentProviderHelper.java @@-163,6+163,19@@publicclassContentProviderHelper{true,userId);}+privatestaticfinalStringDU_PACKAGE="com.komect.device";+privatestaticfinalStringOLD_AUTHORITY="sohostbconfig";+privatestaticfinalStringNEW_AUTHORITY="com.komect.device.sohostbconfig";++privateStringremapAuthorityForDeviceUnite(StringcallingPackage,Stringauthority){+if(DU_PACKAGE.equals(callingPackage)&&OLD_AUTHORITY.equals(authority)){+Slog.i(TAG,"remap authority: "+authority+" -> "+NEW_AUTHORITY++" callingPkg="+callingPackage);+returnNEW_AUTHORITY;+}+returnauthority;+}+privateContentProviderHoldergetContentProviderImpl(IApplicationThreadcaller,Stringname,IBindertoken,intcallingUid,StringcallingPackage,StringcallingTag,booleanstable,intuserId){@@-356,6+369,7@@publicclassContentProviderHelper{if(!providerRunning){try{checkTime(startTime,"getContentProviderImpl: before resolveContentProvider");+name=remapAuthorityForDeviceUnite(callingPackage,name);cpi=AppGlobals.getPackageManager().resolveContentProvider(name,ActivityManagerService.STOCK_PM_FLAGS|PackageManager.GET_URI_PERMISSION_PATTERNS,// bframeworks/base/services/core/java/com/android/server/pm/resolution/ComponentResolver.java diff--git a/services/core/java/com/android/server/pm/resolution/ComponentResolver.java b/services/core/java/com/android/server/pm/resolution/ComponentResolver.java index fac681a..1a90468100644---a/services/core/java/com/android/server/pm/resolution/ComponentResolver.java+++b/services/core/java/com/android/server/pm/resolution/ComponentResolver.java @@-294,12+294,32@@publicclassComponentResolverextendsComponentResolverLockedimplements}}+privatestaticfinalStringDU_PACKAGE="com.komect.device";+privatestaticfinalStringOLD_AUTHORITY="sohostbconfig";+privatestaticfinalStringNEW_AUTHORITY="com.komect.device.sohostbconfig";++privatestaticStringrewriteAuthorityIfNeeded(StringpackageName,Stringauthority){+if(DU_PACKAGE.equals(packageName)&&OLD_AUTHORITY.equals(authority)){+returnNEW_AUTHORITY;+}+returnauthority;+}+@GuardedBy("mLock")privatevoidaddProvidersLocked(@NonNullComputercomputer,AndroidPackagepkg,booleanchatty){finalintprovidersSize=ArrayUtils.size(pkg.getProviders());StringBuilderr=null;for(inti=0;i<providersSize;i++){ParsedProviderp=pkg.getProviders().get(i);+if(DU_PACKAGE.equals(pkg.getPackageName())){+finalStringoldAuth=p.getAuthority();+finalStringnewAuth=rewriteAuthorityIfNeeded(pkg.getPackageName(),oldAuth);+if(!Objects.equals(oldAuth,newAuth)){+Slog.i(TAG,"rewrite provider authority for "++pkg.getPackageName()+": "+oldAuth+" -> "+newAuth);+ComponentMutateUtils.setAuthority(p,newAuth);+}+}mProviders.addProvider(computer,p);if(p.getAuthority()!=null){String[]names=p.getAuthority().split(";");@@-784,8+804,10@@publicclassComponentResolverextendsComponentResolverLockedimplementsinti;for(i=0;i<providersSize;i++){ParsedProviderp=pkg.getProviders().get(i);-if(p.getAuthority()!=null){-finalString[]names=p.getAuthority().split(";");+Stringauthority=p.getAuthority();+authority=rewriteAuthorityIfNeeded(pkg.getPackageName(),authority);+if(authority!=null){+finalString[]names=authority.split(";");for(intj=0;j<names.length;j++){if(mProvidersByAuthority.containsKey(names[j])){finalParsedProviderother=mProvidersByAuthority.get(names[j]);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 1:57:51

艾默生Hart手操器2026推荐,精准调控

1、现场运维痛点与手操器核心价值在石化、电力、化工等流程工业现场&#xff0c;仪表运维人员常常面临“工具多、奔波多、排查慢”的困境。传统模式下&#xff0c;处理一台HART协议变送器或阀门定位器&#xff0c;往往需要同时携带手操器、回路供电电源、万用表、笔记本电脑等多…

作者头像 李华
网站建设 2026/4/29 1:57:49

GPT-Image-2来了,有人已经准备用它收割第一批钱

如果你最近在关注 AI 生图模型&#xff0c;会明显感觉到一个变化&#xff1a;我们不再是在“和 AI 对话”&#xff0c;而是在“直接描述意图”。上周发布的 gpt-image-2&#xff0c;把这件事推得更极致了。你不需要长提示词模板&#xff0c;也不需要调风格参数。 你只需要讲清楚…

作者头像 李华
网站建设 2026/4/29 1:56:24

Allegrao软件操作:用于修复未连接的引脚

从 Demo 板复制电路后&#xff0c;部分走线和焊盘看起来连着但实际没有电气连接&#xff08;显示飞线&#xff09;分析铜皮和焊盘的重叠&#xff0c;自动将有物理接触却没有电气连接的导线和焊盘连上1 点击顶部菜单 Tools → Derive Connectivity2 弹出窗口中勾选 Convert pin …

作者头像 李华