首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程
1. 简介
为了能把应用程序安装到SD卡和TF卡上,Android系统默认是不支持的,它只有一个asec mount点: /mnt/secure/asec,在我的系统中,此mount点由/mnt/sdcard给占用了,所以TF卡就支持不了。为了解决此问题,除了把代码读明白之外,无其它的办法。为了方便理解下面的描述,先看下Vold(管理外设热插拔)的系统框架图:
关于相关类图,引用其他仁兄的图:
2. 从U盘安装应用程序流程
PackageInstallerActivity.java::initiateInstall->
::startInstallConfirm->
InstallAppProgress::onCreate->
InstallAppProgress::initView->
PackageManager::installPackage->
PackageManagerService::installPackage->
installPackageWithVerification->
mHandler.sendMessage(msg)->
PackageHandler::handleMessage->
PackageHandler::doHandleMessage->
HandlerParams::startCopy->
InstallParams::handleStartCopy-> (根据installLocation确认安装位置,只有针对/data分区有lowThreshold)
SdInstallArgs::copyApk-> (关键的地方,下面详解)
InstallParams::handleReturnCode->
PackageManagerService::processPendingInstall->
PackageManagerService::installPackageLI-> //args, res分析
PackageManagerService::installNewPackageLI-> // or replacePackageLI
PackageManagerService::scanPackageLI-> (KEY)->parsePackage(解析AndroidManifest.xml)
Installer::install (mInstaller.install)-> (Socket)--->
installd(真正做事的地方)
2.1 SdInstallArgs::copyApk
SdInstallArgs::copyApk->
DefaultContainerService::copyResourceInner->
PackageHelper::createSdDir->
MountService::createSecureContainer->
(cmd = String.format(new Locale("en", "Us"),
"asec create %s %d %s %s %d", id, sizeMb, fstype, key, ownerUid);)
NativeDaemonConnector::doCommandLocked->(向"vold" socket发送命令给vold,并等待结果)
NativeDaemonConnector::sendCommandLocked-> (Socket)
FrameworkListener::onDataAvailable-> (receive message) "buffer=asec list"
或"buffer=asec create smdl2tmp1 19 fat caf791d0426d682e5b2aafc5439d55a9 10023"
FrameworkListener::dispatchCommand->
CommandListener::AsecCmd::runCommand-> (所有与Volume::SEC_ASECDIR相关的代码都需要修改)
VolumeManager::createAsec (决定安装文