RK3576-Android15-解决此应用专为旧版 Android 系统打造。它可能无法正常运行,也不包含最新的安全和隐私保护功能。请检查是否有更新,或与应用开发者联系 相关问题 提示RK3576-Android15-解决此应用专为旧版 Android 系统打造。它可能无法正常运行也不包含最新的安全和隐私保护功能。请检查是否有更新或与应用开发者联系 相关问题文章目录前言一、需求二、参考资料三、修改文件四、实现方案五、源码解析从UI显示着手-找关联的String 字符串根据StringId 追踪Java层代码根据弹框-找具体位置不让显示AppWarnings 源码分析根据DeprecatedTargetSdkVersionDialog 找到show 业务showDeprecatedTargetSdkDialogUiThread 是哪里调用的Handler 消息-MSG_SHOW_DEPRECATED_TARGET_SDK_DIALOG跟踪 showDeprecatedAbiDialog 方法逻辑showDeprecatedTargetDialog 方法跟踪六、知识点扩展总结前言Android app 内置应用或者 客户自己安装应用在Android15 版本上总是提示一些警告内容或者提示后app 都无法使用的。 这里就是了解相关内容达到app 内置或者安装后可用状态一、需求去掉提示弹框让App 可用二、参考资料之前有相关内容的解决方案输出是另外一个提示但是分析源码解决问题思路完全一致修改的内都一样的。RK3576-Android15-内置32位应用-此应用与最新版 Android 不兼容。请检查是否有更新或与应用开发者联系 弹框问题解决三、修改文件/frameworks/base/services/core/java/com/android/server/wm/AppWarnings.java四、实现方案在方法中添加自己需要释放过滤不拦截的包名即可privatebooleanisWhiteList(Stringname){if(com.cghs.stresstest.equals(name)||com.DeviceTest.equals(name)||android.rk.RockVideoPlayer.equals(name)||com.android.rk.equals(name)||com.gitvdemo.video.equals(name)||com.dangbei.dbmusic.equals(name)||com.iflytek.aiint.app.speechassistant.equals(name)||com.rockchip.devicetest.equals(name)){returntrue;}returnfalse;}五、源码解析从UI显示着手-找关联的String 字符串首先这样的弹框一般都是Framework层的弹框所有方向就是在framework 层找一找字符串看看。在framework层目录直接搜索grep-rn此应用专为旧版 Android 系统打造结果如下base/core/res/res/values-zh-rCN/strings.xml:2037:string namedeprecated_target_sdk_messagemsgid5246906284426844596此应用专为旧版 Android 系统打造。它可能无法正 常运行也不包含最新的安全和隐私保护功能。请检查是否有更新或与应用开发者联系。/stringPowerEdge-R730:~/Android/rk/Android15_002/Rockchip_Android15.0_Express_SDK_Release/frameworks$根据StringId 追踪Java层代码直接在framework层搜索grep -rn deprecated_target_sdk_message找到先关的类base/services/core/java/com/android/server/wm/DeprecatedTargetSdkVersionDialog.java:根据弹框-找具体位置不让显示如上找到弹框DeprecatedTargetSdkVersionDialog.java 直接看看它在哪里弹出来屏蔽掉就可以了。所以继续搜索grep -rn DeprecatedTargetSdkVersionDialog找到AppWarnings.javaAppWarnings 源码分析根据DeprecatedTargetSdkVersionDialog 找到show 业务搜索DeprecatedTargetSdkVersionDialog即可如下/** * Shows the deprecated target sdk version warning for the given application. * p * strongNote:/strong Must be called on the UI thread. * * param ar record for the activity that triggered the warning */UiThreadprivatevoidshowDeprecatedTargetSdkDialogUiThread(NonNullActivityRecordar){finalintuserIdgetUserIdForActivity(ar);DeprecatedTargetSdkVersionDialogdeprecatedTargetSdkVersionDialog;if(mDeprecatedTargetSdkVersionDialogs!null){deprecatedTargetSdkVersionDialogmDeprecatedTargetSdkVersionDialogs.get(userId);if(deprecatedTargetSdkVersionDialog!null){deprecatedTargetSdkVersionDialog.dismiss();mDeprecatedTargetSdkVersionDialogs.remove(userId);}}if(!hasPackageFlag(userId,ar.packageName,FLAG_HIDE_DEPRECATED_SDK)){deprecatedTargetSdkVersionDialognewDeprecatedTargetSdkVersionDialog(AppWarnings.this,getUiContextForActivity(ar),ar.info.applicationInfo,userId);deprecatedTargetSdkVersionDialog.show();if(mDeprecatedTargetSdkVersionDialogsnull){mDeprecatedTargetSdkVersionDialogsnewSparseArray();}mDeprecatedTargetSdkVersionDialogs.put(userId,deprecatedTargetSdkVersionDialog);}}showDeprecatedTargetSdkDialogUiThread 是哪里调用的继续追踪代码原来是通过Handler 发消息 监听到消息就展示出来弹框Handler 消息-MSG_SHOW_DEPRECATED_TARGET_SDK_DIALOG哈哈这个MSG_SHOW_DEPRECATED_TARGET_SDK_DIALOG提示跟踪到如下代码publicvoidshowDeprecatedTargetDialog(ActivityRecordr){removeMessages(MSG_SHOW_DEPRECATED_TARGET_SDK_DIALOG);obtainMessage(MSG_SHOW_DEPRECATED_TARGET_SDK_DIALOG,r).sendToTarget();}跟踪 showDeprecatedAbiDialog 方法逻辑接上面分析跟踪showDeprecatedAbiDialog它是在showDeprecatedAbiDialogIfNeeded方法中调用的showDeprecatedTargetDialog 方法跟踪接上面逻辑showDeprecatedTargetDialog跟踪最终找到showDeprecatedTargetDialogIfNeeded方法。哈哈哈这里不就找到了一个白名单机制isWhiteList添加自己包名过滤掉就可以了。六、知识点扩展其实很多类似的提示、弹框 基本上都是走的AppWarmings 逻辑如下总结高版本中各种对低版本的限制对应的如何修改需要有自己的思路。整篇日志其实就是解决问题思路找源码、在源码里面找相关的。其实 分析的过程中各个节点都可以进行屏蔽只是在顶层解决问题更好。 找一个适当位置 过滤掉就可以了。