Monday, 6 January 2014

Android Package Manager and Package Installer

We are installing and uninstalling APK(s) every day, might be many time in a day, but have you try to get answer of following questions ?

1. What is Package Manager and Package Installer ?
2. Where APK files stores in Android ?
3. What is APK installation process in detail ?
4. How Package Manager store data ?
5. Where I can find source code of Package Manager and Package Installer ?


1. What is Package Manager and Package Installer ?

PackageInstaller is the default application for Android to install interactively normal package. PackateInstaller provide user interface to manage applications/package. PackageInstaller calls InstallAppProgress activity to receives an instruction from the user. InstallAppProgress will ask Package Manager Service to install package via indalld. Source code is available at  <Android Source>/packages/apps/PackageInstaller.


Installd  daemon's primary role is to receive request from Package Manager Service via Linux domain socket / dev/ socket/ installed. installd execute series of steps to install APK with root permission
[Ref: https://github.com/android/platform_frameworks_base/blob/master/cmds/installd/commands.c]


Package Manage is API which actually manage application install, uninstall, upgrade.When we install APK file, Package Manager parse the package(APK) file and display confirmation, When user press OK button, Package Manager call method named "installPackage" with these four parameters namely uri, installFlags, observer, installPackageName. Package Manager start one service named "package", now all fuzzy things happen in this service. you can check "PackageInstallerActivity.java" and "InstallAppProgress.java" in PackageInstaller source code. Package Manager Service running in system_service process and  install daemon (installd) that runs as a native process both start at system boot time.


2. Where APK files stores in Android ?

1. Pre-Install (i.e. Camera, Calendar, Browser,etc.) APK stored in /system/app/
2. User Install (ApiDemo, Any.do, etc.) APK stored in /data/app/
3. Package Manager create data directory /data/data/<package name>/  to store database, shared preference, native library and cache data

You might see apk file and *.odex file for same APK, ODEX file is totally different discussion and purpose.

3. What is APK installation process in detail ?

Following process execute in Package Manager Service.

- Waiting 
- Add a package to the queue for the installation process 
- Determine the appropriate location of the package installation 
- Determine installation Install / Update new 
- A copy of the apk file to a given directory 
- Determine the UID of the app 
- Request to installd daemon process 
- Create the application directory and set permissions 
- Extraction of dex code to the cache directory 
- To reflect and packages.list / system / data / packages.xml the latest status 
- Broadcast to the system along with the name of the effect of the installation is complete package 
Intent.ACTION_PACKAGE_ADDED: If the new ( Intent.ACTION_PACKAGE_REPLACED): the case of an update


4. How Package Manager store data ?

Package Manager store application information in three files, located in  /data/system. Following sample is extracted from Android 4 ICS emulator image.

1. packages.xml :This file contain list of permissions and Packages/Applications. 
01<packages>
02<last-platform-version external="15" internal="15">
03<permission-trees>
04<permissions>
05<item name="android.permission.CHANGE_WIFI_MULTICAST_STATE"package="android" protection="1">
06<item name="android.permission.CLEAR_APP_USER_DATA" package="android"protection="2">
07.
08.
09.
10.
11</item></item></permissions>
12 
13<package codepath="/system/app/Contacts.apk" flags="1" ft="136567b3990"it="136567b3990" name="com.android.contacts"nativelibrarypath="/data/data/com.android.contacts/lib"shareduserid="10001" ut="136567b3990" version="15">
14<sigs count="1">
15<cert index="2">
16</cert></sigs>
17</package>
18.
19.
20.
21.
22<package codepath="/data/app/com.project.t2i-2.apk" flags="0"ft="13a837c2068" it="13a83704ea3" name="com.project.t2i"nativelibrarypath="/data/data/com.project.t2i/lib" userid="10040"ut="13a837c2ecb" version="1">
23<sigs count="1">
24<cert index="3" key="308201e53082014ea0030201020204506825ae300d06092a86
254886f70d01010505003037310b30090603550406130255533110300e060355040a13074
2616e64726f6964311630140603550403130d416e64726f6964204465627567301e170d31
2732303933303130353735305a170d3432303932333130353735305a3037310b300906035
2850406130255533110300e060355040a1307416e64726f6964311630140603550403130d
29416e64726f696420446562756730819f300d06092a864886f70d010101050003818d003
3008189028181009ce1c5fd64db794fd787887e8a2dccf6798ddd2fd6e1d8ab04cd8cdd9e
31bf721fb3ed6be1d67c55ce729b1e1d32b200cbcfc91c798ef056bc9b2cbc66a396aed6b
32a3629a18e4839353314252811412202500f11a11c3bf4eb41b2a8747c3c791c89391443
3339036345b15b5e080469ac5f536fd9edffcd52dcbdf88cf43c580abd0203010001300d0
346092a864886f70d01010505000381810071fa013b4560f16640ed261262f32085a51fca
3563fa6c5c46fde9a862b56b6d6f17dd49643086a39a06314426ba9a38b784601197246f8
36d568e349a93bc6af315455de7a8923f40d4051a51e1658ee34aca41494ab94ce978ae38
37609803dfb3004806634e6e78dd0be26fe75843958711935ffc85f9fcf81523ce23c86bc
38c5c7a">
39</cert></sigs>
40<perms>
41<item name="android.permission.WRITE_EXTERNAL_STORAGE">
42</item></perms>
43</package>
44.
45.
46.
47.
48.
49</permission-trees></last-platform-version></packages>
This xml file stores two things 1. permissions 2. package (application), permission are store under <permissions> tag. Each Permission has three attributes namely name, package and protection. Name attribute has permission name which we are using in AndroidManifest.xml, package attribute indicate permission belong to package, In majority cases "android" is values because <permission> tag contain default permissions and protection indicate level of security.

package tag contain 10 attributes and few sub tags.

SrAttribute NameDescription
1namepackage name
2codePathAPK file installation location (/system/app/ or /data/app/)
3nativeLibraryPathnative library (*.so file) default path is /data/data/<package name>/lib/
4flagStore ApplicationInfo Flags [http://developer.android.com/reference/android/content/pm/ApplicationInfo.html]
5fttimestamp in hex format
6lttimestamp in hex format of first time installation
7uttimestamp in hex format of last update
8versionVersion Code from AndroidManifest.xml file []http://developer.android.com/guide/topics/manifest/manifest-element.html#vcode]
9sharedUserIdThe name of Linux user ID that will be shared with other applications, It is same parameter which we define in AndroidManifest.xml [http://developer.android.com/guide/topics/manifest/manifest-element.html#uid]
10userIdThe name of a Linux user ID

Sub Tags
1. sigs signature information, count attribute represent number of cert tag.
2. cert  contain certification key , index attribute represent global index of certificate, I observer that it increment when new certificate install with application.
3. perms contain permission which developer has set in AndroidManifest.xml

2. packages.list : It is simple text file contain package name, user id ,flag and data directory, I can't find any perfect description but I assume it that packages.list file may provide faster lookup of installed package because it file keep important information only.

1com.android.launcher 10013 0 /data/data/com.android.launcher
2com.android.quicksearchbox 10033 0 /data/data/com.android.quicksearchbox
3com.android.contacts 10001 0 /data/data/com.android.contacts
4com.android.inputmethod.latin 10006 0 /data/data/com.android.inputmethod.latin

3. packages-stoped.xml : This file contain package list which has stopped state, Stope stated applications can not receive any broadcast. Refer this link for more information about stopped state application http://yuki312.blogspot.in/2012/03/androidbroadcaststop.html 
1<stopped-packages>
2<pkg name="com.android.widgetpreview" nl="1"></pkg>
3<pkg name="com.example.android.livecubes" nl="1"></pkg>
4<pkg name="com.android.gesture.builder" nl="1"></pkg>
5<pkg name="com.example.android.softkeyboard" nl="1"></pkg>
6</stopped-packages>

4. Where I can find the source code of Package Manager and Package Installer ?

Package Manager

Package Installer
packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java

No comments:

Post a Comment