4.4.5 Verification介绍
Verification功能的出现将打乱图4-12所示的工作流程,所以这部分内容要放在最后来介绍。其代码在InstallParams的handleStartCopy中,如下所示:
[—>PackageManagerService.java:InstallParams.handleStartCopy]
……//此处已经获得了合适的安装位置
final InstallArgs args=createInstallArgs(this);
mArgs=args;
if(ret==PackageManager.INSTALL_SUCCEEDED){
final int requiredUid=mRequiredVerifierPackage==null?-1
:getPackageUid(mRequiredVerifierPackage);
if(requiredUid!=-1&&isVerificationEnabled()){
//创建一个Intent,用于查找满足条件的广播接收者
final Intent verification=new
Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION);
verification.setDataAndType(packageURI, PACKAGE_MIME_TYPE);
verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
//查找满足Intent条件的广播接收者
final List<ResolveInfo>receivers=queryIntentReceivers(
verification, null, PackageManager.GET_DISABLED_COMPONENTS);
//verificationId为当前等待Verification的安装包个数
final int verificationId=mPendingVerificationToken++;
//设置Intent的参数,例如要校验的包名
verification.putExtra(PackageManager.EXTRA_VERIFICATION_ID,
VerificationId);
verification.putExtra(
PackageManager.EXTRA_VERIFICATION_INSTALLER_PACKAGE,
installerPackageName);
verification.putExtra(
PackageManager.EXTRA_VERIFICATION_INSTALL_FLAGS, flags);
if(verificationURI!=null){
verification.putExtra(PackageManager.EXTRA_VERIFICATION_URI,
verificationURI);
}
final PackageVerificationState verificationState=new
PackageVerificationState(requiredUid, args);
//将上面创建的PackageVerificationState保存到mPendingVerification中
mPendingVerification.append(verificationId, verificationState);
//筛选符合条件的广播接收者
final List<ComponentName>sufficientVerifiers=
matchVerifiers(pkgLite, receivers, verificationState);
if(sufficientVerifiers!=null){
final int N=sufficientVerifiers.size();
……
for(int i=0;i<N;i++){
final ComponentName verifierComponent=sufficientVerifiers.get(i);
final Intent sufficientIntent=new Intent(verification);
sufficientIntent.setComponent(verifierComponent);
//向校验包发送广播
mContext.sendBroadcast(sufficientIntent);
}
}}
//除此之外,如果在执行adb install的时候指定了校验包,则需要向其单独发送校验广播
final ComponentName requiredVerifierComponent=
matchComponentForVerifier(mRequiredVerifierPackage,
receivers);
if(ret==PackageManager.INSTALL_SUCCEEDED
&&mRequiredVerifierPackage!=null){
verification.setComponent(requiredVerifierComponent);
mContext.sendOrderedBroadcast(verification,
android.Manifest.permission.PACKAGE_VERIFICATION_AGENT,
new BroadcastReceiver(){
//调用sendOrderdBroadcast,并传递一个BroadcastReceiver,该对象将在
//广播发送的最后被调用。读者可参考sendOrderdBroadcast的文档说明
public void onReceive(Context context, Intent intent){
final Message msg=mHandler.obtainMessage(
CHECK_PENDING_VERIFICATION);
msg.arg1=verificationId;
//设置一个超时执行时间,该值来自Settings数据库的secure表,默认为60秒
mHandler.sendMessageDelayed(msg, getVerificationTimeout());
}
},null,0,null, null);
mArgs=null;
}
}……//不用做Verification的流程
PKMS的Verification工作其实就是收集安装包的信息,然后向对应的校验者发送广播。但遗憾的是,当前Android中还没有能处理Verification的组件。
另外,该组件处理完Verification后,需要调用PKMS的verifyPendingInstall函数,以通知校验结果。
提示 Verification的目的主要是在APK安装时先触发校验程序对该APK进行检查,只有检查通过才能进行真正的安装。这部分代码比较简单。不过目前源码中还没有可进行Verification的程序,读者不妨自己写一个小例子测试一番。