美文网首页
Android 设置标志位限制应用安装

Android 设置标志位限制应用安装

作者: 假期开发仔 | 来源:发表于2018-06-06 12:01 被阅读0次

只有标志位为1的时候的apk才可以安装,否则apk都不能安装
需要修改的文件有以下几个
/frameworks/base/core/java/android/provider/Settings.java
/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
/frameworks/base/core/java/android/content/pm/PackageManager.java

1 Settings.java

数据分类
SettingsProvider对数据进行了分类,分别是Global、System、Secure三种类型,它们的区别如下:

Global:所有的偏好设置对系统的所有用户公开,第三方APP有读没有写的权限;
System:包含各种各样的用户偏好系统设置;
Secure:安全性的用户偏好系统设置,第三方APP有读没有写的权限。
参考文章:https://blog.csdn.net/myfriend0/article/details/59107989
我们这次添加在Global中,要添加另外两个类中方法也是类似的
首先我们在Settings的内部类Global中加入我们用来限制应用安装的标志位

/**
* cyh add 
* app install lock
* @hide
*/
public static final String APP_INSTALL_LOCK = "app_install_lock";

之后在SETTINGS_TO_BACKUP字符串数组中加入这个标志位

public static final String[] SETTINGS_TO_BACKUP = {
    ...
    ...
    APP_INSTALL_LOCK
};

2 DatabaseHelper.java

设定标志位初始值

/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
资源文件内加入默认值

...
<!-- cyh add app install lock -->
<bool name="def_app_install_lock">true</bool>
...

在DatabaseHelper的loadGlobalSettings()方法内(System类型就在loadSystemSettings()方法内)加入初始值设置

...
//cyh add start
//设定默认值
loadBooleanSetting(stmt, Settings.Global.APP_INSTALL_LOCK,
R.bool.def_app_install_lock);
//cyh add end 
...

3 PackageManagerService.java

在scanPackageLI方法下加入如下代码
一定要将NullPointerException抛出,在标志位数据库未生成时会运行到这个方法内,若不抛出异常,则会卡在android开机画面

boolean success = false;
//cyh add start
//获取应用安装锁
if(mContext!=null&&mContext.getContentResolver()!=null){
    try {
    int  appInstallLock = android.provider.Settings.Global.getInt(mContext.getContentResolver(),android.provider.Settings.Global.APP_INSTALL_LOCK , 1);
if (appInstallLock==0){
    int mLastScanError = PackageManager.INSTALL_FAILED_INVALID_LOCK;
    throw new PackageManagerException(mLastScanError,
    "禁止安装,安装模式未开启动");
    }
}catch(NullPointerException e){
    //一定要将NullPointerException抛出,在标志位数据库未生成时会运行到这个方法内,若不抛出异常,则会卡在android开机画面
    e.printStackTrace();
    }
}
//cyh add end 

4 PackageManager.java

加入错误标志,其实影响不大,看你要不要在自己的应用内做判断

/**
* cyh add
* app install failed lock noopen
* cyh end 
* @hide
*/
public static final int INSTALL_FAILED_INVALID_LOCK = -27;

使用方式:
在自己的应用内加入权限

<!-- 用于读取,修改标志位-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

在方法中

private final String APP_INSTALL_LOCK = "app_install_lock";
...
//方法内
//读取标志位的值
int keyValue;
try {
    int keyValue = Settings.Global.getInt(getContentResolver(),APP_INSTALL_LOCK);
} catch (Settings.SettingNotFoundException e) {
    e.printStackTrace();
}
//修改标志位的值
Settings.Global.putInt(getContentResolver(),APP_INSTALL_LOCK,value==0? 
1:0);
...

相关文章

  • Android 设置标志位限制应用安装

    只有标志位为1的时候的apk才可以安装,否则apk都不能安装需要修改的文件有以下几个/frameworks/bas...

  • Android 8.0(api27)静态广播和动态广播接收问题

    Android 8.0对广播进行了限制:静态广播(应用内)需要为Intent设置setClassName(Stri...

  • Android之UID and PID

    | 标签: 安装应用失败的25种原因 android安装应用失败 android中安装应用失 android之ui...

  • Android中适配未知来源权限

    Android中为了防止一些不良应用的随便静默安装,设置了未知来源应用的开关,在不同的android版本中使上会有...

  • Android 8.0 内部更新适配

    Android8.0后需要使应用可以安装未知来源应用才可以安装更新包,做内部更新设置res->xml->file_...

  • Android 免安装应用

    什么是免安装应用 Android 免安装应用使原生 Android 应用能够在启动网址时运行,无需安装应用。 当 ...

  • 组件化库开发资源合并等注意事项

    在开发库模块和相关应用时,请注意以下行为和限制。 向 Android 应用模块添加对库模块的引用后,您可以设置它们...

  • Flutter 安装

    安装Android Studio Android设置 1. 下载并安装 Android Studio[https...

  • 有关性能优化

    1)内存优化 首先了解内存的管理机制: 1.共享内存 2.限制应用内存: Android为每个应用程序设置一个硬性...

  • 排序算法-直接选择排序

    直接选择排序 通过设置标志位,将标志位的数字与标志位后最小的数字进行交换,递增标志位,知道标志位到达最后一位。 代...

网友评论

      本文标题:Android 设置标志位限制应用安装

      本文链接:https://www.haomeiwen.com/subject/sdrmlftx.html