Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Àí½âAndroidÐéÄâ»úÌåϵ½á¹¹
 
À´Ô´£º51CTO ·¢²¼ÓÚ£º2017-2-13
  1826  次浏览      27
 

1. ʲôÊÇDalvikÐéÄâ»ú

DalvikÊÇGoogle¹«Ë¾×Ô¼ºÉè¼ÆÓÃÓÚAndroidƽ̨µÄJavaÐéÄâ»ú£¬ËüÊÇAndroidƽ̨µÄÖØÒª×é³É²¿·Ö£¬Ö§³Ödex¸ñʽ(Dalvik Executable)µÄJavaÓ¦ÓóÌÐòµÄÔËÐС£dex¸ñʽÊÇרÃÅΪDalvikÉè¼ÆµÄÒ»ÖÖѹËõ¸ñʽ£¬ÊʺÏÄÚ´æºÍ´¦ÀíÆ÷ËÙ¶ÈÓÐÏÞµÄϵͳ¡£Google¶ÔÆä½øÐÐÁËÌØ¶¨µÄÓÅ»¯£¬Ê¹µÃDalvik¾ßÓиßЧ¡¢¼ò½à¡¢½ÚÊ¡×ÊÔ´µÄÌØµã¡£´ÓAndroidϵͳ¼Ü¹¹Í¼Öª£¬DalvikÐéÄâ»úÔËÐÐÔÚAndroidµÄÔËÐÐʱ¿â²ã¡£

2. DalvikÐéÄâ»úµÄ¹¦ÄÜ

Dalvik×÷ÎªÃæÏòLinux¡¢ÎªÇ¶Èëʽ²Ù×÷ϵͳÉè¼ÆµÄÐéÄâ»ú£¬Ö÷Òª¸ºÔðÍê³É¶ÔÏóÉúÃüÖÜÆÚ¹ÜÀí¡¢¶ÑÕ»¹ÜÀí¡¢Ï̹߳ÜÀí¡¢°²È«ºÍÒì³£¹ÜÀí£¬ÒÔ¼°À¬»ø»ØÊյȡ£Dalvik³ä·ÖÀûÓÃLinux½ø³Ì¹ÜÀíµÄÌØ¶¨£¬¶ÔÆä½øÐÐÁËÃæÏò¶ÔÏóµÄÉè¼Æ£¬Ê¹µÃ¿ÉÒÔͬʱÔËÐжà¸ö½ø³Ì£¬¶ø´«Í³µÄJava³ÌÐòͨ³£Ö»ÄÜÔËÐÐÒ»¸ö½ø³Ì£¬ÕâÒ²ÊÇΪʲôAndroid²»²ÉÓÃJVMµÄÔ­Òò¡£DalvikΪÁË´ïµ½ÓÅ»¯µÄÄ¿µÄ£¬µ×²ãµÄ²Ù×÷´ó¶àºÍϵͳÄÚºËÏà¹Ø£¬»òÕßÖ±½Óµ÷ÓÃÄں˽ӿڡ£ÁíÍ⣬DalvikÔçÆÚ²¢Ã»ÓÐJIT±àÒëÆ÷£¬Ö±µ½Android2.2²Å¼ÓÈëÁ˶ÔJITµÄ¼¼ÊõÖ§³Ö¡£

3. DalvikÐéÄâ»úºÍJavaÐéÄâ»úµÄÇø±ð

±¾ÖÊÉÏ£¬DalvikÒ²ÊÇÒ»¸öJavaÐéÄâ»ú¡£µ«ËüÌØ±ðÖ®´¦ÔÚÓÚûÓÐʹÓÃJVM¹æ·¶¡£´ó¶àÊýJavaÐéÄâ»ú¶¼ÊÇ»ùÓÚÕ»µÄ½á¹¹(ÏêÇéÇë²Î¿¼£ºÀí½âJavaÐéÄâ»úÌåϵ½á¹¹)£¬¶øDalvikÐéÄâ»úÔòÊÇ»ùÓڼĴæÆ÷¡£»ùÓÚÕ»µÄÖ¸ÁîºÜ½ô´Õ£¬ÀýÈ磬JavaÐéÄâ»úʹÓõÄÖ¸ÁîÖ»Õ¼Ò»¸ö×Ö½Ú£¬Òò¶ø³ÆÎª×Ö½ÚÂë¡£»ùÓڼĴæÆ÷µÄÖ¸ÁîÓÉÓÚÐèÒªÖ¸¶¨Ô´µØÖ·ºÍÄ¿±êµØÖ·£¬Òò´ËÐèÒªÕ¼Óøü¶àµÄÖ¸Áî¿Õ¼ä¡£DalvikÐéÄâ»úµÄijЩָÁîÐèÒªÕ¼ÓÃÁ½¸ö×Ö½Ú¡£»ùÓÚÕ»ºÍ»ùÓڼĴæÆ÷µÄÖ¸Á¸÷ÓÐÓÅÁÓ£¬Ò»°ã¶øÑÔ£¬Ö´ÐÐͬÑùµÄ¹¦ÄÜ£¬Ç°ÕßÐèÒª¸ü¶àµÄÖ¸Áî(Ö÷ÒªÊÇloadºÍstoreÖ¸Áî)£¬¶øºóÕßÐèÒª¸ü¶àµÄÖ¸Áî¿Õ¼ä¡£ÐèÒª¸ü¶àÖ¸ÁîÒâζ×ÅÒª¶àÕ¼ÓÃCPUʱ¼ä£¬¶øÐèÒª¸ü¶àÖ¸Áî¿Õ¼äÒâζ×ÅÊý¾Ý»º³å(d-cache)¸üÒ×ʧЧ¡£¸ü¶àÌÖÂÛ£¬ÐéÄâ»úËæÌ¸(Ò»)£º½âÊÍÆ÷£¬Ê÷±éÀú½âÊÍÆ÷£¬»ùÓÚÕ»Óë»ùÓڼĴæÆ÷£¬´óÔӻ⠸ø³öÁ˷dz£ÏêϸµÄ²Î¿¼¡£

JavaÐéÄâ»úÔËÐеÄÊÇJava×Ö½ÚÂ룬¶øDalvikÐéÄâ»úÔËÐеÄÊÇרÓÐÎļþ¸ñʽdex¡£ÔÚJava³ÌÐòÖУ¬JavaÀà»á±»±àÒë³ÉÒ»¸ö»ò¶à¸öclassÎļþ£¬È»ºó´ò°üµ½jarÎļþÖУ¬½Ó×ÅJavaÐéÄâ»ú»á´ÓÏàÓ¦µÄclassÎļþºÍjarÎļþÖлñÈ¡¶ÔÓ¦µÄ×Ö½ÚÂë¡£AndroidÓ¦ÓÃËäȻҲʹÓÃJavaÓïÑÔ£¬µ«ÊÇÔÚ±àÒë³ÉclassÎļþºó£¬»¹»áͨ¹ýDEX¹¤¾ß½«ËùÓеÄclassÎļþת»»³ÉÒ»¸ödexÎļþ£¬DalvikÐéÄâ»úÔÙ´ÓÖжÁȡָÁîºÍÊý¾Ý¡£dexÎļþ³ýÁ˼õÉÙÕûÌåµÄÎļþ³ß´çºÍI/O²Ù×÷´ÎÊý£¬Ò²Ìá¸ßÁËÀàµÄ²éÕÒËÙ¶È¡£

ÓÉÏÂͼ¿ÉÒÔ¿´µ½£¬jarºÍapkÎļþµÄ×é³É½á¹¹£¬ÒÔ¼°classÎļþºÍdexÎļþµÄ²îÒì¡£dex¸ñʽÎļþʹÓù²ÏíµÄ¡¢Ìض¨ÀàÐ͵ij£Á¿³Ø»úÖÆÀ´½ÚÊ¡ÄÚ´æ¡£³£Á¿³Ø´æ´¢ÀàÖеÄËùÓÐ×ÖÃæ³£Á¿£¬Ëü°üÀ¨×Ö·û´®³£Á¿¡¢×ֶγ£Á¿µÈÖµ¡£

×ܵÄÀ´Ëµ£¬DalvikÐéÄâ»ú¾ßÓÐÒÔÏÂÌØµã£º

ʹÓÃdex¸ñʽµÄ×Ö½ÚÂ룬²»¼æÈÝJava×Ö½ÚÂë¸ñʽ

´úÂëÃܶÈС£¬ÔËÐÐЧÂʸߣ¬½ÚÊ¡×ÊÔ´

³£Á¿³ØÖ»Ê¹ÓÃ32λµÄË÷Òý

ÓÐÄÚ´æÏÞÖÆ

ĬÈÏÕ»´óСÊÇ12KB(3¸öÒ³£¬Ã¿Ò³4KB)

¶ÑĬÈÏÆô¶¯´óСΪ2MB£¬Ä¬ÈÏ×î´óֵΪ16MB

¶ÑÖ§³ÖµÄ×îСÆô¶¯´óСΪ1MB£¬Ö§³ÖµÄ×î´óֵΪ1024MB

¶ÑºÍÕ»²ÎÊý¿ÉÒÔͨ¹ý-XmsºÍ-XmxÐÞ¸Ä

4. Dalvikϵͳ½á¹¹

ʵ¼ÊÉÏ£¬DalvikÊÇ»ùÓÚApache Harmony(ApacheÈí¼þ»ù½ð»áµÄJava SEÏîÄ¿)µÄ²¿·ÖʵÏÖ£¬ÌṩÁË×Ô¼ºµÄÒ»Ì׿⣬¼´ÉϲãJavaÓ¦ÓóÌÐò±àдËùʹÓõÄAPI¡£

ÒÔÉÏͼʾÀ´×Ôtech-insider¡£Apache Harmony´óÌåÉÏ·ÖΪÈý¸ö²ã£º²Ù×÷ϵͳ¡¢JavaÐéÄâ»ú¡¢JavaÀà¿â¡£ËüµÄÌØµãÔÚÓÚÐéÄâ»úºÍÀà¿âÄÚ²¿±»¸ß¶ÈÄ£¿é»¯£¬Ã¿Ò»¸öÄ£¿é¶¼ÓÐÒ»¶¨µÄ½Ó¿Ú¶¨Òå¡£²Ù×÷ϵͳ²ãÓëÐéÄâ»ú²ãÖ®¼äµÄ½Ó¿ÚÓÉPortability Layer¶¨Ò壬Ëü·â×°Á˲»Í¬²Ù×÷ϵͳµÄ²îÒ죬ΪÐéÄâ»úºÍÀà¿âµÄ±¾µØ´úÂëÌṩÁËÒ»Ì×ͳһµÄAPI·ÃÎʵײãϵͳµ÷Óá£ÐéÄâ»úÓëÀà¿âÖ®¼äµÄ½Ó¿Ú³ýÁËJava¹æ·¶¶¨ÒåµÄJNI¡¢JVMITIÍ⣬»¹¼ÓÈëÁËÒ»²ãÐéÄâ»ú½Ó¿Ú£¬ÓÉÄÚºËÀàºÍ±¾µØ´úÂë×é³É¡£ÊµÏÖÁËÐéÄâ»ú½Ó¿ÚµÄÐéÄâ»ú¶¼¿ÉÒÔʹÓÃHarmonyµÄÀà¿âʵÏÖ£¬²¢ÇÒ¿ÉÒÔ±»HarmonyÌṩµÄͬһ¸öJavaÆô¶¯³ÌÐòÆô¶¯¡£

ÏÂÃæÊÇDalvikÐéÄâ»úµÄ½á¹¹Í¼£º

Ò»¸öÓ¦ÓÃÊ×ÏȾ­¹ýDX¹¤¾ß½«classÎļþת»»³ÉDalvikÐéÄâ»ú¿ÉÒÔÖ´ÐеÄdexÎļþ£¬È»ºóÓÉÀà¼ÓÔØÆ÷¼ÓÔØÔ­ÉúÀàºÍJavaÀ࣬½Ó×ÅÓɽâÊÍÆ÷¸ù¾ÝÖ¸Á¶ÔDalvik×Ö½ÚÂë½øÐнâÊÍ¡¢Ö´ÐС£×îºó£¬¸ù¾Ýdvm_arch²ÎÊýÑ¡Ôñ±àÒëµÄÄ¿±ê»úÌåϵ½á¹¹¡£

4.1 dexÎļþ½á¹¹

dexÎļþ½á¹¹ºÍclassÎļþ½á¹¹²îÒìµÄµØ·½ºÜ¶à£¬µ«´ÓЯ´øµÄÐÅÏ¢ÉÏ¿´£¬dexºÍclassÎļþÊÇÒ»Öµġ£

header£º´æ´¢Á˸÷¸öÊý¾ÝÀàÐÍµÄÆðʼµØÖ·¡¢Æ«ÒÆÁ¿µÈÐÅÏ¢¡£

proto_ids£ºÃèÊöº¯ÊýÔ­ÐÍÐÅÏ¢£¬°üÀ¨·µ»ØÖµ£¬²ÎÊýÐÅÏ¢¡£±ÈÈç¡°test:()V¡±

methods_ids£ºº¯ÊýÐÅÏ¢£¬°üÀ¨ËùÊôÀ༰¶ÔÓ¦µÄprotoÐÅÏ¢¡£

¸ü¶àdex¸ñʽµÄÄÚÈÝ£¬Android°²È«¨CDexÎļþ¸ñʽÏê½â ÕâÆªÎÄÕ½øÐÐÁ˷dz£ÏêϸµÄ½éÉÜ¡£ËäÈ»dexÎļþµÄ½á¹¹ºÜ½ô´Õ£¬µ«ÏëÒªÔËÐÐʱµÄÐÔÄܵõ½½øÒ»²½ÌáÉý£¬»¹ÐèÒª¶ÔdexÎļþ½øÐнøÒ»²½ÓÅ»¯¡£ÓÅ»¯Ö÷ÒªÕë¶ÔÒÔϼ¸¸ö·½Ã棺

µ÷ÕûËùÓÐ×ֶεÄ×Ö½ÚÐòºÍ¶ÔÆë½á¹¹ÖеÄÿһ¸öÓò

ÑéÖ¤dexÎļþÖеÄËùÓÐÀà

¶ÔÒ»Ð©ÌØ¶¨µÄÀà½øÐÐÓÅ»¯£¬¶Ô·½·¨ÀïµÄ²Ù×÷Âë½øÐÐÓÅ»¯

dexÎļþ¾­¹ýÓÅ»¯ºóÎļþ´óС»áÅòÕÍ£¬´óÔ¼Ôö¼Óµ½Ô­À´µÄ1~4±¶¡£¶ÔÓÚÄÚÖÃÓ¦Óã¬Ò»°ãÔÚϵͳ±àÒëºó£¬±ã»áÉú³ÉÓÅ»¯Îļþ(odex: Optimized dex)¡£Ò»¸öAndroidÓ¦ÓóÌÐò£¬ÐèÒª¾­¹ýÒÔϹý³Ì²Å¿ÉÒÔÔÚDalvikÐéÄâ»úÉÏÔËÐУº

 

°ÑJavaÔ´Îļþ±àÒë³ÉclassÎļþ

ʹÓÃDX¹¤¾ß°ÑclassÎļþת»»³ÉdexÎļþ

ʹÓÃaapt¹¤¾ß°ÑdexÎļþ¡¢×ÊÔ´ÎļþÒÔ¼°AndroidManifest.xmlÎļþ(¶þ½øÖƸñʽ)×éºÏ³ÉAPK

½«APK°²×°µ½AndroidÉ豸ÔËÐÐ

ÉÏͼ(À´×ÔÍøÂç)Ï꾡µØÕ¹Ê¾ÁË×îÖÕÇ©ÃûºóµÄAPKÊÇÔõôÀ´µÄ¡£

4.2 DalvikÀà¼ÓÔØÆ÷

Ò»¸ödexÎļþÐèÒªÀà¼ÓÔØÆ÷¼ÓÔØÔ­ÉúÀàºÍJavaÀ࣬Ȼºóͨ¹ý½âÊÍÆ÷¸ù¾ÝÖ¸Á¶ÔDalvik×Ö½ÚÂë½øÐнâÊͺÍÖ´ÐС£DalvikÀà¼ÓÔØÆ÷ʹÓÃmmapº¯Êý£¬½«dexÎļþÓ³Éäµ½ÄÚ´æÖУ¬Í¨¹ýÆÕͨµÄÄÚ´æ¶ÁÈ¡²Ù×÷¼´¿É·ÃÎÊdexÎļþ£¬È»ºó½âÎödexÎļþÄÚÈݲ¢¼ÓÔØÆäÖеÄÀൽ¹þÏ£±íÖС£

4.2.1 ½âÎödex

×ܵÄÀ´Ëµ£¬dexÎļþ¿ÉÒÔ³éÏóΪÈý¸ö²¿·Ö£ºÍ·²¿¡¢Ë÷Òý¡¢Êý¾Ý¡£Í¨¹ýÍ·²¿¿ÉÒÔÖªµÀË÷ÒýµÄλÖúÍÊýÄ¿£¬ÒÔ¼°Êý¾ÝÇøµÄÆðʼλÖ᣽«dexÎļþÓ³Éäµ½ÄÚ´æºó£¬Dalvik»áµ÷ÓÃdexFileParseº¯Êý¶ÔÆä½øÐзÖÎö£¬·ÖÎöµÄ½á¹û·Åµ½DexFileÊý¾Ý½á¹¹ÖС£DexFileÖеÄbaseAddrÖ¸ÏòÓ³ÉäÇøµÄÆðʼλÖã¬pClassDefsÖ¸ÏòclassË÷ÒýµÄÆðʼλÖá£ÎªÁ˼ӿìclassµÄ²éÕÒËÙ¶È£¬»¹´´½¨Ò»¸ö¹þÏ£±í£¬¶ÔclassÃû×Ö½øÐйþÏ£²¢Éú³ÉË÷Òý¡£

4.2.2 ¼ÓÔØclass

½âÎö¹¤×÷Íê³Éºó¾Í½øÐÐclassµÄ¼ÓÔØ£¬¼ÓÔØµÄÀàÐèÒªÓÃClassObjectÊý¾Ý½á¹¹À´´æ´¢¡£

typedef struct Object { 

ClassObject* clazz; // ÀàÐͶÔÏó

Lock lock; // Ëø¶ÔÏó

} Object;

ÆäÖÐclazzÖ¸ÏòClassObject¶ÔÏ󣬻¹°üº¬Ò»¸öLock¶ÔÏó¡£Èç¹ûÆäËüÏß³ÌÏëÒª»ñÈ¡ËüµÄËø£¬Ö»ÓеÈÕâ¸öÏß³ÌÊÍ·Å¡£Dalvikÿ¼ÓÔØÒ»¸öclass¶¼»á¶ÔÓ¦Ò»¸öClassObject¶ÔÏ󣬼ÓÔØ¹ý³Ì»áÔÚÄÚ´æÖзÖÅ伸¸öÇøÓò£¬·Ö±ð´æ·ÅdirectMethod, virtualMethod, sfield, ifield¡£ÕâЩÐÅÏ¢´ÓdexÎļþµÄÊý¾ÝÇøÖжÁÈ¡¡£×Ö¶ÎFieldµÄ¶¨ÒåÈçÏ£º

struct Field { 

ClassObject* clazz; //ËùÊôÀàÐÍ

const char* name; // ±äÁ¿Ãû³Æ

const char* signature; // Èç¡°Landroid/os/Debug;¡±

u4 accessFlags; // ·ÃÎʱê¼Ç

#ifdef PROFILE_FIELD_ACCESS

u4 gets;

u4 puts;

#endif

};

´ýµÃµ½classË÷Òýºó£¬Êµ¼ÊµÄ¼ÓÔØÓÉloadClassFromDexÀ´Íê³É¡£Ê×ÏÈËü»á¶ÁÈ¡classµÄ¾ßÌåÊý¾Ý£¬·Ö±ð¼ÓÔØdirectMethod, virtualMethod, ifieldºÍsfield£¬È»ºóΪClassObjectÊý¾Ý½á¹¹·ÖÅäÄڴ棬²¢¶ÁÈ¡dexÎļþµÄÏà¹ØÐÅÏ¢¡£¼ÓÔØÍê³Éºó£¬½«¼ÓÔØµÄclassͨ¹ýdvmAddClassToHashº¯Êý·ÅÈë¹þÏ£±í£¬ÒÔ·½±ãÏ´βéÕÒ;×îºó£¬Í¨¹ýdvmLinkClass²éÕÒ¸ÃÀàµÄ³¬À࣬Èç¹ûÓнӿÚÀàÔò¼ÓÔØÏàÓ¦µÄ½Ó¿ÚÀà¡£

4.3 Dalvik½âÊÍÆ÷

¶ÔÓÚÈκÎÐéÄâ»úÀ´Ëµ£¬½âÊÍÆ÷ÎÞÒÉÊǺËÐĵIJ¿·Ö£¬ËùÓеÄJava×Ö½ÚÂë¶¼¾­¹ý½âÊÍÆ÷½âÊÍÖ´ÐС£ÓÉÓÚDalvik½âÊÍÆ÷µÄЧÂʺÜÖØÒª£¬Android·Ö±ðʵÏÖÁËCÓïÑÔ°æºÍ¸÷ÖÖ»ã±àÓïÑÔ°æµÄ½âÊÍÆ÷¡£½âÊÍÆ÷ͨ³£ÊÇÑ­»·Ö´ÐУ¬ÐèÒªÒ»¸öÈë¿Úº¯Êýµ÷Óô¦Àí³ÌÐòÖ´ÐеÚÒ»ÌõÖ¸Á¶øºóÿÌõÖ¸ÁîÖ´ÐÐʱÒý³öÏÂÒ»ÌõÖ¸Áͨ¹ýº¯ÊýÖ¸Õëµ÷Óô¦Àí³ÌÐò¡£

4.4 ÄÚ´æ¹ÜÀí

À¬»øÊÕ¼¯ÊÇDalvikÐéÄâ»úÄÚ´æ¹ÜÀíµÄºËÐÄ¡£´Ë´¦Ö»½éÉÜDalvikÐéÄâ»úµÄÀ¬»øÊÕ¼¯¹¦ÄÜ¡£À¬»øÊÕ¼¯µÄÐÔÄÜÔںܴó³Ì¶ÈÉÏÓ°ÏìÁËÒ»¸öJava³ÌÐòÄÚ´æÊ¹ÓõÄЧÂÊ¡£DalvikÐéÄâ»úʹÓó£ÓõÄMark-SweepËã·¨£¬¸ÃËã·¨·ÖMark½×¶Î(±ê¼Ç³ö»î¶¯¶ÔÏó)¡¢Sweep½×¶Î(»ØÊÕÀ¬»øÄÚ´æ)ºÍ¿ÉÑ¡µÄCompact½×¶Î(¼õÉÙ¶ÑÖеÄË鯬)¡£AndroidÄÚ´æ¹ÜÀíÔ­Àí ÕâÆªÎÄÕ½²½âµÃºÜÏêϸ¡£

À¬»øÊÕ¼¯µÄµÚÒ»²½ÊDZê¼Ç³ö»î¶¯¶ÔÏó£¬ÒòΪûÓа취ʶ±ðÄÇЩ²»¿É·ÃÎʵĶÔÏó£¬ÕâÑùËùÓÐδ±»±ê¼ÇµÄ¶ÔÏó¾ÍÊÇ¿ÉÒÔ»ØÊÕµÄÀ¬»ø¡£µ±½øÐÐÀ¬»øÊÕ¼¯Ê±£¬ÐèҪֹͣDalvikÐéÄâ»úµÄÔËÐÐ(³ýÀ¬»øÊÕ¼¯Íâ)£¬Òò´ËÀ¬»øÊÕ¼¯ÓÖ±»³Æ×÷STW(stop-the-world)¡£DalvikÐéÄâ»úÔÚÔËÐйý³ÌÖÐҪά»¤Ò»Ð©×´Ì¬ÐÅÏ¢£¬ÕâЩÐÅÏ¢°üÀ¨£ºÃ¿¸öÏß³ÌËù±£´æµÄ¼Ä´æÆ÷¡¢JavaÀàÖеľ²Ì¬×ֶΡ¢¾Ö²¿ºÍÈ«¾ÖµÄJNIÒýÓã¬JVMÖеÄËùÓк¯Êýµ÷Óûá¶ÔÓ¦Ò»¸öÏàÓ¦CµÄÕ»Ö¡¡£Ã¿Ò»¸öÕ»Ö¡Àï¿ÉÄܰüº¬¶Ô¶ÔÏóµÄÒýÓ㬱ÈÈç°üº¬¶ÔÏóÒýÓõľֲ¿±äÁ¿ºÍ²ÎÊý¡£ËùÓÐÕâЩÒýÓÃÐÅÏ¢±»¼ÓÈëµ½Ò»¸ö¸ù¼¯ºÏÖУ¬È»ºó´Ó¸ù¼¯ºÏ¿ªÊ¼£¬µÝ¹é²éÕÒ¿ÉÒÔ´Ó¸ù¼¯ºÏ³ö·¢·ÃÎʵĶÔÏó¡£Òò´Ë£¬Mark¹ý³ÌÓÖ½Ð×ö×·×Ù£¬×·×ÙËùÓпɱ»·ÃÎʵĶÔÏó¡£

À¬»øÊÕ¼¯µÄµÚ¶þ²½¾ÍÊÇ»ØÊÕÄÚ´æ¡£ÔÚMark½×¶Îͨ¹ýmarkBitsλͼ¿ÉÒԵõ½ËùÓпɷÃÎʵĶÔÏ󼯺ϣ¬¶øliveBitsλͼ±íʾËùÓÐÒѾ­·ÖÅäµÄ¶ÔÏ󼯺ϡ£Í¨¹ý±È½ÏliveBitsλͼºÍmarkBitsλͼµÄ²îÒì¾ÍÊÇËùÓпɻØÊյĶÔÏ󼯺ϡ£Sweep½×¶Îµ÷ÓÃfreeÀ´ÊÍ·ÅÕâЩÄÚ´æ¸ø¶Ñ¡£

ÔڵײãÄÚ´æÊµÏÖÉÏ£¬AndroidϵͳʹÓõÄÊÇmsspace£¬ÕâÊÇÒ»¸öÇáÁ¿¼¶µÄmallocʵÏÖ¡£³ýÁË´´½¨ºÍ³õʼ»¯ÓÃÓÚ´æ´¢ÆÕͨJava¶ÔÏóµÄÄÚ´æ¶Ñ£¬Android»¹´´½¨Èý¸ö¶îÍâµÄÄÚ´æ¶Ñ£º

¡°livebits¡±(ÓÃÀ´´æ·Å¶ÑÉÏÄÚ´æ±»Õ¼ÓÃÇé¿öµÄλͼË÷Òý)

¡°markbits¡±(ÔÚGCʱÓÃÓÚ±ê×¢´æ»î¶ÔÏóµÄλͼË÷Òý)

¡°markstack¡±(ÔÚGCÖбéÀú´æ»î¶ÔÏóÒýÓõıê×¢Õ»)

ÐéÄâ»úͨ¹ýÒ»¸öÃûΪgHsµÄÈ«¾ÖHeapSource±äÁ¿À´²Ù¿ØGCÄÚ´æ¶Ñ£¬¶øHeapSourceÀïͨ¹ýheapsÊý×é¿ÉÒÔ¹ÜÀí¶à¸ö¶Ñ(Heap)£¬ÒÔÂú×㶯̬µ÷ÕûGCÄÚ´æ¶Ñ´óСµÄÒªÇó¡£ÁíÍâHeapSourceÀﻹά»¤Ò»¸öÃûΪ¡±livebits¡±µÄλͼË÷Òý£¬ÒÔ¸ú×Ù¸÷¸ö¶Ñ(Heap)µÄÄÚ´æÊ¹ÓÃÇé¿ö¡£Ê£ÏÂÁ½¸öÊý¾Ý½á¹¹¡±markstack¡±ºÍ¡±markbits¡±¶¼ÊÇÓÃÔÚÀ¬»ø»ØÊս׶Ρ£

ÉÏͼÖС±livebits¡±Î¬»¤¶ÑÉÏÒÑÓõÄÄÚ´æÐÅÏ¢£¬¶ø¡±markbits¡±Õâ¸öλͼË÷ÒýÔòÖ¸Ïò´æ»îµÄ¶ÔÏó¡£ A¡¢C¡¢F¡¢G¡¢H¶ÔÏóÐèÒª±£Áô£¬Òò´Ë¡±markbits¡±·Ö±ðÖ¸ÏòËûÃÇ(×îºóµÄH¶ÔÏóÉÐÔÚ±ê×¢¹ý³ÌÖУ¬Òò´ËûÓÐÖ¸ÕëÖ¸ÏòËü)¡£¶ø¡±markstack¡±¾ÍÊÇÔÚ±ê×¢¹ý³ÌÖиú×Ùµ±Ç°ÐèÒª´¦ÀíµÄ¶ÔÏóÒªÓõ½µÄ±êÖ¾Õ»£¬´ËʱÆä±£´æÁËÕýÔÚ´¦ÀíµÄ¶ÔÏóF¡¢GºÍH¡£

4.5 DalvikµÄÆô¶¯Á÷³Ì

Dalvik½ø³Ì¹ÜÀíÊÇÒÀÀµÓÚlinuxµÄ½ø³ÌÌåϵ½á¹¹µÄ£¬ÈçҪΪӦÓóÌÐò´´½¨Ò»¸ö½ø³Ì£¬Ëü»áʹÓÃlinuxµÄfork»úÖÆÀ´¸´ÖÆÒ»¸ö½ø³Ì¡£ZygoteÊÇÒ»¸öÐéÄâ»ú½ø³Ì£¬Í¬Ê±Ò²ÊÇÒ»¸öÐéÄâ»úʵÀýµÄ·õ»¯Æ÷£¬Ëüͨ¹ýinit½ø³ÌÆô¶¯¡£Ö®Ç°µÄÎÄÕÂÓжԴ˹ý³ÌÓÐÏêϸ½éÉÜ£ºAndroidϵͳÆô¶¯·ÖÎö(Init->Zygote->SystemServer->Home activity)¡£´Ë´¦·ÖÎöDalvikÐéÄâ»úÆô¶¯µÄÏà¹Ø¹ý³Ì¡£

AndroidRuntimeÀàÖ÷Òª×öÁËÒÔϼ¸¼þÊÂÇ飺

µ÷ÓÃstartVM´´½¨Ò»¸öDalvikÐéÄâ»ú£¬JNI_CreateJavaVMÕæÕý´´½¨²¢³õʼ»¯ÐéÄâ»úʵÀý

µ÷ÓÃstartReg×¢²áAndroidºËÐÄÀàµÄJNI·½·¨

ͨ¹ýZygote½ø³Ì½øÈëJava²ã

ÔÚJNIÖУ¬dvmCreateJNIEnvΪµ±Ç°Ï̴߳´½¨ºÍ³õʼ»¯Ò»¸öJNI»·¾³£¬¼´Ò»¸öJNIEnvExt¶ÔÏó¡£×îºóµ÷ÓÃdvmStartupÀ´³õʼ»¯Ç°Ãæ´´½¨µÄDalvikÐéÄâ»úʵÀý¡£º¯ÊýdvmInitZygoteµ÷ÓÃÁËϵͳµÄsetpgidÀ´ÉèÖõ±Ç°½ø³Ì£¬¼´Zygote½ø³ÌµÄ½ø³Ì×éID¡£ÕâÒ»²½Íê³Éºó£¬DalvikÐéÄâ»úµÄ´´½¨ºÍ³õʼ»¯¹¤×÷¾ÍÍê³ÉÁË¡£

5. AndroidµÄÆô¶¯

Æô¶¯µçÔ´£¬¼ÓÔØÒýµ¼³ÌÐòµ½RAM

BootLoaderÒýµ¼

Linux KernelÆô¶¯

Init½ø³Ì´´½¨

Init fork³öZygote½ø³Ì£¬Zygote½ø³Ì´´½¨ÐéÄâ»ú;´´½¨ÏµÍ³·þÎñ

Android Home LauncherÆô¶¯

   
1826 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ