因为经常进自己网站左康右康有没有人访问(极度自恋),老是去翻浏览器书签很麻烦,最近就想着把网站打包一个app,虽然我这破站也没什么可看的,不过至少打包后加点快捷功能就看不出来我一直在划水了(笑

0x01 正文

说是做个app,但是我又完全不懂安卓,这可怎么办呢。

正好想到之前大名鼎鼎的Funsion App,可以快捷的将网站做成app,于是就下载来试了一下,调了半个小时就做好了(也就改改图标之类的,也没什么技术含量,就不献丑了),说起来这应用确实简单,没有一点安卓编程基础的都能用,这里向和我一样的小白朋友们安利一波(住口,我没恰烂钱!)

虽然这软件确实很方便,不过随之而来也有一些问题,预览的结果还挺简洁美观,但是打包安装好后测试一波,就弹出了下面的提示

虽说没有什么大问题,但是,一来弹个提示出来会让大部分人不爽,二来这不还是看的出来我在划水吗?得想办法解决一下。

一般这种情况,要么是用了低版本安卓专用的参数,要么就是应用SDK版本配置过低,上网查了一下,原因大致是因为从Android9开始,操作系统对minSdk进行了限制。

具体原因分析:
PS:引用自大佬文章https://www.jianshu.com/p/9dc825ac1c58
安卓应用启动,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打造,因此可能无法正常运行。请尝试检查更新或与开发者联系”。

懂安卓编程或者正在学的同学可以分析一下,反正我是看不懂的(菜)。。。

原理搞懂了,现在来看解决方法

这里需要提到AndroidManifest.xml 里 targetSdkVersion版本:
原文及相关释义引用自大佬文章,自行查看:https://blog.csdn.net/qq_23062979/article/details/81294550
总结:

targetSdkVersion保证的是api的一致性。

所以一般minSdkVersion <targetSdkVersion<= compileSdkVersion
不随意更改targetSdkVersion,更改targetSdkVersion必须做好兼容。

综上所述,解决方法有二:
方法一:app修改 android:targetSdkVersion 值为合适值
方法二:降低ro.build.version.min_supported_target_sdk 设置值

这里我用的第一种方法,首先查看我自己手机的Android API

然后在手机上用MT管理器反编译,更改AndroidManifest.xml中的targetSdkVersion值为29

提示是没了,然后报错了。。。

参考文章https://www.jianshu.com/p/c42b17223d35 猜测是因为安卓P以上的API版本默认所有Http的请求都被阻止了。
然后继续修改targetSdkVersion,经多次测试发现值为25时既无提示也无报错,成功运行:

0x02 后记

这次只是简单的用软件快捷打包了一下网站,所以还有很多不足的地方,还是不做为我正式的app作品了,不过要是有看得上的小伙伴们还是想让你们更方便的踩踩我的站啦,哈哈!

宇神博客app下载链接:https://lanzous.com/icwsjne

划重点:因为我几乎没有接触过本文涉及知识,所以此篇文章中的所有我自己写的解释仅供参考,更偏向于个人记录,请不要以我的解释作为正解,如果是大佬们发现了本文有什么错误的地方,还劳烦大家在评论区中严厉温柔指出,你们的支持是我前进的动力!