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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
AndroidÈÈÐÞ¸´¼¼ÊõÑ¡ÐÍ¡ª¡ªÈý´óÁ÷ÅɽâÎö
 
×÷ÕߣºËùΪ À´Ô´£ºInfoQ ·¢²¼ÓÚ 2016-9-20
  1829  次浏览      27
 

2015ÄêÒÔÀ´£¬Android¿ª·¢ÁìÓòÀï¶ÔÈÈÐÞ¸´¼¼ÊõµÄÌÖÂۺͷÖÏíÔ½À´Ô½¶à£¬Í¬Ê±Ò²³öÏÖÁËһЩ²»Í¬µÄ½â¾ö·½°¸£¬ÈçQQ¿Õ¼ä²¹¶¡·½°¸¡¢°¢ÀïAndFixÒÔ¼°Î¢ÐÅTinker£¬ËüÃÇÔÚÔ­Àí¸÷Óв»Í¬£¬ÊÊÓó¡¾°¸÷Ò죬µ½µ×²ÉÓÃÄÄÖÖ·½°¸£¬ÊÇ¿ª·¢Õ߱ȽÏÍ·ÌÛµÄÎÊÌâ¡£±¾ÎÄÏ£Íûͨ¹ý½éÉÜQQ¿Õ¼ä²¹¶¡¡¢TinkerÒÔ¼°»ùÓÚAndFixµÄ°¢Àï°Ù´¨HotFix¼¼ÊõµÄÔ­Àí·ÖÎöºÍºáÏò±È½Ï£¬°ïÖú¿ª·¢Õ߸üÉîÈëÁ˽âÈÈÐÞ¸´·½°¸¡£

¼¼Êõ±³¾°

Ò»¡¢Õý³£¿ª·¢Á÷³Ì

´ÓÁ÷³ÌÀ´¿´£¬´«Í³µÄ¿ª·¢Á÷³Ì´æÔںܶà±×¶Ë£º

ÖØÐ·¢²¼°æ±¾´ú¼ÛÌ«´ó

Óû§ÏÂÔØ°²×°³É±¾Ì«¸ß

BUGÐÞ¸´²»¼°Ê±£¬Óû§ÌåÑéÌ«²î

¶þ¡¢ÈÈÐÞ¸´¿ª·¢Á÷³Ì

¶øÈÈÐÞ¸´µÄ¿ª·¢Á÷³ÌÏԵøü¼ÓÁé»î£¬ÓÅÊÆºÜ¶à£º

ÎÞÐèÖØÐ·¢°æ£¬ÊµÊ±¸ßЧÈÈÐÞ¸´

Óû§ÎÞ¸ÐÖªÐÞ¸´£¬ÎÞÐèÏÂÔØÐµÄÓ¦Ó㬴ú¼ÛС

ÐÞ¸´³É¹¦Âʸߣ¬°ÑËðʧ½µµ½×îµÍ

Òµ½çÈÈÃŵÄÈÈÐÞ¸´¼¼Êõ

ÈÈÐÞ¸´×÷Ϊµ±ÏÂÈÈÃŵļ¼Êõ£¬ÔÚÒµ½çÄڱȽÏÖøÃûµÄÓа¢Àï°Í°ÍµÄAndFix¡¢Dexposed£¬ÌÚѶQQ¿Õ¼äµÄ³¬¼¶²¹¶¡¼¼ÊõºÍ΢ÐŵÄTinker¡£×î½ü°¢Àï°Ù´¨ÍƳöµÄHotFixÈÈÐÞ¸´·þÎñ¾Í»ùÓÚAndFix¼¼Êõ£¬¶¨Î»ÓÚÏßÉϽô¼±BUGµÄ¼´Ê±ÐÞ¸´£¬ËùÒÔAndFix¼¼ÊõÕâ¿éÎÒÃÇÖØµã·ÖÎö°¢Àï°Ù´¨HotFix¡£ÏÂÃæ£¬ÎÒÃǾͷֱð½éÉÜQQ¿Õ¼ä³¬¼¶ÈȲ¹¶¡¼¼ÊõºÍ΢ÐŵÄTinkerÒÔ¼°°¢Àï°Ù´¨HotFix¼¼Êõ¡£

Ò»¡¢QQ¿Õ¼ä³¬¼¶²¹¶¡¼¼Êõ

³¬¼¶²¹¶¡¼¼Êõ»ùÓÚDEX·Ö°ü·½°¸£¬Ê¹ÓÃÁ˶àDEX¼ÓÔØµÄÔ­Àí£¬´óÖµĹý³Ì¾ÍÊÇ£º°ÑBUG·½·¨ÐÞ¸´ÒԺ󣬷ŵ½Ò»¸öµ¥¶ÀµÄDEXÀ²åÈëµ½dexElementsÊý×éµÄ×îÇ°Ãæ£¬ÈÃÐéÄâ»úÈ¥¼ÓÔØÐÞ¸´ÍêºóµÄ·½·¨¡£

µ±patch.dexÖаüº¬Test.classʱ¾Í»áÓÅÏȼÓÔØ£¬ÔÚºóÐøµÄDEXÖÐÓöµ½Test.classµÄ»°¾Í»áÖ±½Ó·µ»Ø¶ø²»È¥¼ÓÔØ£¬ÕâÑù¾Í´ïµ½ÁËÐÞ¸´µÄÄ¿µÄ¡£

µ«ÊÇÓÐÒ»¸öÎÊÌâÊÇ£¬µ±Á½¸öµ÷ÓùØÏµµÄÀ಻ÔÚͬһ¸öDEXʱ£¬¾Í»á²úÉúÒì³£±¨´í¡£ÎÒÃÇÖªµÀ£¬ÔÚAPK°²×°Ê±£¬ÐéÄâ»úÐèÒª½«classes.dexÓÅ»¯³ÉodexÎļþ£¬È»ºó²Å»áÖ´ÐС£ÔÚÕâ¸ö¹ý³ÌÖУ¬»á½øÐÐÀàµÄverify²Ù×÷£¬Èç¹ûµ÷ÓùØÏµµÄÀà¶¼ÔÚͬһ¸öDEXÖеϰ¾Í»á±»´òÉÏCLASS_ISPREVERIFIEDµÄ±êÖ¾£¬È»ºó²Å»áдÈëodexÎļþ¡£

ËùÒÔ£¬ÎªÁË¿ÉÒÔÕý³£µÄ½øÐдò²¹¶¡ÐÞ¸´£¬±ØÐë±ÜÃâÀà±»´òÉÏCLASS_ISPREVERIFIED±êÖ¾£¬¾ßÌåµÄ×ö·¨¾ÍÊǵ¥¶À·ÅÒ»¸öÀàÔÚÁíÍâDEXÖУ¬ÈÃÆäËûÀàµ÷Óá£

ÎÒÃÇÀ´ÄæÏòÊÖ»úQQ¿Õ¼äAPK¿´Ò»Ï¾ßÌåµÄʵÏÖ£º

ÏȽøÈë³ÌÐòÈë¿ÚQZoneRealApplication£¬ÔÚattachBaseContextÖнøÐÐÁËÁ½²½²Ù×÷£ºÐÞ¸´CLASS_ISPREVERIFIED±êÖ¾µ¼ÖµÄunexpected DEX problemÒì³£¡¢¼ÓÔØÐÞ¸´µÄDEX¡£

1. ÐÞ¸´unexpectedDEX problemÒì³£ ÏÈ¿´´úÂ룺

¿ÉÒÔ¿´µ½£¬ÕâÀïÊÇÒª¼ÓÔØÒ»¸ölibsĿ¼ÏµÄdalvikhack.jar¡£ÔÚÏîÄ¿µÄassets/libsÕÒµ½¸ÃÎļþ£¬½âѹµÃµ½classes.dexÎļþ£¬ÄæÏò´ò¿ª¸ÃDEXÎļþ£¬

ͨ¹ý²»Í¬µÄDEX¼ÓÔØ½øÀ´£¬È»ºóÔÚÿһ¸öÀàµÄ¹¹Ôì·½·¨ÖÐÒýÓÃÆäËûDEXÖеÄΨһÀàAnitLazyLoad£¬±ÜÃâÀà±»´òÉÏCLASS_ISPREVERIFIED±êÖ¾¡£

ÔÚÎÞÐÞ¸´µÄÇé¿öÏ£¬½«DO_VERIFY_CLASSESÉèÖÃΪfalse£¬Ìá¸ßÐÔÄÜ¡£Ö»ÓÐÔÚÐèÒªÐÞ¸´µÄʱºò£¬²ÅÉèÖÃΪtrue¡£

ÖÁÓÚÈçºÎ¼ÓÔØ½øÀ´£¬Óë½ÓÏÂÀ´µÚ¶þ¸ö²½Öè»ù±¾Ïàͬ¡£

2. ¼ÓÔØÐÞ¸´µÄDEX ´ÓloadPatchDex()·½·¨½øÈ룬¾­¹ý¼¸´ÎÌø×ª£¬µ½´ïºËÐĵĴúÂë¶Î£¬SystemClassLoaderInjector.c()¡£ÓÉÓÚ½øÐÐÁË»ìÏýºÍ¶à´Î·½·¨µÄÌø×ª£¬ÓÚÊǽ«ºËÐÄ´úÂë¶Î×öÁËÈçÏÂÕûÀí£º

ÐÞ¸´µÄ²½ÖèΪ£º

1. ¿ÉÒÔ¿´³öÊÇͨ¹ý»ñÈ¡µ½µ±Ç°Ó¦ÓõÄClassloader£¬¼´ÎªBaseDexClassloader

2. ͨ¹ý·´Éä»ñÈ¡µ½ËûµÄDexPathListÊôÐÔ¶ÔÏópathLis

3. ͨ¹ý·´Éäµ÷ÓÃpathListµÄdexElements·½·¨°Ñpatch.dexת»¯ÎªElement[]

4. Á½¸öElement[]½øÐкϲ¢£¬°Ñpatch.dex·Åµ½×îÇ°ÃæÈ¥

5. ¼ÓÔØElement[]£¬´ïµ½ÐÞ¸´Ä¿µÄ

ÕûÌåµÄÁ÷³ÌͼÈçÏ£º

´ÓÁ÷³ÌͼÀ´¿´£¬¿ÉÒÔºÜÃ÷ÏÔµÄÕÒµ½ÕâÖÖ·½Ê½µÄÌØµã£º

ÓÅÊÆ£º

1.ûÓкϳÉÕû°ü£¨ºÍ΢ÐÅTinker±ÈÆðÀ´£©£¬²úÎï±È½ÏС£¬±È½ÏÁé»î

2.¿ÉÒÔʵÏÖÀàÌæ»»£¬¼æÈÝÐԸߡ££¨Ä³Ð©ÈýÐÇÊÖ»ú²»Æð×÷Óã©

²»×㣺

1. ²»Ö§³Ö¼´Ê±ÉúЧ£¬±ØÐëͨ¹ýÖØÆô²ÅÄÜÉúЧ¡£

2. ΪÁËʵÏÖÐÞ¸´Õâ¸ö¹ý³Ì£¬±ØÐëÔÚÓ¦ÓÃÖмÓÈëÁ½¸öDEX£¡dalvikhack.dexÖÐÖ»ÓÐÒ»¸öÀ࣬¶ÔÐÔÄÜÓ°Ïì²»´ó£¬µ«ÊǶÔÓÚpatch.dexÀ´Ëµ£¬ÐÞ¸´µÄÀൽÁËÒ»¶¨ÊýÁ¿£¬¾ÍÐèÒª»¨²»ÉÙµÄʱ¼ä¼ÓÔØ¡£¶ÔÊÖÌÔÕâÖÖº½Ä¸¼¶Ó¦ÓÃÀ´Ëµ£¬Æô¶¯ºÄʱÔö¼Ó2sÒÔÉÏÊDz»Äܹ»½ÓÊܵÄÊÂ

3. ÔÚARTģʽÏ£¬Èç¹ûÀàÐÞ¸ÄÁ˽ṹ£¬¾Í»á³öÏÖÄÚ´æ´íÂÒµÄÎÊÌ⡣ΪÁ˽â¾öÕâ¸öÎÊÌ⣬¾Í±ØÐë°ÑËùÓÐÏà¹ØµÄµ÷ÓÃÀà¡¢¸¸Àà×ÓÀàµÈµÈÈ«²¿¼ÓÔØµ½patch.dexÖУ¬µ¼Ö²¹¶¡°üÒì³£µÄ´ó£¬½øÒ»²½Ôö¼ÓÓ¦ÓÃÆô¶¯¼ÓÔØµÄʱºò£¬ºÄʱ¸ü¼ÓÑÏÖØ¡£

¶þ¡¢Î¢ÐÅTinker

΢ÐÅÕë¶ÔQQ¿Õ¼ä³¬¼¶²¹¶¡¼¼ÊõµÄ²»×ãÌá³öÁËÒ»¸öÌṩDEX²îÁ¿°ü£¬ÕûÌåÌæ»»DEXµÄ·½°¸¡£Ö÷ÒªµÄÔ­ÀíÊÇÓëQQ¿Õ¼ä³¬¼¶²¹¶¡¼¼Êõ»ù±¾Ïàͬ£¬Çø±ðÔÚÓÚ²»ÔÙ½«patch.dexÔö¼Óµ½elementsÊý×éÖУ¬¶øÊDzîÁ¿µÄ·½Ê½¸ø³öpatch.dex£¬È»ºó½«patch.dexÓëÓ¦ÓõÄclasses.dexºÏ²¢£¬È»ºóÕûÌåÌæ»»µô¾ÉµÄDEX£¬´ïµ½ÐÞ¸´µÄÄ¿µÄ¡£

ÎÒÃÇÀ´ÄæÏò΢ÐÅAPK¿´Ò»Ï¾ßÌåµÄʵÏÖ£º

ÏÈÕÒµ½Ó¦ÓÃÈë¿ÚTinkerApplication£¬ÔÚonBaseContextAttached()µ÷ÓÃÁËloadTinker(),

½øÈëTinkerLoaderµÄtryLoad()·½·¨ÖУ¬

´Ó·½·¨Ãû¿ÉÒÔÔ¤¼û£¬ÔÚtryLoadPatchFilesInternal()Öг¢ÊÔ¼ÓÔØ±¾µØµÄ²¹¶¡£¬ÔÙ¾­¹ýÌø×ª½øÈëºËÐÄÐÞ¸´¹¦ÄÜÀàSystemClassLoaderAdder.classÖС£

´úÂëÖпÉÒÔ¿´³ö£¬¸ù¾ÝAndroid°æ±¾µÄ²»Í¬£¬·Ö±ð²ÉÈ¡¾ßÌåµÄÐÞ¸´²Ù×÷£¬²»¹ýÔ­Àí¶¼ÊÇÒ»ÑùµÄ¡£ÎÒÃÇÒÔV19ΪÀý£º

´Ó´úÂëÖпÉÒÔ¿´µ½£¬Í¨¹ý·´Éä²Ù×÷µÃµ½PathClassLoaderµÄDexPatchList,·´Éäµ÷ÓÃpatchlistµÄmakeDexElements()·½·¨°É±¾µØµÄDEXÎļþÖ±½ÓÌæ»»µ½Element[]Êý×éÖÐÈ¥£¬´ïµ½ÐÞ¸´µÄÄ¿µÄ

¶ÔÓÚÈçºÎ½øÐÐpatch.dexÓëclasses.dexµÄºÏ²¢²Ù×÷£¬ÕâÀï΢ÐÅ¿ªÆôÁËÒ»¸öеĽø³Ì£¬¿ªÆôнø³ÌµÄTinkerPatchService½øÐкϲ¢¡£

ÕûÌåµÄÁ÷³ÌÈçÏ£º

´ÓÁ÷³ÌͼÀ´¿´£¬Í¬Ñù¿ÉÒÔºÜÃ÷ÏÔµÄÕÒµ½ÕâÖÖ·½Ê½µÄÌØµã£º

ÓÅÊÆ£º

1.ºÏ³ÉÕû°ü£¬²»ÓÃÔÚ¹¹Ô캯Êý²åÈë´úÂ룬·ÀÖ¹verify£¬verifyºÍoptÔÚ±àÒëÆÚ¼ä¾ÍÒѾ­Íê³É£¬²»»áÔÚÔËÐÐÆÚ¼ä½øÐÐ

2.ÐÔÄÜÌá¸ß¡£¼æÈÝÐÔºÍÎȶ¨ÐԱȽϸߡ£

3.¿ª·¢Õß͸Ã÷£¬²»ÐèÒª¶Ô°ü½øÐжîÍâ´¦Àí¡£

²»×㣺

1.Ó볬¼¶²¹¶¡¼¼ÊõÒ»Ñù£¬²»Ö§³Ö¼´Ê±ÉúЧ£¬±ØÐëͨ¹ýÖØÆôÓ¦Óõķ½Ê½²ÅÄÜÉúЧ

2.ÐèÒª¸øÓ¦ÓÿªÆôеĽø³Ì²ÅÄܽøÐкϲ¢£¬²¢ÇÒºÜÈÝÒ×ÒòΪÄÚ´æÏûºÄµÈÔ­ÒòºÏ²¢Ê§°Ü¡£

3.ºÏ²¢Ê±Õ¼ÓöîÍâ´ÅÅ̿ռ䣬¶ÔÓÚ¶àDEXµÄÓ¦ÓÃÀ´Ëµ£¬Èç¹ûÐÞ¸ÄÁ˶à¸öDEXÎļþ£¬¾ÍÐèҪϷ¢¶à¸öpatch.dexÓë¶ÔÓ¦µÄclasses.dex½øÐкϲ¢²Ù×÷ʱÕâÖÖÇé¿ö»á¸üÑÏÖØ£¬Òò´ËºÏ²¢¹ý³ÌµÄʧ°ÜÂÊÒ²»á¸ü¸ß¡£

Èý¡¢°¢Àï°Ù´¨HotFix

°¢Àï°Ù´¨ÍƳöµÄÈÈÐÞ¸´HotFix·þÎñ£¬Ïà¶ÔÓÚQQ¿Õ¼ä³¬¼¶²¹¶¡¼¼ÊõºÍ΢ÐÅTinkerÀ´Ëµ£¬¶¨Î»ÓÚ½ô¼±bugÐÞ¸´µÄ³¡¾°Ï£¬Äܹ»×ʱµÄÐÞ¸´bug£¬ÏÂÀ­²¹¶¡Á¢¼´ÉúЧÎÞÐèµÈ´ý¡£

1¡¢AndFixʵÏÖÔ­Àí

AndFix²»Í¬ÓÚQQ¿Õ¼ä³¬¼¶²¹¶¡¼¼ÊõºÍ΢ÐÅTinkerͨ¹ýÔö¼Ó»òÌæ»»Õû¸öDEXµÄ·½°¸£¬ÌṩÁËÒ»ÖÖÔËÐÐʱÔÚNativeÐÞ¸ÄFiledÖ¸ÕëµÄ·½Ê½£¬ÊµÏÖ·½·¨µÄÌæ»»£¬´ïµ½¼´Ê±ÉúЧÎÞÐèÖØÆô£¬¶ÔÓ¦ÓÃÎÞÐÔÄÜÏûºÄµÄÄ¿µÄ¡£ Ô­ÀíͼÈçÏ£º

2¡¢AndFixʵÏÖ¹ý³Ì

¶ÔÓÚʵÏÖ·½·¨µÄÌæ»»£¬ÐèÒªÔÚNative²ã²Ù×÷£¬¾­¹ýÈý¸ö²½Ö裺

½ÓÏÂÀ´ÒÔDalvikÉ豸ΪÀý£¬À´·ÖÎö¾ßÌåµÄʵÏÖ¹ý³Ì£º

2.1 setup()

¶ÔÓÚDalvikÀ´Ëµ£¬×ñÑ­JIT¼´Ê±±àÒë»úÖÆ£¬ÐèÒªÔÚÔËÐÐÊ±×°ÔØlibdvm.so¶¯Ì¬¿â£¬»ñÈ¡ÒÔÏÂÄÚ²¿º¯Êý£º

1£© dvmThreadSelf( )£º²éѯµ±Ç°µÄỊ̈߳»

2£©dvmDecodeIndirectRef()£º¸ù¾Ýµ±Ç°Ï̻߳ñµÃClassObject¶ÔÏó¡£

2.2 setFieldFlag

¸Ã²Ù×÷µÄÄ¿µÄ£ºÈÃprivate¡¢protectedµÄ·½·¨ºÍ×ֶοɱ»¶¯Ì¬¿â¿´¼û²¢Ê¶±ð¡£Ô­ÒòÔÚÓÚ¶¯Ì¬¿â»áºöÂÔ·ÇpublicÊôÐÔµÄ×ֶκͷ½·¨¡£

2.3 replaceMethod

¸Ã²½ÖèÊÇ·½·¨Ìæ»»µÄºËÐÄ£¬Ìæ»»µÄÁ÷³ÌÈçÏ£º

AndFix¶ÔARTÉ豸ͬÑùÖ§³Ö£¬¾ßÌåµÄ¹ý³ÌÓëDalvikÏàËÆ£¬ÕâÀï²»ÔÙ׸Êö¡£

´Ó¼¼ÊõÔ­Àí£¬²»ÄÑ¿´³ö°¢Àï°Ù´¨HotFixµÄ¼¸¸öÌØµã£º

×î´óµÄÓÅÊÆÔÚÓÚ

1.BUGÐÞ¸´µÄ¼´Ê±

2.²¹¶¡°üͬÑù²ÉÓòîÁ¿¼¼Êõ£¬Éú³ÉµÄPATCHÌå»ýС

3.¶ÔÓ¦ÓÃÎÞÇÖÈ룬¼¸ºõÎÞÐÔÄÜËðºÄ

²»×㣺

1.²»Ö§³ÖÐÂÔö×ֶΣ¬ÒÔ¼°ÐÞ¸Ä<init>·½·¨£¬Ò²²»Ö§³Ö¶Ô×ÊÔ´µÄÌæ»»¡£

2.ÓÉÓÚ³§É̵Ä×Ô¶¨ÒåROM£¬¶ÔÉÙÊý»úÐÍÔݲ»Ö§³Ö¡£

×ۺϷÖÎöÈçÏ£º

ÈÈÐÞ¸´µÄ¿ÓºÍ½â

ÎÒÃÇ¿ÉÒÔ¿´µ½£¬QQ¿Õ¼ä³¬¼¶²¹¶¡¼¼ÊõºÍ΢ÐÅTinkerµÄÐÞ¸´Ô­Àí¶¼»ùÓÚÀà¼ÓÔØ£¬ÔÚ¹¦ÄÜÉÏÒѾ­Ö§³ÖÀà¡¢×ÊÔ´µÄÌæ»»ºÍÐÂÔö£¬¹¦Äܷdz£Ç¿´ó¡£¼ÈÈ»ÒѾ­ÓÐÁËÕâôǿ´óµÄÈÈÐÞ¸´¼¼Êõ£¬ÎªÊ²Ã´°¢Àï°Ù´¨»¹ÒªÍƳö×Ô¼ºµÄÈÈÐÞ¸´·½°¸HotFixÄØ£¿

Ò»¡¢¶àDEX´øÀ´µÄÐÔÄÜÎÊÌâºÍÓ°Ïì

ÎÒÃÇÖªµÀ£¬¶àDEX·½°¸ÓÃÀ´½â¾öÓ¦Ó÷½·¨Êý65kµÄÎÊÌ⣬ÏÖÔÚGoogleÒ²¹Ù·½Ö§³ÖÁËMultiDexµÄʵÏÖ·½°¸¡£µ«ÊÇ£¬ÕâʵÔÚÊÇÓ¦ÓÃÒò·½·¨Êý³¬³ö¶ø×÷³öµÄ²»µÃÒѵÄϲߣ¬µ«Êdz¬¼¶²¹¶¡¼¼ÊõºÍTinker×÷ΪһÖÖÈÈÐÞ¸´µÄ·½°¸£¬Æ½Éú¸øÓ¦ÓÃÔö¼ÓÁ˶à¸öDEX£¬¶ø¶àDEX¼¼Êõ×î´óµÄÎÊÌâÔÚÓÚÐÔÄÜÉϵĿӣ¬Òò´Ë»ùÓÚÕâÖÖ·½°¸µÄ²¹¶¡¼¼ÊõÓ°ÏìÓ¦ÓõÄÐÔÄÜÊÇÎÞÒɵġ£

1. Æô¶¯¼ÓÔØÊ±¼ä¹ý³¤

ÎÒÃÇ¿ÉÒÔ¿´µ½£¬³¬¼¶²¹¶¡¼¼ÊõºÍTinker¶¼Ñ¡ÔñÔÚApplicationµÄattachBaseContext()½øÐв¹¶¡DEXµÄ¼ÓÔØ£¬¼´Ê¹ÕâÊǼÓÔØdexµÄ×î¼Ñʱ»ú£¬µ«ÊÇÒÀÈ»»á´øÀ´ºÜ´óµÄÐÔÄÜÎÊÌ⣬Ê×µ±Æä³åµÄ¾ÍÊÇÆô¶¯Ê±¼äÌ«³¤?

¶ÔÓÚ²¹¶¡DEXÀ´Ëµ£¬Ó¦ÓÃÆô¶¯Ê±ÐéÄâ»ú»á½øÐÐdexopt²Ù×÷£¬½«patch.dexÎļþת»»³ÉodexÎļþ£¬Õâ¸ö¹ý³Ì·Ç³£ºÄʱ¡£¶øÕâ¸ö¹ý³Ì£¬ÓÖÒªÇóÐèÒªÔÚÖ÷Ïß³ÌÖУ¬ÒÔͬ²½µÄ·½Ê½Ö´ÐУ¬·ñÔòÎÞ·¨³É¹¦½øÐÐÐÞ¸´¡£¾ÍDEXµÄ¼ÓÔØÊ±¼ä£¬´ó¸Å×öÁËÒÔϵÄʱ¼ä²âÊÔ¡£

Ëæ×Åpatch.dexµÄÔö¼Ó£¬ÔÚ²»×öÈκÎÓÅ»¯µÄÇé¿öÏ£¬Æô¶¯Ê±¼äÒ²Ö±ÏßÔö³¤¡£¶ÔÓÚÒ»¸öÓ¦ÓÃÀ´Ëµ£¬Õâ¼òÖ±ÊÇÔÖÄÑÐÔµÄ

2. Ò×Ôì³ÉÓ¦ÓõÄANRºÍCrash

ÕýÊÇÓÈÆä¶àDEX¼ÓÔØµ¼ÖÂÁËÆô¶¯Ê±¼ä¹ý³¤£¬ºÜÈÝÒ׾ͻáÒý·¢Ó¦ÓõÄANR¡£ÎÒÃÇÖªµÀµ±Ó¦ÓÃÔÚÖ÷Ï̵߳ȴý³¬¹ý5sÒԺ󣬾ͻáÖ±½Óµ¼Ö³¤Ê±¼äÎÞÏìÓ¦¶øÍ˳ö¡£³¬¼¶²¹¶¡¼¼ÊõΪ±£Ö¤ART²»³öÏÖµØÖ·´íÂÒÎÊÌ⣬ÐèÒª½«ËùÓйØÁªµÄÀàÈ«²¿¼ÓÈëµ½²¹¶¡ÖУ¬¶øÎ¢ÐÅTinker²ÉȡһÖÖ²îÁ¿°üºÏ²¢¼ÓÔØµÄ·½Ê½£¬¶¼»áʹҪ¼ÓÔØµÄDEXÌå»ý±äµÃºÜ´ó¡£ÕâÒ²ºÜ´ó³Ì¶ÈÉÏÈÝÒ×µ¼ÖÂANRÇé¿öµÄ³öÏÖ

³ýÁËÓ¦ÓÃANRÒÔÍ⣬¶àDEXģʽҲͬÑùºÜÈÝÒ×µ¼ÖÂCrashÇé¿öµÄ³öÏÖ¡£ÎÒÃÇÖªµÀ£¬³¬¼¶²¹¶¡¼¼ÊõΪÁ˱£Ö¤ARTÉ豸ϲ»³öÏÖµØÖ·´íÂÒÎÊÌ⣬ÐèÒª°ÑÐÞ¸ÄÀàµÄËùÓÐÏà¹ØÀàÈ«²¿¼ÓÈëµ½²¹¶¡ÖУ¬ÕâÀï»á³öÏÖÒ»¸öÎÊÌ⣬ΪÁ˱£Ö¤²¹¶¡°üµÄÌå»ý×îС£¬ÄÜ·ñ±£Ö¤ÒýÈëÈ«²¿µÄ¹ØÁªÀà¶ø²»ÒýÈëÎ޹صÄÀàÄØ£¿Ò»µ©Ã»ÓÐÒýÈë¹ØÁªµÄÀ࣬¾Í»á³öÏÖÒÔϵÄÒì³££º

1.NoClassDefFoundError

2.Could not find class

3.Could not find method

³öÏÖÕâЩÒì³££¬¾Í»áÖ±½Óµ¼ÖÂÓ¦ÓõÄCrashÍ˳ö¡£

ËùÒÔ£¬²»ÄÑ¿´³öÈç¹ûÎÒÃÇÐèÒªÐÞ¸´Ò»¸ö²»ÊÇCrashµÄBUG£¬µ«ÊÇÒòΪδ¼ÓÈëÏà¹ØÀà¶øµ¼ÖÂÁ˸üÑÏÖØµÄCrash£¬¾Í¸ü¼ÓµÄµÃ²»³¥Ê§¡£

×ܵÄÀ´Ëµ£¬ÈÈÐÞ¸´±¾ÖʵÄÄ¿µÄÊÇΪÁ˱£Ö¤Ó¦Óøü¼ÓÎȶ¨£¬¶ø²»ÊÇΪÁ˸üÇ¿´óµÄ¹¦ÄÜÒýÈë¸ü´óµÄ·çÏպͲ»Îȶ¨ÐÔ¡£

¶þ¡¢ÈÈÐÞ¸´ or ²å¼þ»¯£¿

ÎÒÃǾ­³£Ìáµ½ÈÈÐÞ¸´ºÍ²å¼þ»¯£¬Õâ¶¼Êǵ±ÏÂÈÈÃŵÄÐÂÐ˼¼Êõ¡£ÔÚ½²Êö֮ǰ£¬ÐèÒª¶ÔÕâÁ½¸ö¸ÅÄî½øÐÐһϽâÊÍ¡£

²å¼þ»¯£ºÒ»¸ö³ÌÐò»®·ÖΪ²»Í¬µÄ²¿·Ö£¬ÒÔ²å¼þµÄÐÎʽ¼ÓÔØµ½Ó¦ÓÃÖÐÈ¥£¬±¾ÖÊÉÏËüʹÓõļ¼Êõ»¹ÊÇÈÈÐÞ¸´¼¼Êõ£¬Ö»ÊǼÓÈëÁ˸ü¶à¹¤³Ìʵ¼ù£¬ÈÃËüÖ§³Ö´ó¹æÄ£µÄ´úÂë¸üÐÂÒÔ¼°×ÊÔ´ºÍSO°üµÄ¸üС£

ÈÈÐÞ¸´£ºµ±ÏßÉÏÓ¦ÓóöÏÖ½ô¼±BUG£¬ÎªÁ˱ÜÃâÖØÐ·¢°æ£¬²¢ÇÒ±£Ö¤ÐÞ¸´µÄ¼°Ê±ÐÔ¶ø½øÐеÄÒ»ÏîÔÚÏßÍÆËͲ¹¶¡µÄÐÞ¸´·½°¸¡£

ÏÔÈ»£¬´Ó¸ÅÄîÉÏÎÒÃÇ¿ÉÒÔ¿´µ½£¬²å¼þ»¯Ê¹Óó¡¾°¸ü¶àÊǹ¦ÄÜ£¬ÈÈÐÞ¸´Ê¹Óó£¼ûÔÚÓÚÐÞ¸´¡£´ÓÕâ¸ö²ãÃæÀ´Ëµ£¬²å¼þ»¯±ØÈ»¹¦Äܸü¼ÓÇ¿´ó£¬ÄÜ×öµÄÊÂÇéÒ²¸ü¶à¡£QQ¿Õ¼ä³¬¼¶²¹¶¡¼¼ÊõºÍ΢ÐÅTinker´ÓÀà¡¢×ÊÔ´µÄÌæ»»ºÍ¸üÐÂÉÏÀ´¿´£¬ÓëÆä˵ÊÇÈÈÐÞ¸´£¬²»Èç˵ÊDzå¼þ»¯¡£

µ±È»£¬Ç¿´óµÄ¹¦ÄÜÒ²¾ÍÔö¼ÓÁ˲»Îȶ¨µÄÒòËØ¡£±ÈÈçÉÏÎÄÌáµ½µÄÔö¼ÓÆô¶¯Ê±¼ä£¬µ¼ÖÂANR¡¢CrashµÄÎÊÌâ¡£

QQ¿Õ¼ä³¬¼¶²¹¶¡¼¼ÊõºÍ΢ÐÅTinkerÌṩÁ˸ü¼ÓÇ¿´óµÄ¹¦ÄÜ£¬µ«ÊǶÔÓ¦ÓõÄÐÔÄܺÍÎȶ¨ÓнϴóµÄÓ°Ï죬¾ÍBUGÐÞ¸´µÄÕâ¸öʹÓó¡¾°ÉÏ»¹²»¹»Ã÷È·£¬²¢ÇÒÏԵùýÖØ¡£

Õë¶ÔÓ¦ÓõÄÐÔÄÜËðºÄ£¬ÎÒÃÇ¿ÉÒÔ¾ÙÀý×öÒ»¸ö¶Ô±È¡£

ijAPPµÄÆô¶¯ÔØÈëʱ¼äΪ3s×óÓÒ£¬±¾Éí¾ÍÊÇ»ùÓÚ¶àDEXģʽµÄʵÏÖ¡£

·Ö±ð½ÓÈëÈýÖÖÈÈÐÞ¸´·þÎñ£¬¸ù¾ÝÌÚѶÌṩ³¬¼¶²¹¶¡¼¼ÊõºÍTinkerµÄÊý¾Ý£¬ÄÇô»á±ä³ÉÒÔϵij¡¾°£º

1.°¢Àï°Ù´¨HotFix:Æô¶¯Ê±¼ä¼¸ºõÎÞÔö¼Ó£¬²»Ôö¼ÓÔËÐÐÆÚ¶îÍâµÄ´ÅÅÌÏûºÄ¡£

2.QQ¿Õ¼ä³¬¼¶²¹¶¡¼¼Êõ£ºÈç¹ûÓ¦ÓÃÓÐ700¸öÀ࣬Æô¶¯ºÄʱÔö¼Ó³¬¹ý2.5s£¬´ïµ½5.5sÒÔÉÏ¡£

3.΢ÐÅTinker£º¼ÙÉèÓ¦ÓÃÓÐ5¸öDEXÎļþ£¬·Ö±ðÐÞ¸ÄÁËÕâ5¸öDEX£¬²úÉú5¸öpatch.dexÎļþ£¬¾ÍÒª½øÐÐ5´ÎµÄpatchºÏ²¢¶¯×÷£¬¼ÙÉèÿ¸ö²¹¶¡1M£¬ÄÇô¾ÍÒª¶àÕ¼ÓÃ7.5MµÄ´ÅÅ̿ռ䡣

ÏÔÈ»¶ÔÓÚÐÞ¸´½ô¼±BUGÕâ¸ö³¡¾°£¬°¢Àï°Ù´¨HotFixµÄ¸üΪºÏÊÊ£¬Ëü¸ü¼ÓÇáÁ¿£¬¿ÉÒÔÔÚ²»ÖØÆôµÄÇé¿öÏÂÉúЧ£¬ÇÒ¶ÔÐÔÄܼ¸ºõûÓÐÓ°Ï졣΢ÐÅTinker¡¢QQ¿Õ¼ä³¬¼¶²¹¶¡¼¼Êõ¸ü¶àµØ°Ñ³¡¾°¶¨Î»ÔÚ·¢²¼Ð¡µÄй¦ÄÜÉÏ£¬²ÉÓÃClassLoaderµÄģʽ£¬ÎþÉü½Ï¸ßµÄÐÔÄÜ´ú¼ÛȥʵÏÖÀà¡¢×ÊÔ´ÐÂÔö»òÌæ»»µÄ¹¦ÄÜ¡£°¢Àï°Ù´¨HotFix¶ÔÓ¦Óñ¾Éí×öµ½ÎÞÇÖÈ룬ÎÞÐÔÄÜËðºÄ¡£

×ܽá

QQ¿Õ¼ä³¬¼¶²¹¶¡¼¼ÊõºÍ΢ÐÅTinker Ö§³ÖÐÂÔöÀàºÍ×ÊÔ´µÄÌæ»»£¬ÔÚһЩ¹¦ÄÜ»¯µÄ¸üÐÂÉϸüΪǿ´ó£¬µ«¶ÔÓ¦ÓõÄÐÔÄܺÍÎȶ¨»áÓеÄÒ»¶¨µÄÓ°Ï죻°¢Àï°Ù´¨HotFixËäÈ»ÔÝʱ²»Ö§³ÖÐÂÔöÀàºÍ×ÊÔ´µÄÌæ»»£¬¶Ôй¦Äܵķ¢²¼Ò²ÓÐËùÏÞÖÆ£¬µ«ÊÇ×÷ΪһÏλΪÏßÉϽô¼±BUGµÄÈÈÐÞ¸´µÄ·þÎñÀ´Ëµ£¬Äܹ»ÕæÕý×öµ½BUG¼´Ê±ÐÞ¸´Óû§ÎÞ¸ÐÖª£¬Í¬Ê±±£Ö¤¶ÔÓ¦ÓÃÐÔÄܲ»²úÉú²»±ØÒªµÄËðºÄ£¬ÔÚÈÈÐÞ¸´·½Ã治ʧΪһ¸öºÃµÄÑ¡Ôñ¡£

Ŀǰ°¢Àï°Ù´¨HotFixÒѾ­¿ªÊ¼¹«²â£¬µã»÷Á¢¼´Ê¹Ó㬼´¿É¿ªÊ¼ÄãµÄÈÈÐÞ¸´Ö®Âá£

 

   
1829 ´Îä¯ÀÀ       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ÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ