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