2

그래서 안드로이드 앱을 설치하는 방법을 알아 내려고 AOSP를 파고 들었습니다. 지금까지 내가 여기있는 곳입니다 :PackageManagerService에서 안드로이드 앱을 설치하는 방법 이해하기

apk 파일은 PackageManager 메서드 installPackage()를 호출하는 InstallAppProgress로 PackageInstallerActivity에서 전송됩니다.

이전에 PackageManager를 호출하면 AIDL의 마술과 함께 PackageManagerService로 연결됩니다 (이 사실을 이해하는 데 시간이 다소 걸렸습니다). 코어있어서 installPackageWithVerification에서

()는 PackageHandler의 인스턴스가 생성되고, 메시지 전달 등 INIT_COPY 같은 상태 코드의 무리의 사용량 PACKAGE_VERIFIED

기반으로 강력한 방식으로 이루어진다 도착 Handler에 수신 된 메시지의 상태 코드에서 ops가 발생합니다. 으로 시작하려면 INIT_COPY - 보류중인 설치 목록에 패키지를 추가하고 코드 MCS_BOUND과 함께 메시지를 호출합니다.

이렇게하면 데이터 파일과 같은 apk 파일에서 추출한 기본 파일이 복사됩니다.

그리고 어딘가에있는 레인에서 메시지가 나타납니다. CHECK_PENDING_VERIFICATION은 보류 목록에서 패키지를 가져와 항목, 특히 AndroidManifest 파일을 구문 분석합니다.

updateSettingLI()이 호출되면 결국 3 가지 중요한 함수 호출이 만들어집니다.

  • moveDexFilesLI는()
  • setPermissionsLI()는 -, Manifest.xml
  • updatePermissionsLPw (DIR 고해상도/파일, resources.arsc를 추출) - grantPermissionLPw를 호출 -과의 groupids 추가 매니페스트 파일에서 구문 분석 된 사용 권한

이 시점에서 Package 개체에는 각각의 그룹 ID가 있으므로 이제 기본적으로 권한이 그룹 ID로 변환되는 방법을 파악할 수있었습니다. 실례합니다. 누군가가 PackageManagerService, 특히 scanPackageLI 메소드를 유용하게 사용할 수 있다고 생각했습니다. 특히 코드에서 길을 잃기 쉽습니다.

이제 실제 질문은, 나는 비 유적으로 안드로이드에서 각 애플 리케이션은 리눅스 프로세스 자체의 UI와 gids로 제어된다는 것입니다. 우리는 위의 내용을 참고하여 PackageManagerService에서 Linux 프로세스로 변환되는 방법을 알고 싶습니다.

"installd"도 설치 과정에서 중요한 역할을한다는 것을 알고 있습니다. 그러나 사용 권한 또는 액세스 권한 (Linux teminology에 따라)이 설치되는 패키지 (Linux의 프로세스)에 대해 설정된 링크를 찾을 수 없습니다.

친절하게 도와주세요.

+0

여기에 더 자세한 정보를 제공하는 좋은 블로그 또는 이와 관련된 것이 있습니까? 그렇다면 공유하십시오. –

+0

http://coltf.blogspot.it/p/android-os-processes-and-zygote.html 좋은 출발점입니다. –

답변

2

아주 좋은 질문입니다.그러나 귀하의 질문에 대한 답변을 찾으려면 약간 다른 방향, 즉 프로세스 시작을 조사해야합니다. Android에서 알 수 있듯이 Zygote라는 특별한 프로세스가 있습니다. 이것은 예열 된 프로세스입니다. 즉, 메모리에 이미 일부 라이브러리가로드되어 있음을 의미합니다.이 프로세스에서 모든 Android 프로세스가 분리됩니다.

응용 프로그램을 시작하면 Android 시스템이 Zygote 소켓을 통해 명령을 보내어 새 프로세스를 만듭니다. 이 명령 내에서 사용 권한에 따라 응용 프로그램에 할당 된 일련의 gid가 전송됩니다. Zygote가 새로운 프로세스를 생성 한 후에는 전달 된 gid를 설정합니다. 따라서 fork 된 프로세스는 uid와 gid를받습니다. 그러나이 프로세스는 권한에 대해서만 관련이 있으며 이는 gid에 매핑됩니다.

+0

제안 해 주셔서 감사합니다. 네, 잘못된 트랙에 있다고 느끼더라도 Zygote 코드를 통해 권한 설정 방법에 대한 뉘앙스를 이해할 수 있습니다. 특히 dalvik_system_Zygote.cpp의 forkAndSpecialize() 메소드는 fork 된 프로세스에 대한 setgroups (gid)와 함께 설정 그룹 ID를 실제로 수행합니다. 내 질문은 우리가 실제로이 부분에 대한 호출을 정확하게 수행하는 안드로이드의 App을 실제로 클릭 할 때입니다. 나는 길을 추적하고 싶다. 같은 포인터를 사용하여 나를 도울 수 있습니까? 감사합니다 –

+1

이 링크에 정보를 적용하십시오 : http://coltf.blogspot.it/p/android-os-processes-and-zygote.html 사실, 내가 잘못 아니었다면 당신은 불리는 방법을 찾아야합니다. ActivityManagerService의 startActivity() 메소드에 의해 호출되는 startActivityMayWait() – Yury

+0

너무 많이 Yury 감사합니다. 이 기사는 나에게 많은 도움이되었다. –