Android package Management System Analysis

Source: Internet
Author: User

Package management script/system/bin/PM parsing:
For how to use PM, refer
In the PM. Java (frameworks/base/cmds/PM/src/COM/Android/commands/PM) file
Static void showusage () function:
Private Static void showusage (){
System. Err. println ("Usage: PM [list | path | install | uninstall]");
System. Err. println ("PM list packages [-F]");
System. Err. println ("PM list permission-groups ");
System. Err. println ("PM list permissions [-G] [-F] [-D] [-u] [group]");
System. Err. println ("PM list instrumentation [-F] [target-package]");
System. Err. println ("PM path package ");
System. Err. println ("PM install [-L] [-R] path ");
System. Err. println ("PM uninstall [-K] package ");
System. Err. println ("PM enable package_or_component ");
System. Err. println ("PM disable package_or_component ");
...
}
Script/system/bin/PM content:
----------------------------------------------------------
Base =/System
Export classpath = $ base/framework/PM. Jar
Exec app_process $ base/bin com. Android. commands. PM. PM "$ @"
----------------------------------------------------------

PM Execution Process Analysis:
The command line parameters show the calling process as follows:
First, go to the app_main.cpp (frameworks/base/cmds/app_process) file.
The main function of the appruntime class.
Main ()
Set_process_name (argv0 );
Runtime. mclassname = ARG;
Runtime. margc = argc-I;
Runtime. margv = argv + I;
Runtime. Start ();
Runtime. Start calls the following in the androidruntime. cpp (frameworks/base/CORE/JNI) file:
Void androidruntime: Start ()
Start ("com. Android. Internal. OS. runtimeinit", false/* don't start the system server */);
Enter the main function of the runtimeinit class.
Runtimeinit. Java (frameworks/base/CORE/Java/COM/Android/Internal/OS)
Main ()
Commoninit ();
Finishinit ();
Finishinit is actually called locally: In androidruntime. cpp (frameworks/base/CORE/JNI:
Static void com_android_internal_ OS _runtimeinit_finishinit (jnienv * ENV, jobject clazz)
Gcurruntime-> onstarted ();
Because:
App_main.cpp (frameworks/base/cmds/app_process): Virtual void onstarted ()
Main_runtime.cpp (frameworks/base/cmds/runtime): Virtual void onstarted ()
And class appruntime: Public androidruntime, which enters runtimeinit by the appruntime class
Therefore, you can determine that gcurruntime-> onstarted () is called in app_main.cpp (frameworks/base/cmds/app_process:
Virtual void onstarted () function.
App_init (mclassname, margc, margv );
Next,
Status_t app_init (const char * classname, int argc, const char * const argv [])
JR-> callmain (classname, argc, argv );
JR-> callmain calls the PM. Java (frameworks/base/cmds/PM/src/COM/Android/commands/PM) file.
Main function of class pm
Static void main (string [] ARGs)
New PM (). Run (ARGs)
The parameters are parsed in the run function.
The args here is actually the parameter passed in when the PM script is executed.
Common formats of PM scripts include:
---------------------------------------------------
PM list packages [-F]
Displays all installed software packages in the system. The-F option lists their related information.
PM list permission-groups ");
PM list permissions [-G] [-F] [-D] [-u] [group]
PM list instrumentation [-F] [target-package]
PM path package
PM install [-L] [-R] path
The path of the installation package is the path of the APK file.-L indicates that the installation is based on forward_lock.-R if a package exists
Reinstallation, but keep the original data.
PM uninstall [-K] package
Uninstall a software package. The package is the name of the software package. The-K option indicates that the data and the corresponding cache directory are retained during uninstallation.
PM enable package_or_component
PM disable package_or_component
Enable and disable modify the enabling status of a package or component (class.
----------------------------------------------------
For example:
Run the PM install/patch/to/mygps.apk command.
The execution is: runinstall ();
Void runinstall ()
While (OPT = nextoption ())! = NULL ){
If (OPT. Equals ("-l "))
{
Installflags | = packagemanager. forward_lock_package;
}
Else if (OPT. Equals ("-R "))
{
Installflags | = packagemanager. replace_existing_package;
}
String apkfilepath = nextarg ();
// Create an observer to monitor the package installation process.
Packageinstallobserver obs = new packageinstallobserver ();
MPM. installpackage (URI. fromfile (new file (apkfilepath), OBS, installflags );
If the installation is successful:
Obs. Result = packagemanager. install_succeeded
Because:
Ipackagemanager MPM;
MPM = ipackagemanager. stub. asinterface (servicemanager. getservice ("package "));
Class packagemanagerservice extends ipackagemanager. Stub
Therefore, mpm. installpackage calls:
In the packagemanagerservice. Java (frameworks/base/services/Java/COM/Android/Server) file
/* Called when a downloaded package installation has been confirmed by the user */
Void installpackage (final URI packageuri, final ipackageinstallobserver observer, final int flags)
Res = installpackageli (packageuri, flags );
...
Bundle extras = new bundle (1 );
Extras. putint (intent. extra_uid, res. UID );
...
Sendpackagebroadcast (intent. action_package_added, res. PKG. applicationinfo. packagename, extras );
If the package is successfully installed, an action_package_added message will be broadcast.
The following services and applications monitor action_package_added messages.
Appwidgetservice. Java (frameworks/base/services/Java/COM/Android/Server): Filter. addaction (intent. action_package_added );
Home. Java (Development/samples/home/src/COM/example/Android/Home): Filter = new intentfilter (intent. action_package_added );
Inputmethodmanagerservice. Java (frameworks/base/services/Java/COM/Android/Server): packagefilt. addaction (intent. action_package_added );
Launcher. Java (packages/apps/launcher/src/COM/Android/launcher): intentfilter filter = new intentfilter (intent. action_package_added );
Manageapplications. Java (packages/apps/settings/src/COM/Android/settings): intentfilter filter = new intentfilter (intent. action_package_added );
Packagebrowser. Java (Development/apps/development/src/COM/Android/Development): intentfilter filter = new intentfilter (intent. action_package_added );
Searchdialog. Java (frameworks/base/CORE/Java/Android/APP): mpackagefilter. addaction (intent. action_package_added );
Searchmanagerservice. Java (frameworks/base/CORE/Java/Android/Server/search): Filter. addaction (intent. action_package_added );

The following describes how the searchmanagerservice monitors action_package_added messages:
From the script analysis of PM, we can know that after installing a package, the action_package_added message will be broadcast.
In the searchmanagerservice constructor
Pass:
// Setup the infrastructure for updating and maintaining the list
// Of searchable activities.
Intentfilter filter = new intentfilter ();
Filter. addaction (intent. action_package_added );
Filter. addaction (intent. action_package_removed );
Filter. addaction (intent. action_package_changed );
Filter. adddatascheme ("package ");
Mcontext. registerreceiver (mintentreceiver, filter, null, mhandler );
Added monitoring for action_package_added messages.
After receiving the action_package_added message
Void onreceive (context, intent)
Mhandler. Post (mrunupdatesearchable );
Next,
Private runnable mrunupdatesearchable = new runnable ()
Run
Run calls updatesearchables ();
Searchmanagerservice. Java (frameworks/base/CORE/Java/Android/Server/search)
Private void updatesearchables ()
Searchableinfo. buildsearchablelist (mcontext );
Componentname defaultsearch = new componentname (
"Com. Android. googlesearch ",
"Com. Android. googlesearch. googlesearch ");
Searchableinfo. setdefasearchsearchable (mcontext, defasearch search );
By:
Componentname. Java (frameworks/base/CORE/Java/Android/content)
Public componentname (string PKG, string CLs)
Public componentname (context PKG, string CLs)
Public componentname (context PKG, class <?> CLs)
New componentname calls public componentname (string PKG, string CLs)

Void buildsearchablelist (context)
// Use intent resolver to generate list of action_search Receivers
Final packagemanager PM = context. getpackagemanager ();
List <resolveinfo> infolist;
Final intent = new intent (intent. action_search );
Infolist = PM. queryintentactivities (intent, packagemanager. get_meta_data );

Static void setdefasearchsearchable (context, componentname activity)
SI = getsearchableinfo (context, activity );
If (Si! = NULL ){
// Move to front of list
Ssearchableslist. Remove (SI );
Ssearchableslist. Add (0, Si );
}
Next,
Static searchableinfo getsearchableinfo (context, componentname activity)

Additional information:
Getlaunchintentforpackage
Getinstalledpackages
Getinstalledapplications
Getdefaactivactivityicon
Getapplicationlabel
Addpackagetopreferred

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.