如何去除“此应用专为旧版Android打造”的提示

如何去除“此应用专为旧版Android打造”的提示

Android P上,有的应用打开时,会弹出对话框,内容:“此应用专为旧版Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系”。用户会感到困惑,真正的原因是什么? 举例,如下图某应用,版本:6.072.001, 下面通过Android P源码,分析原因: ...

Android P上,有的应用打开时,会弹出对话框,内容:“此应用专为旧版Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系”。用户会感到困惑,真正的原因是什么?

举例,如下图某应用,版本:6.072.001,

下面通过Android P源码,分析原因:

应用启动,startActivity时,流程会执行到realStartActivityLocked方法,代码位于ActivityStackSupervisor.java

realStartActivityLocked方法中,会调用AppWarnings.java的onStartActivity方法,如下:

final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, boolean andResume, boolean checkConfig) throws RemoteException {
    try {
        // ...
        mService.getAppWarningsLocked().onStartActivity(r);
        // ...
    } catch (RemoteException e) {
        // ...
    }
}

onStartActivity方法实现:

/**
   * Called when an activity is being started.
   *
   * @param r record for the activity being started
   */
public void onStartActivity(ActivityRecord r) {
    showUnsupportedCompileSdkDialogIfNeeded(r);
    showUnsupportedDisplaySizeDialogIfNeeded(r);
    showDeprecatedTargetDialogIfNeeded(r);
}

其中第三个函数showDeprecatedTargetDialogIfNeeded重点分析:

/**
   * Shows the "deprecated target sdk" warning, if necessary.
   *
   * @param r activity record for which the warning may be displayed
   */
public void showDeprecatedTargetDialogIfNeeded(ActivityRecord r) {
    if (r.appInfo.targetSdkVersion < Build.VERSION.MIN_SUPPORTED_TARGET_SDK_INT) {
        mUiHandler.showDeprecatedTargetDialog(r);
    }
}

重点:这里出现一个判断方法,正是其决定是否弹窗,判断条件中Build.VERSION.MIN_SUPPORTED_TARGET_SDK_INT,如下:

public static final int MIN_SUPPORTED_TARGET_SDK_INT = SystemProperties.getInt(
                "ro.build.version.min_supported_target_sdk", 0);

此属性默认值,一般是17。也就是说:

Android P机型上,当应用的targetSdk版本低于17时,应用启动时会弹窗“此应用专为旧版Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系”。
那么查看截图的某应用Package信息:

Package [com.qqgame.hlddz] (5ecd50f): 
    ......
    versionCode=196 minSdk=8 targetSdk=8
    versionName=6.043.001

果然其App的targetSdk是8,远低于17。

解决了核心问题,继续跟进showDeprecatedTargetDialog方法的实现,会发现其主要是调用对话框类DeprecatedTargetSdkVersionDialog,来弹出此对话框,并显示提示。

这里有一个问题,既然是在每个Activity启动时会调用AppWarnings.java的onStartActivity方法,那会不会每次打开新Activity,都弹此对话框?如果这样,用户体验也会非常不好。

答案:不会的,这里有一个小技巧,第一次弹出对话框后,用户如果选择“确定”,AMS会给此应用设置一个Flag标识:FLAG_HIDE_DEPRECATED_SDK。每次准备弹窗时,会先判断此标识值是否为true,如果是,说明已经提示过用户,无需再弹窗。代码如下:

public DeprecatedTargetSdkVersionDialog(final AppWarnings manager, Context context, ApplicationInfo appInfo) {
    // ...
    final AlertDialog.Builder builder = new AlertDialog.Builder(context)
                .setPositiveButton(R.string.ok, (dialog, which) ->
                    manager.setPackageFlag(
                            mPackageName, AppWarnings.FLAG_HIDE_DEPRECATED_SDK, true))
                .setMessage(message)
                .setTitle(label);
    // ...
}

最后,结论如下:

Android P机型上,当应用的targetSdk版本低于17时,应用启动时会弹窗“此应用专为旧版Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系”。标准值由ro.build.version.min_supported_target_sdk值设定的,一般默认是17

还有一个比较偷懒的方法,

部分游戏的安卓客户端在安卓10以上平台安装使用时,会提示“此应用专为旧版Android打造”,今天海盗空间就教大家如何解决这一问题。

我们在服务器上部署应用时,常常遇到这种问题,原因此应用可能是非常老的版本,当官方因为各种原因不再更新,当时最新安卓系统可以是安卓7或更老版本,随着安卓系统的更新换代,老的应用可能就会出现以上提示。

下面我们就来详细讲解如何去除:

去附方法:
1、用改之理软件,或其它同类反编译软件反编译客户端。
2、完成反编译后,找到AndroidManifest.xml文件,并用N++文本编辑器打开。
3、在代码<application上面添加一行。

4、加上如下代码即可:

<uses-sdk android:targetsdkVersion=”23″ android:minsdkversion=”16″/>
版权申明:
版权声明

①:本站文章均为原创,除非另有说明,否则本站内容依据CC BY-NC-SA 4.0许可证进行授权,转载请附上出处链接,谢谢。
②:本站提供的所有资源均为网上搜集,不保证能100%完整,如有涉及或侵害到您的版权请立即通知我们。
③:本站所有下载文件,仅用作学习研究使用,请下载后24小时内删除,支持正版,勿用作商业用途。
④:本站保证所提供资源的完整性,但不含授权许可、帮助文档、XML文件、PSD、后续升级等。
⑤:使用该资源需要用户有一定代码基础知识!由本站提供的资源对您的网站或计算机造成严重后果的本站概不负责。
⑥:本站资源售价只是赞助,收取费用仅维持本站的日常运营所需。
⑦:如果喜欢本站资源,欢迎捐助本站开通会员享受优惠折扣,谢谢支持!
⑧:如果网盘地址失效,请在相应资源页面下留言,我们会尽快修复下载地址。

0

评论0

请先

会员低至49元,开通享海量VIP资源免费下载 自助开通
显示验证码
没有账号?注册  忘记密码?