ãšã³ããªãŒ
ä»æ¥ã®ã¹ããŒããã©ã³ã®æãäžè¬çãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯Androidã§ãã ãããããã®äºå®ã ãã§ãªãã圌女ãžã®é¢å¿ãé«ãŸã£ãŠããŸãã éæŸæ§ã調æŽã調æŽããããŠãã¡ãããããç Žãèœåãããã®ãã©ãããã©ãŒã ã®äººæ°ã«å€§ããè²¢ç®ããŠããŸãã ãã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãã©ã®ããã«æ©èœãããã«ã€ããŠã®çµéšãå ±æããã»ãã¥ãªãã£ã·ã¹ãã ã«ã€ããŠãæ€èšããŸãã èå³ã®ããæ¹ãããããïŒ ãã®èšäºã§ã¯ãã«ãŒãã«ã¬ãã«ã®ã»ãã¥ãªãã£ã«ã€ããŠèª¬æããŸãã
å 責äºé
翻蚳ããéã«ééããç¯ãããšãæããŠããã®ã§ãçšèªãè±èªã§æžãããã«ããŸãã 誰ãããããããã·ã¢èªã«çŸãã翻蚳ããæ¹æ³ãç¥ã£ãŠãããªããç§ã«æçŽãæžããŠãã ããã Androidã®ãœãŒã¹ã³ãŒããæå ã«çšæããŠããããšããå§ãããŸãïŒãã ããã€ã³ã¿ãŒãããäžã®ãã¡ã€ã«ãžã®ãªã³ã¯ãæäŸããããšããŸãïŒã ãœãŒã¹ã³ãŒãã®ããŠã³ããŒãæ¹æ³ã«ã€ããŠã¯ã ãã¡ããŸãã¯Habrã®ãã®èšäºãã芧ãã ãããèšäºäžèŠ§
ãã®ãããã¯ããã®ç§ã®èšäºãžã®ãªã³ã¯ã¯æ¬¡ã®ãšããã§ãã- Androidãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã»ãã¥ãªãã£ã®åºæ¬ã ã³ã¢ã¬ãã«
- Androidãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã»ãã¥ãªãã£ã®åºæ¬ã ãã€ãã£ããŠãŒã¶ãŒã¹ããŒã¹ãããŒã1
- Androidãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã»ãã¥ãªãã£ã®åºæ¬ã ãã€ãã£ããŠãŒã¶ãŒã¹ããŒã¹ãããŒã2
- Androidãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã»ãã¥ãªãã£ã®åºæ¬ã Application Frameworkã¬ãã«ã§ã®ã»ãã¥ãªãã£ã ãã€ã³ããŒIPC
Androidã¹ã¿ãã¯
![](https://habrastorage.org/getpro/habr/post_images/c29/7c8/1b7/c297c81b73da4234cc60460e4605f2d0.jpg)
ãŸãããã®åçãåé¿ããããšã¯ã§ããŸããã ã€ã³ã¿ãŒãããã§èŠã€ããŸããããAndroidã®æ§æãç解ããããã«å¿ èŠã§ãã ãã®ãããAndroidã¹ã¿ãã¯ã«ã¯4ã€ã®ã¬ãã«ïŒããã ã¢ããïŒããããŸãã
- Linuxã«ãŒãã«ïŒLinuxã«ãŒãã«ïŒ
- ãã€ãã£ãã©ã€ãã©ãª
- ã¢ããªã±ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯
- çšé
Linuxã«ãŒãã«ã ããã¯é©ãã¹ãããšã§ã¯ãããŸããããæåã¯Android Inc. -ããã¯ã¹ã¿ãŒãã¢ããã§ãã ãã¹ãŠã®ã¹ã¿ãŒãã¢ãããšåæ§ã«ããã®äŒç€Ÿã«ã¯æ¢åã®ãœãªã¥ãŒã·ã§ã³ã®äœ¿çšãæ倧åããã¿ã¹ã¯ããããŸããã ãã®ãããLinuxã¯ããã®ãªãŒãã³æ§ãšå¿ èŠãªæ©èœã®å¯çšæ§ã®ããã«ããã®ãã©ãããã©ãŒã ã®ã«ãŒãã«ãšããŠéžæãããŸããã Androidã§ã¯ãLinuxã«ãŒãã«ã¯ã¡ã¢ãªãããã»ã¹ã管çããããŒããŠã§ã¢ã¢ãã¹ãã©ã¯ã·ã§ã³ã¬ã€ã€ãŒïŒHALïŒãšããŠã䜿çšãããŸãã ç§ã®ç¥ãéããLinuxã§ã¯ããã©ã€ããŒã¯ã«ãŒãã«ã«çµã¿èŸŒãŸããŠããããããŒãå¯èœãªã«ãŒãã«ã¢ãžã¥ãŒã«ãšããŠèšèšãããŠããŸãã Androidã§ã®ã«ãŒãã«ã¢ãžã¥ãŒã«ã®èªã¿èŸŒã¿ã¯ããã©ã«ãã§ç¡å¹ã«ãªã£ãŠããããããã¹ãŠã®ãã©ã€ããŒãåã蟌ããšãã«ãŒãã«ãéåžžã«å€§ãããªããããã«ãŒãã«ãšãã©ã€ããŒã®éã«HALãšåŒã°ããäžéå±€ïŒãããã·ïŒãäœæããããšã«ããŸããã ãããã£ãŠãHALã¯åãªãã€ã³ã¿ãŒãã§ã€ã¹ã®ã»ããã§ããããã®å®è£ ã¯ãã©ã€ããŒã«å®è£ ãããŸãã äžæ¹ãAndroidã·ã¹ãã ã«åºæã®ããã€ãã®ã·ã¹ãã ãã«ãŒãã«ã«è¿œå ãããŸããã çŸæç¹ã§ã¯ãLinuxã«ãŒãã«ã®ã¡ã€ã³ãã©ã³ãã«ã¯ãŸã å«ãŸããŠããªããããLinuxã«ãŒãã«ãããŠã³ããŒãããŠAndroidã«ãŒãã«ã«çœ®ãæããã ãã§ã¯å€±æããŸãã äžã§ããBinderïŒIPC / RPCããã»ã¹ééä¿¡ãæäŸïŒãAsynchronous SHared MEMory-AshmemïŒå ±æã¡ã¢ãªãã©ã€ããŒïŒãWakelocksïŒç»é¢ã®èª¿å ããã³/ãŸãã¯ããã»ããµãŒã®ã·ã£ããããŠã³ãé²ãã¡ã«ããºã ïŒãLow Memory KillerãAlarmãLoggerããã³ãªã©
ãã€ãã£ãã©ã€ãã©ãªã ãã®ã¬ã€ã€ãŒã«ã¯ãAndroidãæ©èœããããã«å¿ èŠãªããŸããŸãªãã€ãã£ãã©ã€ãã©ãªãå«ãŸããŸãã ãŸãããªãŒãã³ãœãŒã¹ã³ãã¥ããã£ãããåããŠããŸãã ãããã®äžã«ã¯ãSQLiteãWebKitãªã©ããããŸãã
Androidãã¬ãŒã ã¯ãŒã¯ ãã®ã¬ã€ã€ãŒã¯ãAndroidã¢ããªã±ãŒã·ã§ã³ïŒPowerManagerãActivityManagerãNotificationManagerãªã©ïŒãäœæãããšãã«éåžžããåããããã®ãæããŸãã
ã¢ããªã±ãŒã·ã§ã³ã ã¢ããªã±ãŒã·ã§ã³ã«ã¯2ã€ã®ã¿ã€ãããããŸããã·ã¹ãã ã€ã¡ãŒãžïŒã·ã¹ãã ïŒã«ä»å±ããã¢ããªã±ãŒã·ã§ã³ãšãåžå ŽãŸãã¯ãã®ä»ã®ãœãŒã¹ããããŠã³ããŒãããã¢ããªã±ãŒã·ã§ã³ã§ãã æåã®ã±ãŒã¹ã§ã¯ãããã€ã¹ã®ã¢ããªã±ãŒã·ã§ã³ã¯ã/ system / appããã£ã¬ã¯ããªã«ããã2çªç®ã®ã±ãŒã¹ã§ã¯ã/ data / appããã£ã¬ã¯ããªã«ãããŸãã
ã«ãŒãã«ã»ãã¥ãªãã£
![](https://habrastorage.org/getpro/habr/post_images/36a/ee3/a31/36aee3a31fbe6f8faf745f34d2ec63c1.png)
Androidããã€ã¹ã«ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããããã»ã¹ãèŠãŠã¿ãŸãããã ããã€ã¹ã«ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããæ¹æ³ã¯ããã€ããããŸãïŒäžè¬çã«ïŒïŒ
- PackageInstallerã¢ããªã±ãŒã·ã§ã³ã®äœ¿çš
- AndroidããŒã±ããã¢ããªã®äœ¿çš
- adb installã³ãã³ãã䜿çšãã
å³ã§ã¯ãããšãã°ãex1.apkã¢ããªã±ãŒã·ã§ã³ã¯PackageInstallerã䜿çšããŠã€ã³ã¹ããŒã«ãããŸãïŒããšãã°ãã¢ããªã±ãŒã·ã§ã³ãã¡ãŒã«ã§éä¿¡ãããããã€ã¹ããã€ã³ã¹ããŒã«ããå Žåã«äœ¿çšãããŸãïŒãex2.apkã¯AndroidããŒã±ããïŒGoogle PlayïŒã䜿çšããŠã€ã³ã¹ããŒã«ãããŸãã ex3.apkã¢ããªã±ãŒã·ã§ã³ã¯ãadb install ex3.apkã³ãã³ãã䜿çšããŠã€ã³ã¹ããŒã«ãããŸãïŒéåžžããã®ã³ãã³ãã¯ãã¢ããªã±ãŒã·ã§ã³éçºè ãã³ã³ãã¥ãŒã¿ãŒããã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããããã«äœ¿çšããŸãïŒã
ã€ã³ã¹ããŒã«äžãAndroidã¯ããã©ã«ãã§åã¢ããªã±ãŒã·ã§ã³ã«äžæã®ãŠãŒã¶ãŒIDïŒUIDïŒãšã°ã«ãŒãIDïŒGIDïŒãå²ãåœãŠãããããã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®åã¢ããªã±ãŒã·ã§ã³ã«ã¯ç¬èªã®ãŠãŒã¶ãŒãããŸãã ãŠãŒã¶ãŒåã¯éåžžapp_x圢åŒã§ããããŠãŒã¶ãŒIDã¯åŒïŒProcess.FIRST_APPLICATION_UID + xïŒã䜿çšããŠèšç®ãããŸããProcess.FIRST_APPLICATION_UIDã¯10000ã§ãããããã®ã¢ããªã±ãŒã·ã§ã³IDã¯å€æŽãããŸããã ã€ã³ã¹ããŒã«ãããã¢ããªã±ãŒã·ã§ã³ã®ãªã¹ãã¯ãã/ data / system / packages.listããã¡ã€ã«ã«ä¿åãããŸããã«ãŒãåãããé»è©±ãããå ŽåããŸãã¯ãšãã¥ã¬ãŒã¿ã䜿çšããŠããå Žåã¯ã次ã®ã³ãã³ãã䜿çšããŠãã®ãã¡ã€ã«ã衚瀺ã§ããŸãã
adb shell cat /data/system/packages.list
åã¢ããªã±ãŒã·ã§ã³ã«ã¯ç¬èªã®ããŒã ãã£ã¬ã¯ããªããããŸãïŒäŸïŒ / data / data / <package_name> ãããã§<package_name>ã¯Androidããã±ãŒãžã®ååãcom.ex.ex1ãªã©ïŒAndroidããã±ãŒãžã®ååã¯AndroidManifest.xmlãã¡ã€ã«ã®packageããããã£ã§èšå®ãããŸããã®ãã©ã«ããŒã¯å éšã¹ãã¬ãŒãžã§ãïŒå éšã¹ãã¬ãŒãžïŒãã¢ããªã±ãŒã·ã§ã³ããã¹ãŠã®ãã©ã€ããŒãããŒã¿ãä¿åãããã£ã¬ã¯ããªãããã³ã¢ããªã±ãŒã·ã§ã³éçºè ãContext.getFilesDirïŒïŒãŸãã¯Context.getDirïŒïŒé¢æ°ã䜿çšããŠã¢ã¯ã»ã¹ãããã£ã¬ã¯ããªããã®ãã©ã«ãã«ã¯drwxr-x-x ãt .eã ææè ãšææè ã°ã«ãŒãå ã®ãŠãŒã¶ãŒã®ã¿ããã®ãã©ã«ããžã®ãã«ã¢ã¯ã»ã¹ãæã¡ãŸãã ãŸããåã¢ããªã±ãŒã·ã§ã³ã¯äžæã®ãŠãŒã¶ãŒãšããŠå®çŸ©ãããŠãããããããã©ã«ãã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯äºãã®æ å ±ã«ã¢ã¯ã»ã¹ã§ããŸããã å éšã¹ãã¬ãŒãžã«ãã¡ã€ã«ãäœæãããšãããã®ãã¡ã€ã«ãMODE_WORLD_READABLEããã³/ãŸãã¯MODE_WORLD_WRITABLEã«ãªãããã«æ瀺çã«æå®ã§ããŸã
ããã«ãã«ãŒãã«ã¬ãã«ã§ã¯ãåã¢ããªã±ãŒã·ã§ã³ã®äžæã®UIDãšGIDã䜿çšããŠãã·ã¹ãã ãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãå ±æããŸãïŒã¡ã¢ãªãšããã»ããµæéïŒã ãããã£ãŠãã«ãŒãã«ã¬ãã«ã§ã¯ãåã¢ããªã±ãŒã·ã§ã³ã«ç¬èªã®ãµã³ãããã¯ã¹ïŒã¢ããªã±ãŒã·ã§ã³ãµã³ãããã¯ã¹ïŒããããŸãã
äžæ¹ãã¢ããªã±ãŒã·ã§ã³éçºè ã¯ãäžéšã®HISã¢ããªã±ãŒã·ã§ã³ã«åãUIDãå¿ èŠã§ããããšã瀺ãå ŽåããããŸãã AndroidManifest.xmlãã¡ã€ã«ã«ã¯ããã®ããã®ç¹å¥ãªããããã£sharedUserIdããããŸãããã®å Žåããããã®ã¢ããªã±ãŒã·ã§ã³ã¯ãåãéçºè ããŒã§çœ²åãããŠããå Žåã«ã®ã¿ãäºãã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ã§ããŸãã
äžéšã®æš©éã¯ã«ãŒãã«ã¬ãã«ã§ãæ©èœããŸãã ããšãã°ãæã䜿çšãããŠããã¢ã¯ã»ã¹èš±å¯ãèããŠã¿ãŸããããandroid.permission.INTERNETã¢ããªã±ãŒã·ã§ã³ããã®ã¢ã¯ã»ã¹èš±å¯ãèŠæ±ããå ŽåãAndroidã¯ã€ã³ã¹ããŒã«äžã«ç¹å¥ãªãinetãã°ã«ãŒãã«ãã®ã¢ããªã±ãŒã·ã§ã³ãè¿œå ããŸãã ä»ã®ããã€ãã®æš©éãæ©èœããŸãã ãããã®èš±å¯ãšå¯Ÿå¿ããã°ã«ãŒããšã®å¯Ÿå¿ã®ãªã¹ãã¯ã frameworks / base / data / etc / platform.xmlãã¡ã€ã«ã«ãããŸãã
<permissions> ... <permission name="android.permission.INTERNET" > <group gid="inet" /> </permission> <permission name="android.permission.CAMERA" > <group gid="camera" /> </permission> <permission name="android.permission.READ_LOGS" > <group gid="log" /> </permission> ... </permissions>
ãããã®ã°ã«ãŒãã®ååãšå€ïŒGIDïŒãšã®å¯Ÿå¿ã®ãªã¹ãã¯ãæ§é android_ids []ã®é åã®ãã¡ã€ã«ã·ã¹ãã / core / include / private / android_filesystem_config.hã§æ瀺çã«æå®ãããŸãã
... #define AID_ROOT 0 /* traditional unix root user */ #define AID_SYSTEM 1000 /* system server */ ... #define AID_CAMERA 1006 /* camera devices */ ... #define AID_INET 3003 /* can create AF_INET and AF_INET6 sockets */ ... static const struct android_id_info android_ids[] = { { "root", AID_ROOT, }, ... { "camera", AID_CAMERA, }, { "log", AID_LOG, }, ... { "inet", AID_INET, }, ... } ...
ãããã£ãŠãã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¿ãŒãããã«æ¥ç¶ããããšãããšãã«ãŒãã«ã¯ãã®ã¢ããªã±ãŒã·ã§ã³ãèå¥åAID_INETãæã€ã°ã«ãŒãã«ãããã©ããã確èªããŸãã ããã§ãªãå Žåãã¢ããªã±ãŒã·ã§ã³ã¯ã¢ã¯ã»ã¹ãæåŠãããŸãã ãã®ãã§ãã¯ã®ã³ãŒãã¯éåžžã«ç°¡åã§ãïŒ
... #ifdef CONFIG_ANDROID_PARANOID_NETWORK #include <linux/android_aid.h> static inline int current_has_network(void) { return in_egroup_p(AID_INET) || capable(CAP_NET_RAW); } #else static inline int current_has_network(void) { return 1; } #endif ... /* * Create an inet socket. */ static int inet_create(struct net *net, struct socket *sock, int protocol, int kern) { ... if (!current_has_network()) return -EACCES; ... }
ãããã«
ããã¯Habréã«é¢ããç§ã®æåã®èšäºã§ãã®ã§ãå³å¯ã«å€æããªãã§ãã ããã ã³ãã¥ããã£ã«èå³ãããå Žåã¯ãä»åŸã®èšäºã§åŒãç¶ãAndroidå éšã«ã€ããŠèª¬æããŸãã ç§ã¯ããŸãç¥ããªãããšãç解ããŠãããåžžã«ååãªæéã¯ãããŸããããç§ã¯ãã§ã«èªåèªèº«ãééãããã®ãå ±æããããšããŸãã ã³ã¡ã³ãããäœãæ°ããããšãåŠã³ãããšæã£ãŠããŸãïŒ èª°ããç¹å®ã®ãããã¯ã«èå³ãæã£ãŠãããªããã³ã¡ã³ããæžããŠãã ãããä»åŸã®èšäºã§ããªãã®åžæãèæ ®ã«å ¥ããããšããŸãã
åç §è³æ
- Karim Yaghmourã«ãããçµã¿èŸŒã¿Androidã
- Marko Gargentaã«ããAndroidã»ãã¥ãªãã£ã®åºç€
- William Enckçã«ãããAndroidã»ãã¥ãªãã£ã«ã€ããŠã
- Androidã»ãã¥ãªãã£ã®æŠèŠ