概述
在13.0系统rom定制化开发中,客户需求要实现应用安装白名单功能,在白名单中的应用可以安装,其他的应用不准安装,实现一个
控制app安装的功能并且暴露接口给上层应用,这需要从app安装流程入手才可以实现功能
PMS就是负责管理app安装的,功能就在这里添加就可以了,接下来看具体实现这个功能
一、app应用安装白名单核心代码
framework/base/core/java/android/content/pm/IPackageManager.aidl
framework/base/services/core/java/com/android/server/pm/InstallPackageHelper.java
framework/base/services/core/java/com/android/server/pm/PackageManagerService.java
二、app应用安装白名单核心功能分析
PackageManager是用于获取Android系统中应用程序的信息,查询应用程序相关信息(application,activity,receiver,service,provider及相应属性等)、查询已安装的应用、
增加或删除权限、清除数据用户、服务器、代码段等
IPackageManager接口类中定义了服务端和客户端通信的业务函数,还定义了内部类Stub,该类从Binder派生并实现了IPackageManager接口。
PackageManagerService继承自IPackageManager.Stub类,由于Stub类从Binder派生,因此PackageManagerService将作为服务端参与Binder通信。
PackageManagerService(简称PKMS),是Android系统中核心服务之一,管理着所有与package相关的工作,常见的比如安装、卸载应用、信息查询等工作,主要完成以下核心功能
1.解析AndroidManifest.xml清单文件,解析清单文件中的所有节点信息
2.扫描本地文件,主要针对apk,主要是系统应用、本地安装应用等。
实现功能需求:
我这里用了简单的方法在InstallPackageHelper.java中增加白名单接口,实现设置白名单和获取白名单,接下来在InstallPackageHelper中的安装app的方法中判断是否是白名单的app,然后确定是否让安装从而实现功能
三、代码实战
1.先导入所需要的包
//add LQX
import android.text.TextUtils;
import java.util.Arrays;
import java.util.List;
//add LQX
有些Android13是没有android.provider.Settings.System定义的,就需要多加一个:
import android.provider.Settings;
2.添加获取白名单方法
//add LQX
private boolean isWhiteListApp(String packagename){
String installWhiteApp = android.provider.Settings.System.getString(mContext.getContentResolver(), "install_white_app");
if (TextUtils.isEmpty(installWhiteApp)) {
return false;
}else{
String[] split = installWhiteApp.split(",");
List<String> installWhiteAppList = Arrays.asList(split);
if (installWhiteAppList.contains(packagename)) {
return true;
}else{
return false;
}
}
}
//add LQX
3.添加限制白名单方法
在preparePackageLI(InstallArgs args, PackageInstalledInfo res)中添加:
try (PackageParser2 pp = mPm.mInjector.getPreparingPackageParser()) {
parsedPackage = pp.parsePackage(tmpPackageFile, parseFlags, false);
AndroidPackageUtils.validatePackageDexMetadata(parsedPackage);
} catch (PackageManagerException e) {
throw new PrepareFailure("Failed parse during installPackageLI", e);
} finally {
Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
}
//add LQX
if(!isWhiteListApp(parsedPackage.getPackageName())){
Log.d("InstallPackageHelper",parsedPackage.getPackageName()+" is does not instant app");
throw new PrepareFailure(INSTALL_FAILED_INTERNAL_ERROR,
"app is not in the WhiteList.packageName");
}
//add LQX
// Instant apps have several additional install-time checks.
4.上层使用
Settings.System.putString(mContext.getContentResolver(), "install_white_app","com.LQX.systemproperties,com.LQX");
多个包名用逗号隔开
PS:查看当前白名单
settings get system install_white_app
总结
以上就是安卓13的应用安装白名单以及接口教程。