前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于app提示专为旧版Android打造的有关测试

关于app提示专为旧版Android打造的有关测试

作者头像
Y5neKO
发布2022-01-13 13:03:53
3.4K0
发布2022-01-13 13:03:53
举报
文章被收录于专栏:Y5neKO博客Y5neKO博客

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

0x01 正文

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

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

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

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

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

具体原因分析: PS:引用自大佬文章https://www.jianshu.com/p/9dc825ac1c58 安卓应用启动,startActivity时,流程会执行到realStartActivityLocked方法,代码位于ActivityStackSupervisor.java realStartActivityLocked方法中,会调用AppWarnings.java的onStartActivity方法,如下:

代码语言:javascript
复制
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, boolean andResume, boolean checkConfig) throws RemoteException {
    try {
        // ...
        mService.getAppWarningsLocked().onStartActivity(r);
        // ...
    } catch (RemoteException e) {
        // ...
    }
}

onStartActivity方法实现:

代码语言:javascript
复制
/**
   * 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重点分析:

代码语言:javascript
复制
/**
   * 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,如下:

代码语言:javascript
复制
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作品了,不过要是有看得上的小伙伴们还是想让你们更方便的踩踩我的站啦,哈哈!

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020年05月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 正文
  • 0x02 后记
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档