AccountManagerService负责管理手机中用户的在线账户,主要的工作涉及账户的添加、删除和AuthToken的获取和更新。
下面看下AccountManagerService的初始化,进入SystemServer中的startOtherServices方法看到如下代码:
mSystemServiceManager.startService(ACCOUNT_SERVICE_CLASS);
其中ACCOUNT_SERVICE_CLASS为com.android.server.accounts.AccountManagerService$Lifecycle,SystemServiceManager的startService里面会通过反射创建AccountManagerService.Lifecycle对象,并调用其onStart方法:
public void onStart() {
mService = new AccountManagerService(getContext());
publishBinderService(Context.ACCOUNT_SERVICE, mService);
}
可以看到创建AccountManagerService对象,并发布到服务总管里面。下面看下AccountManagerService构造函数:
public AccountManagerService(Context context) {
this(context, context.getPackageManager(), new AccountAuthenticatorCache(context));
}
public AccountManagerService(Context context, PackageManager packageManager,
IAccountAuthenticatorCache authenticatorCache) {
mContext = context;
mPackageManager = packageManager;
mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
mMessageHandler = new MessageHandler(FgThread.get().getLooper());
mAuthenticatorCache = authenticatorCache;
mAuthenticatorCache.setListener(this, null /* Handler */);
这里又创建了AccountAuthenticatorCache对象并设置监听器,AccountAuthenticatorCache是android平台中账户验证服务(AAS)的管理中心,AAS是应用程序中定义的服务,对它的定义有一定的要求,后面会看到。接着看下AccountAuthenticatorCache的构造函数:
/* package private */ class AccountAuthenticatorCache
extends RegisteredServicesCache<AuthenticatorDescription>
public AccountAuthenticatorCache(Context context) {
super(context, AccountManager.ACTION_AUTHENTICATOR_INTENT,
AccountManager.AUTHENTICATOR_META_DATA_NAME,
AccountManager.AUTHENTICATOR_ATTRIBUTES_NAME, sSerializer);
}
这里又调用父类RegisteredServicesCache构造函数,传递的参数如下定义:
public static final String ACTION_AUTHENTICATOR_INTENT =
"android.accounts.AccountAuthenticator";
public static final String AUTHENTICATOR_META_DATA_NAME =
"android.accounts.AccountAuthenticator";
public static final String AUTHENTICATOR_ATTRIBUTES_NAME = "account-authenticator";
后面解析XML要用到,所以AAS的配置文件也需要符合这个要求。
public RegisteredServicesCache(Context context, String interfaceName, String metaDataName,
String attributeName, XmlSerializerAndParser<V> serializerAndParser) {
mContext = context;
mInterfaceName = interfaceName;
mMetaDataName = metaDataName;
mAttributesName = attributeName;
mSerializerAndParser = serializerAndParser;
migrateIfNecessaryLocked();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
intentFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
intentFilter.addDataScheme("package");
mContext.registerReceiverAsUser(mPackageReceiver, UserHandle.ALL, intentFilter, null, null);
简单看下RegisteredServicesCache构造函数,其中migrateIfNecessaryLocked用户在系统目录下创建文件:
File systemDir = new File(getDataDirectory(), "system");
File syncDir = new File(systemDir, REGISTERED_SERVICES_DIR);
AtomicFile oldFile = new AtomicFile(new File(syncDir, mInterfaceName + ".xml"));
接着注册了包添加删除广播。猜测应用安装或卸载会在这里进行账户信息添加和删除。下面看下这个广播接收器:
private final BroadcastReceiver mPackageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final int uid = intent.getIntExtra(Intent.EXTRA_UID, -1);
if (uid != -1) {
handlePackageEvent(intent, UserHandle.getUserId(uid));
}
}
};
接着进入handlePackageEvent:
private final void handlePackageEvent(Intent intent, int userId) {
// Don't re