1
처음부터 앱을 설치하는 방법을 추적하려고합니다. 호출이 PackageManagerService로 이동하여 PackageManager를 확장하고 호출하는 소스 코드를 추적 할 수있었습니다 상기 방법 installPackageWithVerification()는, 코드하는 참조 용으로 다음과 같다 : 코드Android 앱 설치 프로세스 이해하기 PackageManagerService.installPackage
@Override
public void installPackageWithVerification(Uri packageURI, IPackageInstallObserver observer, int flags, String installerPackageName, Uri verificationURI, ManifestDigest manifestDigest) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES, null);
final int uid = Binder.getCallingUid();
final int filteredFlags;
if (uid == Process.SHELL_UID || uid == 0) {
if (DEBUG_INSTALL) {
Slog.v(TAG, "Install from ADB");
}
filteredFlags = flags | PackageManager.INSTALL_FROM_ADB;
} else {
filteredFlags = flags & ~PackageManager.INSTALL_FROM_ADB;
}
final Message msg = mHandler.obtainMessage(INIT_COPY);
msg.obj = new InstallParams(packageURI, observer, filteredFlags, installerPackageName,
verificationURI, manifestDigest);
mHandler.sendMessage(msg);
}
마지막 3 개 라인은 상기 메시지 핸들러 객체를 생성하고, 기본적으로 패키지 PARAMS 메시지에서 설치를 캡슐화하여 전송한다. 메시지가 배달되는 곳을 분명히 알지 못합니다.
내가 가서 기본적으로 sendMessage 첨부를 (정의 android.os.Handler)를 디버깅, 내가 찾을 수있는 모든이 메시지는 기본적으로수 android.os.MessageQueue
의 인스턴스를 사용하여 대기열에 추가됩니다이다 누군가 그 패키지 옆에 어떤 일이 일어나는지 친절하게 가르쳐 주겠습니까? 또는 NativeMessageQueue에 큐에 대기중인 메시지까지도 포함 할 수 있습니다.미리 감사드립니다.
AOSP 코드에서'InstallParams'를 검색하면 그 자리를 찾을 수 있습니다. 아니면'mHandler'가 어디서 왔고 어디에서'handleMessage'가 구현되는지 알아 내십시오. – 323go
알아 냈습니다. mHandler는 서비스 자체에 정의 된 PackageHandler 클래스 (android.os.Handler 클래스를 확장)입니다. 내가 android.os.Handler에서 sendMessage 메소드를 언급하면서 MessageQueue에 메시지를 추가합니다. 그리고 그게 내가 붙어있어 다음에 일어날 일을 알아 내지 못해! –
여기서 mHandler가 어디서 왔는지 알아 내야 만합니다.이 핸들러는 여러분이 보낸 메시지를 처리합니다. – 323go