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

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

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

    9dc825ac1c58?from=groupmessage

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

    应用启动,startActivity时,流程会执行到realStartActivityLocked方法,代码位于ActivityStackSupervisor.java,可参考我之前一篇文章:startActivity启动流程的源码学习。

    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

    作者:kevin song,2019.1.23于南京建邺区

    展开全文
  • 最近发现之前开发的APP 在Android9.0上安装时提示如下恶心的提示: 度娘大部分技术是建议修改android:targetSdkVersion="17"及以上版本于是乎开始更新打包更新自己的APP,意外的事情发生了,闪退!!!debuger 发现...

    最近发现之前开发的APP 在Android9.0上安装时提示如下恶心的提示:

    27748504018735c35094cfd7c097de85.png

    度娘大部分技术是建议修改  android:targetSdkVersion="17"及以上版本

    于是乎开始更新打包更新自己的APP,意外的事情发生了,闪退!!!

    debuger 发现如下错误:

    09b1ddd613c8ae2bc586513f425a883d.png

    低版本Androidsdk下之前正常,现在升级target报错,肯定跟这个有关,因为代码没有问题但总是报错。最后查阅资料了解到,在Android 4.0以上,网络连接不能放在主线程上,不然就会报错android.os.NetworkOnMainThreadException。但是4.0下版本可以不会报错。

    贴出改造后代码:仅适合本项目使用哦,需要的拿走

    timer = new Timer(true);

    startTime = System.currentTimeMillis();

    timer.schedule(task, 2000, 2);

    private  TimerTask task = new TimerTask() {

    @Override

    public void run() {

    if (task.scheduledExecutionTime() - startTime >= 1000 || !_touched) {

    Message message = new Message();

    Log.i("SplashActivity", (task.scheduledExecutionTime() - startTime)+"");

    if(isConnectInternet()){

    TIME_UP=1;

    message.what = TIME_UP;

    Bundle data =  new  Bundle();

    HttpURLConnection connection = null;

    BufferedReader reader = null;

    try {

    URL url = new URL(url);

    connection = (HttpURLConnection) url.openConnection();

    connection.setRequestMethod("GET");

    connection.setConnectTimeout(5000);

    connection.setReadTimeout(5000);

    InputStream in = connection.getInputStream();

    //对获取到的输入流进行读取

    reader = new BufferedReader(new InputStreamReader(in,"UTF-8"));

    StringBuilder response = new StringBuilder();

    String line;

    while ((line = reader.readLine()) != null){

    response.append(line);

    }

    data.putString("value",response.toString()) ;

    } catch (Exception e) {

    e.printStackTrace();

    }finally {

    if (reader != null){

    try {

    reader.close();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    if (connection != null){

    connection.disconnect();

    }

    }

    message.setData(data);

    }else{

    message.what = 2;

    }

    handler.sendMessage(message);

    timer.cancel();

    this.cancel();

    }

    }

    };

    Handler handler =  new  Handler(){

    @Override

    public void  handleMessage(Message msg) {

    switch (msg.what) {

    case 1:

    Bundle data = msg.getData();

    String jsonStr = data.getString("value");

    if (jsonStr.length() > 1) {

    try {

    jsonObject = new JSONObject(jsonStr.substring(1,

    jsonStr.length() - 1));

    linkUrl = jsonObject.getString("url")  ;

    } catch (JSONException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    Intent intent = new Intent();

    intent.setClass(MainActivity.this, WebviewActivity.class);

    intent.putExtra("url", linkUrl);

    intent.putExtra("type", "other");

    startActivity(intent);

    overridePendingTransition(R.anim.main_enter, R.anim.main_exit);

    MainActivity.this.finish();

    }

    break;

    case 2:

    exit();

    break;

    }

    super.handleMessage(msg);

    }

    };

    展开全文
  • 这种问题,是从Android9开始,操作系统对minSdk进行了检测造成的 解决方法是,在gradle中调高minSdkVersion 但是有时并不是真的由于minSdkVersion过低造成的,而是多个模块在资源合并时,发生了错误,造成了minSdk...

    在这里插入图片描述
    这种问题,是从Android9开始,操作系统对minSdk进行了限制造成的
    解决方法是,在gradle中调高minSdkVersion即可

    但有时调高minSdkVersion也解决不了问题,原因是其它原因间接导致了minSdkVersion过低
    比如多个模块在资源合并时,发生了错误,造成了minSdkVersion丢失,使得最终的minSdkVersion等于0
    如下,去掉红框中的内容即可
    在这里插入图片描述

    可能还会有其它情况造成类似结果,但是本质原因无非是minSdkVersion过低
    根据这个原理来推测,就能找到出错的地方

    展开全文
  • 1.升级SDK至Android10 2.本质原因是minSdkVersion过低,

    1.升级SDK至Android10

    2.本质原因是minSdkVersion过低,

    展开全文
  • 此应用专为旧版Android打造。拒绝权限可能导致其无法运行”,然后关闭权限以后启动APP检查不到没有开启的权限?这是什么情况,新写的demo测试又没有这个问题。。
  • as项目检查项目及依赖的项目中每个build.gradle里面targetSdk、minSdkVersion是否大于17。 eclipse项目检查项目及依赖的项目中每个AndroidManifest.xml里面targetSdk、minSdkVersion是否大于17。...
  • Android P(9.0)出现弹窗,多数建议`targetSdk > 17, minSdk> 17`, 最近测试反应在Android 10上也出现该弹窗,经测试targetSdk > 17时能够安装,但是会有弹窗提示,要去掉这个弹窗需要修改`targetSdk ...
  • 今天这个文章,大家一定一定要看,简直是太坑了。。 之前用HB打包的apk,安装到安卓手机,都没问题。 现在问题来了。安卓低于10.0.0手机地图出不来,其他手机可以出来【用的百度地图】 后来, ......
  • Android Q上,应用打开会弹出对话框,提示:“此应用专为旧版Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系”。找了下源码,发现: Android Q机型,即Android 10,貌似应用的 targetSdk版本 &...
  • 那我怎么获取权限,我在用于设置中将相机的权限关闭了;但是直接去请求相机权限:返回值还是truefunction reqPermission(one_per, callback){var perms = new Array();if(one_per){perms.push(one_per);...
  • 此应用专为旧版本打造

    千次阅读 2020-07-02 18:53:37
    Android P机型及以上,当应用的targetSdk版本低于17时,应用启动时会弹窗“此应用专为旧版Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系”。 修复方案: 修改minSdkVersion 17以上 修改...
  • 项目是网狐旗舰架构,默认安卓编译版本是Android-19, 如果运行在Android9.0及以上的设备就会提示“此应用专为旧版本打造的提示”,所以需要将工程里面的AndroidManifest.xml文件中编译目标版本升级。为了之后方便...
  • 解决专为旧版android打造

    千次阅读 2021-06-23 10:21:50
    import android.os.Build; import java.lang.reflect.Field; import java.lang.reflect.Method; public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); ...
  • 也就是说: Android P机以上机型上,当应用的targetSdk版本低于17时,应用启动时会弹窗“此应用专为旧版Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系”。 懂安卓编程或者正在学的同学可以分析...
  • 悬浮控制是专为Android

    2014-10-28 23:03:57
    悬浮控制是专为Android。悬浮控制是一个按钮,漂浮在你的屏幕上的应用程序
  • Android P,系统应用集成,部分应用初次打开时提示此应用专为低版本Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系 定位原因:1. 猜测和应用sdk版本有关 2. AndroidManifest.xml 里 targetSdk...
  • 最近发现刚做出的项目在一部分机型上总显示版本专为旧版安卓打造,经过一番排查,发现其实是安卓版本太高了,不兼容,自安卓10以后就要动态获取权限 1、需将一个manifest.xml置于你的/项目代码/res/目录下,并将...
  • [img=https://img-bbs.csdn.net/upload/202007/29/1595990000_775827.png][/img] 请问一下 这个问题 我已经设置了 minSdkVersion 19 targetSdkVersion 28 在Android9.0和10.0还是会提示 ? 请问咋个解决了 谢谢
  • 有钱的大佬,请往讯飞语音开放平台看吧,那里有收费的
  • 华为方面承诺,6月份...据参与鸿蒙OS开发板测试的用户反映,其在进入某款安卓应用游戏时,被系统误检测Android模拟器”,并在侧边显示一个电脑小图标。因为检测到不属于手机设备,游戏服务器会自动检测并匹配P...
  • 在Android10.0中运行应用会提示“此应用专为旧版Android打造,可能无法正常运行,请尝试更新或与开发者联系”。 具体截图如下: 什么在Android10.0会出现这个提示,而在低版本中却没有呐? 2.问题分析 我们...
  • 我以前在编译kivy应用程序时从来没有遇到过问题(已经做过很多次了),但现在我遇到了一个问题:它会将应用程序正常地扔到我的手机上,但当我打开它时,它会冻结在preplash图标上,并给我一条消息:“无法提取公共数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,530
精华内容 3,812
关键字:

此应用专为旧版android