Android system/bin 命令

水铭晨
2023-12-01
               

You could do something like that:
 
public static boolean runRootCommand(String command) {
 Process process = null;
 DataOutputStream os = null;
 try {
 process = Runtime.getRuntime().exec("su");
 os = new DataOutputStream(process.getOutputStream());
 os.writeBytes(command+"\n");
 os.writeBytes("exit\n");
 os.flush();
 process.waitFor();
 } catch (Exception e) {
 Log.d("*** DEBUG ***", "Unexpected error - Here is what I know: "+e.getMessage());
 return false;
 }
 finally {
 try {
 if (os != null) {
 os.close();
 }
 process.destroy();
 } catch (Exception e) {
 // nothing
 }
 }
 return true;
 }
 

Or in your case (change the owner of a file) ... less code:
 
public static boolean runChmod777(String myfile) {
 Process process = null;
 try {
 process = Runtime.getRuntime().exec("su -c chmod 0777 myfile");
 process.waitFor();
 } catch (Exception e) {
 Log.d("*** DEBUG ***", "Unexpected error - Here is what I know: "+e.getMessage());
 return false;
 }
 finally {
 try {
 process.destroy();
 } catch (Exception e) {
 // nothing
 }
 }
 return true;
 }
 

 

 

\system\app这个里面主要存放的是常规下载的应用程序,可以看到都是以APK格式结尾的文件。在这个文件夹下的程序为系统默认的组件,自己安装的软件将不会出现在这里,而是\data\文件夹中。
 \system\bin这个目录下的文件都是系统的本地程序,从bin文件夹名称可以看出是binary二进制的程序,里面主要是Linux系统自带的组件(命令)
 \system\etc从文件夹名称来看保存的都是系统的配置文件,比如APN接入点设置等核心配置。
 \system\fonts字体文件夹,除了标准字体和粗体、斜体外可以看到文件体积最大的可能是中文字库,或一些unicode字库,从T-Mobile G1上可以清楚的看到显示简体中文正常,其中DroidSansFallback.ttf文件大小 。
 \system\frameworkframework主要是一些核心的文件,从后缀名为jar可以看出是是系统平台框架。
 \system\liblib目录中存放的主要是系统底层库,一些so文件,如平台运行时库。
 \system\media\system\media\audio铃声音乐文件夹,除了常规的铃声外还有一些系统提示事件音。
 \system\sounds默认的音乐测试文件,仅有一个test.mid文件,用于播放测试的文件。
 \system\usr用户文件夹,包含共享、键盘布局、时间区域文件等。
 

 

 
 
==================================================
 

\system\bin
 
这个目录下的文件都是系统的本地程序,从bin文件夹名称可以看出是binary二进制的程序,里面主要是Linux系统自带的组件:
 
\system\bin\akmd
 \system\bin\am
 \system\bin\app_process 系统进程
 \system\bin\dalvikvm Dalvik虚拟机宿主
 \system\bin\dbus-daemon 系统BUS总线监控
 \system\bin\debuggerd 调试器
 \system\bin\debug_tool 调试工具
 \system\bin\dexopt DEX选项
 \system\bin\dhcpcd DHCP服务器
 \system\bin\dumpstate 状态抓取器
 \system\bin\dumpsys 系统抓取器
 \system\bin\dvz
 \system\bin\fillup
 \system\bin\flash_image 闪存映像
 \system\bin\hciattach
 \system\bin\hcid HCID内核
 \system\bin\hostapd
 \system\bin\hostapd_cli
 \system\bin\htclogkernel
 \system\bin\input
 \system\bin\installd
 \system\bin\itr
 \system\bin\linker
 \system\bin\logcat Logcat日志打印
 \system\bin\logwrapper
 \system\bin\mediaserver
 \system\bin\monkey
 \system\bin\mountd 存储挂载器
 \system\bin\netcfg 网络设置
 \system\bin\ping Ping程序
 \system\bin\playmp3 MP3播放器
 \system\bin\pm 包管理器
 \system\bin\qemud QEMU虚拟机
 \system\bin\radiooptions 无线选项
 \system\bin\rild RIL组件
 \system\bin\sdptool
 \system\bin\sdutil
 \system\bin\service
 \system\bin\servicemanager 服务管理器
 \system\bin\sh
 \system\bin\ssltest SSL测试
 \system\bin\surfaceflinger 触摸感应驱动
 \system\bin\svc 服务
 \system\bin\system_server
 \system\bin\telnetd Telnet组件
 \system\bin\toolbox
 \system\bin\wlan_loader
 \system\bin\wpa_cli
 \system\bin\wpa_supplicant
 

 

===============================================================
 
\system\etc
 
从文件夹名称来看保存的都是系统的配置文件,比如APN接入点设置等核心配置。
 
\system\etc\apns-conf.xml APN接入点配置文件
 \system\etc\AudioFilter.csv 音频过滤器配置文件
 \system\etc\AudioPara4.csv
 \system\etc\bookmarks.xml 书签数据库
 \system\etc\dbus.conf 总线监视配置文件
 \system\etc\dhcpcd
 \system\etc\event-log-tags
 \system\etc\favorites.xml 收藏夹
 \system\etc\firmware 固件信息
 \system\etc\gps.conf GPS设置文件
 \system\etc\hcid.conf 内核HCID配置文件
 \system\etc\hosts 网络DNS缓存
 \system\etc\init.goldfish.sh
 \system\etc\location 定位相关
 \system\etc\mountd.conf 存储挂载配置文件
 \system\etc\NOTICE.html 提示网页
 \system\etc\permissions.xml 权限许可
 \system\etc\pvplayer.conf
 \system\etc\security
 \system\etc\wifi WLAN相关组件
 \system\etc\dhcpcd\dhcpcd-hooks
 \system\etc\dhcpcd\dhcpcd-run-hooks
 \system\etc\dhcpcd\dhcpcd.conf
 \system\etc\dhcpcd\dhcpcd-hooks\01-test
 \system\etc\dhcpcd\dhcpcd-hooks\20-dns.conf
 \system\etc\dhcpcd\dhcpcd-hooks\95-configured
 \system\etc\firmware\brf6300.bin
 \system\etc\location\gps
 \system\etc\location\gps\location 定位相关
 \system\etc\location\gps\nmea GPS数据解析
 \system\etc\location\gps\properties
 \system\etc\security\cacerts.bks
 \system\etc\security\otacerts.zip OTA下载验证
 \system\etc\wifi\Fw1251r1c.bin
 \system\etc\wifi\tiwlan.ini
 \system\etc\wifi\wpa_supplicant.conf WPA验证组件
 
===================================================================
 
\system\fonts
 
字体文件夹,除了标准字体和粗体、斜体外可以看到文件体积最大的可能是中文字库,或一些unicode字库,从T-Mobile G1上可以清楚的看到显示简体中文正常,其中DroidSansFallback.ttf文件大小
 
\system\fonts\DroidSans-Bold.ttf
 \system\fonts\DroidSans.ttf
 \system\fonts\DroidSansFallback.ttf
 \system\fonts\DroidSansMono.ttf
 \system\fonts\DroidSerif-Bold.ttf
 \system\fonts\DroidSerif-BoldItalic.ttf
 \system\fonts\DroidSerif-Italic.ttf
 \system\fonts\DroidSerif-Regular.ttf
 ======================================================================
 
 
 
\system\framework
 
framework主要是一些核心的文件,从后缀名为jar可以看出是是系统平台框架。
 
\system\framework\am.jar
 \system\framework\am.odex
 \system\framework\android.awt.jar AWT库
 \system\framework\android.awt.odex
 \system\framework\android.policy.jar
 \system\framework\android.policy.odex
 \system\framework\android.test.runner.jar
 \system\framework\android.test.runner.odex
 \system\framework\com.google.android.gtalkservice.jar GTalk服务
 \system\framework\com.google.android.gtalkservice.odex
 \system\framework\com.google.android.maps.jar 电子地图库
 \system\framework\com.google.android.maps.odex
 \system\framework\core.jar 核心库,启动桌面时首先加载这个
 \system\framework\core.odex
 \system\framework\ext.jar
 \system\framework\ext.odex
 \system\framework\framework-res.apk
 \system\framework\framework-tests.jar
 \system\framework\framework-tests.odex
 \system\framework\framework.jar
 \system\framework\framework.odex
 \system\framework\input.jar 输入库
 \system\framework\input.odex
 \system\framework\itr.jar
 \system\framework\itr.odex
 \system\framework\monkey.jar
 \system\framework\monkey.odex
 \system\framework\pm.jar 包管理库
 \system\framework\pm.odex
 \system\framework\services.jar
 \system\framework\services.odex
 \system\framework\ssltest.jar
 \system\framework\ssltest.odex
 \system\framework\svc.jar 系统服务
 \system\framework\svc.odex
 
==================================================================
 
\system\lib
 
lib目录中存放的主要是系统底层库,如平台运行时库。
 
\system\lib\libaes.so
 \system\lib\libagl.so
 \system\lib\libandroid_runtime.so Android运行时库
 \system\lib\libandroid_servers.so 系统服务组件
 \system\lib\libaudio.so 音频处理
 \system\lib\libaudioeq.so EQ均衡器
 \system\lib\libaudioflinger.so 音频过滤器
 \system\lib\libbluetooth.so 蓝牙组件
 \system\lib\libc.so
 \system\lib\libcamera.so 超相机组件
 \system\lib\libcameraservice.so
 \system\lib\libcorecg.so
 \system\lib\libcrypto.so 加密组件
 \system\lib\libctest.so
 \system\lib\libcutils.so
 \system\lib\libdbus.so
 \system\lib\libdl.so
 \system\lib\libdrm1.so DRM解析库
 \system\lib\libdrm1_jni.so
 \system\lib\libdvm.so
 \system\lib\libexif.so
 \system\lib\libexpat.so
 \system\lib\libFFTEm.so
 \system\lib\libGLES_CM.so
 \system\lib\libgps.so
 \system\lib\libhardware.so
 \system\lib\libhgl.so
 \system\lib\libhtc_ril.so
 \system\lib\libicudata.so
 \system\lib\libicui18n.so
 \system\lib\libicuuc.so
 \system\lib\liblog.so
 \system\lib\libm.so
 \system\lib\libmedia.so
 \system\lib\libmediaplayerservice.so
 \system\lib\libmedia_jni.so
 \system\lib\libnativehelper.so
 \system\lib\libnetutils.so
 \system\lib\libOmxCore.so
 \system\lib\libOmxH264Dec.so
 \system\lib\libpixelflinger.so
 \system\lib\libpvasf.so
 \system\lib\libpvasfreg.so
 \system\lib\libpvauthor.so
 \system\lib\libpvcommon.so
 \system\lib\libpvdownload.so
 \system\lib\libpvdownloadreg.so
 \system\lib\libpvmp4.so
 \system\lib\libpvmp4reg.so
 \system\lib\libpvnet_support.so
 \system\lib\libpvplayer.so
 \system\lib\libpvrtsp.so
 \system\lib\libpvrtspreg.so
 \system\lib\libqcamera.so
 \system\lib\libreference-ril.so
 \system\lib\libril.so
 \system\lib\librpc.so
 \system\lib\libsgl.so
 \system\lib\libsonivox.so
 \system\lib\libsoundpool.so
 \system\lib\libsqlite.so
 \system\lib\libssl.so
 \system\lib\libstdc++.so
 \system\lib\libsurfaceflinger.so
 \system\lib\libsystem_server.so
 \system\lib\libthread_db.so
 \system\lib\libUAPI_jni.so
 \system\lib\libui.so
 \system\lib\libutils.so
 \system\lib\libvorbisidec.so
 \system\lib\libwbxml.so
 \system\lib\libwbxml_jni.so
 \system\lib\libwebcore.so
 \system\lib\libwpa_client.so
 \system\lib\libxml2wbxml.so
 \system\lib\libz.so
 \system\lib\modules
 \system\lib\modules\wlan.ko
 


==================================================================
 
\system\media
 
铃声音乐文件夹,除了常规的铃声外还有一些系统提示事件音
 
\system\media\audio
 \system\media\audio\alarms 闹铃音
 \system\media\audio\notifications 提示音
 \system\media\audio\ringtones 铃声
 \system\media\audio\ui 界面操作事件音
 \system\media\audio\alarms\Alarm_Beep_01.ogg
 \system\media\audio\alarms\Alarm_Beep_02.ogg
 \system\media\audio\alarms\Alarm_Beep_03.ogg
 \system\media\audio\alarms\Alarm_Buzzer.ogg
 \system\media\audio\alarms\Alarm_Classic.ogg
 \system\media\audio\alarms\Alarm_Rooster_02.ogg
 \system\media\audio\notifications\Beat_Box_Android.ogg
 \system\media\audio\notifications\CaffeineSnake.ogg
 \system\media\audio\notifications\DearDeer.ogg
 \system\media\audio\notifications\DontPanic.ogg
 \system\media\audio\notifications\F1_MissedCall.ogg
 \system\media\audio\notifications\F1_New_MMS.ogg
 \system\media\audio\notifications\F1_New_SMS.ogg
 \system\media\audio\notifications\Heaven.ogg
 \system\media\audio\notifications\Highwire.ogg
 \system\media\audio\notifications\KzurbSonar.ogg
 \system\media\audio\notifications\OnTheHunt.ogg
 \system\media\audio\notifications\TaDa.ogg
 \system\media\audio\notifications\Tinkerbell.ogg
 \system\media\audio\notifications\Voila.ogg
 \system\media\audio\ringtones\BeatPlucker.ogg
 \system\media\audio\ringtones\BentleyDubs.ogg
 \system\media\audio\ringtones\BirdLoop.ogg
 \system\media\audio\ringtones\CaribbeanIce.ogg
 \system\media\audio\ringtones\CrazyDream.ogg
 \system\media\audio\ringtones\CurveBall.ogg
 \system\media\audio\ringtones\DreamTheme.ogg
 \system\media\audio\ringtones\EtherShake.ogg
 \system\media\audio\ringtones\FriendlyGhost.ogg
 \system\media\audio\ringtones\GameOverGuitar.ogg
 \system\media\audio\ringtones\Growl.ogg
 \system\media\audio\ringtones\InsertCoin.ogg
 \system\media\audio\ringtones\LoopyLounge.ogg
 \system\media\audio\ringtones\LoveFlute.ogg
 \system\media\audio\ringtones\MidEvilJaunt.ogg
 \system\media\audio\ringtones\MildlyAlarming.ogg
 \system\media\audio\ringtones\NewPlayer.ogg
 \system\media\audio\ringtones\Noises1.ogg
 \system\media\audio\ringtones\Noises2.ogg
 \system\media\audio\ringtones\Noises3.ogg
 \system\media\audio\ringtones\OrganDub.ogg
 \system\media\audio\ringtones\Ring_Classic_02.ogg
 \system\media\audio\ringtones\Ring_Digital_02.ogg
 \system\media\audio\ringtones\Ring_Synth_02.ogg
 \system\media\audio\ringtones\Ring_Synth_04.ogg
 \system\media\audio\ringtones\RomancingTheTone.ogg
 \system\media\audio\ringtones\SitarVsSitar.ogg
 \system\media\audio\ringtones\SpringyJalopy.ogg
 \system\media\audio\ringtones\T-Jingle.ogg
 \system\media\audio\ringtones\Terminated.ogg
 \system\media\audio\ringtones\TwirlAway.ogg
 \system\media\audio\ringtones\VeryAlarmed.ogg
 \system\media\audio\ringtones\World.ogg
 \system\media\audio\ui\Effect_Tick.ogg
 

==============================================================
 
\system\sounds
 
默认的音乐测试文件,仅有一个test.mid文件,用于播放测试的文件。
 
\system\sounds\test.mid
 ==============================================================
 
\system\usr
 
用户文件夹,包含共享、键盘布局、时间区域文件等。
 
\system\usr\keychars
 \system\usr\keylayout
 \system\usr\share
 \system\usr\srec
 \system\usr\keychars\qwerty.kcm.bin
 \system\usr\keychars\qwerty2.kcm.bin
 \system\usr\keychars\trout-keypad-qwertz.kcm.bin
 \system\usr\keychars\trout-keypad-v2.kcm.bin
 \system\usr\keychars\trout-keypad-v3.kcm.bin
 \system\usr\keychars\trout-keypad.kcm.bin
 \system\usr\keylayout\h2w_headset.kl
 \system\usr\keylayout\qwerty.kl
 \system\usr\keylayout\trout-keypad-qwertz.kl
 \system\usr\keylayout\trout-keypad-v2.kl
 \system\usr\keylayout\trout-keypad-v3.kl
 \system\usr\keylayout\trout-keypad.kl
 \system\usr\share\bsk
 \system\usr\share\zoneinfo
 \system\usr\share\bsk\V_FD_speed_101.bsk
 \system\usr\share\bsk\V_FD_std_101.bsk
 \system\usr\share\zoneinfo\zoneinfo.dat
 \system\usr\share\zoneinfo\zoneinfo.idx
 \system\usr\srec\config
 \system\usr\srec\config\en.us
 \system\usr\srec\config\en.us\baseline.par
 \system\usr\srec\config\en.us\baseline11k.par
 \system\usr\srec\config\en.us\baseline8k.par
 \system\usr\srec\config\en.us\dictionary
 \system\usr\srec\config\en.us\g2p
 \system\usr\srec\config\en.us\grammars
 \system\usr\srec\config\en.us\models
 \system\usr\srec\config\en.us\dictionary\basic.ok
 \system\usr\srec\config\en.us\dictionary\cmu6plus.ok.zip
 \system\usr\srec\config\en.us\dictionary\enroll.ok
 \system\usr\srec\config\en.us\g2p\en-US-ttp.data
 \system\usr\srec\config\en.us\grammars\VoiceDialer.g2g
 \system\usr\srec\config\en.us\models\generic.swiarb
 \system\usr\srec\config\en.us\models\generic11.lda
 \system\usr\srec\config\en.us\models\generic11_f.swimdl
 \system\usr\srec\config\en.us\models\generic11_m.swimdl
 \system\usr\srec\config\en.us\models\generic8.lda
 \system\usr\srec\config\en.us\models\generic8_f.swimdl
 \system\usr\srec\config\en.us\models\generic8_m.swimdl
 


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
================================================
 
包管理系统分析 包管理脚本 /system/bin/pm解析:
 pm的使用方法可以参考
Pm.java (frameworks\base\cmds\pm\src\com\android\commands\pm)文件中的
 static void showUsage()函数:
 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");
     ...
 }
 脚本 /system/bin/pm 内容:
 ----------------------------------------------------------
 base=/system
 export CLASSPATH=$base/framework/pm.jar
 execapp_process $base/bincom.android.commands.pm.Pm "$@"
 ----------------------------------------------------------
 
pm脚步执行过程分析:
 由命令行参数可以知道调用过程如下:
 首先进入 App_main.cpp (frameworks\base\cmds\app_process)文件中
 AppRuntime 类的 main 函数。
 main()
   set_process_name(argv0);
   runtime.mClassName = arg;
   runtime.mArgC = argc-i;
   runtime.mArgV = argv+i;
   runtime.start();
 runtime.start 调用的是 AndroidRuntime.cpp (frameworks\base\core\jni)文件中的:
 void AndroidRuntime::start()
     start("com.android.internal.os.RuntimeInit",false /* Don't start thesystem server */);
 然后进入  RuntimeInit 类的main函数
 RuntimeInit.java (frameworks\base\core\java\com\android\internal\os)
 main()
   commonInit();
   finishInit();
 finishInit 实际上本地调用:AndroidRuntime.cpp (frameworks\base\core\jni)中的:
 static void com_android_internal_os_RuntimeInit_finishInit(JNIEnv* env, jobject clazz)
     gCurRuntime->onStarted();
 因为有:
 App_main.cpp (frameworks\base\cmds\app_process):    virtual void onStarted()
 Main_runtime.cpp (frameworks\base\cmds\runtime):    virtual void onStarted()
 而 class AppRuntime : public AndroidRuntime 并且是由 AppRuntime 类进入 RuntimeInit
 所以可以确定  gCurRuntime->onStarted() 调用的是App_main.cpp (frameworks\base\cmds\app_process)中的:
 virtual void onStarted() 函数。
   app_init(mClassName, mArgC, mArgV);
 接着,
 status_t app_init(const char* className, int argc, const char* const argv[])
     jr->callMain(className, argc, argv);
 jr->callMain 调用了  Pm.java (frameworks\base\cmds\pm\src\com\android\commands\pm) 文件中
 类 Pm 的main函数
 static void main(String[] args)
   new Pm().run(args)
 在run函数中对参数进行解析。
 此处的args 实际上为执行pm脚本时 传入的参数。
 pm 脚本常见的格式有:
 ---------------------------------------------------
 pm list packages [-f]
 显示系统中所有已安装的软件包,-f选项列出他们的相关信息
 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
 安装软件包 PATH 为apk文件的路径 , -l 表示采用 FORWARD_LOCK 的方式安装,-r 如果一个包存在那么
 重新安装,但是保留原来的数据。
 pm uninstall [-k] PACKAGE
 卸载一个软件包,PACKAGE 为软件包的名称,-k选项表明卸载的时候保留数据和相应的cache目录。
 pm enable PACKAGE_OR_COMPONENT
 pm disable PACKAGE_OR_COMPONENT
 enable 和 disable 修改一个包或者组件(class)的使能状态.
 ----------------------------------------------------
 例如:
 我们输入命令 pm install /patch/to/mygps.apk
 那么执行的是: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();
   //创建Observer用于包安装过程的监测。
   PackageInstallObserver obs = new PackageInstallObserver();
   mPm.installPackage(Uri.fromFile(new File(apkFilePath)), obs, installFlags);
 如果安装成功:
 obs.result == PackageManager.INSTALL_SUCCEEDED
 因为有:
 IPackageManager mPm;
 mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
 class PackageManagerService extends IPackageManager.Stub
 所以 mPm.installPackage 调用的是:
 PackageManagerService.java (frameworks\base\services\java\com\android\server)文件中的
 /* 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);
 如果包安装成功了,那么将广播一个 ACTION_PACKAGE_ADDED 的消息。
 下面的服务和应用程序会监测  ACTION_PACKAGE_ADDED 消息。
 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);
 
下面将分析  SearchManagerService 服务对  ACTION_PACKAGE_ADDED 消息的监测过程:
 由pm的脚本分析,我们可以知道,安装一个包后会广播 ACTION_PACKAGE_ADDED 消息。
 而在  SearchManagerService 的构造函数SearchManagerService(Context context)中
 通过:
         // 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);
 添加了对  ACTION_PACKAGE_ADDED 消息的监测。
 当收到 ACTION_PACKAGE_ADDED 消息后,会执行
void onReceive(Context context, Intent intent)
   mHandler.post(mRunUpdateSearchable);
 接着,
 private Runnable mRunUpdateSearchable = new Runnable()
 执行 run
 run 调用  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.setDefaultSearchable(mContext, defaultSearch);
 由:
 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 调用的是  public ComponentName(String pkg, String cls)
 
void buildSearchableList(Context context)
   //use intent resolver to generate list of ACTION_SEARCH receivers
   final PackageManager pm = context.getPackageManager();
   List<ResolveInfo> infoList;
   final Intent intent = new Intent(Intent.ACTION_SEARCH);
   infoList = pm.queryIntentActivities(intent, PackageManager.GET_META_DATA);
 
static void setDefaultSearchable(Context context,ComponentName activity)
   si = getSearchableInfo(context, activity);
   if (si != null) {
     // move to front of list
     sSearchablesList.remove(si);
     sSearchablesList.add(0, si);
   }
 接着,
 static SearchableInfo getSearchableInfo(Context context, ComponentName activity)
 
补充信息:
 getLaunchIntentForPackage
 getInstalledPackages
 getInstalledApplications
 getDefaultActivityIcon
 getApplicationLabel
 

addPackageToPreferred

           
 类似资料: