此应用专为旧版Android打造,因此可能无法正常运行...

此应用专为旧版Android打造,因此可能无法正常运行...

Google为解决系统版本碎片化,在最新的Android P也就是api28,Android 8.0中需要把最小sdk版本提升到17。

原因

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

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

onStartActivity()

public void onStartActivity(ActivityRecord r) {
    showUnsupportedCompileSdkDialogIfNeeded(r);
    showUnsupportedDisplaySizeDialogIfNeeded(r);
    showDeprecatedTargetDialogIfNeeded(r); // 检测
    }

重点看一下,showDeprecatedTargetDialogIfNeeded()

public void showDeprecatedTargetDialogIfNeeded(ActivityRecord r) {
    if (r.appInfo.targetSdkVersion < Build.VERSION.MIN_SUPPORTED_TARGET_SDK_INT) {
        mUiHandler.showDeprecatedTargetDialog(r);
    }
    }

当最小版本17时候将显示过时对话框。

系统编译的时候写死的
public static final int MIN_SUPPORTED_TARGET_SDK_INT = SystemProperties.getInt(
                "ro.build.version.min_supported_target_sdk", 0);

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

判断是在启动activity的是后判断的那么是不是每次启动都会提示呢,当然是不是,如果每次都提示还怎么时候,那还不如直接不允许安装好了。

// 显示对话框,当用户点击确定后,系统会保存忽略,当再次启动就不会显示了
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);
    // ...
    }

总结

目前是要求最小需要设置17,后面还会变化,而且Google已经要求开发者提高最小支持的版本,否则不能上架。

声明:原创文章,版权所有,转载请注明出处,https://litets.com。