禁止安装第三方应用(可对某个应用特殊处理),动态通过暗码改变是否能够安装第三方应用:
o版本
主要是在frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
在handleStartCopy方法中有判断
if (onInt && onSd) {
最外的else内加入
if ("1".equals(SystemProperties.get("persist.sys.packageinstall.status", "0"))){
ret = PackageManager.INSTALL_SUCCEEDED;
} else {
if (pkgLite.packageName != null && (pkgLite.packageName.equals("com.corget"))) {
ret = PackageManager.INSTALL_SUCCEEDED;
android.util.Log.e("tydtech", pkgLite.packageName+" can install");
} else{
ret = PackageManager.INSTALL_FAILED_INVALID_APK;
android.util.Log.e("tydtech", "xxx not allow install");
}
}
最后把mRet = ret;
SystemProperties.get("persist.sys.packageinstall.status", "0")如果开始没有值,那就默认是0,就走else,当然这个get也可以是一个参数,不返回默认值。此类适用于开始已经定义好了初始值。一般在device里mediatek/system/common/system.prop。比如35,38,54题。下面那个判断就是具体的包名依然可以安装
如果是ret = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION,那就是提示空间不足,(手动安装或adb安装会给报错提示),所以推荐用PackageManager.INSTALL_FAILED_INVALID_APK;
import android.os.SystemProperties;
输入暗码再开启或关闭
override/vendor/freeme/frameworks/base/core-export/java/com/freeme/telephony/FreemeSpecialCharSequenceMgr.java
在handleSecretCode方法中
if (input.equals("*#731130#")) {
Intent intent = new Intent();
intent.setAction("COM_TYD_INSTALL");
context.sendBroadcast(intent);
Toast.makeText(context,context.getString(R.string.close_app_installation_permission),Toast.LENGTH_SHORT).show();
return true;
}
if (input.equals("*#731129#")) {
Intent intent = new Intent();
intent.setAction("COM_TYD_UNINSTALL");
context.sendBroadcast(intent);
Toast.makeText(context,context.getString(R.string.open_app_installation_permission),Toast.LENGTH_SHORT).show();
return true;
}
就是发两个广播,至于这个toast提示,是为了有点反应,证明确实执行到了,别忘导包
import android.widget.Toast;
import com.android.internal.R;
还有这toast的字符串要写好
vendor/freeme/frameworks/base/core-export/res/res/values/strings.xml
<string name="open_app_installation_permission">开启APP安装权限</string>
<string name="close_app_installation_permission">关闭APP安装权限</string>
在override/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
接受两个广播,并赋值
filter.addAction("COM_TYD_INSTALL");
filter.addAction("COM_TYD_UNINSTALL");
BroadcastReceiver mDockReceiver = new BroadcastReceiver() {
加入
if (intent.getAction().equals("COM_TYD_INSTALL")) {
SystemProperties.set("persist.sys.packageinstall.status", "0");
}
if (intent.getAction().equals("COM_TYD_UNINSTALL")) {
SystemProperties.set("persist.sys.packageinstall.status", "1");
}
SystemProperties.set("persist.sys.packageinstall.status,设置这种属性值,名字有讲究的!!!!,一定要是persist.sys.打头。这个已经系统定义好了,如果想自己定义,就找到property_contexts文件加入,这个是SeLinux需要的。
比如在device/droi/common/sepolicy/non_plat/ property_contexts
还有些在./mediatek/proprietary/modem/pd3d_l8/sepolicy/q0/property_contexts
加入
persist.freeme. u:object_r:system_prop:s0
就相当于一个系统各进程共享内存
源码的定义在system目录下,每个api不一样。比如P版本
~/2TSSD/P2/system/sepolicy/prebuilts/api/28.0/private/ property_contexts
persist.sys. u:object_r:system_prop:s0
所以只要能编译到底层都放到或者覆盖那个位置就可以
拨号中输入*#数字#进入指定界面:
vendor/freeme/frameworks/base/core-export/java/com/freeme/telephony/FreemeSpecialCharSequenceMgr.java
private static final SecretCode kSecretCode;
static {
kSecretCode = SecretCode.newInstance()
.build("*#6801#", "android.settings.DEVICE_INFO_SETTINGS", "*#6802#") /
.build("*#6810#", "com.freeme.intent.action.SOFTWARE_INFO")
这个里面两个参数也行,第三个参数也可以是备用的号
这个SecretCode.newInstance()只是设置,号码数字打开哪个应用特定的action
然后这个kSecretCode交给
handleSecretCode方法里面去处理。
当然也可以仿照上面的,两者可互通
if (input.equals("*#731129#")) {
Intent intent = new Intent();
intent.setAction("COM_TYD_UNINSTALL");
context.sendBroadcast(intent);
return true;
}