Android system/bin 命令

本文详细解读了Android系统中各文件夹的功能,包括bin、etc、fonts、framework、lib、media、usr等关键目录,并对包管理脚本pm的功能和执行流程进行了深入剖析。

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

<think>嗯,用户想了解如何在Android上修改/system/bin/su的权限。首先,我得确认他们是否已经root了设备,因为修改系统分区通常需要root权限。如果没有root,可能需要先解锁bootloader,刷入自定义Recovery,然后安装SuperSU或Magisk之类的工具。 接下来,用户可能需要通过adb来操作,所以需要安装ADB工具并启用USB调试。然后,在连接设备后,可能需要挂载/system分区为可读写,使用命令`mount -o rw,remount /system`。不过,现在很多新设备的分区是只读的,可能需要其他方法,比如通过Magisk进行系统less root。 然后,修改su文件的权限,通常使用chmod命令,比如`chmod 6755 /system/bin/su`,这样设置SUID位,允许其他用户以所有者权限执行。不过,修改系统文件可能有风险,比如导致系统不稳定或安全漏洞,特别是如果su权限设置不当,恶意应用可能获取root权限。 另外,用户可能在使用Magisk的情况下,不需要修改/system分区,因为Magisk采用模块化方式,避免直接修改系统分区,这样更容易通过OTA更新,也减少了变砖的风险。所以,可能建议用户使用Magisk而不是直接修改su权限。 还需要提醒用户备份重要数据,操作前了解设备型号和Android版本的具体情况,不同厂商可能有不同的分区保护机制。比如,某些设备使用dm-verity,修改系统分区会导致无法启动。 总的来说,步骤大致是:解锁bootloader,刷入自定义Recovery,刷入root解决方案,然后可能需要调整su权限。但具体步骤因设备而异,用户需要查找自己设备的特定教程。同时,强调风险,谨慎操作。</think>在Android系统中修改`/system/bin/su`的权限需要谨慎操作,以下是分步骤说明: --- ### **1. 前置条件** - **设备已Root**:必须已获取Root权限(如通过Magisk或SuperSU)。 - **解锁Bootloader**:部分厂商设备需解锁Bootloader才能修改系统分区。 - **启用USB调试**:在开发者选项中启用`USB调试`,并安装ADB工具。 --- ### **2. 挂载系统分区为可读写** 由于`/system`分区默认是只读的,需通过ADB或终端模拟器执行: ```shell adb shell su mount -o rw,remount /system ``` (注:部分新设备需改用`mount -o rw,remount /`或使用Magisk挂载模块) --- ### **3. 修改su文件权限** 通过`chmod`命令调整权限: ```shell chmod 6755 /system/bin/su ``` - **权限解释**: - `6755`:设置SUID位(4)和SGID位(2),允许其他用户以所有者权限执行。 - 等效权限:`-rwsr-sr-x` --- ### **4. 验证修改结果** 执行以下命令检查权限: ```shell ls -l /system/bin/su ``` 正常输出应为: ``` -rwsr-sr-x 1 root root ... /system/bin/su ``` --- ### **5. 恢复分区只读状态** 操作完成后,防止系统损坏: ```shell mount -o ro,remount /system ``` --- ### **6. 替代方案(推荐)** - **使用Magisk**:现代Root方案通过`magiskinit`动态挂载,无需直接修改`/system`分区。 - **自定义内核**:编译支持完整Root权限的内核。 --- ### **注意事项** 1. **兼容性问题**:Android 7.0+可能因SELinux策略限制SU权限。 2. **安全风险**:错误权限可能导致恶意应用提权。 3. **系统更新**:修改`/system`后可能无法OTA升级。 建议优先使用Magisk等无侵入式Root方案,以降低风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值