Android如何让APP无法在指定的系统版本上运行(实现方法)

作者:snowyeti 时间:2022-10-16 03:24:46 

随着市面上越来越多三方APP的出现,某些手机厂商也开始对这些APP进行了安装限制或者运行限制,或者三方APP自身的版本过低,无法被特定的系统版本所支持。

今天我将要模拟实现一个“由于APP自身版本过低、导致无法在当前的系统版本上运行”的功能效果。

实现思路如下:

  • 要获得APP的目标运行版本,也要知道系统的编译版本

  • 通过版本比较,在进入该APP时,给用户做出“不支持运行”的提示

  • 用户确认提示后,直接退出该APP

关键点是 targetSdkVersion 的使用,源码如下:

1、主Activity


public class TargetSdkVersionDemo extends Activity {
 @Override
 protected void onCreate(Bundle onSavedInstance) {
   super.onCreate(onSavedInstance);
   setContentView(R.layout.target_sdk_version_demo);

int appTargetSdkVersion = getApplicationInfo().targetSdkVersion;
   Log.i("TargetSdkVersionDemo", "targetsdkversion " + appTargetSdkVersion);

// 我们假设这个APP的目标运行版本不高于 API Level 26
   if (appTargetSdkVersion <= Build.VERSION_CODES.O) {
     showNotSupportDialog(appTargetSdkVersion);
   }
 }

private void showNotSupportDialog(int version) {
   new AlertDialog.Builder(this)
       .setMessage("该APP的目标运行版本是 " + version + ",低于手机当前的版本,不支持运行!")
       .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
         @Override
         public void onClick(DialogInterface dialog, int which) {

// 退出程序
           finish();
         }
       })
       .create()
       .show();

}
}

2、在AndroidManifest.xml中需要定义 uses-sdk 这个标签的 targetSdkVersion 属性:


<uses-sdk android:targetSdkVersion="25" />

注意:

如果在 app 目录下的 build.gradle 文件中定义了 targetSdkVersion,则会覆盖 AndroidManifest中的值,源码中有说明:

Android如何让APP无法在指定的系统版本上运行(实现方法)

3、效果图如下:

Android如何让APP无法在指定的系统版本上运行(实现方法)

我们注意到程序中使用的是 getApplicationInfo().targetSdkVersion,说明这个变量是 ApplicationInfo.java 的成员变量,这个值是在安装APK的过程中、由系统服务 PackageManagerService 解析赋值的,解析的源码位于 frameworks\base\core\java\android\content\pm\PackageParser.java 中:

Android如何让APP无法在指定的系统版本上运行(实现方法)

可以看到:

  • 先解析 TAG_USES_SDK(uses-sdk)

  • 再解析属性名 targetSdkVersion 以及 minSdkVersion 的值

最后再赋值给 applicationInfo对象的:


pkg.applicationInfo.targetSdkVersion = targetSdkVersion

来源:https://www.cnblogs.com/snowyeti/archive/2021/01/31/14354670.html

标签:android,app,无法运行
0
投稿

猜你喜欢

  • Android结合xml实现帧动画

    2023-10-07 22:57:51
  • LINQ基础之Intersect、Except和Distinct子句

    2022-01-19 00:46:13
  • Java递归实现斐波那契数列

    2022-05-03 19:00:11
  • Java中的Struts2框架拦截 器之实例代码

    2023-06-21 19:04:03
  • Java实现将txt文件转成xls文件的方法

    2022-05-20 10:21:25
  • C# 填充Excel图表、图例背景色的实例代码

    2023-08-06 04:01:31
  • Java之SpringBean生命周期问题理解

    2022-11-16 14:47:35
  • Springboot下swagger-ui.html访问不到的解决方案

    2022-08-20 20:52:22
  • C#构建树形结构数据(全部构建,查找构建)

    2022-07-22 12:22:52
  • Java面试基础之TCP连接以及其优化

    2023-10-02 17:43:51
  • Android中执行java命令的方法及java代码执行并解析shell命令

    2022-08-27 15:45:13
  • Java利用MessageFormat实现短信模板的匹配

    2023-02-19 11:41:54
  • Java操作Redis详细介绍

    2023-07-27 06:53:04
  • Android实现随手指移动小球

    2021-06-03 23:38:46
  • Spring Cloud Alibaba Nacos Config进阶使用

    2021-07-14 19:46:00
  • Unity实现仿3D轮转图效果

    2023-11-24 12:26:56
  • Android Dispatchers.IO线程池深入刨析

    2022-12-13 16:20:31
  • c#调用存储过程实现登录界面详解

    2023-01-02 22:03:07
  • C#纯技术之Class写入Json

    2023-01-15 17:13:49
  • 关于Spring事务隔离、传播属性与@Transactional注解

    2021-11-15 04:37:11
  • asp之家 软件编程 m.aspxhome.com