提示: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 name="deprecated_target_sdk_message"msgid="5246906284426844596">"此应用专为旧版 Android 系统打造。它可能无法正 常运行,也不包含最新的安全和隐私保护功能。请检查是否有更新,或与应用开发者联系。"</string>PowerEdge-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.java
AppWarnings 源码分析
根据DeprecatedTargetSdkVersionDialog 找到show 业务
搜索DeprecatedTargetSdkVersionDialog即可,如下:
/** * Shows the "deprecated target sdk version" warning for the given application. * <p> * <strong>Note:</strong> Must be called on the UI thread. * * @param ar record for the activity that triggered the warning */@UiThreadprivatevoidshowDeprecatedTargetSdkDialogUiThread(@NonNullActivityRecordar){finalintuserId=getUserIdForActivity(ar);DeprecatedTargetSdkVersionDialogdeprecatedTargetSdkVersionDialog;if(mDeprecatedTargetSdkVersionDialogs!=null){deprecatedTargetSdkVersionDialog=mDeprecatedTargetSdkVersionDialogs.get(userId);if(deprecatedTargetSdkVersionDialog!=null){deprecatedTargetSdkVersionDialog.dismiss();mDeprecatedTargetSdkVersionDialogs.remove(userId);}}if(!hasPackageFlag(userId,ar.packageName,FLAG_HIDE_DEPRECATED_SDK)){deprecatedTargetSdkVersionDialog=newDeprecatedTargetSdkVersionDialog(AppWarnings.this,getUiContextForActivity(ar),ar.info.applicationInfo,userId);deprecatedTargetSdkVersionDialog.show();if(mDeprecatedTargetSdkVersionDialogs==null){mDeprecatedTargetSdkVersionDialogs=newSparseArray<>();}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 逻辑,如下:
总结
- 高版本中各种对低版本的限制,对应的如何修改需要有自己的思路。
- 整篇日志其实就是解决问题思路,找源码、在源码里面找相关的。
- 其实 分析的过程中,各个节点都可以进行屏蔽,只是在顶层解决问题更好。 找一个适当位置 过滤掉就可以了。