±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ¸öÈ˲©¿Í,±¾ÎĽ²ÊöÃÀÍÅÍâÂôAndroid¿Í»§¶ËÍŶÓÔÚ½«AppµÄCrashÂÊ´Óǧ·ÖÖ®Èý×öµ½Íò·ÖÖ®¶þ¹ý³ÌÖÐËù×öµÄ´óÁ¿Êµ¼ù¹¤×÷£¬Ï£ÍûÄܹ»ÎªÆäËûÍŶÓÌṩһЩ¾ÑéºÍÆô·¢¡£ |
|
CrashÂÊÊǺâÁ¿Ò»¸öAppºÃ»µµÄÖØÒªÖ¸±êÖ®Ò»¡£Èç¹ûÄãºöÂÔÁËËüµÄ´æÔÚ£¬Ëü¾Í»áµÃ´ç½ø³ß£¬ÓúÑÝÓúÁÒ£¬×îºóÔì³É´óÁ¿Óû§µÄÁ÷ʧ£¬½ø¶ø¸ø¹«Ë¾´øÀ´ÎÞ·¨¹ÀÁ¿µÄËðʧ¡£±¾ÎĽ²ÊöÃÀÍÅÍâÂôAndroid¿Í»§¶ËÍŶÓÔÚ½«AppµÄCrashÂÊ´Óǧ·ÖÖ®Èý×öµ½Íò·ÖÖ®¶þ¹ý³ÌÖÐËù×öµÄ´óÁ¿Êµ¼ù¹¤×÷£¬Å×שÒýÓñ£¬Ï£ÍûÄܹ»ÎªÆäËûÍŶÓÌṩһЩ¾ÑéºÍÆô·¢¡£
ÃæÁÙµÄÌôÕ½ºÍ³É¹û
Ãæ¶ÔÓû§Ê¹ÓÃÆµÂʸߣ¬ÍâÂôÒµÎñÔö³¤¿ì£¬AndroidË鯬»¯ÑÏÖØÕâЩÎÊÌ⣬ÃÀÍÅÍâÂôAndroid
AppÈçºÎ³ÖÐøµÄ½µµÍCrashÂÊ£¬ÊÇÒ»Ï¾ßÌôÕ½µÄÊÂÇ顣ͨ¹ýÍŶӵÄÈ«Á¦È«²ß£¬ÃÀÍÅÍâÂôAndroid
AppµÄƽ¾ùCrashÂÊ´Óǧ·ÖÖ®Èý½µµ½ÁËÍò·ÖÖ®¶þ£¬×îÓÅÖµÍòÒ»×óÓÒ(CrashÂÊͳ¼Æ·½Ê½£ºCrash´ÎÊý/DAU)¡£
ÃÀÍÅÍâÂô×Ô2013Äê´´½¨ÒÔÀ´£¬ÒµÎñ¾ÍÒÔÖ¸Êý¼¶µÄËÙ¶È·¢Õ¹¡£ÃÀÍÅÍâÂô³ÐÔØµÄÒµÎñ£¬´Óµ¥Ò»µÄ²ÍÒûÒµÎñ£¬·¢Õ¹µ½²ÍÒû¡¢³¬ÊС¢ÉúÏÊ¡¢¹ûÊß¡¢Ò©Æ·¡¢ÏÊ»¨¡¢µ°¸â¡¢ÅÜÍȵÈÊ®¶à¸ö´óÆ·ÀàÒµÎñ¡£Ä¿Ç°ÃÀÍÅÍâÂôÈÕÍê³É¶©µ¥Á¿ÒÑÍ»ÆÆ2000Íò£¬³ÉΪÃÀÍŵãÆÀ×îÖØÒªµÄÒµÎñÖ®Ò»¡£ÃÀÍÅÍâÂô¿Í»§¶ËËù³ÐÔØµÄÒµÎñÄ£¿éÔ½À´Ô½¶à£¬²úÆ·¸´ÔÓ¶ÈÔ½À´Ô½¸ß£¬ÍŶӿª·¢ÈËÔ±ÈÕÒæÔö¼Ó£¬ÕâЩ¶¼¸øApp½µµÍCrashÂÊ´øÀ´Á˾޴óµÄÌôÕ½¡£
CrashµÄÖÎÀíʵ¼ù
¶ÔÓÚCrashµÄÖÎÀí£¬ÎÒÃǾ¡Á¿×ñÊØÒÔÏÂÈýµãÔÔò£º
ÓÉµãµ½Ãæ¡£Ò»¸öCrash·¢ÉúÁË£¬ÎÒÃDz»ÄÜÖ»Õë¶ÔÕâ¸öCrashµÄÈ¥½â¾ö£¬¶øÒªÈ¥¿¼ÂÇÕâÒ»ÀàCrashÔõôȥ½â¾öºÍÔ¤·À¡£Ö»ÓÐÕâÑù²ÅÄÜʹµÃÕâÒ»ÀàCrashÕæÕý±»½â¾ö¡£
Òì³£²»ÄÜËæ±ã³Ôµô¡£ËæÒâµÄʹÓÃtry-catch£¬Ö»»áÔö¼ÓÒµÎñµÄ·ÖÖ§ºÍÒþ±ÎÕæÕýµÄÎÊÌ⣬ҪÁ˽âCrashµÄ±¾ÖÊÔÒò£¬¸ù¾Ý±¾ÖÊÔÒòÈ¥½â¾ö¡£catchµÄ·ÖÖ§£¬¸üÒª¸ù¾ÝÒµÎñ³¡¾°È¥¶µµ×£¬±£Ö¤ºóÐøµÄÁ÷³ÌÕý³£¡£
Ô¤·ÀʤÓÚÖÎÀí¡£µ±Crash·¢ÉúµÄʱºò£¬ËðʧÒѾÔì³ÉÁË£¬ÎÒÃÇÔÙÔõôÖÎÀíÒ²Ö»ÊǼõÉÙËðʧ¡£¾¡¿ÉÄܵÄÌáǰԤ·ÀCrashµÄ·¢Éú£¬¿ÉÒÔ½«CrashÏûÃðÔÚÃÈÑ¿½×¶Î¡£
³£¹æµÄCrashÖÎÀí
³£¹æCrash·¢ÉúµÄÔÒòÖ÷ÒªÊÇÓÉÓÚ¿ª·¢ÈËÔ±±àд´úÂ벻СÐĵ¼Öµġ£½â¾öÕâÀàCrashÐèÒªÓÉµãµ½Ãæ£¬¸ù¾ÝCrashÒý·¢µÄÔÒòºÍÒµÎñ±¾Éí£¬Í³Ò»¼¯Öнâ¾ö¡£³£¼ûµÄCrashÀàÐͰüÀ¨£º¿Õ½Úµã¡¢½Ç±êÔ½½ç¡¢ÀàÐÍת»»Òì³£¡¢ÊµÌå¶ÔÏóûÓÐÐòÁл¯¡¢Êý×Öת»»Òì³£¡¢Activity»òServiceÕÒ²»µ½µÈ¡£ÕâÀàCrashÊÇAppÖÐ×îΪ³£¼ûµÄCrash£¬Ò²ÊÇ×îÈÝÒ×·´¸´³öÏֵġ£ÔÚ»ñÈ¡Crash¶ÑÕ»ÐÅÏ¢ºó£¬½â¾öÕâÀàCrashÒ»°ã±È½Ï¼òµ¥£¬¸ü¶à¿¼ÂǵÄÓ¦¸ÃÊÇÈçºÎ±ÜÃâ¡£ÏÂÃæ½éÉÜÁ½¸öÎÒÃÇÖÎÀíµÄÁ¿±È½Ï´óµÄCrash¡£
NullPointerException
NullPointerExceptionÊÇÎÒÃÇÓöµ½×îÆµ·±µÄ£¬Ôì³ÉÕâÖÖCrashÒ»°ãÓÐÁ½ÖÖÇé¿ö£º
¶ÔÏó±¾ÉíûÓнøÐгõʼ»¯¾Í½øÐвÙ×÷¡£
¶ÔÏóÒѾ³õʼ»¯¹ý£¬µ«ÊDZ»»ØÊÕ»òÕßÊÖ¶¯ÖÃΪnull£¬È»ºó¶ÔÆä½øÐвÙ×÷¡£
Õë¶ÔµÚÒ»ÖÖÇé¿öµ¼ÖµÄÔÒòÓкܶ࣬¿ÉÄÜÊÇ¿ª·¢ÈËÔ±µÄʧÎó¡¢API·µ»ØÊý¾Ý½âÎöÒì³£¡¢½ø³Ì±»É±ËÀºó¾²Ì¬±äÁ¿Ã»³õʼ»¯µ¼Ö£¬ÎÒÃÇ¿ÉÒÔ×öµÄÓУº
¶Ô¿ÉÄÜΪ¿ÕµÄ¶ÔÏó×öÅпմ¦Àí¡£
Ñø³ÉʹÓÃ@NonNullºÍ@Nullable×¢½âµÄϰ¹ß¡£
¾¡Á¿²»Ê¹Óþ²Ì¬±äÁ¿£¬Íò²»µÃÒÑʹÓÃSharedPreferencesÀ´´æ´¢¡£
¿¼ÂÇʹÓÃKotlinÓïÑÔ¡£
Õë¶ÔµÚ¶þÖÖÇé¿ö´ó²¿·ÖÊÇÓÉÓÚActivity/FragmentÏú»Ù»ò±»ÒƳýºó£¬ÔÚMessage¡¢Runnable¡¢ÍøÂçµÈ»Øµ÷ÖÐÖ´ÐÐÁËһЩ´úÂëµ¼Öµģ¬ÎÒÃÇ¿ÉÒÔ×öµÄÓУº
Message¡¢Runnable»Øµ÷ʱ£¬ÅжÏActivity/FragmentÊÇ·ñÏú»Ù»ò±»ÒƳý;¼Ótry-catch±£»¤;Activity/FragmentÏú»ÙÊ±ÒÆ³ýËùÓÐÒÑ·¢Ë͵ÄRunnable¡£
·â×°LifecycleMessage/Runnable»ù´¡×é¼þ£¬²¢×Ô¶¨ÒåLint¼ì²é£¬ÌáʾʹÓ÷â×°ºÃµÄ»ù´¡×é¼þ¡£
ÔÚBaseActivity¡¢BaseFragmentµÄonDestory()Àï°Ñµ±Ç°ActivityËù·¢µÄËùÓÐÇëÇóÈ¡Ïûµô¡£
IndexOutOfBoundsException
ÕâÀàCrash³£¼ûÓÚ¶ÔListViewµÄ²Ù×÷ºÍ¶àÏß³Ì϶ÔÈÝÆ÷µÄ²Ù×÷¡£
Õë¶ÔListViewÖÐÔì³ÉµÄIndexOutOfBoundsException£¬¾³£ÊÇÒòΪÍⲿҲ³ÖÓÐÁËAdapterÀïÊý¾ÝµÄÒýÓÃ(ÈçÔÚAdapterµÄ¹¹Ô캯ÊýÀïÖ±½Ó¸³Öµ)£¬ÕâʱÈç¹ûÍⲿÒýÓöÔÊý¾Ý¸ü¸ÄÁË£¬µ«Ã»Óм°Ê±µ÷ÓÃnotifyDataSetChanged()£¬ÔòÓпÉÄÜÔì³ÉCrash£¬¶Ô´ËÎÒÃÇ·â×°ÁËÒ»¸öBaseAdapter£¬Êý¾ÝͳһÓÉAdapter×Ô¼ºÎ¬»¤Í¨Öª£¬
ͬʱҲ¼«´óµÄ±ÜÃâÁËThe content of the adapter has changed but
ListView did not receive a notification£¬ÕâÁ½ÀàCrashĿǰµÃµ½ÁËͳһµÄ½â¾ö¡£
ÁíÍ⣬ºÜ¶àÈÝÆ÷ÊÇÏ̲߳»°²È«µÄ£¬ËùÒÔÈç¹ûÔÚ¶àÏß³ÌÏÂ¶ÔÆä²Ù×÷¾ÍÈÝÒ×Òý·¢IndexOutOfBoundsException¡£³£ÓõÄÈçJDKÀïµÄArrayListºÍAndroidÀïµÄSparseArray¡¢ArrayMap£¬Í¬Ê±Ò²Òª×¢ÒâÓÐһЩÀàµÄÄÚ²¿ÊµÏÖÒ²ÊÇÓõÄÏ̲߳»°²È«µÄÈÝÆ÷£¬ÈçBundleÀïÓõľÍÊÇArrayMap¡£
ϵͳ¼¶CrashÖÎÀí
ÖÚËùÖÜÖª£¬AndroidµÄ»úÐÍÖڶ࣬Ë鯬»¯ÑÏÖØ£¬¸÷¸öÓ²¼þ³§ÉÌ¿ÉÄÜ»á¶¨ÖÆ×Ô¼ºµÄROM£¬¸ü¸Äϵͳ·½·¨£¬µ¼ÖÂÌØ¶¨»úÐ͵ıÀÀ£¡£·¢ÏÖÕâÀàCrash£¬Ö÷Òª¿¿ÔÆ²âÆ½Ì¨ÅäºÏ×Ô¶¯»¯²âÊÔ£¬ÒÔ¼°ÏßÉÏ¼à¿Ø£¬ÕâÖÖÇé¿öϵÄCrash¶ÑÕ»ÐÅÏ¢ºÜÄÑÖ±½Ó¶¨Î»ÎÊÌâ¡£ÏÂÃæÊdz£¼ûµÄ½â¾ö˼·£º
³¢ÊÔÕÒµ½Ôì³ÉCrashµÄ¿ÉÒÉ´úÂ룬¿´ÊÇ·ñÓÐÌØÒìµÄAPI»òÕßµ÷Ó÷½Ê½²»µ±µ¼Öµģ¬³¢ÊÔÐ޸ĴúÂëÂß¼À´½øÐйæ±Ü¡£
ͨ¹ýHookÀ´½â¾ö£¬Hook·ÖΪJava HookºÍNative
Hook¡£Java HookÖ÷Òª¿¿·´Éä»òÕß¶¯Ì¬´úÀíÀ´¸ü¸ÄÏàÓ¦APIµÄÐÐΪ£¬ÐèÒª³¢ÊÔÕÒµ½¿ÉÒÔHookµÄµã£¬Ò»°ãHookµÄµã¶àΪ¾²Ì¬±äÁ¿£¬Í¬Ê±ÐèҪעÒâAndroid²»Í¬°æ±¾µÄAPI£¬ÀàÃû¡¢·½·¨ÃûºÍ³ÉÔ±±äÁ¿Ãû¶¼¿ÉÄܲ»Ò»Ñù£¬ËùÒÔÒª×öºÃ¼æÈݹ¤×÷;Native
HookÔÀíÉÏÊÇÓøü¸Äºó·½·¨°Ñ¾É·½·¨ÔÚÄÚ´æµØÖ·ÉϽøÐÐÌæ»»£¬ÐèÒª¿¼Âǵ½DalvikºÍARTµÄ²îÒì;Ïà¶ÔÀ´ËµNative
HookµÄ¼æÈÝÐÔ¸ü²îÒ»µã£¬ËùÒÔÓÃNative HookµÄʱºòÐèÒªÅäºÏ½µ¼¶²ßÂÔ¡£
Èç¹ûͨ¹ýǰÁ½ÖÖ·½Ê½¶¼ÎÞ·¨½â¾öµÄ»°£¬ÎÒÃÇÖ»Äܳ¢ÊÔ·´±àÒëROM£¬Ñ°ÕÒ½â¾öµÄ°ì·¨¡£
ÎÒÃǾÙÒ»¸ö¶¨ÖÆÏµÍ³ROMµ¼ÖÂCrashµÄÀý×Ó£¬¸ù¾ÝCrashƽ̨ͳ¼ÆÊý¾Ý·¢ÏÖ¸ÃCrashÖ»·¢ÉúÔÚvivo
V3MaxÕâÀà»úÐÍÉÏ£¬Crash¶ÑÕ»ÈçÏ£º

ÎÒÃÇ·¢ÏÖÔÉúϵͳÉ϶ÔӦϵͳ°æ±¾µÄAbsListViewÀﲢûÓÐUpdateBottomFlagTaskÀ࣬Òò´Ë¿ÉÒԶ϶¨ÊÇvivo¸Ã°æ±¾¶¨ÖƵÄROMÐÞ¸ÄÁËϵͳµÄʵÏÖ¡£ÎÒÃÇÔÚ¶¨Î»Õâ¸öCrashµÄ¿ÉÒɵãÎÞ¹ûºó¾ö¶¨Í¨¹ýHookµÄ·½Ê½½â¾ö£¬Í¨¹ýÔ´Âë·¢ÏÖAsyncTask$SerialExecutorÊǾ²Ì¬±äÁ¿£¬ÊÇÒ»¸öºÜºÃµÄHookµÄµã£¬Í¨¹ý·´ÉäÌí¼Ótry-catch½â¾ö¡£ÒòΪÐ޸ĵÄÊÇfinal¶ÔÏóËùÒÔÐèÒªÏÈ·´ÉäÐÞ¸ÄaccessFlags£¬ÐèҪעÒâARTºÍDalvik϶ÔÓ¦µÄClass²»Í¬£¬´úÂëÈçÏ£º

ÃÀÍÅÍâÂôAppÓÃÉÏÊö·½·¨½â¾öÁ˶ÔÓ¦µÄCrash£¬µ«ÊÇÃÀÍÅAppÀïµÄÍâÂôƵµÀÒòΪƽ̨µÄÏÞÖÆÎÞ·¨Í¨¹ýÕâÖÖ·½Ê½£¬ÓÚÊÇÎÒÃdz¢ÊÔ·´±àÒëROM¡£
Android ROM±àÒëʱ»á½«framework¡¢app¡¢binµÈĿ¼´òÈësystem.imgÖУ¬system.imgÊÇAndroidϵͳÖÐÓÃÀ´´æ·ÅϵͳÎļþµÄ¾µÏñ
(image)£¬Îļþ¸ñʽһ°ãΪyaffs2»òext¡£µ«Android 5.0¿ªÊ¼Ö§³Ödm-verityºó£¬system.img²»ÔÙÌṩ£¬¶øÊÇÌṩÁËÈý¸öÎļþsystem.new.dat£¬system.patch.dat£¬system.transfer.list£¬Òò´ËÎÒÃÇÊ×ÏÈÐèҪͨ¹ýÉÏÊöµÄÈý¸öÎļþµÃµ½system.img¡£µ«ÎÒÃǽ«vivo
ROM½âѹºó·¢ÏÖ³§É̽«system.new.dat½øÐÐÁË·ÖÆ¬£¬ÈçÏÂͼËùʾ£º

¾¹ý¶Ôsystem.transfer.listÖеÄÐÅÏ¢ºÍsystem.new.dat
1 2 3 ¡ Îļþ´óС¶Ô±ÈÑо¿£¬·¢ÏÖһЩ¹²Í¬µã£¬system.transfer.listÖеÄÿһ¸öblockÊý*4KB
Óë¶ÔÓ¦µÄ·ÖƬÎļþµÄ´óС´óÖÂÏàͬ,¹Ê´óµ¨²Â²â£¬vivo ROM¶Ôsystem.patch.dat·ÖƬҲֻÊǵ¥´¿µÄ°´blockÏȺó˳Ðò½øÐÐÁË·ÖÆ¬´¦Àí¡£ËùÒÔÎÒÃÇÖ»ÐèÒªÔÚת»¯imgǰ½«ÕâЩ·ÖƬÎļþºÏ³ÉÒ»¸ösystem.patch.datÎļþ¾Í¿ÉÒÔÁË¡£
×îºó¸ù¾Ýsystem.imgµÄÎļþϵͳ¸ñʽ½øÐнâ°ü£¬Äõ½frameworkĿ¼£¬ÆäÖÐÓÐframework.jarºÍboot.oatµÈÎļþ£¬ÒòΪAndroid4.4Ö®ºóÒýÈëÁËARTÐéÄâ»ú£¬»áÔ¤ÏȰÑsystem/frameworkÖеÄһЩjar°üת»»Îªoat¸ñʽ£¬ËùÒÔÎÒÃÇ»¹ÐèÒª½«¶ÔÓ¦µÄoatÎļþͨ¹ýota2dex½«Æä½â°ü»ñµÃdexÎļþ£¬Ö®ºóͨ¹ýdex2jarºÍjd-gui²é¿´Ô´Âë¡£
OOM
OOMÊÇOutOfMemoryErrorµÄ¼ò³Æ£¬ÔÚ³£¼ûµÄCrashÒÉÄÑÅÅÐаñÉÏ£¬OOM¾ø¶Ô¿ÉÒÔÃûÁÐǰé²¢ÇÒ¾¾Ã²»Ë¥¡£ÒòΪËü·¢ÉúʱµÄCrash¶ÑÕ»ÐÅÏ¢ÍùÍù²»Êǵ¼ÖÂÎÊÌâµÄ¸ù±¾ÔÒò£¬¶øÖ»ÊÇѹËÀÂæÍÕµÄ×îºóÒ»¸ùµ¾²Ý¡£µ¼ÖÂOOMµÄÔÒò´ó²¿·ÖÈçÏ£º
ÄÚ´æÐ¹Â©£¬´óÁ¿ÎÞÓöÔÏóûÓб»¼°Ê±»ØÊÕµ¼ÖºóÐøÉêÇëÄÚ´æÊ§°Ü¡£
´óÄÚ´æ¶ÔÏó¹ý¶à£¬×î³£¼ûµÄ´ó¶ÔÏó¾ÍÊÇBitmap£¬¼¸¸ö´óͼͬʱ¼ÓÔØºÜÈÝÒ×´¥·¢OOM¡£
ÄÚ´æÐ¹Â©
ÄÚ´æÐ¹Â©Ö¸ÏµÍ³Î´Äܼ°Ê±ÊÍ·ÅÒѾ²»ÔÙʹÓõÄÄÚ´æ¶ÔÏó£¬Ò»°ãÊÇÓÉ´íÎóµÄ³ÌÐò´úÂëÂß¼ÒýÆðµÄ¡£ÔÚAndroidƽ̨ÉÏ£¬×î³£¼ûÒ²ÊÇ×îÑÏÖØµÄÄÚ´æÐ¹Â©¾ÍÊÇActivity¶ÔÏóй©¡£Activity³ÐÔØÁËAppµÄÕû¸ö½çÃæ¹¦ÄÜ£¬ActivityµÄй©ͬʱҲÒâζ×ÅËü³ÖÓеĴóÁ¿×ÊÔ´¶ÔÏó¶¼ÎÞ·¨±»»ØÊÕ£¬¼«ÆäÈÝÒ×Ôì³ÉOOM¡£³£¼ûµÄ¿ÉÄÜ»áÔì³ÉActivityй©µÄÔÒòÓУº
ÄäÃûÄÚ²¿ÀàʵÏÖHandler´¦ÀíÏûÏ¢£¬¿ÉÄܵ¼ÖÂÒþʽ³ÖÓеÄActivity¶ÔÏóÎÞ·¨»ØÊÕ¡£
ActivityºÍContext¶ÔÏó±»»ìÏýºÍÀÄÓã¬ÔÚÐí¶àÖ»ÐèÒªApplication
Context¶ø²»ÐèҪʹÓÃActivity¶ÔÏóµÄµØ·½Ê¹ÓÃÁËActivity¶ÔÏ󣬱ÈÈç×¢²á¸÷ÀàReceiver¡¢¼ÆËãÆÁÄ»Ãܶȵȵȡ£
View¶ÔÏó´¦Àí²»µ±£¬Ê¹ÓÃActivityµÄLayoutInflater´´½¨µÄView×ÔÉí³ÖÓеÄContext¶ÔÏóÆäʵ¾ÍÊÇActivity£¬Õâµã¾³£±»ºöÂÔ£¬ÔÚ×Ô¼ºÊµÏÖViewÖØÓõȳ¡¾°ÏÂÒ²»áµ¼ÖÂActivityй©¡£
¶ÔÓÚActivityй©£¬Ä¿Ç°ÒѾÓÐÁËÒ»¸ö·Ç³£ºÃÓõļì²â¹¤¾ß£ºLeakCanary£¬Ëü¿ÉÒÔ×Ô¶¯¼ì²âµ½ËùÓÐActivityµÄй©Çé¿ö£¬²¢ÇÒÔÚ·¢Éúй©ʱ¸ø³öÊ®·ÖÓѺõĽçÃæÌáʾ£¬Í¬Ê±ÎªÁË·ÀÖ¹¿ª·¢ÈËÔ±µÄÊè©£¬ÎÒÃÇÒ²»á½«ÆäÉϱ¨µ½·þÎñÆ÷£¬Í³Ò»¼ì²é½â¾ö¡£ÁíÍâÎÒÃÇ¿ÉÒÔÔÚdebugÏÂʹÓÃStrictModeÀ´¼ì²éActivityµÄй¶¡¢Closeable¶ÔÏóûÓб»¹Ø±ÕµÈÎÊÌâ¡£
´ó¶ÔÏó
ÔÚAndroidƽ̨ÉÏ£¬ÎÒÃÇ·ÖÎöÈÎÒ»Ó¦ÓõÄÄÚ´æÐÅÏ¢£¬¼¸ºõ¶¼¿ÉÒԵóöͬÑùµÄ½áÂÛ£ºÕ¼ÓÃÄÚ´æ×î¶àµÄ¶ÔÏó´ó¶¼ÊÇBitmap¶ÔÏó¡£Ëæ×ÅÊÖ»úÆÁÄ»³ß´çÔ½À´Ô½´ó£¬ÆÁÄ»·Ö±æÂÊÒ²Ô½À´Ô½¸ß£¬1080pºÍ¸ü¸ßµÄ2kÆÁÒѾռÁË´ó°ë·Ý¶î£¬ÎªÁË´ïµ½¸üºÃµÄÊÓ¾õЧ¹û£¬ÎÒÃÇÍùÍùÐèҪʹÓôóÁ¿¸ßÇåͼƬ£¬Í¬Ê±Ò²ÎªOOMÂñÏÂÁË»ö¸ù¡£¶ÔÓÚͼƬÄÚ´æÓÅ»¯£¬ÎÒÃÇÓм¸¸ö³£ÓõÄ˼·£º
¾¡Á¿Ê¹ÓóÉÊìµÄͼƬ¿â£¬±ÈÈçGlide£¬Í¼Æ¬¿â»áÌṩºÜ¶àͨÓ÷½ÃæµÄ±£ÕÏ£¬¼õÉÙ²»±ØÒªµÄÈËΪʧÎó¡£
¸ù¾Ýʵ¼ÊÐèÒª£¬Ò²¾ÍÊÇView³ß´çÀ´¼ÓÔØÍ¼Æ¬£¬¿ÉÒÔÔÚ·Ö±æÂʽϵ͵ĻúÐÍÉϾ¡¿ÉÄÜÉÙµØÕ¼ÓÃÄÚ´æ¡£³ýÁ˳£ÓõÄBitmapFactory.Options#inSampleSizeºÍGlideÌṩµÄBitmapRequestBuilder#overrideÖ®Í⣬ÎÒÃǵÄͼƬCDN·þÎñÆ÷Ò²Ö§³ÖͼƬµÄʵʱËõ·Å£¬¿ÉÒÔÔÚ·þÎñ¶Ë½øÐÐͼƬËõ·Å´¦Àí£¬´Ó¶ø¼õÇá¿Í»§¶ËµÄÄÚ´æÑ¹Á¦¡£·ÖÎöAppÄÚ´æµÄÏêϸÇé¿öÊǽâ¾öÎÊÌâµÄµÚÒ»²½£¬ÎÒÃÇÐèÒª¶ÔAppÔËÐÐʱµ½µ×Õ¼ÓÃÁ˶àÉÙÄÚ´æ¡¢ÄÄЩÀàÐ͵ĶÔÏóÓжàÉÙ¸öÓдóÖÂÁ˽⣬²¢¸ù¾Ýʵ¼ÊÇé¿ö×ö³öÔ¤²â£¬ÕâÑù²ÅÄÜÔÚ·ÖÎöʱ×öµ½ÓеķÅʸ¡£Android
StudioÒ²ÌṩÁ˷dz£ºÃÓõÄMemory Profiler£¬¶Ñת´¢ºÍ·ÖÅä¸ú×ÙÆ÷¹¦ÄÜ¿ÉÒÔ°ïÎÒÃÇѸËÙ¶¨Î»ÎÊÌâ¡£
AOPÔöÇ¿¸¨Öú
AOPÊÇÃæÏòÇÐÃæ±à³ÌµÄ¼ò³Æ£¬ÔÚAndroidµÄGradle²å¼þ1.5.0ÖÐÐÂÔöÁËTransform
APIÖ®ºó£¬±àÒëʱÐÞ¸Ä×Ö½ÚÂëÀ´ÊµÏÖAOPÒ²ÒòΪÓÐÁ˹ٷ½Ö§³Ö¶ø±äµÃ·Ç³£·½±ã¡£ÔÚÒ»Ð©ÌØ¶¨Çé¿öÏ£¬¿ÉÒÔͨ¹ýAOPµÄ·½Ê½×Ô¶¯´¦Àíδ²¶»ñµÄÒì³££º
Å×Òì³£µÄ·½·¨·Ç³£Ã÷È·£¬µ÷Ó÷½Ê½±È½Ï¹Ì¶¨¡£
Òì³£´¦Àí·½Ê½±È½Ïͳһ¡£
ºÍÒµÎñÂß¼Î޹أ¬¼´×Ô¶¯´¦ÀíÒì³£ºó²»»áÓ°ÏìÕý³£µÄÒµÎñÂß¼¡£µäÐ͵ÄÀý×ÓÓжÁÈ¡Intent
Extras²ÎÊý¡¢¶ÁÈ¡SharedPreferences¡¢½âÎöÑÕÉ«×Ö·û´®ÖµºÍÏÔʾÒþ²ØWindowµÈµÈ¡£
ÕâÀàÎÊÌâµÄ½â¾öÔÀí´óÖÂÏàͬ£¬ÎÒÃÇÒÔIntent ExtrasΪÀýÏêϸ½éÉÜһϡ£¶ÁÈ¡Intent
ExtrasµÄÎÊÌâÔÚÓÚÎÒÃǷdz£³£Óõķ½·¨ Intent#getStringExtra ÔÚ´úÂëÂß¼³ö´í»òÕß¶ñÒâ¹¥»÷µÄÇé¿öÏ¿ÉÄÜ»áÅ׳öClassNotFoundExceptionÒì³££¬¶øÎÒÃÇÆ½Ê±ÔÚд´úÂëʱÓÖ²»Ì«¿ÉÄܸøËùÓе÷Óö¼¼ÓÉÏtry-catchÓï¾ä£¬ÓÚÊÇÒ»¸ö¸ü°²È«µÄIntent¹¤¾ßÀàÓ¦Ô˶øÉú£¬ÀíÂÛÉÏÖ»ÒªËùÓÐÈ˶¼Ê¹ÓÃÕâ¸ö¹¤¾ßÀàÀ´·ÃÎÊIntent
Extras²ÎÊý¾Í¿ÉÒÔ·ÀÖ¹´ËÀàÐ͵ÄCrash¡£µ«ÊÇÃæ¶ÔÅÓ´óµÄ¾É´úÂë²Ö¿âºÍÖî¶àµÄÒµÎñ²¿ÃÅ£¬ÐÞ¸ÄÏÖÓдúÂëÐèÒª¼«´ó³É±¾£¬»¹Óиü¶àµÄÍⲿÒÀÀµSDK»ù±¾²»¿ÉÄÜʹÓÃÎÒÃÇ×Ô¼ºµÄ¹¤¾ßÀ࣬´Ëʱ¾ÍÐèÒªAOP´óÕ¹ÉíÊÖÁË¡£
ÎÒÃÇרÃÅÖÆ×÷ÁËÒ»¸öGradle²å¼þ£¬Ö»ÐèÒªÅäÖÃһϲÎÊý¾Í¿ÉÒÔ½«Ä³¸öÌØ¶¨·½·¨µÄµ÷ÓÃÌæ»»³ÉÁíÒ»¸ö·½·¨£º

ÉÏÃæµÄÅäÖþͿÉÒÔ½«App´úÂë(°üÀ¨µÚÈý·½¿â)ÀïËùÓеÄIntent.getXXXExtraµ÷ÓÃÌæ»»³ÉIntentUtilÀàÖеݲȫ°æÊµÏÖ¡£µ±È»£¬²¢²»ÊÇËùÓеÄÒì³£¶¼Ö»ÐèÒªcatchס¾ÍÍòÊ´󼪣¬Èç¹ûÕæµÄÓÐÂß¼´íÎó¿Ï¶¨ÐèÒªÔÚ¿ª·¢ºÍ²âÊԽ׶μ°Ê±±©Â¶³öÀ´£¬ËùÒÔÔÚIntentUtilÖлá¶ÔAppµÄÔËÐл·¾³×öÅжϣ¬DebugÏ»ὫÒì³£Ö±½ÓÅ׳ö£¬¿ª·¢Í¬Ñ§¿ÉÒÔ¸ù¾ÝCrash¶ÑÕ»·ÖÎöÎÊÌ⣬Release»·¾³ÏÂÔòÔÚ²¶»ñµ½Ò쳣ʱ·µ»Ø¶ÔÓ¦µÄĬÈÏֵȻºó½«Òì³£Éϱ¨µ½·þÎñÆ÷¡£
ÒÀÀµ¿âµÄÎÊÌâ
Android App¾³£»áÒÀÀµºÜ¶àAAR£¬ ÿ¸öAAR¿ÉÄÜÓжà¸ö°æ±¾£¬´ò°üʱGradle»á¸ù¾Ý¹æÔòÈ·¶¨Ê¹ÓõÄ×îÖÕ°æ±¾ºÅ(ĬÈÏÑ¡Ôñ×î¸ß°æ±¾»òÕßÇ¿ÖÆÖ¸¶¨µÄ°æ±¾)£¬¶øÆäËû°æ±¾µÄAAR½«±»¶ªÆú¡£Èç¹û»¥ÏàÒÀÀµµÄAARÖÐÓв»¼æÈݵİ汾£¬´æÔÚµÄÎÊÌâÔÚ´ò°üʱÊDz»ÄÜ·¢Ïֵģ¬Ö»ÓÐÔÚÏà¹Ø´úÂëÖ´ÐÐʱ²Å»á³öÏÖ£¬»áÔì³ÉNoClassDefFoundError¡¢NoSuchFieldError¡¢NoSuchMethodErrorµÈÒì³£¡£
ÈçͼËùʾ£¬orderºÍstoreÁ½¸öÒµÎñ¿â¶¼ÒÀÀµÁËplatform.aar£¬Ò»¸öÊÇ1.0°æ±¾£¬Ò»¸öÊÇ2.0°æ±¾£¬Ä¬ÈÏ×îÖÕ´ò½øAPKµÄÖ»ÓÐplatform
2.0°æ±¾£¬ÕâʱÈç¹ûorder¿âÀïÓõ½µÄplatform¿âÀïµÄij¸öÀà»òÕß·½·¨ÔÚ2.0°æ±¾Öб»É¾³ýÁË£¬ÔËÐÐʱ¾Í¿ÉÄÜ·¢ÉúÒì³££¬ËäÈ»SDKÔÚÉý¼¶Ê±»á¾¡Á¿×öµ½ÏòϼæÈÝ£¬µ«ºÜ¶àʱºòÓÈÆäÊǵÚÈý·½SDKÊÇû·¨µÃµ½±£Ö¤µÄ£¬ÔÚÃÀÍÅÍâÂôAndroid
App v6.0°æ±¾Ê±ÒòΪÕâ¸öÔÒòµ¼ÖÂÈÈÐÞ¸´¹¦ÄÜɥʧ£¬Òò´ËΪÁËÌáǰ·¢ÏÖÎÊÌ⣬ÎÒÃǽÓÈëÁËÒÀÀµ¼ì²é²å¼þDefensor¡£

DefensorÔÚ±àÒëʱͨ¹ýDexTask»ñÈ¡µ½ËùÓеÄÊäÈëÎļþ(Ò²¾ÍÊDZ»±àÒë¹ýµÄclassÎļþ)£¬È»ºó¼ì²éÿ¸öÎļþÀïÒýÓõÄÀà¡¢×ֶΡ¢·½·¨µÈÊÇ·ñ´æÔÚ¡£
³ý´ËÖ®ÍâÎÒÃÇдÁËÒ»¸öGradle²å¼þSVD(strict version
dependencies)À´¶ÔÄÇÐ©ÖØÒªµÄSDKµÄ°æ±¾½øÐÐͳһ¹ÜÀí¡£²å¼þ»áÔÚ±àÒëʱ¼ì²éGradle×îÖÕʹÓõÄSDK°æ±¾ÊÇ·ñºÍÅäÖÃÖеÄÒ»Ö£¬Èç¹û²»Ò»Ö²å¼þ»áÖÕÖ¹±àÒë²¢±¨´í£¬²¢Í¬Ê±»á´òÓ¡³ö·¢Éú³åÍ»µÄSDKµÄËùÓÐÒÀÀµ¹ØÏµ¡£
CrashµÄÔ¤·Àʵ¼ù
µ¥´¿µÄ¿¿Ô¼¶¨»ò¹æ·¶È¥¼õÉÙCrashµÄ·¢ÉúÊDz»ÏÖʵµÄ¡£Ô¼¶¨ºÍ¹æ·¶ÊÜÏÞÓÚ×éÖ¯¼Ü¹¹ºÍ¾ßÌåÖ´ÐеĸöÈË£¬ºÜÈÝÒ×±»ºöÂÔ£¬Ö»Óп¿¹¤³Ì¼Ü¹¹ºÍ¹¤¾ß²ÅÄܱ£Ö¤CrashµÄÔ¤·À³¤¾ÃµÄÖ´ÐÐÏÂÈ¥¡£
¹¤³Ì¼Ü¹¹¶ÔCrashÂʵÄÓ°Ïì
ÔÚÖÎÀíCrashµÄʵ¼ùÖУ¬ÎÒÃÇÍùÍùºöÂÔÁ˹¤³Ì¼Ü¹¹¶ÔCrashÂʵÄÓ°Ïì¡£CrashµÄ·¢Éú´ó²¿·ÖÔÒòÊÇÔ´ÓÚ³ÌÐòÔ±µÄ²»ºÏÀíµÄ´úÂ룬¶ø³ÌÐòÔ±¹¤×÷ÖÐ×îÖ±½ÓµÄ½Ó´¥µÄ¾ÍÊǹ¤³Ì¼Ü¹¹¡£¶ÔÓÚÒ»¸ö±ß½çÄ£ºý£¬²ã¼¶»ìÂҵļܹ¹£¬³ÌÐòÔ±ÊǸü¼ÓÈÝÒ×д³öÒýÆðCrashµÄ´úÂë¡£ÔÚÕâÑùµÄ¼Ü¹¹ÀïÃæ£¬¼´Ê¹³ÌÐòÔ±Òâʶµ½µ¼ÖÂijÖÖд·¨´æÔÚÎÊÌ⣬ÏëҪȥ¸ÄÉÆÕâÑù²»ºÏÀíµÄ´úÂ룬ҲÊǷdz£À§Äѵġ£Ïà·´£¬Ò»¸ö²ã¼¶ÇåÎú£¬±ß½çÃ÷È·µÄ¼Ü¹¹£¬ÊÇÄܹ»´ó´ó¼õÉÙCrash·¢ÉúµÄ¸ÅÂÊ£¬ÖÎÀíºÍÔ¤·ÀCrashÒ²ÊÇÏà¶Ô¸üÈÝÒס£ÕâÀïÎÒÃÇ¿ÉÒÔ¾Ù¼¸¸öÎÒÃÇʵ¼ù¹ýµÄÀý×Ó²ûÊö¡£
ÒµÎñÄ£¿éµÄ»®·Ö
ÔÀ´ÎÒÃǵÄCrash»ù±¾É϶¼ÊÇÓɸö±ðͬѧ¹Ø×¢½â¾öµÄ£¬ÍŶÓÀïµÄÿ¸öͬѧ¶¼»áÌá½»¿ÉÄÜÒýÆðCrashµÄ´úÂ룬Èç¹û¸ºÔðCrashµÄͬѧÒòΪijЩÊÂÇ飬ÔÝʱûÓйØ×¢AppµÄCrashÂÊ£¬ÄÇôÔì³ÉCrashµÄͬѧҲ²»»áÖªµÀËûµÄ´úÂëÒýÆðÁËCrash¡£
¶ÔÓÚÕâ¸öÎÊÌ⣬ÎÒÃǵÄ×ö·¨ÊÇAppµÄÒµÎñÄ£¿é»¯¡£ÒµÎñÄ£¿é»¯ºó£¬Ã¿¸öÒµÎñ¶¼Óж¼ÓÐΨһ°üÃûºÍ¶ÔÓ¦µÄ¸ºÔðÈË¡£µ±Ä³¸öÄ£¿é·¢ÉúÁËCrash£¬¿ÉÒÔ¸ù¾Ý°üÃûÌá½»ÎÊÌâ¸øÕâ¸öÄ£¿éµÄ¸ºÔðÈË£¬ÈÃËûµÚһʱ¼ä½øÐд¦Àí¡£ÒµÎñÄ£¿é»¯±¾ÉíÒ²Êǹ¤³Ì¼Ü¹¹ÓÅÏÈÐèÒª¿¼ÂǵÄÊÂÇéÖ®Ò»¡£
Ò³ÃæÌø×ªÂ·ÓÉͳһ´¦ÀíÒ³ÃæÌø×ª
¶ÔÍâÂôApp¶øÑÔ£¬Ê¹Óùý³ÌÖÐ×î¶àµÄ¾ÍÊÇÒ³Ãæ¼äµÄÌø×ª£¬¶øÒ³Ãæ¼äÌø×ª¾³£»áÔì³ÉActivityNotFoundException£¬ÀýÈçÎÒÃÇÅäÁËÒ»¸öscheme£¬µ«¶Ô·½µÄscheme·¾¶ÒѾ·¢ÉúÁ˱仯;ÓÖÀýÈ磬ÎÒÃǵ÷ÓÃÊÖ»úÉÏÏà²áµÄ¹¦ÄÜ£¬¶øÏà²áÓ¦ÓÃÒѱ»Óû§×Ô¼º½ûÓûòÒÆ³ýÁË¡£½â¾öÕâÒ»ÀàCrash£¬ÆäʵҲºÜ¼òµ¥£¬Ö»ÐèÒªÔÚstartActivityÔö¼ÓActivityNotFoundExceptionÒì³£²¶»ñ¼´¿É¡£µ«Ò»¸öAppÀÆô¶¯ActivityµÄµØ·½£¬¼¸ºõÊÇËæ´¦¿É¼û£¬ÎÞ·¨Ô¤²âÄÄÒ»´¦»áÔì³ÉActivityNotFoundException¡£
ÎÒÃǵÄ×ö·¨Êǽ«Ò³ÃæµÄÌø×ª£¬¶¼Í¨¹ýÎÒÃÇ·â×°µÄscheme·ÓÉÈ¥·Ö·¢¡£ÕâÑùµÄºÃ´¦ÊÇ£¬Í¨¹ýscheme·ÓÉ£¬ÔÚ¹¤³Ì¼Ü¹¹ÉÏËùÓÐÒµÎñ¶¼Êǽâñģ¿é¼ä²»ÐèÒªÏ໥ÒÀÀµ¾Í¿ÉÒÔʵÏÖÒ³ÃæµÄÌø×ªºÍ»ù±¾ÀàÐͲÎÊýµÄ´«µÝ;ͬʱ£¬ÓÉÓÚËùÓеÄÒ³ÃæÌø×ª¶¼»á×ßscheme·ÓÉ£¬ÎÒÃÇÖ»ÐèÒªÔÚscheme·ÓÉÀïÒ»´¦¼ÓÉÏActivityNotFoundExceptionÒì³£²¶»ñ¼´¿É½â¾öÕâÖÖÀàÐ͵ÄCrash¡£Â·ÓÉÉè¼ÆÊ¾ÒâͼÈçÏ£º

ÍøÂç²ãͳһ´¦ÀíAPIÔàÊý¾Ý
¿Í»§¶ËµÄºÜ´óÒ»²¿·ÖµÄCrashÊÇÒòΪAPI·µ»ØµÄÔàÊý¾Ý¡£±ÈÈçµ±API·µ»Ø¿ÕÖµ¡¢¿ÕÊý×é»ò·µ»Ø²»ÊÇÔ¼¶¨ÀàÐ͵ÄÊý¾Ý£¬AppÊÕµ½ÕâЩÊý¾Ý£¬¾Í¼«ÓпÉÄÜ·¢Éú¿ÕÖ¸Õë¡¢Êý×éÔ½½çºÍÀàÐÍת»»´íÎóµÈCrash¡£¶øÇÒÕâÑùµÄÔàÊý¾Ý£¬ÌرðÈÝÒ×ÒýÆðÏßÉÏ´óÃæ»ýµÄ±ÀÀ£¡£
×îÔçÎÒÃǵŤ³ÌµÄÍøÂç²ãÓ÷¨ÊÇ£ºÒ³Ãæ¼àÌýÍøÂç³É¹¦ºÍʧ°ÜµÄ»Øµ÷£¬ÍøÂç³É¹¦ºó£¬½«JSONÊý¾Ý´«µÝ¸øÒ³Ãæ£¬Ò³Ãæ½âÎöModel£¬³õʼ»¯View£¬ÈçͼËùʾ¡£ÕâÑùµÄÎÊÌâ¾ÍÊÇ£¬ÍøÂçËäÈ»ÇëÇó³É¹¦ÁË£¬µ«ÊÇJSON½âÎöModelÕâ¸ö¹ý³Ì¿ÉÄÜ´æÔÚÎÊÌ⣬ÀýÈçûÓзµ»ØÊý¾Ý»òÕß·µ»ØÁËÀàÐͲ»¶ÔµÄÊý¾Ý£¬¶øÕâ¸öÔàÊý¾Ýµ¼ÖÂÎÊÌâ»á³öÏÖÔÚUI²ã£¬Ö±½Ó·´Ó¦¸øÓû§¡£

¸ù¾ÝÉÏͼ£¬ÎÒÃÇ¿ÉÒÔ¿´µ½ÓÉÓÚÍøÂç²ãÖ»³Ðµ£ÁËÇëÇóÍøÂçµÄÖ°Ôð£¬Ã»Óге£Êý¾Ý½âÎöµÄÖ°Ôð£¬Êý¾Ý½âÎöµÄÖ°Ô𽻸øÁËÒ³ÃæÈ¥´¦Àí¡£ÕâÑùʹµÃÎÒÃÇÒ»µ©·¢ÏÖÔàÊý¾Ýµ¼ÖµÄCrash£¬¾ÍÖ»ÄÜÔÚÍøÂçÇëÇóµÄ»Øµ÷ÀïÃæÔö¼Ó¸÷ÖÖÅжÏÈ¥¼æÈÝÔàÊý¾Ý¡£ÎÒÃÇÓм¸°Ù¸öÒ³Ãæ£¬²¹Â©ÍêÈ«²¹²»¹ýÀ´¡£Í¨¹ý¼¸¸ö°æ±¾µÄÖØ¹¹£¬ÎÒÃÇÖØÐ»®·ÖÁËÍøÂç²ãµÄÖ°Ôð£¬ÈçͼËùʾ£º

´ÓͼÉÏ¿ÉÒÔ¿´³ö£¬Öع¹ºóµÄÍøÂç²ã¸ºÔðÇëÇóÍøÂçºÍÊý¾Ý½âÎö£¬Èç¹û´æÔÚÔàÊý¾ÝµÄ»°£¬ÔÚÍøÂç²ã¾Í»á·¢ÏÖÎÊÌ⣬²»»áÓ°Ïìµ½UI²ã£¬·µ»Ø¸øUI²ãµÄ¶¼ÊÇУÑé³É¹¦µÄÊý¾Ý¡£ÕâÑù¸ÄÔìºó£¬ÎÒÃÇ·¢ÏÖÕâÀàµÄCrashÂÊÓÐÁ˼«´óµÄ¸ÄÉÆ¡£
´óͼ¼à¿Ø
ÉÏÃæ½²µ½´ó¶ÔÏóÊǵ¼ÖÂOOMµÄÖ÷ÒªÔÒòÖ®Ò»£¬¶øBitmapÊÇAppÀï×î³£¼ûµÄ´ó¶ÔÏóÀàÐÍ£¬Òò´Ë¶ÔÕ¼ÓÃÄÚ´æ¹ý´óµÄBitmap¶ÔÏóµÄ¼à¿Ø¾ÍºÜÓбØÒªÁË¡£
ÎÒÃÇÓÃAOP·½Ê½HookÁËÈýÖÖ³£¼ûͼƬ¿âµÄ¼ÓÔØÍ¼Æ¬»Øµ÷·½·¨£¬Í¬Ê±¼à¿ØÍ¼Æ¬¿â¼ÓÔØÍ¼Æ¬Ê±µÄÁ½¸öά¶È£º
¼ÓÔØÍ¼Æ¬Ê¹ÓõÄURL¡£ÍâÂôAppÖгý¾²Ì¬×ÊÔ´Í⣬ËùÓÐͼƬ¶¼ÒªÇó·¢²¼µ½×¨ÓõÄͼƬCDN·þÎñÆ÷ÉÏ£¬¼ÓÔØÍ¼Æ¬Ê±Ê¹ÓÃÕýÔò±í´ïʽƥÅäURL£¬³ýÁËÏÞ¶¨CDNÓòÃûÖ®Í⻹ҪÇóËùÓÐͼƬ¼ÓÔØÊ±¶¼ÒªÌí¼Ó¶ÔÓ¦µÄ¶¯Ì¬Ëõ·Å²ÎÊý¡£
×îÖÕ¼ÓÔØ³öµÄͼƬ½á¹û(Ò²¾ÍÊÇBitmap¶ÔÏó)¡£ÎÒÃÇÖªµÀBitmap¶ÔÏóËùÕ¼ÄÚ´æºÍÆä·Ö±æÂÊ´óС³ÉÕý±È£¬¶øÒ»°ãÇé¿öÏÂÔÚImageViewÉÏÉèÖó¬¹ý×ÔÉí³ß´çµÄͼƬÊÇûÓÐÒâÒåµÄ£¬ËùÒÔÎÒÃÇÒªÇóÏÔʾÔÚImageViewÖеÄBitmap·Ö±æÂʲ»ÔÊÐí³¬¹ýView×ÔÉíµÄ³ß´ç(ΪÁ˽µµÍÎó±¨ÂÊÒ²¿ÉÒÔÉ趨һ¸ö±¨¾¯ãÐÖµ)¡£
¿ª·¢¹ý³ÌÖУ¬ÔÚAppÀï¼ì²âµ½²»ºÏ¹æµÄͼƬʱ»áÁ¢¼´¸ßÁÁ³ö´íµÄImageViewËùÔÚµÄλÖò¢µ¯³ö¶Ô»°¿òÌáʾImageViewËùÔÚµÄActivity¡¢XPathºÍ¼ÓÔØÍ¼Æ¬Ê¹ÓõÄURLµÈÐÅÏ¢£¬ÈçÏÂͼ£¬¸¨Öú¿ª·¢Í¬Ñ§¶¨Î»²¢½â¾öÎÊÌâ¡£ÔÚRelease»·¾³Ï¿ÉÒÔ½«±¨¾¯ÐÅÏ¢Éϱ¨µ½·þÎñÆ÷£¬ÊµÊ±¹Û²ìÊý¾Ý£¬ÓÐÎÊÌ⼰ʱ´¦Àí¡£

Lint¼ì²é
ÎÒÃÇ·¢ÏÖÏßÉϵĺܶàCrashÆäʵ¿ÉÒÔÔÚ¿ª·¢¹ý³ÌÖÐͨ¹ýLint¼ì²éÀ´±ÜÃâ¡£LintÊÇGoogleÌṩµÄAndroid¾²Ì¬´úÂë¼ì²é¹¤¾ß£¬¿ÉÒÔɨÃè²¢·¢ÏÖ´úÂëÖÐDZÔÚµÄÎÊÌ⣬ÌáÐÑ¿ª·¢ÈËÔ±¼°ÔçÐÞÕý£¬Ìá¸ß´úÂëÖÊÁ¿¡£
µ«ÊÇAndroidÔÉúÌṩµÄLint¹æÔò(ÈçÊÇ·ñʹÓÃÁ˸߰汾API)Ô¶Ô¶²»¹»£¬È±ÉÙһЩÎÒÃÇÈÏΪÓбØÒªµÄ¼ì²â£¬Ò²²»Äܼì²é´úÂë¹æ·¶¡£Òò´ËÎÒÃÇ¿ªÊ¼¿ª·¢×Ô¶¨ÒåLint£¬Ä¿Ç°ÎÒÃÇͨ¹ý×Ô¶¨ÒåLint¹æÔòÒѾʵÏÖÁËCrashÔ¤·À¡¢BugÔ¤·À¡¢ÌáÉýÐÔÄÜ/°²È«ºÍ´úÂë¹æ·¶¼ì²éÕâЩ¹¦ÄÜ¡£Èç¼ì²éʵÏÖÁËSerializable½Ó¿ÚµÄÀ࣬Æä³ÉÔ±±äÁ¿(°üÀ¨´Ó¸¸Àà¼Ì³ÐµÄ)ËùÉùÃ÷µÄÀàÐͶ¼ÒªÊµÏÖSerializable½Ó¿Ú£¬¿ÉÒÔÓÐЧµÄ±ÜÃâNotSerializableException;Ç¿ÖÆÊ¹Ó÷â×°ºÃµÄ¹¤¾ßÀàÈçColorUtil¡¢WindowUtilµÈ¿ÉÒÔÓÐЧµÄ±ÜÃâÒòΪ²ÎÊý²»ÕýÈ·²úÉúµÄIllegalArgumentExceptionºÍÒòΪActivityÒѾfinishµ¼ÖµÄBadTokenException¡£
Lint¼ì²é¿ÉÒÔÔÚ¶à¸ö½×¶ÎÖ´ÐУ¬°üÀ¨ÔÚ±¾µØÊÖ¶¯¼ì²é¡¢±àÂëʵʱ¼ì²é¡¢±àÒëʱ¼ì²é¡¢commitʱ¼ì²é£¬ÒÔ¼°ÔÚCIϵͳÖÐÌáPull
Requestʱ¼ì²é¡¢´ò°üʱ¼ì²éµÈ£¬ÈçÏÂͼËùʾ¡£¸üÏêϸµÄÄÚÈݿɲο¼¡¶ÃÀÍÅÍâÂôAndroid Lint´úÂë¼ì²éʵ¼ù¡·¡£

×ÊÔ´ÖØ¸´¼ì²é
ÔÚ֮ǰµÄÎÄÕ¡¶ÃÀÍÅÍâÂôAndroidƽ̨»¯¼Ü¹¹ÑݽøÊµ¼ù¡·Öн²ÊöÁËÎÒÃÇµÄÆ½Ì¨»¯Ñݽø¹ý³Ì£¬ÔÚÕâ¸ö¹ý³ÌÖдó¼ÒºÜ´óµÄÒ»²¿·Ö¹¤×÷ÊÇϳÁ£¬µ«ÊÇϳÁ²»ÍêÈ«¾Í»áµ¼ÖÂһЩÀàºÍ×ÊÔ´µÄÖØ¸´£¬ÀàÒòΪÓаüÃûµÄÏÞÖÆ²»»á³öÏÖÎÊÌâ¡£µ«ÊÇһЩ×ÊÔ´ÎļþÈçlayout¡¢drawableµÈÈç¹ûͬÃûÔòϲã»á±»Éϲ㸲¸Ç£¬ÕâʱlayoutÀïviewµÄid·¢ÉúÁ˱仯¾Í¿ÉÄܵ¼Ö¿ÕÖ¸ÕëµÄÎÊÌâ¡£
ΪÁ˱ÜÃâÕâÖÖÎÊÌ⣬ÎÒÃÇдÁËÒ»¸öGradle²å¼þͨ¹ýhook MergeResourceÕâ¸öTask£¬Äõ½ËùÓÐlibraryºÍÖ÷¿âµÄ×ÊÔ´Îļþ£¬Èç¹û¼ì²éµ½Öظ´Ôò»áÖжϱàÒë¹ý³Ì£¬Êä³öÖØ¸´µÄ×ÊÔ´Ãû¼°¶ÔÓ¦µÄlibrary
name£¬Í¬Ê±±ÜÃâÓÐЩ×ÊÔ´ÒòΪÑùʽµÈÔÒòȷʵÐèÒª¸²¸Ç£¬Òò´ËÎÒÃÇÉèÖÃÁ˰×Ãûµ¥¡£Í¬Ê±ÔÚÕâ¸ö¹ý³ÌÖÐÎÒÃÇÒ²Äõ½ÁËËùÓеĵÄͼƬ×ÊÔ´£¬¿ÉÒÔ˳ÊÖ×öͼƬ´óСµÄ±¾µØ¼à¿Ø£¬ÈçÏÂͼËùʾ£º

CrashµÄ¼à¿Ø&Ö¹ËðµÄʵ¼ù
¼à¿Ø
ÔÚ¾¹ýÇ°ÃæÌáµ½µÄ¸÷ÖÖ¼ì²éºÍ²âÊÔÖ®ºó£¬Ó¦Óñ㿪ʼ·¢²¼ÁË¡£ÎÒÃǽ¨Á¢ÁËÈçÏÂͼµÄ¼à¿ØÁ÷³Ì£¬À´±£Ö¤Òì³£·¢ÉúʱÄܹ»¼°Ê±µÃµ½·´À¡²¢´¦Àí¡£Ê×ÏÈÊÇ»Ò¶È¼à¿Ø£¬»Ò¶È½×¶ÎÊÇÔöÁ¿Crash×îÈÝÒ×±©Â¶µÄ½×¶Î£¬Èç¹ûÕâ¸ö½×¶ÎûÓкܺõİÑÎÕס£¬»áʹµÃÔöÁ¿±ä´æÁ¿£¬´Ó¶øµ¼ÖÂCrashÂÊÉÏÉý¡£
Èç¹ûÌõ¼þÔÊÐíµÄ»°£¬¿ÉÒÔÔÚ»Ò¶ÈÆÚ¼äÖÆ¶¨Ò»Ð©»Ò¶È²ßÂÔÈ¥Ìá¸ßÕâ¸ö½×¶ÎCrashµÄ±©Â¶¡£ÀýÈç·ÖÇþµÀ»Ò¶È¡¢·Ö³ÇÊлҶȡ¢·ÖÒµÎñ³¡¾°»Ò¶È¡¢ÐÂ×°Óû§µÄ»Ò¶ÈµÈµÈ£¬¾¡Á¿¸²¸ÇËùÓеķÖÖ§¡£»Ò¶È½áÊøÖ®ºó±ã¿ªÊ¼È«Á¿£¬ÔÚÈ«Á¿µÄ¹ý³ÌÖÐÎÒÃÇ»¹ÐèҪһЩÈÕ³£Crash¼à¿ØºÍCrashÂʵÄÒì³£±¨¾¯À´·Àֹͻ·¢Çé¿öµÄ·¢Éú£¬ÀýÈçÒòΪºǫ́ÉÏÏß»òÕßÔËÓªÅäÖôíÎóµ¼ÖµÄÏßÉÏCrash¡£³ý´ËÖ®Í⻹ÐèҪһЩÆäËûµÄ¼à¿Ø£¬ÀýÈ磬֮ǰÌáµ½µÄ´óͼ¼à¿Ø£¬À´±ÜÃâÒòΪ´óͼµ¼ÖµÄOOM¡£¾ßÌåµÄÊä³öÐÎʽÖ÷ÒªÓÐÓʼþ֪ͨ¡¢IM֪ͨ¡¢±¨±í¡£

Ö¹Ëð
¾¡¹ÜÎÒÃÇÔÚÇ°Ãæ×öÁËÄÇô¶à£¬µ«ÊÇCrash»¹ÊÇÎÞ·¨±ÜÃâµÄ£¬ÀýÈ磬ÔڻҶȽ׶ÎÒòΪÁ¿¼¶²»¹»£¬ÓÐЩCrashûÓб»±©Â¶³öÀ´;ÓÖ»òÕßijЩ¹¦Äܿͻ§¶Ë±Èºǫ́¸üÔçÉÏÏߣ¬¶øÕâЩ¹¦ÄÜÔڻҶȽ׶ÎûÓб»¸²¸Çµ½;ÕâЩÇé¿öÏ£¬Èç¹û³öÏÖÎÊÌâ¾ÍÐèÒª¿¼ÂÇÈçºÎÖ¹ËðÁË¡£
ÎÊÌâ·¢ÉúʱÊ×ÏÈÐèÒªÆÀ¹ÀÖØÒªÐÔ£¬Èç¹ûÎÊÌâ²»ÊǺÜÑÏÖØ¶øÇÒÐÞ¸´³É±¾½Ï¸ß¿ÉÒÔ¿¼ÂÇÔÚϸö°æ±¾ÔÙÐÞ¸´£¬Ïà·´Èç¹ûÎÊÌâ±È½ÏÑÏÖØ£¬¶ÔÓû§ÌåÑé»òϵ¥ÓÐÓ°Ïìʱ¾Í±ØÐëÒªÐÞ¸´¡£ÐÞ¸´Ê±Ê×ÏÈ¿¼ÂÇÒµÎñ½µ¼¶£¬Ö÷Òª¿´¸Ã²¿·ÖÒì³£µÄÒµÎñÊÇ·ñÓжµµ×»òÕßA/B²ßÂÔ£¬ÕâÑùÊÇ×îÎÈÍ×Ò²ÊÇ×îÓÐЧµÄ·½Ê½¡£
Èç¹ûÒµÎñ²»Äܽµ¼¶¾ÍÐèÒª¿¼ÂÇÈÈÐÞ¸´ÁË£¬Ä¿Ç°ÃÀÍÅÍâÂôAndroid App½ÓÈëµÄÈÈÐÞ¸´¿ò¼ÜÊÇ×ÔÑеÄRobust£¬¿ÉÒÔÐÞ¸´90%ÒÔÉϵij¡¾°£¬ÈÈÐ޳ɹ¦ÂÊÒ²´ïµ½ÁË99%ÒÔÉÏ¡£Èç¹ûÎÊÌâ·¢ÉúÔÚÈÈÐÞ¸´ÎÞ·¨¸²¸ÇµÄ³¡¾°£¬¾ÍÖ»ÄÜÇ¿ÖÆÓû§Éý¼¶¡£Ç¿ÖÆÉý¼¶ÒòΪ¸²¸ÇÖÜÆÚ³¤£¬Í¬Ê±Ó°ÏìÓû§µÄÌåÑ飬ֻÔÚÍò²»µÃÒѵÄÇé¿öϲŻáʹÓá£
Õ¹Íû
CrashµÄ×ÔÎÒÐÞ¸´
ÎÒÃÇÔÚ×öм¼ÊõÑ¡ÐÍʱ³ýÁËÒª¿¼ÂÇÊÇ·ñÄÜÂú×ãÒµÎñÐèÇó¡¢ÊÇ·ñ±ÈÏÖÓм¼Êõ¸üÓÅÐãºÍÍŶÓѧϰ³É±¾µÈÒòËØÖ®Í⣬¼æÈÝÐÔºÍÎȶ¨ÐÔÒ²·Ç³£ÖØÒª¡£µ«Ãæ¶Ô¹úÄڷǸ»¶à²ÊµÄAndroidϵͳ»·¾³£¬ÔÚÌåÁ¿°ÙÍò¼¶ÒÔÉϵĵÄAppÖм¸ºõ²»¿ÉÄÜʵÏÖºÁÎÞ覴õļ¼Êõ·½°¸ºÍ×é¼þ£¬ËùÒÔÒ»°ãÇé¿öÏÂÈç¹ûij¸ö¼¼ÊõʵÏÖ·½°¸¿ÉÒÔ´ïµ½0.01¡ëÒÔϵıÀÀ£ÂÊ£¬¶øÆäËû·½°¸Ò²Ã»ÓиüºÃµÄ±íÏÖ£¬ÎÒÃǾÍÈÏΪËüÊÇ¿ÉÒÔ½ÓÊܵġ£µ«ÊÇÄÄŽö½öÊ®Íò·ÖÖ®Ò»µÄ±ÀÀ£ÂÊ£¬Ò²´ú±í»¹ÓÐÓû§Êܵ½Ó°Ï죬¶øÎÒÃÇÈÏΪCrash¶ÔÓû§À´ËµÊÇ×îÔã¸âµÄÌåÑ飬ÓÈÆäÊÇÉæ¼°µ½½»Ò׵ij¡¾°£¬ËùÒÔÎÒÃDZØÐë±¾×Åÿһµ¥¶¼ºÜÖØÒªµÄÔÔò£¬¾¡×î´óŬÁ¦±£Ö¤Óû§Ë³ÀûÖ´ÐÐÁ÷³Ì¡£
ʵ¼ÊÇé¿öÖÐÓÐһЩ¼¼Êõ·½°¸ÔÚ¼æÈÝÐÔºÍÎȶ¨ÐÔÉÏ×öÁËÒ»¶¨Í×еij¡¾°£¬ÍùÍùÊÇÒòΪ¿¼Âǵ½ÐÔÄÜ»òÀ©Õ¹ÐԵȷ½ÃæµÄÓÅÊÆ¡£ÕâÖÖÇé¿öÏÂÎÒÃÇÆäʵ¿ÉÒÔÔÙ¶à×öһЩ£¬½øÒ»²½Ìá¸ßAppµÄ¿ÉÓÃÐÔ¡£¾ÍÏñºÜ¶à²Ù×÷ϵͳ¶¼ÓС°¼æÈÝģʽ¡±»òÕß¡°°²È«Ä£Ê½¡±£¬ºÜ¶à×Ô¶¯»¯»úе»úÆ÷¶¼ÅäÌ×ÓÐÊÖ¶¯²Ù×÷ģʽһÑù£¬AppÀïÒ²¿ÉÒÔʵÏÖ±¸ÓõĽµ¼¶·½°¸£¬È»ºóÉèÖÃÌØ¶¨Ìõ¼þµÄ´¥·¢²ßÂÔ£¬´Ó¶ø´ïµ½×Ô¶¯ÐÞ¸´CrashµÄÄ¿µÄ¡£
¾ÙÀýÀ´½²£¬Android 3.0ÖÐÒýÈëÁËÓ²¼þ¼ÓËÙ»úÖÆ£¬ËäÈ»¿ÉÒÔÌá¸ß»æÖÆÖ¡Âʲ¢ÇÒ½µµÍCPUÕ¼ÓÃÂÊ£¬µ«ÊÇÔÚijЩ»úÐÍÉÏ»¹ÊÇ»áÓлæÖÆ´íÂÒÉõÖÁCrashµÄÇé¿ö£¬ÕâʱÎÒÃǾͿÉÒÔÔÚAppÖмǼӲ¼þ¼ÓËÙÏà¹ØµÄCrashÎÊÌâ»òÕßʹÓüì²â´úÂëÖ÷¶¯¼ì²âÓ²¼þ¼ÓËÙ¹¦ÄÜÊÇ·ñÕý³£¹¤×÷£¬È»ºóÖ÷¶¯Ñ¡ÔñÊÇ·ñ¿ªÆôÓ²¼þ¼ÓËÙ£¬ÕâÑù¼È¿ÉÒÔÈþø´ó²¿·ÖÓû§ÏíÊÜÓ²¼þ¼ÓËÙ´øÀ´µÄÓÅÊÆ£¬Ò²¿ÉÒÔ±£ÕÏÓ²¼þ¼ÓËÙ¹¦Äܲ»ÍêÉÆµÄ»úÐͲ»ÊÜÓ°Ïì¡£»¹ÓÐһЩÀàËÆµÄ¿ÉÒÔ×ö×Ô¶¯½µ¼¶µÄ³¡¾°£¬±ÈÈ磺
²¿·ÖʹÓÃJNIʵÏÖµÄÄ£¿é£¬ÔÚSO¼ÓÔØÊ§°Ü»òÕßÔËÐÐʱ·¢ÉúÒì³£Ôò¿ÉÒÔ½µ¼¶ÎªJava°æÊµÏÖ¡£
RenderScriptʵÏÖµÄͼƬģºýЧ¹û£¬Ò²¿ÉÒÔÔÚʧ°Üºó½µ¼¶ÎªÆÕͨµÄJava°æ¸ß˹ģºýËã·¨¡£
ÔÚʹÓÃRetrofitÍøÂç¿âʱ·¢ÏÖOkHttp3»òÕßHttpURLConnectionÍøÂçͨµÀʧ°ÜÂʸߣ¬¿ÉÒÔÖ÷¶¯Çл»µ½ÁíÒ»ÖÖͨµÀ¡£
ÕâÀàÎÊÌâ¶¼ÐèÒª¸ù¾Ý¾ßÌåÇé¿ö¾ßÌå·ÖÎö£¬Èç¹û¿ÉÒÔÕÒµ½×¼È·µÄÅж¨Ìõ¼þºÍÎȶ¨µÄÐÞ¸´·½°¸£¬¾Í¿ÉÒÔÈÃAppÎȶ¨ÐÔÔÙÉÏÒ»¸ǫ̈½×¡£
ÌØ¶¨CrashÀàÐÍÈÕÖ¾×Ô¶¯»ØÀÌ
ÍâÂôÒµÎñ·¢Õ¹Ñ¸ËÙ£¬¼´Ê¹ÎÒÃÇÔÚ¿ª·¢Ê±Ê¹Óø÷ÖÖ¹¤¾ß¡¢´ëÊ©À´±ÜÃâCrashµÄ·¢Éú£¬µ«Crash»¹ÊDz»¿É±ÜÃâ¡£ÏßÉÏijЩ¹ÖÒìµÄCrash·¢Éúºó£¬ÎÒÃdzýÁË·ÖÎöCrash¶ÑÕ»ÐÅÏ¢Ö®Í⣬»¹¿ÉÒÔʹÓÃÀëÏßÈÕÖ¾»ØÀÌ¡¢Ï·¢¶¯Ì¬ÈÕÖ¾µÈ¹¤¾ßÀ´»¹ÔCrash·¢ÉúʱµÄ³¡¾°£¬°ïÖú¿ª·¢Í¬Ñ§¶¨Î»ÎÊÌ⣬µ«ÊÇÕâÁ½ÖÖ·½Ê½¶¼ÓÐËüÃǸ÷×ÔµÄÎÊÌâ¡£
ÀëÏßÈÕÖ¾¹ËÃû˼Ò壬ËüµÄÄÚÈݶ¼ÊÇÔ¤ÏȼǼºÃµÄ£¬ÓÐʱºò¿ÉÄܻ᩵ôһЩ¹Ø¼üÐÅÏ¢£¬ÒòΪÔÚ´úÂëÖмÓÈÕÖ¾Ò»°ãÖ»ÊÇÔÚÒµÎñ¹Ø¼üµã£¬ÔÚ´óÁ¿µÄÆÕͨ·½·¨Öв»¿ÉÄܶ¼¼ÓÉÏÈÕÖ¾¡£¶¯Ì¬ÈÕÖ¾(Holmes)´æÔÚµÄÎÊÌâÊÇÿ´ÎÏ·¢Ö»ÄÜÕë¶ÔÒÑÖªUUIDµÄÒ»¸öÓû§µÄһ̨É豸£¬¶ÔÓÚ´óÁ¿ÏßÉÏCrashµÄÇé¿öÕâÖÖ²Ù×÷²¢²»ºÏÊÊ£¬ÒòΪÎÒÃDz¢²»ÄÜÖªµÀÄĸö·¢ÉúCrashµÄÓû§»¹»áÔٴθ´ÏÖÕâ´Î²Ù×÷£¬Ï·¢ÅäÖóäÂúÁ˲»È·¶¨ÐÔ¡£
ÎÒÃÇ¿ÉÒÔ¸ÄÔìHolmesʹÆäÖ§³ÖÅúÁ¿ÉõÖÁÈ«Á¿Ï·¢¶¯Ì¬ÈÕÖ¾£¬¼Ç¼µÄÈÕÖ¾µÈµ½·¢ÉúÌØ¶¨ÀàÐ͵ÄCrashʱ²ÅÉϱ¨£¬ÕâÑùÒ»À´¿ÉÒÔ¼õÉÙÈÕÖ¾·þÎñÆ÷ѹÁ¦£¬Í¬Ê±Ò²¿ÉÒÔ¼«´óÌá¸ß¶¨Î»ÎÊÌâµÄЧÂÊ£¬ÒòΪÎÒÃÇ¿ÉÒÔÈ·¶¨Éϱ¨ÈÕÖ¾µÄÉ豸×îºó¶¼ÕæÕý·¢ÉúÁ˸ÃÀàÐÍCrash£¬ÔÙÀ´·ÖÎöÈÕÖ¾¾Í¿ÉÒÔ×öµ½Ê°빦±¶¡£
×ܽá
ÒµÎñµÄ¿ìËÙ·¢Õ¹£¬ÍùÍù²»¿ÉÄܸøÍŶӳä×ãµÄʱ¼äÈ¥ÖÎÀíCrash£¬¶øCrashÓÖÊÇApp×îÖØÒªµÄÖ¸±êÖ®Ò»¡£ÍŶÓÐèÒªÓÉÒ»¸ö¸öCrash¸öÀý£¬È¥Ì½¾¿Ã¿Ò»¸öCrash·¢ÉúµÄ×î±¾ÖÊÔÒò£¬ÕÒµ½×îºÏÀí½â¾öÕâÀàCrashµÄ·½°¸£¬½¨Á¢½â¾öÕâÒ»ÀàCrashµÄ³¤Ð§»úÖÆ£¬¶ø²»ÄÜÒûð²Ö¹¿Ê¡£Ö»ÓÐÕâÑù£¬Ëæ×Ű汾µÄ²»¶Ïµü´ú£¬ÎÒÃDzÅÄÜÔÚCrashÖÎÀí֮·ÉÏÀëÄ¿±êÔ½À´Ô½½ü¡£
|