• 안드로이드 버전: android 6.0.1 r77
  • [ code ]

로그 출력 7월 2일

7월 11일

  • 세 부분으로 나누어 진행
    • 넥서스 5에 소스를 올려 스캐닝관련 로그 출력: 기기에 직접 올리면 로그가 더 많이 나올 것이라 생각
    • DEBUG_PACKAGE_SCANNING 플래그 관련 코드 분석: 로그 출력과 관련된 플래그 주변 코드가 결국 중요할 것이라 생각
    • PackageManagerService 생성자 코드 분석: 부팅 과정에 따라 SystemServer에서 호출하는 생성자를 보면 스캐닝 동작 과정 이해할 수 있을 것이라 생각

SystemServer.java에서 시작

  • 먼저 SystemServer.java 에서 PackageManagerService를 생성한다
  • code: SystemServer.java #364
          // Start the package manager.
          Slog.i(TAG, "Package Manager");
          mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                  mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
          mFirstBoot = mPackageManagerService.isFirstBoot();
          mPackageManager = mSystemContext.getPackageManager();
    
  • 그 다음 PackageManagerService.main 함수를 살펴본다.

PackageManagerService.java

  • code: PackageManagerService.java
  • code: PackageManagerService.java #1766
      public static PackageManagerService main(Context context, Installer installer,
              boolean factoryTest, boolean onlyCore) {
          PackageManagerService m = new PackageManagerService(context, installer,
                  factoryTest, onlyCore);
          ServiceManager.addService("package", m);
          return m;
      }
    
  • 위 코드에서 PackageManagerService 인스턴스를 생성한다.
  • 그리고 ServiceManager의 addService를 통해 PackageManagerService를 등록한다.
  • 이제 PacakageManagerService 클래스의 생성자 코드를 찾아본다.

PackageManagerService Constructor in PackageManagerService.java

scanDirLI method in PackageManagerService.java

scanPackageLI method


참고 자료

  1. 웹사이트: Android Framework analysis-PackageManager analysis
  2. Naver Blog: Package Scanning의 간략한 과정
  3. Google Books: Android Security Internals