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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Android Ó¦Óÿª·¢ÐÔÄÜÓÅ»¯ÍêÈ«·ÖÎö
 
À´×ÔÓÚ£º¹¤½³ÈôË® ·¢²¼ÓÚ 2016-2-3
  2379  次浏览      28
 

1 ±³¾°

ÆäʵÓе㲻ÏëдÕâÆªÎÄյ쬵«ÊÇÓÖÏëд£¬ÓÐЩì¶Ü¡£²»ÏëдµÄÔ­ÒòÊÇËæ±ãÉÏÍøÒ»ËÑÒ»¶Ñ¹ØÓÚÐÔÄܵĽ¨Ò飬¸Ð¾õ´ó¼ÒÄãÒ»×ܽᡢÎÒÒ»×ܽáµÄ¶¼Ëµµ½Á˺ܶàÓÅ»¯×¢ÒâÊÂÏµ«ÊÇ¿´¹ýÕâЩÎÄÕºó´ó¶àÊý´æÔÚÒ»¸öÎÊÌâ¾ÍÊÇÖ»¸ø³öɶɶɶ²»ÄÜÓã¬É¶É¶É¶¸ÃÕ¦Óõȣ¬È´ºÜÉÙÓнÏΪϵͳµÄ½øÐÐÕæÕýÐÔÄܰ¸Àý·ÖÎöµÄ£¬´ó¶àÊý¶¼ÊÇ×ìÉϺ°º°»òÕßËÀ¼Çס¹æÔò¶øÒÑ£¨µ±È»ÁË£¬Õâ»°ÎÒ×Ô¼ºÌý×Ŷ¼ÓÐЩ´Ì¶ú£¬ÊµÔÚ²»ºÃÒâ˼£¬Æäʵ¹ØÓÚÐÔÄÜÓÅ»¯µÄÓÅÖʲ©ÎÄÍøÉÏÒ²»¹ÊÇÓкܶàµÄ£¬Æ©ÈçGoogle¹Ù·½¶¼ÒѾ­ÍƳöÁËÓÅ»¯×¨Ì⣬ÎÒÕâÀïÖ»ÊÇ×ܽáÏÂ×ԵĸÐÎò¶øÒÑ£¬ÈôÓеÃ×ï»¶Ó­ÅÄש£¬ÎÒÔ¸°¤´ò£¬ÒòΪÎÒ֮ǰ¹¤×÷µÄÒ»°ëʱ¼ä¶¼ÊǸºÔðÐÔÄÜÓÅ»¯£©¡£

µ±È»ÁË£¬±¾ÎIJ»»á¾Í´Ë±à¼­Õâôһ´Î£¬ÒòΪ¼¼ÊõÔÚ·¢Õ¹£¬¹¤¾ßÔÚÇ¿´ó£¨Ð´×Åд×ÅAndroid Studio 1.4°æ±¾¶¼ÍÆËÍÁË£©£¬×Ô¼ºµÄ¾­ÑéÒ²ÔÚÔö¼Ó£¬ËùÒÔ±¾ÎÄ×ÔÈ»²»»á¸²¸ÇËùÓÐÐÔÄÜÓÅ»¯¼°·ÖÎö£»½â¾öµÄ°ì·¨¾ÍÊǸÃÎÄÕ»᳤ÆÚά»¤¸üУ¬Í¬Ê±ÔÚÆÀÂÛÇø»¶Ó­Äã¹ØÓÚÐÔÄÜÓÅ»¯µã×ÓµÄ̽ÌÖ¡£

AndroidÓ¦ÓõÄÐÔÄÜÎÊÌâÆäʵ¿ÉÒÔ»®·ÖΪ¼¸¸ö´óµÄÄ£¿éµÄ£¬¶øÇÒ¶¼¾ßÓÐÏà¶Ô²»´íµÄÓÅ»¯µ÷ÊÔ¼¼ÇÉ£¬ÏÂÃæÎÒÃǾͻáÒÀ¾ÝÒ»¸öÏîÄ¿³£¹æ¿ª·¢µÄ´óÀàÐÍÀ´½øÐÐһЩ·ÖÎö½²½â¡£

PS£ºÖ®Ç°´ô¹ýÒ»¼Ò³õ´´Ò½ÁÆ»¥ÁªÍø¹«Ë¾£¬±ðÌáÐÔÄÜÓÅ»¯ÁË£¬ÀϰåÁ¢ÍêÐÂÏîÄ¿ºóÒ»¸öÔ¾ÍÒªÇó¼ûµ½ÉÏÏ߳ɯ·£¬ÕâÖÖѹÆÈÏÂ̸ºÎÐÔÄÜÓÅ»¯£¬´¿Êô³¶µ°£¬ËùÒÔ²»µ½Èý¸öÔÂʱ¼äÎÒÖ÷¶¯Ñ¡Ôñ³·ÁË£¬ÕâÖÖÏÖÏóºóÀ´ÎÒÒ»´òÌý·¢ÏÖÔںܶà³õ´´¹«Ë¾¶¼ºÜÑÏÖØ£¬¶¼ÏëËÙ³ÉÈ´ºöÂÔÁËÌåÑé¡£

PPPS£º±¾ÎÄÖ»ÊÇ´ïµ½Å×שÒýÓñµÄ×÷Ó㬺ܶණÎ÷ϸ¾¿ÏÂÈ¥¶¼ÊÇÖµµÃÉîÈëÑо¿µÄ£¬ÔÙ¼ÓÉÏÐÔÄÜÓÅ»¯±¾À´¾ÍÊÇÒ»¸öÐèÒª×ۺϿ¼Á¿µÄÈÎÎñ£¬²»ÊÇ˵»áÁ˱¾ÎÄÄÄÒ»µã¾ÍÄÜ×öÐÔÄÜ·ÖÎöÁË£¬ÐèÒªÃæÃæ¾ãµ½²Å¿É¸ßЧ¶¨Î»ÎÊÌâÔ­Òò¡£

2 Ó¦ÓÃUIÐÔÄÜÎÊÌâ·ÖÎö

UI¿ÉνÊÇÒ»¸öÓ¦ÓõÄÁ³£¬ËùÒÔÿһ¿îÓ¦ÓÃÔÚ¿ª·¢½×¶ÎÎÒÃǵĽ»»¥¡¢ÊÓ¾õ¡¢¶¯»­¹¤³Ìʦ¶¼Æ´ÃüµÄÏëÈÃËü±äµÃ×ÔÈ»´ó·½ÃÀÀö£¬¿ÉÊÇÏÖʵ×ÜÊDz»¾¡ÈËÒ⣬¶¯»­ºÍ½»»¥×Ü»á¾õµÃ¿ª·¢×ö³öÀ´µÄÓ¦ÓÃÓÃÉÏÈ¥¸Ð¾õ²»×ÔÈ»£¬Ã»ÓдﵽËûÃÇÐÄÄ¿ÖеÄ×ÔÈ»Á÷³©Ï¸½Ú£»ÕâÖÖÇé¿ö֮Ͼ͸ü±ðÌá·¢²¼¸øÖÕ¶ËÓû§Ê¹ÓÃÁË£¬Óû§ÒªÊÇÄܹ»¸Ð¾õ³öÀ´£¬ÉÙÔòÓ°ÏìÐÄÇ飬¶àÔòÐ¶ÔØÓ¦Óã»ËùÒÔÒ»¸öÓ¦ÓõÄUIÏÔʾÐÔÄÜÎÊÌâ¾Í²»µÃ²»±»¿ª·¢ÈËÔ±ÖØÊÓ¡£

2-1 Ó¦ÓÃUI¿¨¶ÙÔ­Àí

ÈËÀà´óÄÔÓëÑÛ¾¦¶ÔÒ»¸ö»­ÃæµÄÁ¬¹áÐÔ¸ÐÖªÆäʵÊÇÓÐÒ»¸ö½çÏ޵쬯©ÈçÎÒÃÇ¿´µçÓ°»á¾õµÃ»­ÃæºÜ×ÔÈ»Á¬¹á£¨Ö¡ÂÊΪ24fps£©£¬ÓÃÊÖ»úµ±È»Ò²ÐèÒª¸ÐÖªÆÁÄ»²Ù×÷µÄÁ¬¹áÐÔ£¨ÓÈÆäÊǶ¯»­¹ý¶È£©£¬ËùÒÔAndroidË÷ÐԾͰѴﵽÕâÖÖÁ÷³©µÄÖ¡Âʹ涨Ϊ60fps¡£

ÓÐÁËÉÏÃæµÄ±³¾°£¬ÎÒÃÇ¿ª·¢AppµÄÖ¡ÂÊÐÔÄÜÄ¿±ê¾ÍÊDZ£³ÖÔÚ60fps£¬Ò²¾ÍÊÇ˵ÎÒÃÇÔÚ½øÐÐAppÐÔÄÜÓÅ»¯Ê±ÐÄÖÐÒªÓÐÈçÏÂ×¼Ôò£º

»»Ëã¹ØÏµ£º60Ö¡/Ãë-----------16ms/Ö¡£»

×¼Ôò£º¾¡Á¿±£Ö¤Ã¿´ÎÔÚ16msÄÚ´¦ÀíÍêËùÓеÄCPUÓëGPU¼ÆËã¡¢»æÖÆ¡¢äÖȾµÈ²Ù×÷£¬·ñÔò»áÔì³É¶ªÖ¡¿¨¶ÙÎÊÌâ¡£

´ÓÉÏÃæ¿ÉÒÔ¿´³öÀ´£¬ËùνµÄ¿¨¶ÙÆäʵÊÇ¿ÉÒÔÁ¿»¯µÄ£¬Ã¿´ÎÊÇ·ñÄܹ»³É¹¦äÖȾÊǷdz£ÖØÒªµÄÎÊÌ⣬16msÄÜ·ñÍêÕûµÄ×öÍêÒ»´Î²Ù×÷Ö±½Ó¾ö¶¨ÁË¿¨¶ÙÐÔÄÜÎÊÌâ¡£

µ±È»ÁË£¬Õë¶ÔAndroidϵͳµÄÉè¼ÆÎÒÃÇ»¹ÐèÒªÖªµÀÁíÒ»¸ö³£Ê¶£»ÐéÄâ»úÔÚÖ´ÐÐGCÀ¬»ø»ØÊÕ²Ù×÷ʱËùÓÐỊ̈߳¨°üÀ¨UIỊ̈߳©¶¼ÐèÒªÔÝÍ££¬µ±GCÀ¬»ø»ØÊÕÍê³ÉÖ®ºóËùÓÐÏ̲߳ÅÄܹ»¼ÌÐøÖ´ÐУ¨Õâ¸öϸ½ÚÏÂÃæÐ¡½Ú»áÓÐÏêϸ½éÉÜ£©¡£Ò²¾ÍÊÇ˵µ±ÔÚ16msÄÚ½øÐÐäÖȾµÈ²Ù×÷ʱÈç¹û¸ÕºÃÓöÉÏ´óÁ¿GC²Ù×÷Ôò»áµ¼ÖÂäÖȾʱ¼äÃ÷ÏÔ²»×㣬Ҳ¾Í´Ó¶øµ¼ÖÂÁ˶ªÖ¡¿¨¶ÙÎÊÌâ¡£

ÓÐÁËÉÏÃæÕâÁ½¸ö¼òµ¥µÄÀíÂÛ»ù´¡Ö®ºóÎÒÃÇÏÂÃæ¾Í»á̽ÌÖһЩUI¿¨¶ÙµÄÔ­Òò·ÖÎö¼°½â¾ö·½°¸¡£

2-2 Ó¦ÓÃUI¿¨¶Ù³£¼ûÔ­Òò

ÎÒÃÇÔÚʹÓÃAppʱ»á·¢ÏÖÓÐЩ½çÃæÆô¶¯¿¨¶Ù¡¢¶¯»­²»Á÷³©¡¢ÁбíµÈ»¬¶¯Ê±Ò²»á¿¨¶Ù£¬¾¿ÆäÔ­Òò£¬ºÜ¶à¶¼ÊǶªÖ¡µ¼Öµģ»Í¨¹ýÉÏÃæ¿¨¶ÙÔ­ÀíµÄ¼òµ¥ËµÃ÷ÎÒÃÇ´ÓÓ¦Óÿª·¢µÄ½Ç¶ÈÍù»ØÍÆÀí¿ÉÒԵóö³£¼û¿¨¶ÙÔ­Òò£¬ÈçÏ£º

¿ÉÒÔ¿´¼û£¬ÉÏÃæÕâЩµ¼Ö¿¨¶ÙµÄÔ­Òò¶¼ÊÇÎÒÃÇÆ½Ê±¿ª·¢Öзdz£³£¼ûµÄ¡£ÓÐЩÈË¿ÉÄÜ»á¾õµÃ×Ô¼ºµÄÓ¦ÓÃÓÃ×Å»¹ÂùOKµÄ£¬ÆäʵÄÇÊÇÒòΪÄãû½øÐÐһЩ˲ʱ²âÊÔºÍѹÁ¦²âÊÔ£¬Ò»µ©ÔÚÕâÖÖ»·¾³ÏÂÔËÐÐÄãµÄAppÄã¾Í»á·¢ÏֺܶàÐÔÄÜÎÊÌâ¡£

2-3 Ó¦ÓÃUI¿¨¶Ù·ÖÎö½â¾ö·½·¨

·ÖÎöUI¿¨¶ÙÎÒÃÇÒ»°ã¶¼½èÖú¹¤¾ß£¬Í¨¹ý¹¤¾ßÒ»°ã¶¼¿ÉÒÔÖ±¹ÛµÄ·ÖÎö³öÎÊÌâÔ­Òò£¬´Ó¶ø·´ÍÆÑ°ÇóÓÅ»¯·½°¸£¬¾ßÌåÈçÏÂϸ˵¸÷ÖÖÇ¿´óµÄ¹¤¾ß¡£

2-3-1 ʹÓÃHierarchyViewer·ÖÎöUIÐÔÄÜ

ÎÒÃÇ¿ÉÒÔͨ¹ýSDKÌṩµÄ¹¤¾ßHierarchyViewerÀ´½øÐÐUI²¼¾Ö¸´Ôӳ̶ȼ°ÈßÓàµÈ·ÖÎö£¬ÈçÏ£º

xxx@ThinkPad:~$ hierarchyviewer   //ͨ¹ýÃüÁîÆô¶¯HierarchyViewer

Ñ¡ÖÐÒ»¸öWindow½çÃæitem£¬È»ºóµã»÷ÓÒÉÏ·½Hierarchy window»òÕßPixel Perfect window£¨ÕâÀï²»½éÉÜ£¬Ö÷ÒªÓÃÀ´¼ì²éÏñËØÊôÐԵ쩼´¿É²Ù×÷¡£

ÏÈ¿´ÏÂHierarchy window£¬ÈçÏ£º

Ò»¸öActivityµÄViewÊ÷£¬Í¨¹ýÕâ¸öÊ÷¿ÉÒÔ·ÖÎö³öViewǶÌ×µÄÈßÓà²ã¼¶£¬×óϽǿÉÒÔÊäÈëViewµÄidÖ±½Ó×Ô¶¯Ìø×ªµ½ÖмäÏÔʾ£»Save as PNGÓÃÀ´°Ñ×ó²àÊ÷±£´æÎªÒ»ÕÅͼƬ£»Capture LayersÓÃÀ´±£´æpsdµÄPhotoShop·Ö²ãËØ²Ä£»ÓÒ²à¾çÖÐÏÔʾѡÖÐViewµÄµ±Ç°ÊôÐÔ״̬£»ÓÒϽÇÏÔʾµ±Ç°ViewÔÚActivityÖеÄλÖõȣ»×óϽÇÈý¸ö½øÐÐÇл»£»Load View HierarchyÓÃÀ´ÊÖ¶¯Ë¢Ð±仯£¨²»»á×Ô¶¯Ë¢Ðµģ©¡£µ±ÎÒÃÇÑ¡ÔñÒ»¸öViewºó»áÈçÏÂͼËùʾ£º

ÀàËÆÉÏͼ¿ÉÒԺܷ½±ãµÄ²é¿´µ½µ±Ç°ViewµÄÐí¶àÐÅÏ¢£»ÉÏͼ×îµ×ÄÇÈý¸ö²Êɫԭµã´ú±íÁ˵±Ç°ViewµÄÐÔÄÜÖ¸±ê£¬´Ó×óµ½ÓÒÒÀ´Î´ú±í²âÁ¿¡¢²¼¾Ö¡¢»æÖƵÄäÖȾʱ¼ä£¬ºìÉ«ºÍ»ÆÉ«µÄµã´ú±íËÙ¶ÈäÖȾ½ÏÂýµÄView£¨µ±È»ÁË£¬ÓÐЩʱºò½ÏÂý²»´ú±íÓÐÎÊÌ⣬ƩÈçViewGroup×Ó½ÚµãÔ½¶à¡¢½á¹¹Ô½¸´ÔÓ£¬ÐÔÄܾÍÔ½²î£©¡£

µ±È»ÁË£¬ÔÚ×Ô¶¨ÒåViewµÄÐÔÄܵ÷ÊÔʱ£¬HierarchyViewerÉÏÃæµÄinvalidate LayoutºÍrequestLayout°´Å¥µÄ¹¦Äܸü¼ÓÇ¿´ó£¬Ëü¿ÉÒÔ°ïÖúÎÒÃÇdebug×Ô¶¨ÒåViewÖ´ÐÐinvalidate()ºÍrequestLayout()¹ý³Ì£¬ÎÒÃÇÖ»ÐèÒªÔÚ´úÂëµÄÏà¹ØµØ·½´òÉ϶ϵã¾ÍÐÐÁË£¬½ÓÏÂÀ´Í¨¹ýËü¹Û²ì»æÖƼ´¿É¡£

¿ÉÒÔ·¢ÏÖ£¬ÓÐÁËHierarchyViewerµ÷ÊÔ¹¤¾ß£¬ÎÒÃǵÄUIÐÔÄÜ·ÖÎö±äµÃÊ®·ÖÈÝÒ×£¬Õâ¸ö¹¤¾ßÒ²ÊÇÎÒÃÇ¿ª·¢Öе÷ÊÔUIµÄÀûÆ÷£¬ÔÚÆ½Ê±Ð´´úÂëʱ»áʱ³£°éËæÎÒÃÇ×óÓÒ¡£

2-3-2 ʹÓÃGPU¹ý¶È»æÖÆ·ÖÎöUIÐÔÄÜ

ÎÒÃǶÔÓÚUIÐÔÄܵÄÓÅ»¯»¹¿ÉÒÔͨ¹ý¿ª·¢ÕßÑ¡ÏîÖеÄGPU¹ý¶È»æÖƹ¤¾ßÀ´½øÐзÖÎö¡£ÔÚÉèÖÃ->¿ª·¢ÕßÑ¡Ïî->µ÷ÊÔGPU¹ý¶È»æÖÆ£¨²»Í¬É豸¿ÉÄÜλÖûòÕ߽з¨²»Í¬£©Öдò¿ªµ÷ÊÔºó¿ÉÒÔ¿´¼ûÈçÏÂͼ£¨¶Ôsettingsµ±Ç°½çÃæ¹ý¶È»æÖƽøÐзÖÎö£©£º

¿ÉÒÔ·¢ÏÖ£¬¿ªÆôºóÔÚÎÒÃÇÏëÒªµ÷ÊÔµÄÓ¦ÓýçÃæÖпÉÒÔ¿´µ½¸÷ÖÖÑÕÉ«µÄÇøÓò£¬¾ßÌ庬ÒåÈçÏ£º

ÓÉÓÚ¹ý¶È»æÖÆÖ¸ÔÚÆÁÄ»µÄÒ»¸öÏñËØÉÏ»æÖƶà´Î£¨Æ©ÈçÒ»¸öÉèÖÃÁ˱³¾°É«µÄTextView¾Í»á±»»æÖÆÁ½´Î£¬Ò»´Î±³¾°Ò»´ÎÎı¾£»ÕâÀïÐèҪǿµ÷µÄÊÇActivityÉèÖõÄThemeÖ÷ÌâµÄ±³¾°²»±»ËãÔÚ¹ý¶È»æÖƲ㼶ÖУ©£¬ËùÒÔ×îÀíÏëµÄ¾ÍÊÇ»æÖÆÒ»´Î£¬Ò²¾ÍÊÇÀ¶É«£¨µ±È»ÕâÔںܶàѤÀöµÄ½çÃæÊDz»ÏÖʵµÄ£¬ËùÒÔ´ó¼ÒÓиö¶È¼´¿É£¬ÎÒÃǵĿª·¢ÐÔÄÜÓÅ»¯±ê×¼ÒªÇó×¶Ë½çÃæÏºìÉ«ÇøÓò²»Äܳ¤ÆÚ³ÖÐø³¬¹ýÆÁÄ»Èý·ÖÖ®Ò»£¬¿É¼û»¹ÊDZȽϿíËɵĹ涨£©£¬Òò´ËÎÒÃÇÐèÒªÒÀ¾Ý´ËÑÕÉ«·Ö²¼½øÐдúÂëÓÅ»¯£¬Æ©ÈçÓÅ»¯²¼¾Ö²ã¼¶¡¢¼õÉÙû±ØÒªµÄ±³¾°¡¢ÔÝʱ²»ÏÔʾµÄViewÉèÖÃΪGONE¶ø²»ÊÇINVISIBLE¡¢×Ô¶¨ÒåViewµÄonDraw·½·¨ÉèÖÃcanvas.clipRect()Ö¸¶¨»æÖÆÇøÓò»òͨ¹ýcanvas.quickreject()¼õÉÙ»æÖÆÇøÓòµÈ¡£

2-3-3 ʹÓÃGPU³ÊÏÖģʽͼ¼°FPS¿¼ºËUIÐÔÄÜ

Android½çÃæÁ÷³©¶È³ý¹ýÊÓ¾õ¸ÐÖªÒÔÍâÊÇ¿ÉÒÔ¿¼ºËµÄ£¨²âÊÔÃÃ×ÓרÓã©£¬³£¼ûµÄ·½·¨¾ÍÊÇͨ¹ýGPU³ÊÏÖģʽͼ»òÕßʵʱFPSÏÔʾ½øÐп¼ºË£¬ÕâÀïÎÒÃÇÖ÷ÒªÕë¶ÔGPU³ÊÏÖģʽͼ½øÐÐÏÂ˵Ã÷£¬ÒòΪFPS¿¼ºË²âÊÔ·½·¨ÓкܶࣨƩÈç×Ô¼ºÐ´´úÂëʵÏÖ¡¢µÚÈý·½App²âÊÔ¡¢¹Ì¼þÖ§³ÖµÈ£©£¬ËùÒÔ²»×öͳһ˵Ã÷¡£

ͨ¹ý¿ª·¢ÕßÑ¡ÏîÖÐGPU³ÊÏÖģʽͼ¹¤¾ßÀ´½øÐÐÁ÷³©¶È¿¼Á¿µÄÁ÷³ÌÊÇ£¨×¢Ò⣺Èç¹ûÊÇÔÚ¿ªÆôÓ¦Óúó²Å¿ªÆô´Ë¹¦ÄÜ£¬¼ÇµÃÏȰÑÓ¦ÓýáÊøºóÖØÐÂÆô¶¯£©ÔÚÉèÖÃ->¿ª·¢ÕßÑ¡Ïî->GPU³ÊÏÖģʽ£¨²»Í¬É豸¿ÉÄÜλÖûòÕ߽з¨²»Í¬£©Öдò¿ªµ÷ÊÔºó¿ÉÒÔ¿´¼ûÈçÏÂͼ£¨¶Ôsettingsµ±Ç°½çÃæÉÏÏ»¬¶¯ÁбíºóµÄͼ±í£©£º

µ±È»£¬Ò²¿ÉÒÔÔÚÖ´ÐÐÍêUI»¬¶¯²Ù×÷ºóÔÚÃüÁîÐÐÊäÈëÈçÏÂÃüÁî²é¿´ÃüÁîÐдòÓ¡µÄGPUäÖȾÊý¾Ý£¨·ÖÎöÒÀ¾Ý£ºDraw + Process + Execute = ÍêÕûµÄÏÔʾһ֡ʱ¼ä < 16ms£©£º

adb shell dumpsys gfxinfo [Ó¦ÓðüÃû]

´ò¿ªÉÏͼ¿ÉÊÓ»¯¹¤¾ßºó£¬ÎÒÃÇ¿ÉÒÔÔÚÊÖ»ú»­ÃæÉÏ¿´µ½·á¸»µÄGPU»æÖÆÍ¼ÐÎÐÅÏ¢£¬·Ö±ðչʾÁËStatusBar¡¢NavgationBar¡¢ActivityÇøÓòµÈµÄGPUäÖȾʱ¼äÐÅÏ¢£¬Ëæ×ŽçÃæµÄˢУ¬½çÃæÉÏ»áÒÔʵʱÖù״ͼÀ´ÏÔʾÿ֡µÄäÖȾʱ¼ä£¬Öù״ͼԽ¸ß±íʾäÖȾʱ¼äÔ½³¤£¬Ã¿¸öÖù״ͼƫÉ϶¼ÓÐÒ»¸ù´ú±í16ms»ù×¼µÄÂÌÉ«ºáÏߣ¬Ã¿Ò»ÌõÊú×ŵÄÖù×´Ïß¶¼°üº¬Èý²¿·Ö£¨À¶É«´ú±í²âÁ¿»æÖÆDisplay ListµÄʱ¼ä£¬ºìÉ«´ú±íOpenGLäÖȾDisplay ListËùÐèÒªµÄʱ¼ä£¬»ÆÉ«´ú±íCPUµÈ´ýGPU´¦ÀíµÄʱ¼ä£©£¬Ö»ÒªÎÒÃÇÿһ֡µÄ×Üʱ¼äµÍÓÚ»ù×¼Ï߾Ͳ»»á·¢ÉúUI¿¨¶ÙÎÊÌ⣨¸ö±ð³¬³ö»ù×¼Ï߯äʵҲ²»ËãɶÎÊÌâµÄ£©¡£

¿ÉÒÔ·¢ÏÖ£¬Õâ¸ö¹¤¾ßÊÇÓоÖÏÞÐԵģ¬ËûËäÈ»Äܹ»¿´³öÀ´ÓÐÖ¡ºÄʱ³¬¹ý»ù×¼Ïßµ¼ÖÂÁ˶ªÖ¡¿¨¶Ù£¬µ«È´·ÖÎö²»µ½Ôì³É¶ªÖ¡µÄ¾ßÌåÔ­Òò¡£ËùÒÔ˵ΪÁËÅäºÏ½â¾ö·ÖÎöUI¶ªÖ¡¿¨¶ÙÎÊÌâÎÒÃÇ»¹ÐèÒª½èÖútraceviewºÍsystraceÀ´½øÐÐÔ­Òò×·×Ù£¬ÏÂÃæÎÒÃÇ»á½éÉÜÕâÁ½ÖÖ¹¤¾ßµÄ¡£

2-3-4 ʹÓÃLint½øÐÐ×ÊÔ´¼°ÈßÓàUI²¼¾ÖµÈÓÅ»¯

ÉÏÃæËµÁË£¬ÈßÓà×ÊÔ´¼°Âß¼­µÈÒ²¿ÉÄܻᵼÖ¼ÓÔØºÍÖ´ÐлºÂý£¬ËùÒÔÎÒÃǾÍÀ´¿´¿´LintÕâ¸ö¹¤¾ßÊÇÈçºÎ·¢ÏÖÓÅ»¯ÕâЩÎÊÌâµÄ£¨µ±È»ÁË£¬Lintʵ¼ÊµÄ¹¦ÄÜÊǷdz£Ç¿´óµÄ£¬ÎÒÃÇ¿ª·¢ÖÐÒ²ÊǾ­³£Ê¹ÓÃËüÀ´·¢ÏÖһЩÎÊÌâµÄ£¬ÕâÀïÖ÷ÒªÓеãÕë¶ÔUIÐÔÄܵÄ˵Ã÷ÁË£¬ÆäËûµÄÀ×ͬ£©¡£

ÔÚAndroid Studio 1.4°æ±¾ÖÐʹÓÃLint×î¼òµ¥µÄ°ì·¨¾ÍÊǽ«Êó±ê·ÅÔÚ´úÂëÇøµã»÷ÓÒ¼ü->Analyze->Inspect Code¨C>½çÃæÑ¡ÔñÄãÒª¼ì²âµÄÄ£¿é->µã»÷È·ÈÏ¿ªÊ¼¼ì²â£¬µÈ´ýһϺó»á·¢ÏÖÈçϽá¹û£º

¿ÉÒÔ¿´¼û£¬Lint¼ì²âÍêºó¸øÁËÎÒÃǺܶཨÒéµÄ£¬ÎÒÃÇÖØµã¿´Ò»¸ö¹ØÓÚUIÐÔÄܵļì²â½á¹û£»ÉÏͼÖиßÁÁµÄÄÇÒ»ÐÐÃ÷ȷ˵Ã÷ÁË´æÔÚÈßÓàµÄUI²ã¼¶Ç¶Ì×£¬ËùÒÔÎÒÃÇÊÇ¿ÉÒÔµã»÷Ìø½øÈ¥½øÐÐÓÅ»¯´¦ÀíµôµÄ¡£

µ±È»ÁË£¬Lint»¹Óкܶ๦ÄÜ£¬´ó¼Ò¿ÉÒÔ×ÔÐÐ̽Ë÷·¢»Ó£¬ÕâÀïÖ»ÊÇ´ïµ½Å×שÒýÓñµÄ×÷Óá£

2-3-5 ʹÓÃMemory¼à²â¼°GC´òÓ¡ÓëAllocation Tracker½øÐÐUI¿¨¶Ù·ÖÎö

¹ØÓÚAndroidµÄÄÚ´æ¹ÜÀí»úÖÆÏÂÃæµÄÒ»½Ú»áÏêϸ½éÉÜ£¬ÕâÀïÎÒÃÇÖ÷ÒªÕë¶ÔGCµ¼ÖµÄUI¿¨¶ÙÎÊÌâ½øÐÐÏêϸ˵Ã÷¡£

Androidϵͳ»áÒÀ¾ÝÄÚ´æÖв»Í¬µÄÄÚ´æÊý¾ÝÀàÐÍ·Ö±ðÖ´Ðв»Í¬µÄGC²Ù×÷£¬³£¼ûÓ¦Óÿª·¢Öе¼ÖÂGCƵ·±Ö´ÐеÄÔ­ÒòÖ÷Òª¿ÉÄÜÊÇÒòΪ¶Ìʱ¼äÄÚÓдóÁ¿Æµ·±µÄ¶ÔÏó´´½¨ÓëÊͷŲÙ×÷£¬Ò²¾ÍÊÇË׳ƵÄÄÚ´æ¶¶¶¯ÏÖÏ󣬻òÕß¶Ìʱ¼äÄÚÒѾ­´æÔÚ´óÁ¿ÄÚ´æÔÝÓýéÓÚãÐÖµ±ßÔµ£¬½Ó×Åÿµ±ÓÐжÔÏó´´½¨Ê±¶¼»áµ¼Ö³¬Ô½ãÐÖµ´¥·¢GC²Ù×÷¡£

ÈçÏÂÊÇÎÒ¹¤×÷ÖÐÒ»¸öÏîÄ¿µÄÒ»´Î¾­Àú£¨ÎÒ½«´úÂë»ØÍËÌØÒâץȡµÄ£©£¬³öÏÖÕâ¸öÎÊÌâµÄ³¡¾°ÊÇÒ»´ÎѹÁ¦²âÊÔµ¼ÖÂÕû¸öϵͳ¿¨¶Ù£¬Ë²¼äɱµôÓ¦ÓþÍOKÁË£¬¾¿ÆäÔ­Òò×îÖղ鵽ÊÇÒ»¸öAPIµÄµ÷ÔËλÖÃд´íÁË·½Ê½£¬µ¼ÖÂÒ»Ö±±»¿ñµ÷£¬µ±ÆÕͨʹÓÃʱ²»»áÓÐÎÊÌ⣬ѹÁ¦²âÊÔ±ØÏÖ¿¨¶Ù¡£¾ßÌåÄÚ´æ²Î¿¼Í¼ÈçÏ£º

Óë´Ë¶¶¶¯Í¼¶ÔÓ¦µÄLogCatץȡÈçÏ£º

//½ØÈ¡ÆäÖбȽÏÃܼ¯Ò»¶ÎLogCat£¬ÓëÉÏͼMemory¼ì²âµ½µÄ¶¶¶¯Í¼¶ÔÓ¦£¬ÆäÖÐxxxΪӦÓðüÃû
...... 10-06 00:59:45.619 xxx I/art: Explicit concurrent mark sweep GC freed 72515(3MB) AllocSpace objects, 65(2028KB) LOS objects, 80% free, 17MB/89MB, paused 3.505ms total 60.958ms 10-06 00:59:45.749 xxx I/art: Explicit concurrent mark sweep GC freed 5396(193KB) AllocSpace objects, 0(0B) LOS objects, 75% free, 23MB/95MB, paused 2.079ms total 100.522ms ......
10-06 00:59:48.059 xxx I/art: Explicit concurrent mark sweep GC freed 4693(172KB) AllocSpace objects, 0(0B) LOS objects, 75% free, 23MB/95MB, paused 2.227ms total 101.692ms
......

ÎÒÃÇÖªµÀ£¬ÀàËÆÉÏÃælogcat´òÓ¡Ò»Ñù£¬´¥·¢À¬»ø»ØÊÕµÄÖ÷ÒªÔ­ÒòÓÐÒÔϼ¸ÖÖ£º

GC_MALLOC¡ª¡ªÄÚ´æ·ÖÅäʧ°Üʱ´¥·¢£»

GC_CONCURRENT¡ª¡ªµ±·ÖÅäµÄ¶ÔÏó´óС³¬¹ýÒ»¸öÏÞ¶¨Öµ£¨²»Í¬ÏµÍ³£©Ê±´¥·¢£»

GC_EXPLICIT¡ª¡ª¶ÔÀ¬»øÊÕ¼¯µÄÏÔʽµ÷ÓÃ(System.gc()) £»

GC_EXTERNAL_ALLOC¡ª¡ªÍⲿÄÚ´æ·ÖÅäʧ°Üʱ´¥·¢£»

¿ÉÒÔ¿´¼û£¬ÕâÖÖ²»Í£µÄ´óÃæ»ý´òÓ¡GCµ¼ÖÂËùÓÐÏß³ÌÔÝÍ£µÄ²Ù×÷±Ø¶¨»áµ¼ÖÂUIÊÓ¾õµÄ¿¨¶Ù£¬ËùÒÔÎÒÃÇÒª±ÜÃâ´ËÀàÎÊÌâµÄ³öÏÖ£¬¾ßÌåµÄ³£¼ûÓÅ»¯·½Ê½ÈçÏ£º

¼ì²é´úÂ룬¾¡Á¿±ÜÃâÓÐЩƵ·±´¥·¢µÄÂß¼­·½·¨ÖдæÔÚ´óÁ¿¶ÔÏó·ÖÅ䣻

¾¡Á¿±ÜÃâÔÚ¶à´ÎforÑ­»·ÖÐÆµ·±·ÖÅä¶ÔÏó£»

±ÜÃâÔÚ×Ô¶¨ÒåViewµÄonDraw()·½·¨ÖÐÖ´Ðи´ÔӵIJÙ×÷¼°´´½¨¶ÔÏ󣍯©ÈçPaintµÄʵÀý»¯²Ù×÷²»ÒªÐ´ÔÚonDraw()·½·¨Öеȣ©£»

¶ÔÓÚ²¢·¢ÏÂÔØµÈÀàËÆÂß¼­µÄʵÏÖ¾¡Á¿±ÜÃâ¶à´Î´´½¨Ï̶߳ÔÏ󣬶øÊǽ»¸øÏ̳߳ش¦Àí¡£

µ±È»ÁË£¬ÓÐÁËÉÏÃæËµÃ÷GCµ¼ÖµÄÐÔÄܺóÎÒÃǾ͸ö¨Î»·ÖÎöÎÊÌâÁË£¬¿ÉÒÔͨ¹ýÔËÐÐDDMS->Allocation Tracker±êÇ©´ò¿ªÒ»¸öд°¿Ú£¬È»ºóµã»÷Start Tracing°´Å¥£¬½Ó×ÅÔËÐÐÄãÏë·ÖÎöµÄ´úÂ룬ÔËÐÐÍê±Ïºóµã»÷Get Allocations°´Å¥¾ÍÄܹ»¿´¼ûÒ»¸öÒÑ·ÖÅä¶ÔÏóµÄÁÐ±í£¬ÈçÏ£º

µã»÷ÉÏÃæµÚÒ»¸ö±í¸ñÖеÄÈκÎÒ»Ïî¾ÍÄܹ»ÔÚµÚ¶þ¸ö±í¸ñÖп´¼ûµ¼Ö¸ÃÄÚ´æ·ÖÅäµÄÕ»ÐÅÏ¢£¬Í¨¹ýÕâ¸ö¹¤¾ßÎÒÃÇ¿ÉÒԺܷ½±ãµÄÖªµÀ´úÂë·ÖÅäÁËÄÄÀà¶ÔÏó¡¢ÔÚÄĸöÏ̡߳¢ÄĸöÀà¡¢ÄĸöÎļþµÄÄÄÒ»ÐС£Æ©ÈçÎÒÃÇ¿ÉÒÔͨ¹ýAllocation Tracker·Ö±ð×öÒ»´ÎPaint¶ÔÏóʵÀý»¯ÔÚonDrawÓë¹¹Ôì·½·¨µÄÒ»¸ö×Ô¶¨ÒåViewµÄÄÚ´æ¸ú×Ù£¬È»ºóÄã¾ÍÃ÷°×Õâ¸ö¹¤¾ßµÄÇ¿´óÁË¡£

PSÒ»¾ä£¬Android Studioа汾³ý¹ýDDMSÒÔÍâÔÚMemoryÊÓͼµÄ×ó²àÒѾ­¼¯³ÉÁËAllocation Tracker¹¦ÄÜ£¬Ö»ÊÇÓÃÆðÀ´»¹ÊÇûÓÐDDMSµÄ·½±ãʵÓã¬ÈçÏÂͼ£º

2-3-6 ʹÓÃTraceviewºÍdmtracedump½øÐзÖÎöÓÅ»¯

¹ØÓÚUI¿¨¶ÙÎÊÌâÎÒÃÇ»¹¿ÉÒÔͨ¹ýÔËÐÐTraceview¹¤¾ß½øÐзÖÎö£¬ËûÊÇÒ»¸ö·ÖÎöÆ÷£¬¼Ç¼ÁËÓ¦ÓóÌÐòÖÐÿ¸öº¯ÊýµÄÖ´ÐÐʱ¼ä£»ÎÒÃÇ¿ÉÒÔ´ò¿ªDDMSÈ»ºóÑ¡ÔñÒ»¸ö½ø³Ì£¬½Ó×ŵã»÷ÉÏÃæµÄ¡°Start Method Profiling¡±°´Å¥£¨ºìɫСµã±äΪºÚÉ«¼´¿ªÊ¼ÔËÐУ©£¬È»ºó²Ù×÷ÎÒÃǵĿ¨¶ÙUI£¨Ð¡·¶Î§²âÊÔ£¬ËùÒÔ²Ù×÷×îºÃ²»Òª³¬¹ý5s£©£¬ÍêÊÂÔÙµãһϸղŰ´µÄÄǸö°´Å¥£¬ÉÔµÈÆ¬¿Ì¼´¿É³öÏÖÏÂͼ£¬ÈçÏ£º

»¨»¨ÂÌÂ̵ÄÒ»·ùͼÎÒÃÇÔõô·ÖÎöÄØ£¿ÏÂÃæÎÒÃǽâÊÍÏÂÈçºÎͨ¹ý¸Ã¹¤¾ß¶¨Î»ÎÊÌ⣺

Õû¸ö½çÃæ°üÀ¨ÉÏÏÂÁ½²¿·Ö£¬ÉÏÃæÊÇÄã²âÊԵĽø³ÌÖÐÿ¸öÏß³ÌÔËÐеÄʱ¼äÏߣ¬ÏÂÃæÊÇÿ¸ö·½·¨£¨°üº¬parent¼°child£©Ö´Ðеĸ÷¸öÖ¸±êµÄÖµ¡£Í¨¹ýÉÏͼµÄʱ¼äÃæ°å¿ÉÒÔÖ±¹Û·¢ÏÖ£¬Õû¸ötraceʱ¼ä¶ÎmainÏß³Ì×öµÄÊÂÇéÌØ±ð¶à£¬ÆäËûµÄ×öµÄÏà¶Ô½ÏÉÙ¡£µ±ÎÒÃÇÑ¡ÔñÉÏÃæµÄÒ»¸öÏ̺߳ó¿ÉÒÔ·¢ÏÖÏÂÃæµÄÐÔÄÜÃæ°åºÜ¸´ÔÓ£¬ÆäʵÕâ²ÅÊÇTraceViewµÄºËÐÄͼ±í£¬ËüÖ÷ҪչʾÁËÏß³ÌÖи÷¸ö·½·¨µÄµ÷ÓÃÐÅÏ¢£¨CPUʹÓÃʱ¼ä¡¢µ÷ÓôÎÊýµÈ£©£¬ÕâЩÐÅÏ¢¾ÍÊÇÎÒÃÇ·ÖÎöUIÐÔÄÜ¿¨¶ÙµÄºËÐĹØ×¢µã£¬ËùÒÔÎÒÃÇÏÈ¿´¼¸¸öÖØÒªµÄÊôÐÔ˵Ã÷£¬ÈçÏ£º

ÓÐÁ˶ÔÉÏÃæTraceviewͼ±íµÄÒ»¸öÈÏʶ֮ºóÎÒÃǾÍÀ´¿´¿´¾ßÌåµ¼ÖÂUIÐÔÄܺó¸ÃÈçºÎÇÐÈë·ÖÎö£¬Ò»°ãTraceview¿ÉÒÔ¶¨Î»Á½ÀàÐÔÄÜÎÊÌ⣺

·½·¨µ÷ÔËÒ»´ÎÐèÒªºÄ·ÑºÜ³¤Ê±¼äµ¼Ö¿¨¶Ù£»

·½·¨µ÷ÔËÒ»´ÎºÄʱ²»³¤£¬µ«±»Æµ·±µ÷Ô˵¼ÖÂÀÛ¼ÆÊ±³¤¿¨¶Ù¡£

Æ©ÈçÎÒÃÇÀ´¾Ù¸öʵÀý£¬ÓÐʱºòÎÒÃÇдÍêAppÔÚʹÓÃʱ²»¾õµÃÓÐɶ´óµÄÓ°Ï죬µ«Êǵ±ÎÒÃÇÆô¶¯ÍêAppºó¾²Ö¹ÔÚÄÇÈ´Ê®·Ö·Ñµç»òÕßµ¼ÖÂÉ豸·¢ÈÈ£¬ÕâÖÖÇé¿öÎÒÃǾͿÉÒÔ´ò¿ªTraceviewÈ»ºó°´ÕÕCpu Time/Call»òÕßReal Time/Call½øÐнµÐòÅÅÁУ¬È»ºó´ò¿ª¿ÉÒɵķ½·¨¼°Æächild½øÐзÖÎö²é¿´£¬È»ºóÔٻص½´úÂ붨λ¼ì²éÂß¼­ÓÅ»¯¼´¿É£»µ±È»ÁË£¬ÎÒÃÇÒ²¿ÉÒÔͨ¹ý¸Ã¹¤¾ßÀ´traceÎÒÃÇ×Ô¶¨ÒåViewµÄһЩ·½·¨À´È¨ºâÐÔÄÜÎÊÌ⣬ÕâÀï²»ÔÙÒ»Ò»ÁоÙà¶¡£

¿ÉÒÔ¿´¼û£¬TraceviewÄܹ»°ïÖúÎÒÃÇ·ÖÎö³ÌÐòÐÔÄÜ£¬ÒѾ­ºÜ·½±ãÁË£¬È»¶øTraceview¼Ò×廹ÓÐÒ»¸ö¸ü¼ÓÖ±¹ÛÇ¿´óµÄС¹¤¾ß£¬ÄǾÍÊÇ¿ÉÒÔͨ¹ýdmtracedumpÉú³É·½·¨µ÷ÓÃͼ¡£¾ßÌå×ö·¨ÈçÏ£º

dmtracedump -g result.png target.trace  //½á¹ûpngÎļþ Ä¿±êtraceÎļþ

ͨ¹ýÕâ¸öÉú³ÉµÄ·½·¨µ÷ÔËͼÎÒÃÇ¿ÉÒÔ¸ü¼ÓÖ±¹ÛµÄ·¢ÏÖһЩ·½·¨µÄµ÷ÔËÒì³£ÏÖÏó¡£²»¹ý±¾ÈËÓÅ»¯µ½ÏÖÔÚ»¹Ã»ÔõôÓõ½Ëü£¬Ã¿´ÎÓõ½Traceview·ÖÎö¾ÍÒѾ­¸ã¶¨ÎÊÌâÁË£¬ËùÒÔ˵dmtracedump×Ô¼º×ÃÇéʹÓðɡ£

PSÒ»¾ä£¬Android Studioа汾³ý¹ýDDMSÒÔÍâÔÚCPUÊÓͼµÄ×ó²àÒѾ­¼¯³ÉÁËTraceview£¨start Method Tracing£©¹¦ÄÜ£¬Ö»ÊÇÓÃÆðÀ´»¹ÊÇûÓÐDDMSµÄ·½±ãʵÓã¨ÕâÀïÓÐһƪAS MT¸öÈ˾õµÃ²»´íµÄ·ÖÎöÎÄÕ£¨ÒýÓÃ×ÔÍøÂ磬Á´½ÓÊôÓÚÔ­×÷Õß¹¦ÀÍ£©£©£¬ÈçÏÂͼ£º

2-3-7 ʹÓÃSystrace½øÐзÖÎöÓÅ»¯

SystraceÆäʵÓÐЩÀàËÆTraceview£¬ËüÊǶÔÕû¸öϵͳ½øÐзÖÎö£¨Í¬Ò»Ê±¼äÖá°üº¬Ó¦Óü°SurfaceFlinger¡¢WindowManagerServiceµÈÄ£¿é¡¢·þÎñÔËÐÐÐÅÏ¢£©£¬²»¹ýÕâ¸ö¹¤¾ßÐèÒªÄãµÄÉ豸ÄÚºËÖ§³Ötrace£¨ÃüÁîÐмì²é/sys/kernel/debug/tracing£©ÇÒÉ豸ÊÇeng»òuserdebug°æ±¾²Å¿ÉÒÔ£¬ËùÒÔʹÓÃǰÂé·³×Ô¼ºÈ·ÈÏһϡ£

ÎÒÃÇÔÚ·ÖÎöUIÐÔÄÜʱһ°ãÖ»¹Ø×¢Í¼ÐÎÐÔÄÜ£¨ËùÒÔ±ØÐëÑ¡ÔñGraphicsºÍView£¬ÆäËûËæÒ⣩£¬Í¬Ê±Ò»°ã¶ÔÓÚ¿¨¶ÙµÄץȡ¶¼ÊÇ5s£¬×î¶à10s¡£Æô¶¯Systrace½øÐÐÊý¾Ýץȡ¿ÉÒÔͨ¹ýÁ½ÖÖ·½Ê½£¬ÃüÁîÐз½Ê½ÈçÏ£º

python systrace.py --time=10 -o mynewtrace.html sched gfx view wm

ͼÐÎģʽ£º

´ò¿ªDDMS->Capture system wide trace using Android systrace->ÉèÖÃʱ¼äÓëÑ¡Ïîµã»÷OK¾Í¿ªÊ¼ÁËץȡ£¬½Ó×ŲÙ×÷APP£¬ÍêÊÂÉú³ÉÒ»¸ötrace.htmlÎļþ£¬ÓÃChrome´ò¿ª¼´¿ÉÈçÏÂͼ£º

ÔÚChromeÖÐä¯ÀÀ·ÖÎö¸ÃÎļþÎÒÃÇ¿ÉÒÔͨ¹ý¼üÅ̵ÄW-A-S-D¼üÀ´¸ã¶¨£¬ÓÉÓÚÉÏÃæÎÒÃÇÔÚ½øÐÐtraceʱѡÔñÁËһЩѡÏËùÒÔÉÏͼÉú³ÉÁË×óÉÏ·½Ïà¹ØµÄCPUƵÂÊ¡¢¸ºÔØ¡¢×´Ì¬µÈÐÅÏ¢£¬ÆäÖеÄCPU N´ú±íÁËCPUºËÊý£¬Ã¿¸öCPUÐеÄÖù״ͼ±í´ú±íÁ˵±Ç°Ê±¼ä¶Îµ±Ç°ºËÉϵÄÔËÐÐÐÅÏ¢£»ÏÂÃæÎÒÃÇÔÙÀ´¿´¿´SurfaceFlingerµÄ½âÊÍ£¬ÈçÏ£º

¿ÉÒÔ¿´¼ûÉÏÃæ×ó±ßÀ¸µÄSurfaceFlingerÆäʵ¾ÍÊǸºÔð»æÖÆAndroid³ÌÐòUIµÄ·þÎñ£¬ËùÒÔSurfaceFlingerÄÜ·´Ó¦³öÕûÌ廿֯Çé¿ö£¬¿ÉÒÔ¹Ø×¢ÉÏͼVSYNC-appÒ»ÐпÉÒÔ·¢ÏÖǰ5s¶à»ù±¾¶¼Äܹ»´ïµ½16msˢмä¸ô£¬5s¶à¿ªÊ¼µ½7s¶à´óÓÚÁË15ms£¬ËµÃ÷´Ëʱ´æÔÚ»æÖƶªÖ¡¿¨¶Ù£»Í¬Ê±¿ÉÒÔ·¢ÏÖsurfaceflingerÒ»ÐÐÃ÷ÏÔ´æÔÚÀàËÆ²»¹æÂɼä¸ô£¬ÕâÊÇÒòΪÓеĵط½ÊDz»ÐèÒªÖØÐÂäÖȾUI£¬ËùÒÔÓдó·¶Î§²»¹æÂÉ£¬ÓеÄÊÇÒòΪ×èÈûµ¼Ö²»¹æÂÉ£¬Ã÷ÏÔ¿ÉÒÔ·¢ÏÖ0µ½4s¼ä´ó¶àÊDz»ÐèÒªäÖȾ£¬¶ø5sÒÔºó´ó¶àÊÇ×èÈûµ¼Ö£»¶ÔÓ¦Õâ¸öʱ¼äµãÎÒÃÇ·Å´ó¿ÉÒÔ¿´µ½Ã¿¸ö²¿·ÖËùʹÓõÄʱ¼äºÍÕýÔÚÖ´ÐеÄÈÎÎñ£¬¾ßÌåÈçÏ£º

¿ÉÒÔ·¢ÏÖ¾ßÌåµÄÖ´ÐÐÃ÷ÏÔ´æÔÚ³¬Ê±ÐÔÄÜ¿¨¶Ù£¨Ô­µã²»ÊÇÂÌÉ«µÄ»ù±¾¶¼´ú±í´æÔÚÒ»¶¨ÎÊÌ⣬ÏÂÃæºÍÓҲ඼»áÌáʾÄãÑ¡ÔñµÄÖ¡Ïà¹ØÏêϸÐÅÏ¢»òÕßalertÐÅÏ¢£©£¬µ«ÊÇÒź¶µÄÊÇͨ¹ýSystraceÖ»ÄÜ´óÌåÉÏ·¢ÏÖÊÇ·ñ´æÔÚÐÔÄÜÎÊÌ⣬¾ßÌåÎÊÌ⻹ÐèҪͨ¹ýTraceview»òÕß´úÂëÖÐǶÈëTrace¹¤¾ßÀàµÈÈ¥¼ÌÐøÏêϸ·ÖÎö£¬×ÜÖ®ºÜµ°ÌÛ¡£

PS£ºÈç¹ûÄãÏëʹÓÃSystraceºÜÇáËɵķÖÎö¶¨Î»ËùÓÐÎÊÌ⣬¿´Ã÷°×ËùÓеÄÐк¬Ò壬Ä㻹ÐèÒª¾ß±¸·Ç³£ÔúʵµÄAndroidϵͳ¿ò¼ÜµÄÔ­Àí²Å¿ÉÒÔ½«¸Ã¹¤¾ßʹÓõĵÃÐÄÓ¦ÊÖ¡£

2-3-8 ʹÓÃtraces.txtÎļþ½øÐÐANR·ÖÎöÓÅ»¯

ANR£¨Application Not Responding£©ÊÇAndroidÖÐAMSÓëWMS¼à²âÓ¦ÓÃÏìÓ¦³¬Ê±µÄ±íÏÖ£»Ö®ËùÒ԰ѳôÃûÕÑÖøµÄANRµ¥¶À×÷ΪUIÐÔÄÜ¿¨¶ÙµÄ·ÖÎöÀ´ËµÃ÷ÊÇÒòΪANRÊÇÖ±½Ó¿¨ËÀUI²»¶¯ÇÒ±ØÐëÒª½âµôµÄBug£¬ÎÒÃDZØÐ뾡Á¿ÔÚ¿ª·¢Ê±±ÜÃâËûµÄ³öÏÖ£¬µ±È»ÁË£¬ÍòÒ»³öÏÖÁËÄǾÍÓÃÏÂÃæ½éÉܵķ½·¨À´·ÖÎö°É¡£

ÎÒÃÇÓ¦Óÿª·¢Öг£¼ûµÄANRÖ÷ÒªÓÐÈçϼ¸Àࣺ

°´¼ü´¥ÃþʼþÅÉ·¢³¬Ê±ANR£¬Ò»°ããÐֵΪ5s£¨ÉèÖÃÖпªÆôANRµ¯´°£¬Ä¬ÈÏÓÐʼþÅÉ·¢²Å»á´¥·¢µ¯¿òANR£©£»

¹ã²¥×èÈûANR£¬Ò»°ããÐֵΪ10s£¨ÉèÖÃÖпªÆôANRµ¯´°£¬Ä¬Èϲ»µ¯¿ò£¬Ö»ÓÐlogÌáʾ£©£»

·þÎñ³¬Ê±ANR£¬Ò»°ããÐֵΪ20s£¨ÉèÖÃÖпªÆôANRµ¯´°£¬Ä¬Èϲ»µ¯¿ò£¬Ö»ÓÐlogÌáʾ£©£»

µ±ANR·¢Éúʱ³ý¹ýlogcat¿ÉÒÔ¿´¼ûµÄlogÒÔÍâÎÒÃÇ»¹¿ÉÒÔÔÚϵͳָ¶¨Ä¿Â¼ÏÂÕÒµ½tracesÎļþ»òdropboxÎļþ½øÐзÖÎö£¬·¢ÉúANRºóÎÒÃÇ¿ÉÒÔͨ¹ýÈçÏÂÃüÁîµÃµ½ANR traceÎļþ£º

adb pull /data/anr/traces.txt ./

È»ºóÎÒÃÇÓÃtxt±à¼­Æ÷´ò¿ª¿ÉÒÔ·¢ÏÖÈçϽṹ·ÖÎö£º

//ÏÔʾ½ø³Ìid¡¢ANR·¢Éúʱ¼äµã¡¢ANR·¢Éú½ø³Ì°üÃû
----- pid 19073 at 2015-10-08 17:24:38 -----
Cmd line: com.example.yanbo.myapplication
//һЩGCµÈobjectÐÅÏ¢£¬Í¨³£¿ÉÒÔºöÂÔ
......
//ANR·½·¨¶ÑÕ»´òÓ¡ÐÅÏ¢£¡Öص㣡
DALVIK THREADS (18):
"main" prio=5 tid=1 Sleeping
| group="main" sCount=1 dsCount=0 obj=0x7497dfb8 self=0x7f9d09a000
| sysTid=19073 nice=0 cgrp=default sched=0/0 handle=0x7fa106c0a8
| state=S schedstat=( 125271779 68162762 280 ) utm=11 stm=1 core=0 HZ=100
| stack=0x7fe90d3000-0x7fe90d5000 stackSize=8MB
| held mutexes=
at java.lang.Thread.sleep!(Native method)
- sleeping on <0x0a2ae345> (a java.lang.Object)
at java.lang.Thread.sleep(Thread.java:1031)
- locked <0x0a2ae345> (a java.lang.Object)
//ÕæÕýµ¼ÖÂANRµÄÎÊÌâµã£¬¿ÉÒÔ·¢ÏÖÊÇonClickÖÐÓÐsleepµ¼Ö¡£ÎÒÃÇÆ½Ê±¿ÉÒÔÀà±È·ÖÎö¼´¿É£¬ÕâÀï²»Ïêϸ˵Ã÷¡£
at java.lang.Thread.sleep(Thread.java:985)
at com.example.yanbo.myapplication.MainActivity$1.onClick(MainActivity.java:21)
at android.view.View.performClick(View.java:4908)
at android.view.View$PerformClick.run(View.java:20389)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5743)
at java.lang.reflect.Method.invoke!(Native method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:988)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)
......
//Ê¡ÂÔһЩ²»³£¹Ø×¢¶ÑÕ»´òÓ¡
......

ÖÁ´Ë³£¼ûµÄÓ¦Óÿª·¢ÖÐANR·ÖÎö¶¨Î»¾Í¿ÉÒÔ½â¾öÁË¡£

2-4 Ó¦ÓÃUIÐÔÄÜ·ÖÎö½â¾ö×ܽá

¿ÉÒÔ¿´¼û£¬¹ØÓÚAndroid UI¿¨¶ÙµÄÐÔÄÜ·ÖÎö»¹ÊÇÓкܶ๤¾ßµÄ£¬ÉÏÃæÖ»ÊǽéÉÜÁËÓ¦Óÿª·¢ÖÐÎÒÃǾ­³£Ê¹ÓõÄһЩ¶øÒÑ£¬»¹ÓÐһЩÆäËûµÄ£¬Æ©ÈçOprofileµÈ¹¤¾ß²»Ôõô³£Óã¬ÕâÀï¾Í²»ÔÙÏêϸ½éÉÜ¡£

ͨ¹ýÉÏÃæUIÐÔÄܵÄÔ­Àí¡¢Ô­Òò¡¢¹¤¾ß·ÖÎö×ܽá¿ÉÒÔ·¢ÏÖ£¬ÎÒÃÇÔÚ¿ª·¢Ó¦ÓÃʱһ¶¨ÒªÊ±¿ÌÖØÊÓÐÔÄÜÎÊÌ⣬ÈçÈôÕæµÄûÁôÒâ³öÏÖÁËÐÔÄÜÎÊÌ⣬²»·ÁʹÓÃÉÏÃæµÄһЩ°¸Àý·½Ê½½øÐзÖÎö¡£µ«ÊÇÄÇÖÕ¹éÊDz¹¾È´ëÊ©£¬ÔÚÎÒÃÇÖªµÀÉÏÃæUI¿¨¶ÙÔ­ÀíÖ®ºóÎÒÃÇÓ¦¸Ã¾¡Á¿´ÓÏîÄ¿´úÂë¼Ü¹¹´î½¨¼°±àдʱ¾Í±ÜÃâһЩUIÐÔÄÜÎÊÌ⣬¾ßÌåÏîÄ¿Öг£¼ûµÄ×¢ÒâÊÂÏîÈçÏ£º

²¼¾ÖÓÅ»¯£»¾¡Á¿Ê¹ÓÃinclude¡¢merge¡¢ViewStub±êÇ©£¬¾¡Á¿²»´æÔÚÈßÓàǶÌ×¼°¹ýÓÚ¸´ÔÓ²¼¾Ö£¨Æ©Èç10²ã¾Í»áÖ±½ÓÒì³££©£¬¾¡Á¿Ê¹ÓÃGONEÌæ»»INVISIBLE£¬Ê¹ÓÃweightºó¾¡Á¿½«widthºÍheighÉèÖÃΪ0dp¼õÉÙÔËË㣬Item´æÔڷdz£¸´ÔÓµÄǶÌ×ʱ¿¼ÂÇʹÓÃ×Ô¶¨ÒåItem ViewÀ´È¡´ú£¬¼õÉÙmeasureÓëlayout´ÎÊýµÈ¡£

ÁÐ±í¼°AdapterÓÅ»¯£»¾¡Á¿¸´ÓÃgetView·½·¨ÖеÄÏà¹ØView£¬²»Öظ´»ñȡʵÀýµ¼Ö¿¨¶Ù£¬ÁÐ±í¾¡Á¿ÔÚ»¬¶¯¹ý³ÌÖв»½øÐÐUIÔªËØË¢Ðµȡ£

±³¾°ºÍͼƬµÈÄÚ´æ·ÖÅäÓÅ»¯£»¾¡Á¿¼õÉÙ²»±ØÒªµÄ±³¾°ÉèÖã¬Í¼Æ¬¾¡Á¿Ñ¹Ëõ´¦ÀíÏÔʾ£¬¾¡Á¿±ÜÃâÆµ·±ÄÚ´æ¶¶¶¯µÈÎÊÌâ³öÏÖ¡£

×Ô¶¨ÒåViewµÈ»æÍ¼Óë²¼¾ÖÓÅ»¯£»¾¡Á¿±ÜÃâÔÚdraw¡¢measure¡¢layoutÖÐ×ö¹ýÓÚºÄʱ¼°ºÄÄÚ´æ²Ù×÷£¬ÓÈÆäÊÇdraw·½·¨ÖУ¬¾¡Á¿¼õÉÙdraw¡¢measure¡¢layoutµÈÖ´ÐдÎÊý¡£

±ÜÃâANR£¬²»ÒªÔÚUIÏß³ÌÖÐ×öºÄʱ²Ù×÷£¬×ñÊØANR¹æ±ÜÊØÔò£¬Æ©Èç¶à´ÎÊý¾Ý¿â²Ù×÷µÈ¡£

µ±È»ÁË£¬ÉÏÃæÖ»ÊÇÁгöÁËÎÒÃÇÏîÄ¿Öг£¼ûµÄһЩUIÐÔÄÜ×¢ÒâÊÂÏî¶øÒÑ£¬ÏàÐÅ»¹ÓкܶàÆäËûµÄÇé¿öÕâÀïûÓÐ˵µ½£¬»¶Ó­²¹³ä¡£»¹ÓÐÒ»µã¾ÍÊÇÎÒÃÇÉÏÃæËùνµÄUIÐÔÄÜÓÅ»¯·ÖÎö×ܽáµÈ¶¼Êǽ¨ÒéÐԵģ¬ÒòΪÐÔÄÜÕâ¸öÎÊÌâÊÇÒ»¸öÉæ¼°ÃæºÜ¹ãºÜ·ºµÄÎÊÌ⣬ÓÐЩÓÅ»¯²»ÊDZØÐèµÄ£¬ÓÐЩÓÅ»¯ÊDZØÐèµÄ£¬ÓÐЩÓÅ»¯µôÒÔºóÓÖÊǵò»³¥Ê§µÄ£¬ËùÒÔÎÒÃÇÒ»°ã×ÅÊÖ½â¾öÄÇЩ±ØÐëµÄ¾Í¿ÉÒÔÁË¡£

3 Ó¦Óÿª·¢MemoryÄÚ´æÐÔÄÜ·ÖÎöÓÅ»¯

˵ÍêÁËÓ¦Óÿª·¢ÖеÄUIÐÔÄÜÎÊÌâºóÎÒÃǾ͸ÃÀ´¹Ø×¢Ó¦Óÿª·¢ÖеÄÁíÒ»¸öÖØÒª¡¢ÑÏÖØ¡¢·Ç³£ÖØÒªµÄÐÔÄÜÎÊÌâÁË£¬ÄǾÍÊÇÄÚ´æÐÔÄÜÓÅ»¯·ÖÎö¡£AndroidÆäʵ¾ÍÊÇǶÈëʽÉ豸£¬Ç¶ÈëʽÉ豸ºËÐĹØ×¢µãÖ®Ò»¾ÍÊÇÄÚ´æ×ÊÔ´£»ÓÐÈË˵ÏÖÔÚµÄÉ豸¶¼ÔÚ¶ÑÓ²¼þÅäÖã¨Æ©Èç¹ú²úijÃ×µÄijÍÃÅÜ·ÖÊÖ»ú¡¢ºÐ×ӵȣ©£¬ËùÒÔÄÚ´æ²»»áÔÙÏñÒÔǰÄÇô½ôÕÅÁË£¬ÆäʵÕâ¾ä»°Ìý×Åû´í£¬µ«ÎªÉ¶ÔÙÅ£±ÆÅäÖõÄAndroidÉ豸ÉÏÓÐЩӦÓû¹ÊÇÔ½ÓÃϵͳԽ¿¨ÄØ£¿ÕâÀïÃæµÄÔ­ÒòÓкܶ࣬²»¹ýÏàÐÅÓÐÁËÕâÒ»ÕÂÏÂÃæµÄÄÚÈÝ·ÖÎö£¬×÷Ϊһ¸öÒÆ¶¯¿ª·¢ÕßµÄÄã¾ÍÓÐÄÜÁ¦´òÀíºÃ×Ô¼ºÓ¦ÓõÄÄÇһĶÈý·ÖµØÄÚ´æÁË£¬ÄÜ×öµ½ÕâÑù¾Í×ãÒÔÁË¡£¹ØÓÚAndroidÄÚ´æÓÅ»¯£¬ÕâÀïÓÐһƪGoogleµÄ¹Ù·½Ö¸µ¼Îĵµ£¬µ«ÊDZ¾ÎÄΪ×Ô¼ºÏîÄ¿ÃþË÷£¬»áÓкܶ಻һÑùµÄµØ·½¡£

3-1 AndroidÄÚ´æ¹ÜÀíÔ­Àí

ϵͳ¼¶ÄÚ´æ¹ÜÀí£º

AndroidϵͳÄÚºËÊÇ»ùÓÚLinux£¬ËùÒÔ˵AndroidµÄÄÚ´æ¹ÜÀíÆäʵҲÊÇLinuxµÄÉý¼¶°æ¶øÒÑ¡£LinuxÔÚ½ø³ÌÍ£Ö¹ºó¾Í½áÊø¸Ã½ø³Ì£¬¶øAndroid°ÑÕâЩֹͣµÄ½ø³Ì¶¼±£ÁôÔÚÄÚ´æÖУ¬Ö±µ½ÏµÍ³ÐèÒª¸ü¶àÄÚ´æÊ±²ÅÑ¡ÔñÐÔµÄÊÍ·ÅһЩ£¬±£ÁôÔÚÄÚ´æÖеĽø³ÌĬÈÏ£¨²»°üº¬ºǫ́serviceÓëThreadµÈµ¥¶ÀUIÏ̵߳Ľø³Ì£©²»»áÓ°ÏìÕûÌåϵͳµÄÐÔÄÜ£¨ËÙ¶ÈÓëµçÁ¿µÈ£©ÇÒµ±ÔÙ´ÎÆô¶¯ÕâЩ±£ÁôÔÚÄÚ´æµÄ½ø³Ìʱ¿ÉÒÔÃ÷ÏÔÌá¸ßÆô¶¯ËÙ¶È£¬²»ÐèÒªÔÙÈ¥¼ÓÔØ¡£

ÔÙÖ±°×µã¾ÍÊÇ˵Androidϵͳ¼¶ÄÚ´æ¹ÜÀí»úÖÆÆäʵÀàËÆÓÚJavaµÄÀ¬»ø»ØÊÕ»úÖÆ£¬ÕâÏÂÃ÷°×Á˰ɣ»ÔÚAndroidϵͳÖпò¼Ü»á¶¨ÒåÈçϼ¸Àà½ø³Ì¡¢ÔÚϵͳÄÚ´æ´ïµ½¹æ¶¨µÄ²»Í¬levelãÐֵʱ´¥·¢Çå¿Õ²»Í¬levelµÄ½ø³ÌÀàÐÍ¡£

¿ÉÒÔ¿´¼û£¬ËùνµÄÎÒÃǵÄServiceÔÚºǫ́ÅÜ×ÅÅÜ׏ÒÁË£¬»òÕߺÐ×ÓÉÏÓÐЩ´óÐÍÓÎÏ·Æô¶¯ÆðÀ´¾Í¹Ò£¨Ö®Ç°ÎÒÔÚÉϼҹ«Ë¾×öºÐ×ÓʱÓö¼û¹ý£©£¬ÓÐÒ»¸öÖ±½ÓµÄÔ­Òò¾ÍÊÇÕâ¸öãÐÖµ¶¨ÒåµÄÌ«´ó£¬µ¼ÖÂϵͳһֱÈÏΪÒѾ­´ïµ½ãÐÖµ£¬ËùÒÔ½øÐÐÓÅÏÈÇå³ýÁË·ûºÏÀàÐ͵Ľø³Ì¡£ËùÒÔ˵£¬¸ÃãÐÖµµÄÉ趨ÊÇÓÐһЩ½²¾¿µÄ£¬¶î£¬³¶¶àÁË£¬ÎÒÃÇÖ÷ÒªÊÇÕë¶ÔÓ¦ÓòãÄÚ´æ·ÖÎöµÄ£¬ÏµÍ³¼¶ÄÚ´æ»ØÊÕÁ˽âÕâЩ¾Í»ù±¾¹»½âÊÍÎÒÃÇÓ¦ÓÃÔÚÉ豸ÉϵÄһЩ±íÏÖÌØÕ÷ÁË¡£

Ó¦Óü¶ÄÚ´æ¹ÜÀí£º

ÔÚ˵ӦÓü¶±ðÄÚ´æ¹ÜÀíÔ­Àíʱ´ó¼ÒÏÈÏëÒ»¸öÎÊÌ⣬¼ÙÉèÓÐÒ»¸öÄÚ´æÎª1GµÄAndroidÉ豸£¬ÉÏÃæÔËÐÐÁËÒ»¸ö·Ç³£·Ç³£³ÔÄÚ´æµÄÓ¦Óã¬Èç¹ûûÓÐÈκλúÖÆµÄÇé¿öÏÂÊDz»ÊÇÓÃ×ÅÓÃ×ÅÕû¸öÉ豸»áÒòΪÎÒÃÇÕâ¸öÓ¦ÓðÑ1GÄÚ´æ³Ô¹âÈ»ºóÕû¸öϵͳÔËÐÐ̱»¾ÄØ£¿

¹þ¹þ£¬ÆäʵGoogleµÄ¹¤³Ìʦ²Å²»»áÕâôɵµÄ°ÑϵͳÉè¼ÆÕâô²î¾¢¡£ÎªÁËʹϵͳ²»´æÔÚÎÒÃÇÉÏÃæ¼ÙÏëÇé¿öÇÒÄܰ²È«¿ìËÙµÄÔËÐУ¬AndroidµÄ¿ò¼ÜʹµÃÿ¸öÓ¦ÓóÌÐò¶¼ÔËÐÐÔÚµ¥¶ÀµÄ½ø³ÌÖУ¨ÕâЩӦÓýø³Ì¶¼ÊÇÓÉZygote½ø³Ì·õ»¯³öÀ´µÄ£¬Ã¿¸öÓ¦Óýø³Ì¶¼¶ÔÓ¦×Ô¼ºÎ¨Ò»µÄÐéÄâ»úʵÀý£©£»Èç¹ûÓ¦ÓÃÔÚÔËÐÐʱÔÙ´æÔÚÉÏÃæ¼ÙÏëµÄÇé¿ö£¬ÄÇô̱»¾µÄÖ»»áÊÇ×Ô¼ºµÄ½ø³Ì£¬²»»áÖ±½ÓÓ°ÏìϵͳÔËÐм°ÆäËû½ø³ÌÔËÐС£

¼ÈȻÿ¸öAndroidÓ¦ÓóÌÐò¶¼Ö´ÐÐÔÚ×Ô¼ºµÄÐéÄâ»úÖУ¬ÄÇÁ˽âJavaµÄÒ»¶¨Ã÷°×£¬Ã¿¸öÐéÄâ»ú±Ø¶¨»áÓжÑÄÚ´æãÐÖµÏÞÖÆ£¨ÖµµÃÒ»ÌáµÄÊÇÕâ¸öãÐÖµÒ»°ã¶¼Óɳ§ÉÌÒÀ¾ÝÓ²¼þÅäÖü°Éè±¸ÌØÐÔ×Ô¼ºÉ趨£¬Ã»ÓÐͳһ±ê×¼£¬¿ÉÒÔΪ64M£¬Ò²¿ÉÒÔΪ128MµÈ£»ËüµÄÅäÖÃÊÇÔÚAndroidµÄÊôÐÔϵͳµÄ/system/build.propÖÐÅäÖÃdalvik.vm.heapsize=128m¼´¿É£¬Èô´æÔÚdalvik.vm.heapstartsizeÔò±íʾ³õʼÉêÇë´óС£©£¬Ò²¼´Ò»¸öÓ¦Óýø³Ìͬʱ´æÔڵĶÔÏó±ØÐëСÓÚãÐÖµ¹æ¶¨µÄÄÚ´æ´óС²Å¿ÉÒÔÕý³£ÔËÐС£

½Ó×ÅÎÒÃÇÔËÐеÄAppÔÚ×Ô¼ºµÄÐéÄâ»úÖÐÄÚ´æ¹ÜÀí»ù±¾¾ÍÊÇ×ñÑ­JavaµÄÄÚ´æ¹ÜÀí»úÖÆÁË£¬ÏµÍ³ÔÚÌØ¶¨µÄÇé¿öÏÂÖ÷¶¯½øÐÐÀ¬»ø»ØÊÕ¡£µ«ÊÇҪעÒâµÄÒ»µã¾ÍÊÇÔÚAndroidϵͳÖÐÖ´ÐÐÀ¬»ø»ØÊÕ£¨GC£©²Ù×÷ʱËùÓÐỊ̈߳¨°üº¬UIỊ̈߳©¶¼±ØÐëÔÝÍ££¬µÈÀ¬»ø»ØÊÕ²Ù×÷Íê³ÉÖ®ºóÆäËûÏ̲߳ÅÄܼÌÐøÔËÐС£ÕâЩGCÀ¬»ø»ØÊÕÒ»°ã¶¼»áÓÐÃ÷ÏÔµÄlog´òÓ¡³ö»ØÊÕÀàÐÍ£¬³£¼ûµÄÈçÏ£º

GC_MALLOC¡ª¡ªÄÚ´æ·ÖÅäʧ°Üʱ´¥·¢£»

GC_CONCURRENT¡ª¡ªµ±·ÖÅäµÄ¶ÔÏó´óС³¬¹ýÒ»¸öÏÞ¶¨Öµ£¨²»Í¬ÏµÍ³£©Ê±´¥·¢£»

GC_EXPLICIT¡ª¡ª¶ÔÀ¬»øÊÕ¼¯µÄÏÔʽµ÷ÓÃ(System.gc()) £»

GC_EXTERNAL_ALLOC¡ª¡ªÍⲿÄÚ´æ·ÖÅäʧ°Üʱ´¥·¢£»

ͨ¹ýÉÏÃæÕ⼸µãµÄ·ÖÎö¿ÉÒÔ·¢ÏÖ£¬Ó¦ÓõÄÄÚ´æ¹ÜÀíÆäʵ¾ÍÊÇÒ»¸öÂܲ·Ò»¸ö¿Ó£¬¿Ó¶¼Ò»°ã´ó£¬ÄãÔÚ¿ª·¢Ó¦ÓÃʱҪ±£Ö¤µÄÊÇÄÚ´æÊ¹ÓÃͬһʱ¿Ì²»Äܳ¬¹ý¿ÓµÄ´óС£¬·ñÔò¾Í×°²»ÏÂÁË¡£

3-2 AndroidÄÚ´æÐ¹Â¶ÐÔÄÜ·ÖÎö

ÓÐÁ˹ØÓÚAndroidµÄһЩÄÚ´æÈÏʶ£¬½Ó×ÅÎÒÃÇÀ´¿´¿´¹ØÓÚAndroidÓ¦Óÿª·¢Öг£³öÏÖµÄÒ»ÖÖÄÚ´æÎÊÌ⡪-ÄÚ´æÐ¹Â¶¡£

3-2-1 AndroidÓ¦ÓÃÄÚ´æÐ¹Â¶¸ÅÄî

ÖÚËùÖÜÖª£¬ÔÚJavaÖÐÓÐЩ¶ÔÏóµÄÉúÃüÖÜÆÚÊÇÓÐÏ޵쬵±ËüÃÇÍê³ÉÁËÌØ¶¨µÄÂß¼­ºó½«»á±»À¬»ø»ØÊÕ£»µ«ÊÇ£¬Èç¹ûÔÚ¶ÔÏóµÄÉúÃüÖÜÆÚ±¾À´¸Ã±»À¬»ø»ØÊÕʱÕâ¸ö¶ÔÏó»¹±»±ðµÄ¶ÔÏóËù³ÖÓÐÒýÓã¬ÄǾͻᵼÖÂÄÚ´æÐ¹Â©£»ÕâÑùµÄºó¹û¾ÍÊÇËæ×ÅÎÒÃǵÄÓ¦Óñ»³¤Ê±¼äʹÓã¬ËûËùÕ¼ÓõÄÄÚ´æÔ½À´Ô½´ó¡£ÈçϾÍÊÇÒ»¸ö×î³£¼û¼òµ¥µÄй¶Àý×Ó£¨ÆäËüµÄй¶²»ÔÙÒ»Ò»ÁоÙÁË£©£º

public final class MainActivity extends Activity {
private DbManager mDbManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//DbManagerÊÇÒ»¸öµ¥ÀýģʽÀ࣬ÕâÑù¾Í³ÖÓÐÁËMainActivityÒýÓ㬵¼ÖÂй¶
mDbManager = DbManager.getInstance(this);
}
}

¿ÉÒÔ¿´¼û£¬ÉÏÃæÀý×ÓÖÐÎÒÃÇÈÃÒ»¸öµ¥ÀýģʽµÄ¶ÔÏó³ÖÓÐÁ˵±Ç°ActivityµÄÇ¿ÒýÓã¬ÄÇÔÚµ±Ç°AcvitivyÖ´ÐÐÍêonDestroy()ºó£¬Õâ¸öActivity¾ÍÎÞ·¨µÃµ½À¬»ø»ØÊÕ£¬Ò²¾ÍÔì³ÉÁËÄÚ´æÐ¹Â¶¡£

ÄÚ´æÐ¹Â¶¿ÉÒÔÒý·¢ºÜ¶àµÄÎÊÌ⣬³£¼ûµÄÄÚ´æÐ¹Â¶µ¼ÖÂÎÊÌâÈçÏ£º

Ó¦Óÿ¨¶Ù£¬ÏìÓ¦ËÙ¶ÈÂý£¨ÄÚ´æÕ¼ÓøßʱJVMÐéÄâ»ú»áƵ·±´¥·¢GC£©;

Ó¦Óñ»´Óºǫ́½ø³Ì¸ÉΪ¿Õ½ø³Ì£¨ÉÏÃæÏµÍ³ÄÚ´æÔ­ÀíÓнéÉÜ£¬Ò²¾ÍÊdz¬¹ýÁËãÐÖµ£©£»

Ó¦ÓÃĪÃûµÄ±ÀÀ££¨ÉÏÃæÓ¦ÓÃÄÚ´æÔ­ÀíÓнéÉÜ£¬Ò²¾ÍÊdz¬¹ýÁËãÐÖµOOM£©£»

Ôì³ÉÄÚ´æÐ¹Â¶Ð¹Â¶µÄ×îºËÐÄÔ­Àí¾ÍÊÇÒ»¸ö¶ÔÏó³ÖÓÐÁ˳¬¹ý×Ô¼ºÉúÃüÖÜÆÚÒÔÍâµÄ¶ÔÏóÇ¿ÒýÓõ¼Ö¸öÔÏóÎÞ·¨±»Õý³£À¬»ø»ØÊÕ£»¿ÉÒÔ·¢ÏÖ£¬Ó¦ÓÃÄÚ´æÐ¹Â¶ÊǸöÏ൱¼¬ÊÖÖØÒªµÄÎÊÌ⣬ÎÒÃDZØÐëÖØÊÓ¡£

3-2-2 AndroidÓ¦ÓÃÄÚ´æÐ¹Â¶²ì¾õÊÖ¶Î

ÖªµÀÁËÄÚ´æÐ¹Â¶µÄ¸ÅÄîÖ®ºó¿Ï¶¨¾ÍÊÇÏë°ì·¨À´È·ÈÏ×Ô¼ºµÄÏîÄ¿ÊÇ·ñ´æÔÚÄÚ´æÐ¹Â¶ÁË£¬ÄǸÃÈçºÎ²ì¾õ×Ô¼ºÏîÄ¿ÊÇ·ñ´æÔÚÄÚ´æÐ¹Â¶ÄØ£¿ÈçÏÂÌṩÁ˼¸ÖÖ³£Óõķ½Ê½£º

ASµÄMemory´°¿ÚÈçÏ£¬ÏêϸµÄ˵Ã÷ÕâÀï¾Í²»½âÊÍÁË£¬ºÜ¼òµ¥ºÜÖ±¹Û£¨Ê¹ÓÃÆµÂʸߣ©£º

DDMS-HeapÄÚ´æ¼à²â¹¤¾ß´°¿ÚÈçÏ£¬ÏêϸµÄ˵Ã÷ÕâÀï¾Í²»½âÊÍÁË£¬ºÜ¼òµ¥£¨Ê¹ÓÃÆµÂʲ»¸ß£©£º

dumpsys meminfoÃüÁîÈçÏ£¨Ê¹ÓÃÆµÂʷdz£¸ß£¬·Ç³£¸ßЧ£¬ÎÒµÄ×î°®Ö®Ò»£¬Æ½Ê±Ò»°ã¹Ø×¢¼¸¸öÖØÒªµÄObject¸öÊý¼´¿ÉÅжÏÒ»°ãµÄй¶£»µ±È»ÁË£¬adb shell dumpsys meminfo²»¸ú²ÎÊýÖ±½ÓչʾϵͳËùÓÐÄÚ´æ×´Ì¬£©£º

leakcanaryÉñÆ÷ʹÓÃÕâÀïÏȲ»Ëµ£¬ÏÂÎÄ»áרÌâ½éÉÜ£¬Äã»áÕ𺳵ÄÒ»B¡£ÓÐÁËÕâЩ¹¤¾ßµÄ¶¨Î»ÎÒÃǾÍÄܷܺ½±ãµÄ²ì¾õÎÒÃÇAppµÄÄÚ´æÐ¹Â¶ÎÊÌ⣬²ì¾õµ½ÒÔºó¸ÃÔõô¶¨Î»·ÖÎöÄØ£¬¼ÌÐøÍùÏ¿´¡£

3-2-3 AndroidÓ¦ÓÃÄÚ´æÐ¹Â¶leakcanary¹¤¾ß¶¨Î»·ÖÎö

leakcanaryÊÇÒ»¸ö¿ªÔ´ÏîÄ¿£¬Ò»¸öÄÚ´æÐ¹Â¶×Ô¶¯¼ì²â¹¤¾ß£¬ÊÇÖøÃûµÄGitHub¿ªÔ´×éÖ¯Square¹±Ï׵ģ¬ËüµÄÖ÷ÒªÓÅÊÆ¾ÍÔÚÓÚ×Ô¶¯»¯¹ýÔçµÄ·¢¾õÄÚ´æÐ¹Â¶¡¢ÅäÖüòµ¥¡¢×¥È¡ÌùÐÄ£¬È±µãÔÚÓÚ»¹´æÔÚһЩbug£¬²»¹ýÕý³£Ê¹ÓðٷÖÖ®¾ÅÊ®Çé¿öÊÇOKµÄ£¬ÆäºËÐÄÔ­ÀíÓëMAT¹¤¾ßÀàËÆ¡£

¹ØÓÚleakcanary¹¤¾ßµÄÅäÖÃʹÓ÷½Ê½ÕâÀï²»ÔÙÏêϸ½éÉÜ£¬ÒòÎªÕæµÄºÜ¼òµ¥£¬ÏêÇéµãÎҲο¼¹Ù·½½Ì³ÌѧϰʹÓü´¿É¡£

PS£ºÖ®Ç°ÔÚÓÅ»¯ÐÔÄÜʱ·¢ÏÖÎÒÃÇÓÐÒ»¸öÓ¦ÓÃÓÐÁ½¸ö½çÃæÍ˳öºóActivityûÓб»»ØÊÕ£¨dumpsys meminfo·¢ÏÖÒ»Ö±ÔÚ¼Ó£©£¬ËùÒԾͻ³ÒÉ¿ÉÄÜ´æÔÚÄÚ´æÐ¹Â¶¡£µ«ÊÇÎÊÌâÀ´ÁË£¬ÕâÁ½¸öActivityµÄÂß¼­Ê®·Ö¸´ÔÓ£¬´úÂëÒ²²»ÊÇÎÒдµÄ£¬Ïà¹ØÁªµÄ´úÂëÁ¿Ò²Ê®·ÖÅӴ󣬸ü¼ÓÓôÃÆµÄÊǺÜÄÑÅжÏÊÇÄĸö°æ±¾Ð޸ĵ¼Öµģ¬ÕâʱºòÖ»ÖªµÀÓÐй¶£¬È´ÎÞ·¨¶¨Î»¾ßÌåÔ­Òò£¬Ê¹ÓÃMAT·ÖÎö½â¾öµôÁËÒ»¸ö¿ÉÒÉй¶ºó·¢ÏÖй¶ÓÖ±ä³ÉÁ˸ÅÂÊÐԵġ£¿ÉÒÔ·¢ÏÖ£¬¶ÔÓÚÕâÖÖ¸ÅÂÊÐÔµÄй¶ÓÃMATÈ¥Ö÷¶¯×¥È¡¿Ï¶¨ÊǺܺÄʱºÄÁ¦µÄ£¬ËùÒÔ¾ö¶¨Ö±½ÓÒýÈëleakcanaryÉñÆ÷À´¼ì²âÏîÄ¿£¬ºóÀ´ºÜ¿ì¾Í³¹µ×½â¾öÁËÏîÄ¿ÖÐËùÓбØÏֵġ¢Å¼ÏÖµÄÄÚ´æÐ¹Â¶¡£

×ÜÖ®Ò»µã£¬¹¤¾ßÔÙÇ¿´óÒ²Ö»ÊǰïÎÒÃǶ¨Î»¿ÉÄܵÄй¶µã£¬¶ø×îºËÐĵÄGC ROOTй¶ÐÅÏ¢ÍÆµ¼³öй¶ÎÊÌâ¼°ÈçºÎ½â¾ö»¹ÊÇÐèÒªÄã°Ñס´úÂëÂß¼­¼°Ð¹Â¶ºËÐĸÅÄîÈ¥ÍÆÀí½â¾ö¡£

3-2-4 AndroidÓ¦ÓÃÄÚ´æÐ¹Â¶MAT¹¤¾ß¶¨Î»·ÖÎö

Eclipse Memory Analysis Tools£¨µãÎÒÏÂÔØ£©ÊÇÒ»¸öרÃÅ·ÖÎöJava¶ÑÊý¾ÝÄÚ´æÒýÓõŤ¾ß£¬ÎÒÃÇ¿ÉÒÔʹÓÃËü·½±ãµÄ¶¨Î»ÄÚ´æÐ¹Â¶Ô­Òò£¬ºËÐÄÈÎÎñ¾ÍÊÇÕÒµ½GC ROOTλÖü´¿É£¬°¥Ñ½£¬¹ØÓÚÕâ¸ö¹¤¾ßµÄʹÓÃÎÒÊÇÕæµÄ²»Ïë˵ÁË£¬×Ô¼ºËÑË÷°É£¬ÊµÔÚ¼òµ¥¡¢´«Í³µÄ²»ÐÐÁË¡£

PS£ºÕâÊÇ¿ª·¢ÖÐʹÓÃÆµÂʷdz£¸ßµÄÒ»¸ö¹¤¾ßÖ®Ò»£¬Âé·³Îñ±ØÕÆÎÕÆäºËÐÄʹÓü¼ÇÉ£¬ËäÈ»Android StudioÒѾ­ÊµÏÖÁ˲¿·Ö¹¦ÄÜ£¬µ«ÊÇÕæµÄºÜÄÑÓã¬Óöµ½ÎÊÌâĿǰ»¹ÊÇʹÓÃEclipse Memory Analysis Tools°É¡£

Ô­ÁÂÎÒ¸ÃС½ÚµÄ·Åµ´²»î¿£¡£¡£¡£¡£¨ÆäʵÎÒÊÇÀ§ÁË£¬ÎØÎØ£¡£©

3-2-5 AndroidÓ¦Óÿª·¢¹æ±ÜÄÚ´æÐ¹Â¶½¨Òé

ÓÐÁËÉÏÃæµÄÔ­Àí¼°°¸Àý´¦ÀíÆäʵ»¹²»¹»£¬ÒòΪÉÏÃæÕâЩ´¦Àí°ì·¨ÊDz¹¾ÈµÄ´ëÊ©£¬ÎÒÃÇÕýÈ·µÄ×ö·¨Ó¦¸ÃÊÇÔÚ¿ª·¢¹ý³ÌÖоÍÑø³ÉÁ¼ºÃµÄϰ¹ßºÍÃôÈñµÄÐá¾õ²Å¶Ô£¬ËùÒÔÏÂÃæ¸ø³öһЩӦÓÿª·¢Öг£¼ûµÄ¹æ±ÜÄÚ´æÐ¹Â¶½¨Ò飺

¹ØÓÚ¹æ±ÜÄÚ´æÐ¹Â¶ÉÏÃæÎÒÖ»ÊÇÁгöÁËÎÒÔÚÏîÄ¿Öо­³£Óö¼ûµÄһЩÇé¿ö¶øÒÑ£¬¿Ï¶¨²»È«Ã棬»¶Ó­ÅÄש£¡µ±È»ÁË£¬Ö»ÓÐÎÒÃÇ×öµ½ºÃµÄ¹æ±Ü¼ÓÉÏÇ¿ÓÐÁ¦µÄÅжÏÐá¾õй¶²ÅÄÜÈÃÎÒÃǵÄÓ¦ÓüÝÔ¦ºÃ×Ô¼ºµÄһĶÈý·ÖµØ¡£

3-3 AndroidÄÚ´æÒç³öOOMÐÔÄÜ·ÖÎö

ÉÏÃæÌ¸ÂÛÁËAndroidÓ¦Óÿª·¢µÄÄÚ´æÐ¹Â¶£¬ÏÂÃæÌ¸Ì¸ÄÚ´æÒç³ö£¨OOM£©£»Æäʵ¿ÉÒÔÈÏΪÄÚ´æÒç³öÓëÄÚ´æÐ¹Â¶Êǽ»¼¯¹ØÏµ£¬¾ßÌåÈçÏÂͼ£º

ÏÂÃæÎÒÃǾÍÀ´¿´¿´ÄÚ´æÒç³ö£¨OOM£©Ïà¹ØµÄ¶«¶«°É¡£

3-3-1 AndroidÓ¦ÓÃÄÚ´æÒç³öOOM¸ÅÄî

ÉÏÃæÎÒÃÇ̽ÌÖÁËAndroidÄÚ´æ¹ÜÀíºÍÓ¦Óÿª·¢ÖеÄÄÚ´æÐ¹Â¶ÎÊÌ⣬¿ÉÒÔÖªµÀÄÚ´æÐ¹Â¶Ò»°ãÓ°Ïì¾ÍÊǵ¼ÖÂÓ¦Óÿ¨¶Ù£¬µ«ÊǼ«¶ËµÄÓ°ÏìÊÇʹӦÓùҵô¡£Ç°ÃæÒ²Ìáµ½¹ýÓ¦ÓõÄÄÚ´æ·ÖÅäÊÇÓÐÒ»¸öãÐÖµµÄ£¬³¬¹ýãÐÖµ¾Í»á³öÎÊÌ⣬ÕâÀïÎÒÃǾÍÀ´¿´¿´Õâ¸öÎÊÌ⡪¨CÄÚ´æÒç³ö£¨OOM¨COutOfMemoryError£©¡£

ÄÚ´æÒç³öµÄÖ÷Òªµ¼ÖÂÔ­ÒòÓÐÈçϼ¸Àࣺ

Ó¦ÓôúÂë´æÔÚÄÚ´æÐ¹Â¶£¬³¤Ê±¼ä»ýÀÛÎÞ·¨Êͷŵ¼ÖÂOOM£»

Ó¦ÓõÄijЩÂß¼­²Ù×÷·è¿ñµÄÏûºÄµô´óÁ¿Äڴ棨ƩÈç¼ÓÔØÒ»ÕŲ»¾­¹ý´¦ÀíµÄ³¬´ó³¬¸ßÇåͼƬµÈ£©µ¼Ö³¬¹ýãÐÖµOOM£»

¿ÉÒÔ·¢ÏÖ£¬ÎÞÂÛÄÄÖÖÀàÐÍ£¬µ¼ÖÂÄÚ´æÒç³ö£¨OutOfMemoryError£©µÄºËÐÄÔ­Òò¾ÍÊÇÓ¦ÓõÄÄڴ泬¹ýãÐÖµÁË¡£

3-3-2 AndroidÓ¦ÓÃÄÚ´æÒç³öOOMÐÔÄÜ·ÖÎö

ͨ¹ýÉÏÃæµÄOOM¸ÅÄîºÍÄÇ·ù½»¼¯Í¼¿ÉÒÔ·¢ÏÖ£¬ÒªÏë·ÖÎöOOMÔ­ÒòºÍ±ÜÃâOOMÐèÒª·ÖÁ½ÖÖÇé¿ö¿¼ÂÇ£¬Ð¹Â¶µ¼ÖµÄOOM£¬ÉêÇë¹ý´óµ¼ÖµÄOOM¡£

ÄÚ´æÐ¹Â¶µ¼ÖµÄOOM·ÖÎö£º

ÕâÖÖOOMÒ»µ©·¢Éúºó»áÔÚlogcatÖдòÓ¡Ïà¹ØOutOfMemoryErrorµÄÒì³£Õ»ÐÅÏ¢£¬²»¹ýÄã±ð¸ßÐËÌ«Ô磬ÕâÖÖÇé¿öϵ¼ÖµÄOOM´òÓ¡Òì³£ÐÅÏ¢ÊÇûÓÐÌ«´ó×÷Óã¬ÒòΪÕâÖÖOOMµÄµ¼ÖÂÒ»°ã¶¼ÈçÏÂͼÇé¿ö£¨Í¼Ê¾ÎªÁË˵Ã÷ÎÊÌâÊý¾ÝºÍ³¡¾°ÓпäÕÅ£¬ÇëºöÂÔ£©£º

´ÓͼƬ¿ÉÒÔ¿´¼û£¬ÕâÖÖOOMÎÒÃÇÓÐʱҲÓöµ½£¬µÚÒ»·´Ó¦ÊÇÈ¥·ÖÎöOOMÒì³£´òÓ¡Õ»£¬¿ÉÊǺóÀ´·¢ÏÖ´òÓ¡Õ»´òÓ¡µÄµØ·½Ã»ÓÐɶÎÊÌ⣬ûÓпÉÓÅ»¯µÄÓàµØÁË£¬ÓÚÊǾÍÓôÃÆÁË¡£ÆäʵÕâʱºòÄãÁôÐĹ۲켸¸öÏÖÏó¼´¿É£¬ÈçÏ£º

ÁôÒâÄãÖ´Ðд¥·¢OOM²Ù×÷ǰµÄ½çÃæÊÇ·ñÓп¨¶Ù»òÕ߱ȽÏÃܼ¯µÄGC´òÓ¡£»

ʹÓÃÃüÁî²é¿´Ïµ±Ç°Ó¦ÓÃÕ¼ÓÃÄÚ´æÇé¿ö£»

È·ÈÏÁËÒÔÉÏÕâЩÏÖÏóÄã»ù±¾¿ÉÒԶ϶¨¸ÃOOMµÄlogÕæµÄûÓã¬ÕæÕýµ¼ÖÂÎÊÌâµÄÔ­ÒòÊÇÄÚ´æÐ¹Â¶£¬ËùÒÔÎÒÃÇÓ¦¸Ã°´ÕÕÉϽڽéÉܵķ½Ê½È¥×ÅÊÖÅŲéÄÚ´æÐ¹Â¶ÎÊÌ⣬½â¾öµôÄÚ´æÐ¹Â¶ºóºìÉ«¿Õ¼ä¶¼Äܵõ½ÊÍ·Å£¬ÔÙÈ¥ÏÔʾһÕÅ0.8MµÄÓÅ»¯Í¼Æ¬¾Í²»»áÔÙ±¨OOMÒì³£ÁË¡£

²»ÕäϧÄÚ´æµ¼ÖµÄOOM·ÖÎö£º

ÉÏÃæËµÁËÄÚ´æÐ¹Â¶µ¼ÖµÄOOMÒì³££¬ÏÂÃæÎÒÃÇÔÙÀ´¿´Ò»·ùͼ£¨Êý¾ÝºÍ³¡¾°ÃèÊöÓпäÕÅ£¬ÇëºöÂÔ£©£¬ÈçÏ£º

¿É¼û£¬ÕâÖÖÀàÐ͵ÄOOM¾ÍºÜºÃ¶¨Î»Ô­ÒòÁË£¬Ò»°ã¶¼¿ÉÒÔ´ÓOOMºóµÄlogÖеóö·ÖÎö¶¨Î»¡£

ÈçÏÂÀý×Ó£¬ÎÒÃÇÔÚActivityÖеÄImageView·ÅÖÃÒ»ÕÅδÓÅ»¯µÄÌØ´óµÄ£¨30¶àM£©¸ßÇåͼƬ£¬ÔËÐÐÖ±½Ó±ÀÀ£ÈçÏ£º

//Å׳öOOMÒì³£
10-10 09:01:04.873 11703-11703/? E/art: Throwing OutOfMemoryError "Failed to allocate a 743620620 byte allocation with 4194208 free bytes and 239MB until OOM"
10-10 09:01:04.940 11703-11703/? E/art: Throwing OutOfMemoryError "Failed to allocate a 743620620 byte allocation with 4194208 free bytes and 239MB until OOM"
//¶ÑÕ»´òÓ¡
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: FATAL EXCEPTION: main
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: Process: com.example.application, PID: 11703
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.application/com.example.myapplication.MainActivity} : android.view.InflateException: Binary XML file line #21: Error inflating class <unknown>
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2610)
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684)
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: at android.app.ActivityThread.access$800(ActivityThread.java:177)
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1542)
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:111)
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: at android.os.Looper.loop(Looper.java:194)
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5743)
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:988)
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)
//³ö´íµØµã£¬Ô­ÒòÊÇ21ÐеÄImageViewÉèÖõÄsrcÊÇÒ»ÕÅδÓÅ»¯µÄ31MµÄ¸ßÇåͼƬ
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #21: Error inflating class <unknown>
10-10 09:01:04.958 11703-11703/? E/AndroidRuntime: at android.view.LayoutInflater.createView(LayoutInflater.java:633)

ͨ¹ýÉÏÃæµÄlog¿ÉÒԺܷ½±ãµÄ¿´³öÀ´ÎÊÌâÔ­ÒòËùÔڵأ¬ÄǽÓÏÂÀ´µÄ×ö·¨¾ÍÊÇÓÅ»¯ß£¬½µµÍͼƬµÄÏà¹Ø¹æ¸ñ¼´¿É£¨Æ©ÈçʹÓÃBitmapFactoryµÄOptionÀà²Ù×÷µÈ£©¡£

PS£ºÌáÐÑÒ»¾äµÄÊǼǵÃÓ¦ÓÃËùÊôµÄÄÚ´æÊÇÇø·ÖJava¶ÑºÍnative¶ÑµÄ£¡

3-3-3 AndroidÓ¦Óùæ±ÜÄÚ´æÒç³öOOM½¨Òé

»¹ÊÇÄǾ仰£¬µÈ´ýOOM·¢ÉúÊÇΪʱÒÑÍíµÄÊ£¬ÎÒÃÇÓ¦¸Ã½«Æä¶óɱÓÚÃÈѿ֮ÖУ¬ÖÁÓÚÈçºÎÔÚ¿ª·¢Öйæ±ÜOOM£¬Èçϸø³öһЩÎÒÃÇÓ¦Óÿª·¢Öеij£ÓõIJßÂÔ½¨Ò飺

¿ÉÒÔ·¢ÏÖ£¬ÉÏÃæÖ»ÊÇÁгöÁËÎÒÃÇ¿ª·¢Öг£¼ûµÄµ¼ÖÂOOMÒì³£µÄһЩ¹æ±ÜÔ­Ôò£¬»¹ÓкܶàÏàÐÅ»¹Ã»ÓÐÁгöÀ´£¬´ó¼Ò¿ÉÒÔ×ÔÐÐ×·¼Ó²Î¿¼¼´¿É¡£

3-4 AndroidÄÚ´æÐÔÄÜÓÅ»¯×ܽá

ÎÞÂÛÊÇʲôµç×ÓÉ豸µÄ¿ª·¢£¬ÄÚ´æÎÊÌâÓÀÔ¶¶¼ÊÇÒ»¸öºÜÉî°Â¡¢ÎÞµ×¶´µÄ»°Ì⣬ÉÏÃæµÄÕâЩÄÚ´æ·ÖÎö½¨ÒéÒ²µ¥µ¥Ö»ÊÇAndroidÓ¦Óÿª·¢ÖÐһЩ³£¼ûµÄ³¡¾°¶øÒÑ£¬ÕæÕýµÄ´ïµ½ºÏÀíµÄÓÅ»¯»¹ÊÇÐèÒªºÜ¶à֪ʶºÍ¹¦µ×µÄ¡£

ºÏÀíµÄÓ¦Óüܹ¹Éè¼Æ¡¢Éè¼Æ·ç¸ñÑ¡Ôñ¡¢¿ªÔ´LibÑ¡Ôñ¡¢´úÂëÂß¼­¹æ·¶µÈ¶¼»á¾ö¶¨µ½Ó¦ÓõÄÄÚ´æÐÔÄÜ£¬ÎÒÃDZØÐëʱ¿ÌÍ·ÄÔÇåÐѵÄÒâʶµ½ÕâЩÎÊÌâDZÔڵķçÏÕÓëÓÅÁÓ£¬ÒòΪÄÚ´æÓÅ»¯±ØÐëÒªÓÐÒ»¸ö¶È£¬²»ÄÜһζµÄÓÅ»¯£¬Ò಻ÄÜÖÃÖ®²»Àí¡£

4 AndroidÓ¦ÓÃAPIʹÓü°´úÂëÂß¼­ÐÔÄÜ·ÖÎö

ÔÚÎÒÃÇ¿ª·¢Öгý¹ý³£¹æµÄÄÇЩ¾­µäUI¡¢ÄÚ´æÐÔÄÜÎÊÌâÍâÆäʵ»¹´æÔںܶàDZÔÚµÄÐÔÄÜÓÅ»¯¡¢ÕâÖÖÓÅ»¯²»ÊÇÊ®·ÖÃ÷ÏÔ£¬µ«ÊÇÔÚijЩ³¡¾°ÏÂÈ´ÊǷdz£ÓбØÒªµÄ£¬ËùÒÔÎÒÃǼòµ¥ÁоÙһЩ³£¼ûµÄÆäËûDZÔÚÐÔÄÜÓÅ»¯¼¼ÇÉ£¬¾ßÌåÈçÏÂ̽ÌÖ¡£

4-1 AndroidÓ¦ÓÃString/StringBuilder/StringBufferÓÅ»¯½¨Òé

×Ö·û´®²Ù×÷ÔÚAndroidÓ¦Óÿª·¢ÖÐÊÇÊ®·Ö³£¼ûµÄ²Ù×÷£¬Ò²¾ÍÊÇÕâ¸ö×î¼òµ¥µÄ×Ö·û´®²Ù×÷È´Ò²°µ²ØºÜ¶àDZÔÚµÄÐÔÄÜÎÊÌ⣬ÏÂÃæÎÒÃÇʵÀýÀ´ËµËµ¡£
ÏÈ¿´ÏÂÃæÕâ¸ö¹ØÓÚStringºÍStringBufferµÄ¶Ô±ÈÀý×Ó£º

//ÐÔÄܲîµÄʵÏÖ
String str1 = "Name:";
String str2 = "GJRS";
String Str = str1 + str2;
//ÐÔÄܺõÄʵÏÖ
String str1 = "Name:";
String str2 = "GJRS";
StringBuffer str = new StringBuilder().append(str1).append(str2);

ͨ¹ýÕâ¸öÀý×Ó¿ÉÒÔ¿´³öÀ´£¬String¶ÔÏ󣨼ǵÃÊǶÔÏ󣬲»Êdz£Á¿£©ºÍStringBuffer¶ÔÏóµÄÖ÷ÒªÐÔÄÜÇø±ðÔÚÓÚString¶ÔÏóÊDz»¿É±äµÄ£¬ËùÒÔÿ´Î¶ÔString¶ÔÏó×ö¸Ä±ä²Ù×÷£¨Æ©Èç¡°+¡±²Ù×÷£©Ê±Æäʵ¶¼Éú³ÉÁËеÄString¶ÔÏóʵÀý£¬ËùÒԻᵼÖÂÄÚ´æÏûºÄÐÔÄÜÎÊÌ⣻¶øStringBuffer¶ÔÏó×ö¸Ä±ä²Ù×÷ÿ´Î¶¼»á¶Ô×Ô¼º½øÐвÙ×÷£¬ËùÒÔ²»ÐèÒªÏûºÄ¶îÍâµÄÄÚ´æ¿Õ¼ä¡£

ÎÒÃÇÔÙ¿´Ò»¸ö¹ØÓÚStringºÍStringBufferµÄ¶Ô±ÈÀý×Ó£º

//ÐÔÄܲîµÄʵÏÖ
StringBuffer str = new StringBuilder().append("Name:").append("GJRS");
//ÐÔÄܺõÄʵÏÖ
String Str = "Name:" + "GJRS";

ÔÚÕâÖÖÇé¿öÏÂÄã»á·¢ÏÖStringBufferµÄÐÔÄÜ·´¶øÃ»ÓÐStringµÄºÃ£¬Ô­ÒòÊÇÔÚJVM½âÊÍʱÈÏΪ
String Str = "Name:" + "GJRS";¾ÍÊÇString Str = "Name:GJRS";£¬ËùÒÔ×ÔÈ»±ÈStringBuffer¿ìÁË¡£

¿ÉÒÔ·¢ÏÖ£¬Èç¹ûÎÒÃÇÆ´½ÓµÄÊÇ×Ö·û´®³£Á¿ÔòStringЧÂʱÈStringBuffer¸ß£¬Èç¹ûÆ´½ÓµÄÊÇ×Ö·û´®¶ÔÏó£¬ÔòStringBuffer±ÈStringЧÂʸߣ¬ÎÒÃÇÔÚ¿ª·¢ÖÐÒª×ÃÇéÑ¡Ôñ¡£µ±È»£¬³ý¹ý×¢ÒâStringBufferºÍStringµÄЧÂÊÎÊÌ⣬ÎÒÃÇ»¹Ó¦¸Ã×¢ÒâÁíÒ»¸öÎÊÌ⣬ÄǾÍÊÇStringBufferºÍStringBuilderµÄÇø±ð£¬ÆäʵStringBufferºÍStringBuilder¶¼¼Ì³Ð×Ôͬһ¸ö¸¸Àֻ࣬ÊÇStringBufferÊÇḬ̈߳²È«µÄ£¬Ò²¾ÍÊÇ˵ÔÚ²»¿¼ÂǶàÏß³ÌÇé¿öÏÂStringBuilderµÄÐÔÄÜÓÖ±ÈStringBuffer¸ß¡£

PS£ºÈç¹ûÏë×·¾¿Çå³þËûÃÇÖ®¼ä¾ßÌåϸ½Ú²îÒ죬Âé·³×Ô¼º²é¿´ÊµÏÖÔ´Âë¼´¿É¡£

4-2 AndroidÓ¦ÓÃOnTrimMemory()ʵÏÖÐÔÄܽ¨Òé

OnTrimMemoryÊÇAndroid 4.0Ö®ºó¼ÓÈëµÄÒ»¸ö»Øµ÷·½·¨£¬×÷ÓÃÊÇ֪ͨӦÓÃÔÚ²»Í¬µÄÇé¿öϽøÐÐ×ÔÉíµÄÄÚ´æÊÍ·Å£¬ÒÔ±ÜÃⱻϵͳֱ½Óɱµô£¬Ìá¸ßÓ¦ÓóÌÐòµÄÓû§ÌåÑ飨ÀäÆô¶¯ËÙ¶ÈÊÇÈÈÆô¶¯µÄ2~3±¶£©¡£ÏµÍ³»á¸ù¾Ýµ±Ç°²»Í¬µÈ¼¶µÄÄÚ´æÊ¹ÓÃÇé¿öµ÷ÓÃÕâ¸ö·½·¨£¬²¢ÇÒ´«È뵱ǰÄÚ´æµÈ¼¶£¬Õâ¸öµÈ¼¶ÓкܶàÖÖ£¬ÎÒÃÇ¿ÉÒÔÒÀ¾ÝÇé¿öʵÏÖ²»Í¬µÄµÈ¼¶£¬ÕâÀï²»Ïêϸ½éÉÜ£¬µ«ÊÇҪ˵µÄÊÇÎÒÃÇÓ¦ÓÃÓ¦¸ÃÖÁÉÙʵÏÖÈçϵȼ¶£º

TRIM_MEMORY_BACKGROUND

ÄÚ´æÒѾ­ºÜµÍÁË£¬ÏµÍ³×¼±¸¿ªÊ¼¸ù¾ÝLRU»º´æÀ´ÇåÀí½ø³Ì¡£ÕâʱºòÈç¹ûÎÒÃÇÊÖ¶¯ÊÍ·ÅһЩ²»ÖØÒªµÄ»º´æ×ÊÔ´£¬Ôòµ±Óû§·µ»ØÎÒÃÇÓ¦ÓÃʱ»á¸Ð¾õµ½ºÜ˳³©£¬¶ø²»ÊÇÖØÐÂÆô¶¯Ó¦Óá£

¿ÉÒÔʵÏÖOnTrimMemory·½·¨µÄϵͳ×é¼þÓÐApplication¡¢Activity¡¢Fragement¡¢Service¡¢ContentProvider£»¹ØÓÚOnTrimMemoryÊÍ·ÅÄÄЩÄÚ´æÆäʵÔڼܹ¹½×¶Î¾ÍÒª¿¼ÂÇÇå³þÄÄЩ¶ÔÏóÊÇÒª³£×¤ÄÚ´æµÄ£¬ÄÄЩÊǰéËæ×é¼þÖÜÆÚ´æÔڵģ¬Ò»°ãÐèÒªÊͷŵͼÊÇ»º´æ¡£

Èçϸø³öÒ»¸öÎÒÃÇÏîÄ¿Öг£ÓõÄÀý×Ó£º

@Override
public void onTrimMemory(int level) {
if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
clearCache();
}
}

ͨ³£ÔÚÎÒÃÇ´úÂëʵÏÖÁËonTrimMemoryºóºÜÄѸ´ÏÔÕâÖÖÄÚ´æÏûºÄ³¡¾°£¬µ«ÊÇÄãÓÖÅÂÒýÈëÐÂBug£¬ÏëÏë°ì·¨²âÊÔ¡£ºÃÔÚÎÒÃÇÓÐÒ»¸ö¿ì½ÝµÄ·½Ê½À´Ä£Äâ´¥·¢¸ÃˮƽÄÚ´æÊÍ·Å£¬ÈçÏÂÃüÁ

adb shell dumpsys gfxinfo packagename -cmd trim value

packagenameΪ°üÃû»òÕß½ø³Ìid£¬valueΪComponentCallbacks2.javaÀïÃæ¶¨ÒåµÄÖµ£¬¿ÉÒÔΪ80¡¢60¡¢40¡¢20¡¢5µÈ£¬ÎÒÃÇÄ£Äâ´¥·¢ÆäÖеĵȼ¶¼´¿É¡£

4-3 AndroidÓ¦ÓÃHashMapÓëArrayMap¼°SparseArrayÓÅ»¯½¨Òé

ÔÚAndroid¿ª·¢ÖÐÉæ¼°µ½Êý¾ÝÂß¼­²¿·Ö´ó²¿·ÖÓõͼÊÇJavaµÄAPI£¨Æ©ÈçHashMap£©£¬µ«ÊǶÔÓÚAndroidÉ豸À´ËµÓÐЩJavaµÄAPI²¢²»Êʺϣ¬¿ÉÄܻᵼÖÂϵͳÐÔÄÜϽµ£¬ºÃÔÚGoogleÍŶÓÒѾ­Òâʶµ½ÕâЩÎÊÌ⣬ËùÒÔËûÃÇÕë¶ÔAndroidÉ豸¶ÔJavaµÄһЩAPI½øÐÐÁËÓÅ»¯£¬ÓÅ»¯×î¶à¾ÍÊÇʹÓÃÁËArrayMap¼°SparseArrayÌæ´úHashMapÀ´»ñµÃÐÔÄÜÌáÉý¡£

HashMap£º

HashMapÄÚ²¿Ê¹ÓÃÒ»¸öĬÈÏÈÝÁ¿Îª16µÄÊý×éÀ´´æ´¢Êý¾Ý£¬Êý×éÖÐÿһ¸öÔªËØ´æ·ÅÒ»¸öÁ´±íµÄÍ·½áµã£¬ÆäʵÕû¸öHashMapÄÚ²¿½á¹¹¾ÍÊÇÒ»¸ö¹þÏ£±íµÄÀ­Á´½á¹¹¡£HashMapĬÈÏʵÏÖµÄÀ©ÈÝÊÇÒÔ2±¶Ôö¼Ó£¬ÇÒ»ñȡһ¸ö½Úµã²ÉÓÃÁ˱éÀú·¨£¬ËùÒÔÏà¶ÔÀ´ËµÎÞÂÛ´ÓÄÚ´æÏûºÄ»¹Êǽڵã²éÕÒÉ϶¼ÊÇÊ®·Ö°º¹óµÄ¡£

SparseArray£º

SparseArray±ÈHashMapÊ¡ÄÚ´æÊÇÒòΪËü±ÜÃâÁ˶ÔKey½øÐÐ×Ô¶¯×°Ï䣨intתInteger£©£¬ËüÄÚ²¿ÊÇÓÃÁ½¸öÊý×éÀ´½øÐÐÊý¾Ý´æ´¢µÄ£¨Ò»¸ö´æKey£¬Ò»¸ö´æValue£©£¬ËüÄÚ²¿¶ÔÊý¾Ý²ÉÓÃÁËѹËõ·½Ê½À´±íʾϡÊèÊý×éÊý¾Ý£¬´Ó¶ø½ÚÔ¼ÄÚ´æ¿Õ¼ä£¬¶øÇÒÆä²éÕÒ½ÚµãµÄʵÏÖ²ÉÓÃÁ˶þ·Ö·¨£¬ºÜÃ÷ÏÔ¿ÉÒÔ¿´¼ûÐÔÄܵÄÌáÉý¡£

ArrayMap£º

ArrayMapÄÚ²¿Ê¹ÓÃÁ½¸öÊý×é½øÐÐÊý¾Ý´æ´¢£¬Ò»¸ö¼Ç¼KeyµÄHashÖµ£¬Ò»¸ö¼Ç¼ValueÖµ£¬ËüºÍSparseArrayÀàËÆ£¬Ò²»áÔÚ²éÕÒʱ¶ÔKey²ÉÓöþ·Ö·¨¡£

ÓÐÁËÉÏÃæµÄ»ù±¾Á˽âÎÒÃÇ¿ÉÒԵóö½áÂÛ¹©¿ª·¢Ê±²Î¿¼£¬µ±Êý¾ÝÁ¿²»´ó£¨Ç§Î»¼¶ÄÚ£©ÇÒKeyΪintÀàÐÍʱʹÓÃSparseArrayÌæ»»HashMapЧÂʸߣ»µ±Êý¾ÝÁ¿²»´ó£¨Ç§Î»¼¶ÄÚ£©ÇÒÊý¾ÝÀàÐÍΪMapÀàÐÍʱʹÓÃArrayMapÌæ»»HashMapЧÂʸߣ»ÆäËûÇé¿öÏÂHashMapЧÂÊÏà¶Ô¸ßÓÚ¶þÕß¡£

4-4 AndroidÓ¦ÓÃContentProviderOperationÓÅ»¯½¨Òé

ContentProviderÊÇAndroidÓ¦Óÿª·¢µÄºËÐÄ×é¼þÖ®Ò»£¬ÓÐʱºòÔÚ¿ª·¢ÖÐÐèҪʹÓÃContentProvider¶Ô¶àÐÐÊý¾Ý½øÐвÙ×÷£¬ÎÒÃǵÄ×ö·¨Ò»°ãÊǶà´Îµ÷ÔËÏà¹Ø²Ù×÷·½·¨£¬Êâ²»ÖªÕâÖÖʵÏÖ·½Ê½ÊǷdz£µÍÐÔÄܵģ¬È¡¶ø´úÖ®µÄ×ö·¨Ó¦¸ÃÊÇʹÓÃÅúÁ¿²Ù×÷£¬¾ßÌåΪÁËʹÅúÁ¿¸üС¢²åÈ롢ɾ³ýÊý¾Ý²Ù×÷¸ü¼Ó·½±ã¹Ù·½ÌṩÁËContentProviderOperation¹¤¾ßÀà¡£ËùÒÔÔÚÎÒÃÇ¿ª·¢ÖÐÓöµ½ÀàËÆÇ龰ʱÇëÎñ±ØÊ¹ÓÃÅúÁ¿²Ù×÷£¬¾ßÌåµÄÓÅÊÆÈçÏ£º

ËùÓеIJÙ×÷¶¼ÔÚÒ»¸öÊÂÎñÖÐÖ´ÐУ¬¿ÉÒÔ±£Ö¤Êý¾ÝµÄÍêÕûÐÔ¡£

ÅúÁ¿²Ù×÷ÔÚÒ»¸öÊÂÎñÖÐÖ´ÐУ¬ËùÒÔÖ»Óôò¿ª¡¢¹Ø±ÕÒ»¸öÊÂÎñ¡£

¼õÇáÓ¦ÓóÌÐòÓëContentProvider¼äµÄ¶à´ÎƵ·±½»»¥£¬ÌáÉýÐÔÄÜ¡£

¿ÉÒÔ¿´¼û£¬Õâ¶ÔÓÚÊý¾Ý¿â²Ù×÷À´ËµÊÇÒ»¸ö·Ç³£ÓÐÓõÄÓÅ»¯´ëÊ©£¬·³ÇëÎñ±ØÖØÊÓ£¨ÎÒÃÇÏîÄ¿ÓÅ»¯¹ý£¬µÄÈ·ÓкܴóÌáÉý£©¡£

4-5 AndroidÓ¦ÓÃÆäËûÂß¼­ÓÅ»¯½¨Òé

¹ØÓÚAPI¼°Âß¼­ÐÔÄÜÓÅ»¯ÆäʵÓжà֪ʶµãµÄ£¬ÕâÀïÎÞ·¨Ò»Ò»Áгö£¬Ö»Äܸø³öÒ»Ð©ÖØÒªµÄ֪ʶµã£¬ÏÂÃæÔÙ¸ø³öһЩ³£¼ûµÄÓÅ»¯½¨Ò飺

±ÜÃâÔÚAndroidÖÐʹÓÃJavaµÄö¾ÙÀàÐÍ£¬ÒòΪ±àÒëºó²»µ«Õ¼¿Õ¼ä£¬¼ÓÔØÒ²·Ñʱ£¬ÍêȫûÓÐstatic finalµÄ±äÁ¿ºÃÓᢸßЧ¡£

Handler·¢ËÍÏûϢʱ¾¡Á¿Ê¹ÓÃobtainÈ¥»ñÈ¡ÒѾ­´æÔÚµÄMessage¶ÔÏó½øÐи´Ó㬶ø²»ÊÇÐÂnew Message¶ÔÏó£¬ÕâÑù¿ÉÒÔ¼õÇáÄÚ´æÑ¹Á¦¡£

ÔÚʹÓúǫ́Serviceʱ¾¡Á¿½«Äܹ»Ì滻ΪIntentServiceµÄµØ·½Ì滻Ϊ´Ë£¬ÕâÑù¿ÉÒÔ¼õÇáϵͳѹÁ¦¡¢Ê¡µç¡¢Ê¡Äڴ桢ʡCPUÕ¼ÓÃÂÊ¡£

ÔÚµ±Ç°ÀàÄÚ²¿¾¡Á¿²»ÒªÍ¨¹ý×Ô¼ºµÄgetXXX¡¢setXXX¶Ô×Ô¼ºÄÚ²¿³ÉÔ±½øÐвÙ×÷£¬¶øÊÇÖ±½ÓʹÓã¬ÕâÑù¿ÉÒÔÌá¸ß´úÂëÖ´ÐÐЧÂÊ¡£

²»ÒªÒ»Î¶µÄΪÁËÉè¼ÆÄ£Ê½¶ø¹ý·ÖµÄ³éÏó´úÂ룬ÒòΪ´úÂë³éÏóϵÊýÓë´úÂë¼ÓÔØÖ´ÐÐʱ¼ä³ÉÕý±È¡£

¾¡Á¿¼õÉÙËø¸öÊý¡¢¼õÐ¡Ëø·¶Î§£¬±ÜÃâÔì³ÉÐÔÄÜÎÊÌâ¡£

ºÏÀíµÄÑ¡ÔñʹÓÃforÑ­»·ÓëÔöÇ¿ÐÍforÑ­»·£¬Æ©Èç²»ÒªÔÚArrayListÉÏʹÓÃÔöÇ¿ÐÍforÑ­»·µÈ¡£

°¥Ñ½£¬ÀàËÆµÄСÓÅ»¯¼¼ÇÉÓкܶ࣬ÕâÀï²»Ò»Ò»ÁоÙÁË£¬×ÔÐз¢»ÓÁôÒâ¼´¿É¡£

5 AndroidÓ¦ÓÃÒÆ¶¯É豸µç³ØºÄµçÐÔÄÜ·ÖÎö

ÓÐÁËUIÐÔÄÜÓÅ»¯¡¢ÄÚ´æÐÔÄÜÓÅ»¯¡¢´úÂë±àдÓÅ»¯Ö®ºóÎÒÃÇÔÚÀ´ËµËµÓ¦Óÿª·¢ÖкÜÖØÒªµÄÒ»¸öÓÅ»¯Ä£¿é¡ª¨CµçÁ¿ÓÅ»¯¡£

5-1 AndroidÓ¦ÓúĵçÁ¿¸ÅÄî

ÔÚºÐ×ӵȿª·¢Ê±¿ÉÄܵçÁ¿ÓÅ»¯²»ÊÇÌØ±ðÖØÊÓ£¨ÊÓºÐ×Ó´ý»úÕæ¼Ù´ý»úģʽ¶ø¶¨£©£¬µ«ÊÇÔÚÒÆ¶¯É豸¿ª·¢ÖкĵçÁ¿ÊÇÒ»¸ö·Ç³£ÖØÒªµÄÖ¸±ê£¬Èç¹ûÓû§Ò»µ©·¢ÏÖÎÒÃǵÄÓ¦Ó÷dz£ºÄµç£¬²»ºÃÒâ˼£¬ËûÃÇ´ó¶à»áÑ¡ÔñÐ¶ÔØÀ´½â¾ö´ËÀàÎÊÌ⣬ËùÒԺĵçÁ¿ÊÇÒ»¸öÊ®·ÖÖØÒªµÄÎÊÌâ¡£

¹ØÓÚÎÒÃÇÓ¦ÓõĺĵçÁ¿Çé¿öÎÒÃÇ¿ÉÒÔ½øÐж¨³¤Ê±¼ä²âÊÔ£¬ÖÁÓÚ¾ßÌåµÄºÄµçÁ¿Í³¼ÆµÈÇë²Î¿¼´ËÎÄ£¬Í¬Ê±ÎÒÃÇ»¹¿ÉÒÔÖ±½Óͨ¹ýBattery Historian ToolÀ´²é¿´ÏêϸµÄÓ¦ÓõçÁ¿ÏûºÄÇé¿ö¡£×î¼òµ¥³£Óð취ÊÇͨ¹ýÃüÁîÖ±½Ó²é¿´£¬ÈçÏ£º

adb shell dumpsys batterystats

ÆäʵÎÒÃÇÒ»¿îÓ¦ÓúĵçÁ¿×î´óµÄ²¿·Ö²»ÊÇUI»æÖÆÏÔʾµÈ£¬³£¼ûºÄµçÁ¿×î´óÔ­Òò»ù±¾¶¼ÊÇÒòÎªÍøÂçÊý¾Ý½»»¥¡¢GPS¶¨Î»¡¢´óÁ¿ÄÚ´æÐÔÄÜÎÊÌâ¡¢ÈßÓàµÄºǫ́Ï̺߳ÍServiceµÈÔì³É¡£

5-2 AndroidÓ¦ÓúĵçÁ¿ÓÅ»¯½¨Òé

ÓÅ»¯µçÁ¿Ê¹ÓÃÇé¿öÎÒÃDz»½ö¿ÉÒÔʹÓÃϵͳÌṩµÄһЩAPIÈ¥´¦Àí£¬»¹¿ÉÒÔÔÚÆ½Ê±±àд´úÂëʱ¾ÍÑø³ÉºÃµÄϰ¹ß¡£¾ßÌåµÄһЩ½¨ÒéÈçÏ£º

ÔÚÐèÒªÍøÂçµÄÓ¦ÓÃÖУ¬Ö´ÐÐijЩ²Ù×÷ǰ¾¡Á¿ÏȽøÐÐÍøÂç״̬Åжϡ£

ÔÚÍøÂçÓ¦Óô«ÊäÖÐʹÓøßЧÂʵÄÊý¾Ý¸ñʽºÍ½âÎö·½·¨£¬Æ©ÈçJSONµÈ¡£

ÔÚ´«ÊäÓû§·´À¡»òÕßÏÂÔØOTAÉý¼¶°üµÈ²»ÊÇÊ®·Ö½ô¼±µÄ²Ù×÷ʱ¾¡Á¿²ÉÓÃѹËõÊý¾Ý½øÐд«ÊäÇÒÑÓ³Ùµ½É豸³äµçºÍWIFI״̬ʱ½øÐС£

ÔÚÓбØÒªµÄÇé¿öϾ¡Á¿Í¨¹ýPowerManager.WakeLockºÍJobSchedulerÀ´¿ØÖÆÒ»Ð©Âß¼­²Ù×÷´ïµ½Ê¡µçÓÅ»¯¡£

¶Ô¶¨Î»ÒªÇó²»Ì«¸ßµÄ³¡¾°¾¡Á¿Ê¹ÓÃÍøÂ綨룬¶ø²»ÊÇGPS¶¨Î»¡£

¶ÔÓÚ¶¨Ê±ÈÎÎñ¾¡Á¿Ê¹ÓÃAlarmManager£¬¶ø²»ÊÇsleep»òÕßTimer½øÐйÜÀí¡£

¾¡¿ÉÄܵļõÉÙÍøÂçÇëÇó´ÎÊýºÍ¼õÐ¡ÍøÂçÇëÇóʱ¼ä¼ä¸ô¡£

ºǫ́ÈÎÎñÒª¾¡¿ÉÄÜÉٵϽÐÑCPU£¬Æ©ÈçIMͨÐŵij¤Á¬½ÓÐÄÌøÊ±¼ä¼ä¸ô¡¢Ò»Ð©Ó¦Óõĺǫ́¶¨Ê±»½ÐÑʱ¼ä¼ä¸ôµÈÒªÉè¼ÆºÏÀí¡£

ÌØÊâºÄµçÒµÎñÇé¿ö¿ÉÒÔ½øÐе¯´°µÈÓѺõĽ»»¥Éè¼ÆÌáÐÑÓû§¸Ã²Ù×÷»áºÄÓùý¶àµçÁ¿¡£

¿ÉÒÔ¿´¼û£¬ÉÏÃæÖ»ÊÇһЩ³£¼ûµÄµçÁ¿ÏûºÄÓÅ»¯½¨Òé¡£×ÜÖ®£¬×÷ΪӦÓÿª·¢ÕßµÄÎÒÃÇÒªÒâʶµ½µçÁ¿ËðºÄ¶ÔÓÚÓû§À´ËµÊǷdz£Ãô¸ÐµÄ£¬Ö»ÓÐÎÒÃÇ×öµ½ºÏÀíµÄµçÁ¿ÓÅ»¯²ÅÄÜÓ®µÃÓû§µÄ·¼ÐÄ¡£

6 AndroidÓ¦Óÿª·¢ÐÔÄÜÓÅ»¯×ܽá

ÐÔÄÜÓÅ»¯ÊÇÒ»¸öºÜ´óµÄ»°Ì⣬ÉÏÃæÎÒÃÇ̸µ½µÄÖ»ÊÇÓ¦Óÿª·¢Öг£¼ûµÄÐÔÄÜÎÊÌ⣬ҲÊÇÓ¦Óÿª·¢ÖÐÐÔÄÜÎÊÌâµÄ±ùɽһ½Ç£¬¸ü¶àµÄÐÔÄÜÓÅ»¯¼¼ÇɺÍÄÜÁ¦²»ÊÇ¿¿¿´³öÀ´£¬¶øÊÇ¿¿¾­ÑéºÍʵս½á¹û×ܽá³öÀ´µÄ£¬ËùÒÔ˵ÐÔÄÜÓÅ»¯ÊÇÒ»¸öÉæ¼°Ãæ·Ç³£¹ãµÄ»°Ì⣬Èç¹ûÄãÏë¶ÔÄãµÄÓ¦ÓýøÐÐÐÔÄÜÄã±ØÐë¶ÔÄãÓ¦ÓõÄÕû¸ö¿ò¼ÜÓÐÒ»¸ö·Ç³£ÇåÎúµÄÈÏʶ¡£

µ±È»ÁË£¬Èç¹ûÔÚÎÒÃÇ¿ª·¢ÖÐÖ»ÊÇһζµÄ×·Çó¸÷ÖÖ¼«ÖµÄÓÅ»¯Ò²ÊDz»¶ÔµÄ¡£ÒòΪÓÅ»¯±¾À´¾ÍÊÇ´æÔÚ·çÏյģ¬ÉõÖÁÓÐЩ¹ý¶ÈµÄÓÅ»¯»áÖ±½Óµ¼ÖÂÏîÄ¿µÄÓ·Ö×£¬ËùÒÔ²»ÒªÒòΪ¼«ÖµÄÐÔÄÜÓÅ»¯¶øÆÆ»µµôÁËÄãÏîÄ¿µÄºÏÀí¼Ü¹¹¡£

×ÜÖ®Ò»¾ä»°£¬ÐÔÄÜÓÅ»¯ÊʿɶøÖ¹£¬Çë×ÃÇéÓÅ»¯¡£

   
2379 ´Îä¯ÀÀ       28
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶Ë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ÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ