[안드로이드 프레임워크 개선]
PackageManager2
디바이스 선정
지난주 adb shell과 안드로이드 스튜디오를 통한 logcat을 출력할 때는 갤럭시 A8 2016 (SM-A800S) 기기를 임시로 사용하였다.
팀원들과 회의 결과 코드를 수정하고 빌드하는 데 구글 레퍼런스 디바이스를 사용하는 것이 좋다고 판단하였다.
우리가 개선하고자 하는 안드로이드 버전은 6.0.1 버전으로 현재 보유하고 있는 갤럭시 넥서스는 해당 버전을 지원하지 않았다.
우리는 넥서스 5를 테스트 및 개선을 위한 디바이스로 선정하였고, 앞으로 해당 디바이스를 통해 개선을 진행한다.
운영체제 및 버전 : Android 6.0.1_r77
빌드 환경 구성
빌드 환경 구성은 아래의 블로그를 참고했다.
https://gamdekong.tistory.com/55?category=763105
repo 설치
보유하고 있는 넥서스 5에 포팅하기 위한 android-6.0.1_r77 버전의 AOSP 소스를 받아온다.
소스를 받아온 후 빌드하기 위한 프로그램을 설치하고, mk파일을 수정한다.
빌드(make)
1 |
|
명령어를 통해 빌드를 수행한다.
빌드 완료 후 에뮬레이터를 실행한다.
나와 같은 경우는 터미널이 바로 꺼지는 경우가 발생해서, 구동 시 마다 환경 설정을 다시 했다.
1 |
|
코드 수정 및 빌드
우리는 PackageManager 부분의 Package Scanning 시간을 줄이는 방식을 통해 개선을 수행하고자 하기 때문에, Scanning log를 보기위해 PackageManagerService.java 코드를 수정 후 빌드해야 한다.
1 |
|
의 DEBUG flag값이 있다. 이 값을 true로 해놓고 빌드해서 올려 package scanning에 관련된 로그를 확인하는 것이 목표이다.
다음과 같이 수정 후 make 명령어를 통해 빌드 하였다.
Scanning 결과
디바이스에 올려서 확인하기 전, 우선 에뮬레이터를 이용해서 로그값을 확인했다.
Scanning에 관련된 로그들이 출력된 것을 확인할 수 있었다.
하지만 PackageManagerService.java 코드를 살펴보니, Scanning에 관련된 다른 로그들도 출력되어야 할 것 같은데, 다른 로그들은 출력되지 않았다.
더 찾아봐야 할 로그들
DEBUG flag값을 따라서 어떤 로그들이 출력되어야 하는지 확인해보았다.
DEBUG_PACKAGE_SCANNING을 true로 변경했기 때문에, 관련 조건문에 있는 로그들은 다음과 같다.
- Log.d(TAG, “Scanning app dir “ + dir + “ scanMode=” + scanMode + “ flags=0x” + Integer.toHexString(flags));
- Log.d(TAG, “Scanning package “ + pkg.packageName);
- Log.d(TAG, “Shared UserID “ + pkg.mSharedUserId + “ (uid=” + suid.userId + “): packages=” + suid.packages);
- Log.v(TAG, “Want this data dir: “ + dataPath);
- Log.d(TAG, “Registered content provider: “ + names[j] + “, className = “ + p.info.name + “, isSyncable = “ + p.info.isSyncable);
- Log.d(TAG, “ Providers: “ + r);
- Log.d(TAG, “ Services: “ + r);
- Log.d(TAG, “ Receivers: “ + r);
- Log.d(TAG, “ Activities: “ + r);
- Log.d(TAG, “ Permission Groups: “ + r);
- Log.d(TAG, “ Permissions: “ + r);
- Log.d(TAG, “ Instrumentation: “ + r);