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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Android ÏîÄ¿´úÂëÖÊÁ¿±£Ö¤Êµ¼ù
 
À´Ô´£º¼òÊé ·¢²¼ÓÚ£º 2017-6-2
  2665  次浏览      31
 

1 ±³¾°

Ò»¸öÏîÄ¿¿ª·¢±ØÈ»»áÉæ¼°ÍŶÓЭ×÷£¬¶ø¹¤³ÌÖÊÁ¿¾ÍÐèÒªÍŶÓÈ¥±£Ö¤¡£Ò»°ãÎÒÃÇÆÚÍûµÄ´úÂ룺ÎÞDZÔÚ·çÏÕ¡¢ÎÞÖØ¸´Âß¼­¡¢·ç¸ñÎÞ²îÒì¡¢¿ÉÔĶÁÐԺá¢ÐÂÈËÉÏÊÖËÙ¶È¿ìµÈ¡£ÎªÁË´ïµ½ÉÏÊöÄ¿±ê£¬Ò»°ãÍŶӶ¼»áÖÆ¶¨Ò»Ì××Ô¼ºÈϿɵıàÂë¹æ·¶£¬²¢ÇÒÖÜÆÚÐÔ½øÐÐ code review¡£È»¶ø±àÂë¹æ·¶µÄÖÆ¶¨£¬ÄÇôһÌ×±àÂë¹æ·¶ÐèÒª°üº¬ÄÄЩÄÚÈÝ£¬ÁíÍâ±àÂë¹æ·¶½ö½öÊÇÒ»Ì×Èí¹æ·¶£¬Êµ¼Ê³ÌÐòԱͬѧÄÜ×ñÊØµ½Ê²Ã´³ÌÐò»¹ÊÇÒ»¸öδ֪Êý£¬ËùÒÔÐèÒªÎÒÃǽøÐÐÈËÈâ code review£¬¶øÕâÖÖÈËÈâÅŲ鷽ʽ£¬ºÜÈÝÒ×ÒÅ©²¿·ÖÎÊÌ⣬±£ÕÏÐÔ»¹ÊÇÓÐЩ²»×ã¡£

Ϊ´Ë£¬ÎÒÃÇ´Ó±àÂëǰÆÚ¡¢±àÂëÖÐÆÚºÍ±àÂëºóÆÚ±£Ö¤½øÐÐÁ˳õ²½³¢ÊÔ¡£

2 ±àÂëǰÆÚ - ±àÂë¹æ·¶

¶ÔÓÚÒ»¸ö Android ÏîÄ¿£¬Ò»°ãÐè񻃾¼°µÄ±àÂë¹æ·¶ÓУº

1.ÆÕͨ java ±àÂë·ç¸ñ¹æ·¶

Èçÿ¸ö·½·¨×î´óÐÐÊý£¬Ã¿¸öÀàÎļþµÄ×î´óÐÐÊý£¬Ã¿¸ö·½·¨×î´ó²ÎÊýÊýµÈ

2.ÆÕͨ java ±àÂë×î¼Ñʵ¼ù

Èçif¡¢for¡¢try µÈǶÌ×Éî¶È¹æ·¶£¬±äÁ¿³õʼ»¯¹æ·¶µÈ

3.ͨÓà Android ±àÂë¹æ·¶£¨java ²¿·ÖºÍ xml ²¿·Ö£©£¬

°üº¬ Android java ²¿·ÖºÍ Android xml ²¿·Ö£¬Èç±ÜÃâʹÓÃÆÕͨÄÚ²¿ÀඨÒåhandler£¬±ÜÃâ layout xml ÖдæÔÚÎÞÓýáµãµÈ

4.Gradle ±àÂë¹æ·¶

È羡Á¿±ÜÃâ lib ʹÓà module£¬¶ÀÁ¢¹¤³Ì¿ÉÒÔͨ¹ý aar »ò mvn ·½Ê½µ¼Èë

5.¾ßÌåÏîÄ¿Ïà¹ØµÄ±àÂë¹æ·¶µÈ

ÈçÏîÄ¿ÍŶӹ涨ʹÓÃ×Ô¶¨Òå LogUtil ´òÈÕÖ¾£¬Activity¡¢Fragment µÈÖØÒªÀàµÄ¼Ì³Ð¹ØÏµ£¬Activity ¶ÔÓ¦µÄ xml Îļþ±ØÐëÒÔ activity_ ¿ªÍ·µÈ

ÖÆ¶¨ÁËÕâЩÄÚÈÝ¿ÉÒÔÒ»¶¨³Ì¶ÈÉϹ淶³ÌÐòÔ³µÄ±àÂ룬ÅäºÏÍŶӽøÐÐÁËÖÜÆÚÐ﵀ code review (Ò»°ãÊÇÒ»¸ö°æ±¾Ò»´Î£¬´ó¸Å 4 ¸öÐÇÆÚÒ»´Î)£¬»áÓбȽϺõÄЧ¹û¡£È»¶ø¼´Ê¹Õâô×ö£¬»¹ÊÇ´æÔÚÒ»¶¨µÄÎÊÌ⣬¾àÀëÎÒÃÇÆÚÍûµÄÄ¿±ê»¹ÊDZȽÏÔ¶¡£±ÈÈç¸÷¸öµ¥ÀýÀàµÄ¶¨ÒåÎ廨°ËÃÅ£¬Ê¹Óà LogUtil ´úÌæ Log µÄʹÓã¬Message.Obtain() ´úÌæ new Message()£¬Activity ²¿·ÖÎļþÃüÃû£¬ÉõÖÁ Activity¡¢Fragment µÄ»ùÀඨÒ广Ôò»¹ÊǺÜÈÝÒ×·¢Éú´íÎ󣬲¢Ã»Óб»·¢ÏÖ¡£Ëæ×űàÂë¹æ·¶µÄÍêÉÆ³äʵ£¬¶à¸ö¿ª·¢µÄ±àÂë¹æ·¶ÈçºÎ±£Ö¤£¬¾Í»á³ÉΪһ¸öÏÔ¶øÒ×¼ûµÄÎÊÌâ¡£

3 ±àÂëÖÐÆÚ - ±àÂëÄ£°å

ΪÁËʵÏÖ¹«ÓôúÂ븴Óã¬ÎÒÃǶ¨ÒåÁËһЩ util ¹¤¾ßÀ࣬µ«Ëæ×Ÿ÷¸ö¿ª·¢µÄ²¹³ä£¬ÕâÌ× util ¹¤¾ßÀàÒ²Ô½À´Ô½¶à£¬Èç LogUtil¡¢KeyboardUtil µÈ£¬¶øÕâЩÀàÒ»²¿·ÖÊÇΪÁËͳһÈë¿Ú£¬ÈçͳһʹÓà LogUtil£¬¿ÉÒÔͳһ×öµ½²âÊÔ·þ´ò¿ª±¾µØÈÕÖ¾£¬ÏßÉÏ·þ¹Ø±ÕÈÕÖ¾£»KeyboardUtil ·½±ãʹÓÃÕß¿ØÖƼüÅ̵ĵ¯³öÒþ²ØµÈ²Ù×÷¡£ËäÈ»¶¨ÒåÁËÕâЩ¹¤¾ßÀ࣬µ«ÖÕ¾¿´æÔÚÓ¦¸ÃʹÓöøÃ»ÓÐʹÓõÄÇé¿ö¡£µ±È»ÕâЩ¹¤¾ß´úÂë²¢²»ÄÑ£¬¿ª·¢ÔÚ×Ô¼ºµÄÄ£¿éÒ²ÄܺÜÈÝÒ×µÄʵÏÖºÍʹÓã¬Ò»°ãÒ²²»»á³öÎÊÌ⡣Ȼ¶øÉÏÊö½²µÄÓŵ㶼»áÏûʧµô¡£¶øÕâЩÎÊÌâÒÀÀµ code review Ò²ÊǼþÍ·ÌÛµÄÎÊÌâ¡£

´ËÍ⣬RecycleView µÄ±àÂ뷽ʽ£¬µ¥ÀýģʽµÄʵÏÖ·½Ê½µÈµÈ£¬¸÷¸ö¿ª·¢¿ÉÄÜд³ö¸÷ʽ´úÂ룬ÉõÖÁʵÏֵĵ¥Àýģʽ²¢²»ÊÇḬ̈߳²È«µÄ¡£

ÌáÁËÕâô¶à£¬ÁíÒ»·½Ã棬ҪÇ󿪷¢ÔÚ·±Ã¦µÄÒµÎñÖÐÑϸñ×ñÊØÕâЩ¹æ·¶£¬Ò²ÓÐЩǿÈËËùÄÑ¡£ËùÐÒ£¬Android Studio ΪÎÒÃÇÌṩÁ˱àÂëÄ£°åÀ´½â·Å¿ª·¢µÄ¹¤×÷£¬²¢Ò»¶¨³Ì¶ÈÉÏͳһ±àÂë·ç¸ñ¡£

3.1 Live Template

3.1.1 ϵͳģ°å

²é¿´Ò»¸öʹÓà Android Studio Öкܳ£¼ûµÄÀý×Ó£¬ÊäÈë for£¬³öÏÖÏÂÀ­ÁбíÈçÏ£º

µ±Ñ¡Ôñ fori£¬³öÏÖ±àÂëÆ¬¶Î£º

È·ÈÏÑ­»·±äÁ¿ i£¬ÌøÈëÑ­»·½á¹ûÖµµÄÊäÈ룺

ÉÏÀý£¬¾ÍÊÇ Android Studio ÖÐϵͳÌṩµÄ Live Template Ò»¸öʵÀý¡£Õâ¸öÀàËÆÓÚ iOS ÖÐµÄ Code Snippets£¬ÌṩÁË´úÂëÆ¬¶ÎµÄÄÜÁ¦¡£

Android Studio (Mac) ½øÈë Settings/Preferences -> Editor -> Live Templates£¬¿ÉÒÔ¿´µ½ÒѶ¨ÒåµÄÄ£°å×飺

²é¿´ fori ±àÂëÄ£°åµÄʵÏÖ£º

  • A: Íê³ÉÄ£°åµÄ¿ì½Ý¼ü Tab
  • B: λÖ÷ÖÀà iterations
  • C: ±àÂëÄ£°å¶ÔÓ¦µÄËõд fori
  • D: Ä£°åµÄÄÚÈÝ
  • E: Ä£°åÓ¦Óû·¾³

3.1.2 ×Ô¶¨ÒåÄ£°å

1.¹¹½¨ÏîÄ¿ group

ÊäÈë group µÄÃû³Æ

2.¹¹½¨¾ßÌå±àÂëÄ£°å

  • Abbreviation£º´¥·¢±àÂëÄ£°åµÄËõд
  • Description£ºÄ£°åµÄ¾ßÌåÃèÊö
  • Template Text£º¾ßÌåµÄÄ£°åÄÚÈÝ

3.±äÁ¿¶¨Òå

±äÁ¿ÐÎʽΪ $<variable_name>$£¬µã»÷ Edit variables ¿ÉÉèÖñäÁ¿¾ßÌåÄÚÈÝ£º

Name£º±äÁ¿Ãû

Expression£º±äÁ¿±íÏÖ

Default value£ºÄ¬ÈÏÖµ

Skip if defined£ºÊÇ·ñÌø¹ý±à¼­ÒѾ­¶¨ÒåµÄÖµ

4.Ä£°åÓ¦Óû·¾³

µã»÷ No application contexts yet. Define£¬ÉèÖÃΪ java »·¾³£º

5.Ä£°åÎļþ

¹¹½¨ÁËÄ£°å group ºó£¬ÔÚ android studio config\templates Ŀ¼Ï²鿴µ½ yanxuan.xml¡£

windows£º C:\Users\<user>\.AndroidStudiox.x\config\templates£¨user ΪÄãµÄ¼ÆËã»úÓû§Ãû£©

mac£º~/Library/Preferences/AndroidStudiox.x/templates

<templateSet group="test">
<template name="yxtest" value="testMethod($a$, $b$);" description="ÕâÊÇÒ»¸ö²âÊÔÄ£°å" toReformat="false" toShortenFQNames="true">
<variable name="a" expression="lineNumber()" defaultValue="2" alwaysStopAt="false" />
<variable name="b" expression="" defaultValue="" alwaysStopAt="true" />
<context>
<option name="JAVA_CODE" value="true" />
<option name="JAVA_STATEMENT" value="true" />
<option name="JAVA_EXPRESSION" value="true" />
<option name="JAVA_DECLARATION" value="true" />
<option name="JAVA_COMMENT" value="true" />
<option name="JAVA_STRING" value="true" />
<option name="COMPLETION" value="true" />
</context>
</template>
</templateSet>

6.ÉèÖÃÍê±Ï£¬Êµ¼ù²é¿´£º

yxtest

singleton

3.2 Android Studio Template

1.±³¾°

³ýÁË Live Template Ö®Í⣬¹¤³ÌÏîÄ¿Öкܶàн¨µÄÀàÒ²Óкܶà»úеµÄ´úÂ룬ÈçÎÒÃǶ¨ÒåµÄ Activity Ҫô¼Ì³Ð×Ô BaseBlankActivity£¬ÒªÃ´¼Ì³Ð×Ô BaseActionBarActivity£¬ÁíÍâÏîÄ¿ÖвÉÓà MVP ģʽ£¬Òò´ËÒ»¸ö Activity »ù±¾ÉÏ»áÓÐÒ»¸ö¶ÔÓ¦µÄ presenter À࣬һ¸ö layout Îļþ£¬Í¬Ê±ºÜ¶àʱºò£¬Ò»¸öÒ³ÃæÖлáÓÐÒ»¸öÐèÒªÖ§³ÖË¢Ð嵀 RecycleView µÈ¡£³ý´ËÖ®Í⣬ViewHolder¡¢HttpTask µÈ´úÂëÒ²Êǹ̶¨Ä£Ê½µÄ´úÂë¡£

ÕâЩ¶¼Êǹ̶¨»úеµÄ´úÂ룬¶øÈç¹ûÊÇÈËÈâȥдµÄ»°£¬ÄÑÃâ»á³öÏÖ´úÂë·ç¸ñ²»Ò»Ö¡¢²»¹æ·¶µÄÇé¿ö£¬Í¬Ê±Ò²ÀË·ÑÁËÒ»²¿·ÖµÄʱ¼ä¡£ËùÐÒ£¬Android Studio ÌṩÁ˹¤³ÌÀàÄ£°å£¬·½±ãÎÒÃÇʵÏÖÕâÑùµÄ¹¦ÄÜ¡£

2.ϵͳģ°å

²é¿´ Android Studio ϵͳÀàÄ£°å£¬ÎÒÃÇÄÜ·¢ÏÖÓкܶඨÒåºÃµÄÀàÄ£°å£º

ÈçÐèÒª´´½¨Ò»¸ö¿ÕµÄ Activity Ò³Ãæ£¬¿ÉÒÔÑ¡Ôñ Empty Activity£¬²¢ÌîдÀàÃû£¬layout Ãû³ÆµÈÐÅÏ¢£¬Ö®ºó¾ÍÄܳöÏÖ¶ÔÓ¦µÄÌí¼Ó»òÐ޸ģºMainActivity.java¡¢activity_main.xml¡¢AndroidManifest.xml£º

¶øÕâЩģ°å¶¨Ò壬¿ÉÒÔÔÚÏà¹ØÂ·¾¶ÎļþÖÐÕÒµ½£º

  • Windows: ${Android Studio µÄ°²×°Ä¿Â¼}/plugins/android/lib/templates/
  • Mac: Android Studio.app/Contents/plugins/android/lib/templates/

Õë¶Ô EmpytActivity ÕâÀïÐèÒª¶¨ÒåµÄÎļþÓУº

  • globals.xml.ftl£º¶¨Ò嵱ǰģ°åµÄһЩȫ¾Ö±äÁ¿
  • recipe.xml.ftl£º¶¨ÒåÄ£°å¿½±´µÄÂß¼­µÈ
  • template.xml£º¶¨ÒåÄ£°å¶Ô»°¿òµÄÑùʽ
  • template_blank_activity.png£º¶¨ÒåÄ£°åµÄͼ±ê
  • root/src/app_package/SimpleActivity.java.ftl£º¾ßÌåµÄÄ£°åÎļþ

ͼƬÀ´×Ô£ºhttp://www.slideshare.net/murphonic/custom-android-code-templates-15537501

3.×Ô¶¨ÒåÄ£°å

¶øÕë¶ÔÎÒÃÇÐèÒª×Ô¶¨ÒåµÄÄ£°å£¬¿ÉÒÔÔÚÄ£°å¶¨Òå·¾¶ÏÂн¨Îļþ¼ÐºÍÎļþ¼´¿É£¬Ï¸½ÚÄÚÈݿɲ鿴 Tutorial How To Create Custom Android Code Templates

ÏîÄ¿µÄÄ£°åÎļþÄÚÈÝ£º

ÉèÖÃÍêÄ£°åÎļþÖ®ºó£¬ÖØÆô Android Studio£¬¿ÉÒÔÉúЧģ°åÎļþ£¬Ê¹ÓÃÄ£°åÎļþÈçÏ£º

4 ±àÂëºóÆÚ - ¾²Ì¬´úÂë¼ì²é

ÓÉÉÏ£¬ÎÒÃǶ¨ÒåÁ˱àÂë¹æ·¶£¬¶¨ÒåÁË Live Template ºÍ Android Studio Template ·½±ã³ÌÐòÔ³¸üºÃµÄ×¼ÊØÎÒÃǵÄÏîÄ¿±àÂë¹æ·¶¡£È»ºó±àÂë¹æ·¶±Ï¾¹Ö»ÊÇÈí¹æ·¶£¬¶øÌṩ±àÂëÄ£°å¸ü¶àµÄ½â¾ö´óÁ¿ util µÄʹÓÃÎÊÌâºÍ±ãÀûС»ï°éÍê³É»úе±àÂ룬²¢²»ÄÜÍêÈ«±£Ö¤³ÌÐòÔ³Ñϸñ°´ÕÕÈ«²¿µÄ¹æ·¶À´±àÂë¡£

Ϊ´Ë£¬ÎÒÃÇÐèÒªÒ»Ì×¾²Ì¬´úÂë¼ì²é»úÖÆÄܼì²éÒÑÓеĴúÂëÊÇ·ñ×ñÊØ¹æ·¶¡£×ܽáÒÑÓеĹ淶£¬¿ÉÒÔ½«¹æ·¶ÀàÐ͹éÄÉΪÆÕͨ Java ¹æ·¶¡¢ÆÕͨ Android ¹æ·¶¡¢¾ßÌåÏîÄ¿¹æ·¶µÈ¡£¶øÕâЩ¼ì²éµã£¬¿ÉÒÔÅäºÏ²»Í¬µÄ¼ì²é¹¤¾ß½øÐмì²é¡£

4.1 ¼ì²é java ´úÂë·ç¸ñ - CheckStyle

¶ÔÓÚ java ¹æ·¶£¬checkstyle °ïÖú¿ª·¢ÕßʵÏÖ³£Óõļì²é¡£ÕâÀï CheckStyle Äܼì²éµÄÄÚÈÝÓУº

  1. Javadoc ×¢ÊÍ
  2. ÃüÃûÔ¼¶¨
  3. ±êÌâ
  4. Import Óï¾ä
  5. Ìå»ý´óС
  6. ¿Õ°×
  7. ÐÞÊηû
  8. ¿é
  9. ´úÂëÎÊÌâ
  10. ÀàÉè¼Æ
  11. »ìºÏ¼ì²é£¨°ü»îһЩÓÐÓõıÈÈç·Ç±ØÐëµÄSystem.outºÍprintstackTrace£©

¼ì²éÄÚÈݺܶ࣬¶ø¼ì²éÏîÐèÒªºÍ¾ßÌåµÄÏîÄ¿¹æ·¶×ö½áºÏ¡£È磬ÿÐдúÂë×Ö·ûÊý¿ØÖÆÔÚ 80£¬µ¥Ò³´úÂëÐÐÊý¿ØÖÆÔÚ 800 µÈ¡£Òò´ËÐèÒª½áºÏÅäÖÃÎļþ£¬À´¼ì²éÏîÄ¿ÖÐµÄ java ´úÂë¡£ÔÚ Android Studio ÉÏÅäÖà CheckStyle Á÷³ÌÈçÏ£º

1.ÔÚ Android Studio ÖÐÌí¼Ó gradle Plugin

apply plugin: 'checkstyle'

2.ÉèÖÃ CheckStyle °æ±¾

checkstyle {
toolVersion '6.1.1'
showViolations true
}

3.ÅäÖà CheckStyle ¼ì²éÏî

task checkstyle(type: Checkstyle) {
configFile file("$configDir/checkstyle/checkstyle.xml")
configProperties.checkstyleSuppressionsPath = file("$configDir/checkstyle/suppressions.xml").absolutePath
source 'src'
include '**/*.java' // ¼ì²é java ´úÂë
exclude '**/gen/**' // ÅųýÉú³ÉµÄ´úÂë
classpath = files()
ignoreFailures true // ºöÂÔ¼ì²éʧ°ÜµÄÇé¿ö£¬±ÜÃâgradleÃüÁîÖ´ÐÐÖÐÖ¹
}

4.ÅäÖÃ×Ô¶¨ÒåµÄ¼ì²éÏ

checkstyle.xml£º

<!--µ¥¸öÎļþ·½·¨ÊýÉÏÏÞ×î¶àΪ 30-->
<module name="MethodCount">
<property name="maxTotal" value="30"/>
</module>
<!--·½·¨ÃûµÄÊ××ÖĸÊÇСд-->
<module name="MethodName">
<property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
</module>
<!--¾²Ì¬±äÁ¿ÃûµÄÊ××Ö·ûÊÇ s-->
<module name="StaticVariableName">
<property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
<property name="applyToPublic" value="true"/>
<property name="applyToProtected" value="true"/>
<property name="applyToPackage" value="true"/>
<property name="applyToPrivate" value="true"/>
</module>
<!--Ö»ÓÐ˽Óй¹Ô캯ÊýµÄÀàÐèÒª¶¨Òå³É final ÀàÐÍ-->
<module name="FinalClass"/>
...

¾ßÌåÆäËûµÄ¼ì²éÏîÅäÖÿÉÒԲ鿴 ¼ì²éÅäÖÃÁ´½Ó

5.Ö´ÐÐ checkstyle ¼ì²é

./gradlew checkstyle

6.²é¿´¼ì²é½á¹û

ÃüÁîÖ´ÐнáÊø£¬²é¿´¼ì²é½á¹ûÎļþ£º${project}/app/build/reports/checkstyle/checkstyle.html

4.2 ¼ì²é java ´úÂëÖÊÁ¿ - FindBugs

Óë CheckStyle ¹¤¾ß²»Í¬µÄÊÇ£¬FindBugs ²»×¢ÖØÑùʽ»òÕ߸ñʽ£¬¶øÊÇÊÔͼѰÕÒ³öÕæÕýµÄȱÏÝ»òÕßÏÖÔÚµÄÐÔÄÜÎÊÌâ¡£FindBugs ¼ì²éÀàºÍ Jar Îļþ£¬²»ÊÇͨ¹ý·ÖÎöÀàÎļþµÄÐÎʽ»ò½á¹¹À´·ÖÎö³ÌÐò£¬¶øÊÇʹÓà Visitor ģʽ£¬½«×Ö½ÚÂëÓëÒ»×éȱÏÝģʽ½øÐжԱÈÒÔ·¢ÏÖ¿ÉÄܵÄÎÊÌâ¡£¶øÕâЩÎÊÌâ±ÈÈçÈçÏ£º

1.ºöÂÔ·µ»ØÖµ

ÉÏÊö´úÂëÖ´ÐнáÊøÖ®ºó£¬²¢Ã»ÓÐʲôÒâÒ壬±äÁ¿ a µÄÖµÒ²²»»á±ä³É dddbbbccc¡£Òò´Ë£¬ÉÏÊö´úÂëºÜ¿ÉÄÜÊdzÌÐòÔ³µÄ bug¡£Îª´Ë FindBugs ÄÜÕÒ³öÕâÖÖÎÊÌâ

2.¿ÕÖ¸ÕëʾÀý

ÉÏÊö×îºóÒ»ÐдúÂ룬ºÜÃ÷ÏÔÔÚÖ´ÐеÄʱºò»á·¢Éú¿ÕÖ¸ÕëÒì³££¬ÕâÀïÒòΪ FindBugs ÎÞ·¨ÖªµÀ±äÁ¿ strMaps ÊÇ·ñȷʵÓÐ aaa Õâ¸ö key£¬Îª´ËÕâÀï»á¼ì²é³ö´íÎó¡£

3.δ³õʼ»¯µÄ³ÉÔ±±äÁ¿Ê¹ÓÃ

ÕâÀïÓÉÓÚÀà³ÉÔ±±äÁ¿ actions ²¢Î´³õʼ»¯£¬Òò´Ëµ± actions.add("TEST") ±»Ö´ÐеÄʱºò»á·¢ÉúÒì³£¡£

Android Studio ÉÏ FindBugs µÄ¼¯³ÉÈçÏ£º

1.ÔÚ gradle ÖÐÒýÈë²å¼þ

apply plugin: 'findbugs'

2.ÔÚ gradle ÖÐÅäÖÃ findbugs task

task findbugs(type: FindBugs, dependsOn: "assembleDebug") {
ignoreFailures = false
effort = "max"
reportLevel = "high"
excludeFilter = new File("$configDir/findbugs/findbugs-filter.xml")
classes = files("${project.rootDir}/app/build/intermediates/classes")
source 'src'
include '**/*.java'
exclude '**/gen/**'
reports {
xml.enabled = false
html.enabled = true
xml {
destination "$reportsDir/findbugs/findbugs.xml"
}
html {
destination "$reportsDir/findbugs/findbugs.html"
}
}
classpath = files()
ignoreFailures true // ±ÜÃâ¼ì²éʧ°Ü gradle Ö´ÐÐÖÐÖ¹
}

3.Ö´ÐÐ findbugs ¼ì²é

./gradlew findbugs

4.²é¿´¼ì²é½á¹û

²é¿´¼ì²é½á¹ûÎļþ£º${project}/app/build/reports/findbugs/findbugs.html

4.3 ¼ì²é Android ´úÂëÖÊÁ¿ - Lint

4.3.1 »ù±¾½éÉÜ

Ç°Ãæ FindBugs µÄ¼ì²éʵÀý(ºöÂÔ·µ»ØÖµ, δ³õʼ»¯µÄ³ÉÔ±±äÁ¿Ê¹ÓÃ)£¬¿ÉÒÔ·¢ÏÖÔÚ Android Studio IDE ÉÏ£¬ÒѾ­³öÏÖÁ豐ȮÌáʾ£¬ÎÒÃǰѹâ±ê·ÅÉÏÈ¥£¬¾ÍÄÜ¿´µ½¾ßÌåµÄÌáʾÁË£º

°´ cmd + F1 ¿ÉÒÔ¿´µ½¾ßÌåµÄ´íÎóÌáʾ£º

Õâ¾ÍÔ­Éú Lint ¸øÎÒÃÇÌṩµÄ´íÎóÌáʾ¹¦ÄÜ¡£³ýÁËºÍ FindBugs ÖØ¸´µÄ´¿ java ´úÂë¼ì²éÖ®Í⣬Lint Äܼì²éºÜ¶àÆäËû¹¤¾ßÎÞ·¨¼ì²éµÄÄÚÈÝ£¬Ò²¸üÌùºÏ Android£º

ÔÚ Activity ÄÚ¶¨Òå·Ç¾²Ì¬ÄÚ²¿Àà Handler µÄ±¨¾¯

ÔÚ AndroidManifest.xml Öж¨Òå export Ϊ true µÄ¹ã²¥½ÓÊÜÆ÷£¬µ«Ã»Óж¨ÒåȨÏÞ£¬Lint ¼ì²éÈÏΪÊDz»°²È«µÄ

build.gradle ÎļþÖÐÒýÓÃµÄ support °üµÄ°æ±¾µÍµÄÌáʾ

Android Lint ÊÇÒ»¸ö¾²Ì¬´úÂë¼ì²é¹¤¾ß£¬Äܹ»¶ÔDZÔÚµÄ bug£¬¿ÉÄܵݲȫÐÔ¡¢ÐÔÄÜ¡¢¿ÉÓÃÐÔ¡¢¿É·ÃÎÊÐÔ¡¢¹ú¼Ê»¯µÈÓÅ»¯ÄÚÈÝ×ö³ö¼à²â£º

À´×Ô¹Ù·½Îĵµ Improve Your Code with Lint

  1. App Source Files£º¹¤³ÌÖеÄÔ´Îļþ£¬°üÀ¨ java ´úÂë¡¢×ÊÔ´ xml ´úÂë¡¢gradle Îļþ£¬Í¼Æ¬×ÊÔ´ÎļþÒÔ¼° progroud µÈÎļþ
  2. lint.xml£ºÅäÖÃÎļþ£¬ÅäÖÃÄÄЩ lint ¼ì²é¿ÉÒÔÅųý£¬×Ô¶¨ÒåÎÊÌâµÄÑÏÖØ¼¶±ð
  3. lint Tool£º¾²Ì¬´úÂë¼ì²é¹¤¾ß£¬¿ÉÒÔÊÇÃüÁîÐлòÕß¼¯³ÉÔÚ Android Studio ÉÏ
  4. lint Output£º´úÂë¼ì²é½á¹û£¬¿ÉÒÔÖ±½ÓÏÔʾÔÚ Console ÉÏ£¬Ò²¿ÉÒÔÊÇ lint-result.html

4.3.2 Ô­Éú Lint ¼ì²é

ÔÚ Android SDK Tools 16 ¼°¸ü¸ßµÄ°æ±¾ÖУ¬Lint ¹¤¾ß»á×Ô¶¯°²×°¡£Ô­Éú Lint µÄ¼ì²éÏîÒѾ­ÓÐ 200 ¶àÏî (°üÀ¨Ç°ÃæÊ¾ÀýµÄ 5 ÏîÄÚÈÝ)£¬Òò´ËʹÓÃÔ­ÉúµÄ¹¦Äܵ㣬¾ÍÄܼì²é¿ª·¢ÖеĴ󲿷ÖͨÓÃÎÊÌâ¡£

1.Android Studio IDE ÉÏÅäÖà Lint ¼ì²éÆ«ºÃÉèÖÃ

(Mac ÏÂ) Preferences ¡ú Editor ¡ú Inspections ½øÈë Android Studio µÄ Lint ÅäÖýçÃæ

  • A£ºÅäÖà Profile£¬·½±ã²»Í¬ÏîÄ¿»òÕß²»Í¬Çé¿öÏÂʹÓò»Í¬µÄ Profile ½øÐмì²é
  • B£ºLint ¼ì²éµã Group
  • C£ºLint ¼ì²éµã¾ßÌåÃèÊö
  • D£ºLint ¼ì²éµã¾¯¸æ¼¶±ðÉèÖÃ
  • E£ºLint ¼ì²éµã¿ª¹Ø

2.lint.xml ÉÏÅäÖÃ Lint

³ýÁË¿ÉÒÔͨ¹ý IDE ÅäÖà Lint£¬»¹¿ÉÒÔͨ¹ýÖ±½Ó lint.xml Ϊµ¥¸öÏîÄ¿ÅäÖüì²é¹æÔò

<?xml version="1.0" encoding="UTF-8"?>
<lint>
<!-- Disable the given check in this project -->
<issue id="IconMissingDensityFolder" severity="ignore" />
<!-- Ignore the ObsoleteLayoutParam issue in the specified files -->
<issue id="ObsoleteLayoutParam">
<ignore path="res/layout/activation.xml" />
<ignore path="res/layout-xlarge/activation.xml" />
</issue>
<!-- Ignore the UselessLeaf issue in the specified file -->
<issue id="UselessLeaf">
<ignore path="res/layout/main.xml" />
</issue>
<!-- Change the severity of hardcoded strings to "error" -->
<issue id="HardcodedText" severity="error" />
</lint>

À´Ô´ Android Develop Îĵµ Improve Your Code with Lint

3.gradle ÖÐÅäÖÃ Lint task

android {
lintOptions {
abortOnError false // ÅäÖà lint ¹ý³ÌÖгö´í£¬²»ÖÐÖ¹ gradle ÈÎÎñ
xmlReport false
htmlReport true
lintConfig file("$configDir/lint/lint.xml") // ÅäÖà lint ¼ì²é¹æÔò
htmlOutput file("$reportsDir/lint/lint-result.html") // ÅäÖà lint Êä³öÎļþ
xmlOutput file("$reportsDir/lint/lint-result.xml") // ÅäÖà lint Êä³öÎļþ
}
}

4.Ö´Ðмì²é

ÔÚ¹¤³Ì¸ùĿ¼ִÐÐÒÔÏÂÃüÁî (Mac)£¬ÒÔÖ´Ðмì²éÈÎÎñ

./gradlew lint

5.¼ì²é½á¹û

Éú³ÉµÄ¼ì²é½á¹ûÔÚ ${ÏîÄ¿¹¤³Ì}/app/build/reports/lint/lint-result.html

4.3.3 ×Ô¶¨Òå Lint ¼ì²é

ËäȻԭÉúµÄ Lint ¼ì²éÒѾ­ºÜÇ¿´óÁË£¬¼ì²éÏîÒ²ÒѾ­ºÜ¶à£¬È»¶ø»¹ÊÇÎÞ·¨Âú×ãÏîÄ¿ÖеÄÌØÓÐÐèÇó£º

  1. log ͳһʹÓà LogUtil
  2. ¶ÔÓ¦ Activity µÄ layout ÃüÃûΪ activity_XXX
  3. ¶ÔÓ¦ Fragment µÄ layout ÃüÃûΪ fragment_XXX
  4. Activity ±ØÐëÅÉÉú×Ô BaseBlankActivity »ò BaseActionBarActivity

¶ÔÓÚÒÔÉÏÕâЩÐèÇó£¬Ô­Éú Lint ¼ì²é£¨°üÀ¨ CheckStyle£¬FindBugs£©¾ÍÒѾ­ÎÞÄÜΪÁ¦ÁË£¬ÎÒÃDZØÐë±àÂëÖ§³Ö×Ô¶¨Òå¼ì²é¡£ÒÔÏîÄ¿Öм¯³ÉµÄ Lint ¼ì²éΪÀý£¬½²ÊöÁ÷³Ì£º

4.3.3.1 ÅäÖà Gradle£¬ÒýÈë lint ¿â

dependencies {
...
compile 'com.android.tools.lint:lint-api:24.5.0'
compile 'com.android.tools.lint:lint-checks:24.5.0'
}
  • lint-api: ¹Ù·½¸ø³öµÄAPI£¬API²¢²»ÊÇ×îÖհ棬¹Ù·½ÌáÐÑËæÊ±ÓпÉÄÜ»á¸ü¸ÄAPI½Ó¿Ú¡£
  • lint-checks£ºÒÑÓеļì²é¡£

4.3.3.2 ¶¨Òå IssueRegistry Àà

н¨Ò»¸ö MyIssueRegistry À࣬¼Ì³Ð×Ô IssueRegistry¡£ÓÃÀ´×¢²áÎÒÃÇ×Ô¶¨ÒåµÄÈ«²¿ issue

public class MyIssueRegistry extends IssueRegistry {
@Override
public List<Issue> getIssues() {
System.out.println("********YXLint rules works!!!********");
return Arrays.asList(
LogUsageDetector.ISSUE,
ToastUsageDetector.ISSUE,
ActivitySuperClassDetector.ACTIVITY_SUPER_CLASS_ISSUE,
...
BuildGradleVersionDetector.ISSUE);
}
}

ÆäÖУº

  • LogUsageDetector.ISSUE£ºÓÃÓÚ¼ì²é²»ÔÊÐíÖ±½ÓʹÓà Log.* ·½Ê½Êä³ö±¾µØÈÕÖ¾µÄ´úÂë
  • ToastUsageDetector.ISSUE£ºÓÃÓÚ¼ì²éÖ±½ÓÓà Toast ·½Ê½ÏÔʾ toast µÄ´úÂë
  • ActivitySuperClassDetector.ACTIVITY_SUPER_CLASS_ISSUE£ºÓÃÓÚ¼ì²é Activity µÄ»ùÀà
  • BuildGradleVersionDetector.ISSUE£ºÓÃÓÚ¼ì²é gradle ÎļþÖв»ÔÊÐíÖ±½ÓдÊý×Ö°æ±¾ºÅµÄ´úÂë

4.3.3.3 gradle Çåµ¥ÏîÖÐ×¢²áÇ°Ãæ¶¨ÒåµÄ IssueRegistry Àà

jar {
manifest {
attributes('Lint-Registry': 'com.netease.htlint.lintrules.MyIssueRegistry')
}
}

4.3.3.4 ¶¨Òå Detector

MyIssueRegistry ÀàÖÐÉùÃ÷×¢²áÁ˸÷¸ö Detector µÄ Issue¡£Issue ÓÉ Detector ·¢ÏÖ²¢±¨¸æ£¬ÊÇ Android ³ÌÐò´úÂë¿ÉÄÜ´æÔڵķçÏÕ¡£¶øÕâÀï¾ÍÐèÒªÕæÕýʵÏÖÕâЩ Detector£¬ÒÔ¼ì²é Activity µÄ»ùÀàΪÀý¡£

ACTIVITY_SUPER_CLASS_ISSUE Õâ¸ö Issue µÄ¶¨ÒåÐèҪʹÓà Issue.create(...) ·½Ê½ÊµÏÖ£¬Í¬Ê±ÐèÒª´«Èë 6 ¸ö²ÎÊý·Ö±ðÈçÏ£º

  • A£ºÒ»¸ö¹Ì¶¨µÄΨһµÄ id ´ú±íÕâ¸ö Issue
  • B£º¶ÔÓÚÎÊÌâµÄ¼ò¶Ì×ܽᣬÃèÊöÎÊÌâ¶ø²»ÊÇÐÞ¸´´ëÊ©
  • C£ºÍêÕûµÄÎÊÌâ½âÊͺÍÐÞ¸´½¨Òé
  • D£ºÎÊÌâÀà±ð£¬ÏÖÔÚÒÑÓеÄÎÊÌâÀà±ðÓÐÈçÏÂ
  • Lint
    • Correctness (incl. Messages)
    • Security
    • Performance
    • Usability (incl. Icons, Typography)
    • Accessibility
    • Internationalization
    • Bi-directional text
  • E£ºÓÅÏȼ¶£¬±ØÐëÔÚ1µ½10Ö®¼ä£¬10Ϊ×îÖØÒª/×îÑÏÖØ¡£
  • F£ºÑÏÖØ¼¶±ð£¬¿ÉѡֵÓÐ Fatal, Error, Warning, Informational, Ignore
  • G£ºÎª Issue ºÍ Detector ÌṩӳÉä¹ØÏµ£¬Detector ¾ÍÊǵ±Ç°Àà¡£ÉùÃ÷ɨÃè¼ì²âµÄ·¶Î§ Scope£¬ÃèÊö Detector ÐèÒª·ÖÎöʱÐèÒª¿¼ÂǵÄÎļþ¼¯£¬°üÀ¨£ºResource Îļþ»òĿ¼¡¢Java Îļþ¡¢Class Îļþ
  • ActivitySuperClassDetector ¼Ì³Ð×Ô Detector£¬²¢ÊµÏÖ Detector.JavaScaner¡£ÕâÀïÖ÷Òª×Ô¶¨ÒåʵÏֵķ½·¨ÈçÉÏͼ H£¬I
  • H£º¼ì²éÀàµÄ»ùÀàÊÇ "android.support.v4.app.Activity" »ò "android.app.Activity"
  • I£º¾ßÌå¼ì²éÀàµÄ·½·¨£¬ÕâÀïÐèÒªÅųý·Ç yanxuan °üÃûϵĴúÂ룬Åжϵ±Ç°ÀàµÄ»ùÀàÊÇ·ñÊÇ BaseBlankActivity »ò BaseActionBarActivity£¿Èç¹û¶¼²»Êǵϰ£¬Ôò±¨¸æ´íÎó
  • J£º±¨³öÎÊÌâµÄ·½·¨£º¸Ã·½·¨ÖÐÖ¸¶¨²ÎÊýÓУº
    • ÐèÒª±¨´íµÄ Issue
    • ·¢ÉúÎÊÌâµÄ´úÂëÔÚÓï·¨Ê÷ÉϵĽڵã
    • ·¢ÉúÎÊÌâµÄ´úÂëλÖÃ
    • ¾¯¸æµÄÐÅÏ¢

4.3.3.5 Éú³É jar °ü

Íê³ÉÉÏÊö²½Ö裬¿ÉÒÔÔÚ¿ØÖÆÌ¨ÖÐͨ¹ýÃüÁî ../../gradlew assemble À´Ö´ÐбàÒëÈÎÎñ£¬¾Í¿ÉÒÔÊä³öÎÒÃÇÐèÒªµÄ jar Îļþ (htlintrules_jar-0.0.1.jar) ÁË

4.3.3.6 jar µÄʹÓÃ

°´ÕÕ Google ·½·¨£¬¿ÉÒÔ½« htlintrules_jar-0.0.1.jar ¿½±´µ½ ~/.android/lint ÖУ¬µ«È±µãÊÇÕë¶Ô»áÓ°Ïìһ̨»úÆ÷ÆäËûµÄ¹¤³Ì¡£ºÜÃ÷ÏÔ£¬ÎÒÃǵÄ×Ô¶¨Òå Lint ¼ì²éÓкܶàÊÇÏîÄ¿ÖÐÌØÓеÄһЩ±àÂë¹æ·¶¡£

Ϊ´Ë£¬ÎÒÃDzÉÓà LinkedIn ·½°¸£º½« jar ·Åµ½Ò»¸ö aar ÖС£ÕâÑùÎÒÃǾͿÉÒÔÕë¶Ô¹¤³Ì½øÐÐ×Ô¶¨Òå Lint£¬lint.jar Ö»¶Ôµ±Ç°¹¤³ÌÓÐЧ¡£

ÔÚÏÖÓÐµÄ htlintrules_jar ¹¤³ÌµÄ build.gradle ÖÐÌí¼Ó´úÂ룬ÕûÌå¿´ÆðÀ´ÈçÏ£º

apply plugin: 'java'
apply plugin: 'maven'
dependencies {
compile 'com.android.tools.lint:lint-api:24.5.0'
compile 'com.android.tools.lint:lint-checks:24.5.0'
}
jar {
manifest {
attributes('Lint-Registry': 'com.netease.htlint.lintrules.MyIssueRegistry')
}
}
configurations {
lintJarOutput
}
dependencies {
lintJarOutput files(jar)
}
defaultTasks 'assemble'

ͬʱн¨ÁíÒ»¸ö¹¤³Ì htlint£¬ÔÚÆä build.gradle ÎļþÖÐÌí¼ÓÈçÏ´úÂ룺

/*
* rules for including "lint.jar" in aar
*/
configurations {
lintJarImport
}
dependencies {
lintJarImport project(path: ':htlintrules_jar', configuration: "lintJarOutput")
}
task copyLintJar(type: Copy) {
from (configurations.lintJarImport) {
rename {
String fileName ->
'lint.jar'
}
}
into 'build/intermediates/lint/'
}
project.afterEvaluate {
def compileLintTask = project.tasks.find { it.name == 'compileLint' }
compileLintTask.dependsOn(copyLintJar)
}

×îºóÔÚ app ¹¤³ÌµÄ build.gradle ÖÐÌí¼Ó htlint ÒýÓã¬ÅäÖÃÍê³É

dependencies {
compile project(':htlint') // lint ¼ì²é¿â
...
}

4.3.3.7 ×Ô¶¨Òå Lint ¼ì²éÖ´Ðм°½á¹û¼ì²é

ÔÚ ${ÏîÄ¿¹¤³Ì}/app/ Ŀ¼ÏÂÖ´ÐÐ ../gradlew lint£º

¸ù¾ÝÌáʾ²é¿´ lint-result.html Îļþ£¬¿ÉÒԲ鿴µ½Ç°Ãæ±àдµÄ ActivitySuperClassDetector.ACTIVITY_SUPER_CLASS_ISSUE ÒѾ­ÉúЧ£¬²¢ÇÒ¼ì²é³öÁËÏà¹ØµÄ·Ç¹æ·¶´úÂë¡£

4.3.3.8 Åųý´íÎóµÄ¼ì²é½á¹û

Ç°ÃæºÜºÃµÄ¸ø³öÁ˼ì²é½á¹ûÁË£¬È»¶øÎÒÃǻᷢÏÖ£¬FullScreenVideoActivity ȷʵÊÇÐèÒªµÄ´íÎó¼ì²é½á¹û£¬¶ø WXEntryActivity È´²»ÊÇ£¬Õâ¸öÀàÊÇÓм¯³É΢ÐÅ·ÖÏíʱÐèÒªµÄ£¬²¢ÇÒ°´ÕÕ΢ÐÅ¿ª·Åƽ̨µÄÎĵµÀ´±àд£¬Òò´Ë²¢²»ÐèÒª°´ÕÕÏîÄ¿¹æ·¶£¬¼Ì³Ð BaseBlankActivity »ò BaseActionBarActivity¡£Îª´Ë£¬ÎÒÃÇÆÚÍû WXEntryActivity ²»Ó¦¸Ã±»¼ì²é³ö WrongActivitySuperClass ´íÎó

Ϊ´Ë£¬ÎÒÃÇ¿ÉÒÔÔÚ WXEntryActivity ÀàÃûÇ©ÃûÌí¼Ó SuppressLint ×¢½â£º

@SuppressLint("WrongActivitySuperClass")
public class WXEntryActivity extends Activity implements IWXAPIEventHandler{
...
}

1.Åųý java Àà»òÕß·½·¨µÄ Lint ¼ì²é

ÈôÐèÒªÒÖ֯ij¸ö Issue ¼ì²é£¬¿ÉÒÔÔÚÀඨÒåÇ©Ãû»òÕß·½·¨¶¨ÒåÇ©Ãû£¬Ìí¼Ó×¢½â @SuppressLint(${IssueId})¡£ÕâÀïÉèÖõľÍÊǾßÌåij¸ö Issue µÄ id Öµ

ÈôÐèÒªÒÖÖÆÈ«²¿µÄ Issue ¼ì²é£¬¿ÉÒÔʹÓà all ¹Ø¼ü×Ö£¬±ÈÈ磺@SuppressLint("all")

2.Åųý xml ×ÊÔ´µÄ Lint ¼ì²é

ÈçÏîÄ¿ÖÐÒýÈë΢²©·ÖÏí sdk£¬°´ÕÕ¹Ù·½Îĵµ£¬ÐèÒªÔÚ AndroidManifest ÖÐÉùÃ÷ com.sina.weibo.sdk.net.DownloadService Õâ¸ö Service£¬¶øÕâ¸ö Service »á±» Lint ¼ì²éΪ䶨Ò壬Ϊ´ËÐèÒª xml ÎļþÖÐÒ²¹ýÂ˲¿·Ö´úÂëµÄ Lint µÄ¼ì²é£º

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.netease.yanxuan">
...
<service
android:name="com.sina.weibo.sdk.net.DownloadService"
android:exported="false"
tools:ignore="MissingRegistered" />
</manifest>

ÕâÀï¶ÔÓÚµ¥¸ö Issue ¹ýÂ˵ĹæÔòΪ£ºtools:ignore=${IssueId}

Èç¹ûÐèÒª¹ýÂËÈ«²¿µÄ Issue£¬¿ÉÒÔʹÓà all ¹Ø¼ü×Ö£ºtools:ignore="all"

4.4 ÆäËû´úÂë¼ì²é¹¤¾ß

4.4.1 360 »ðÏß

360 »ðÏß ÊÇ 360 ¹«Ë¾ºÍÐÅÏ¢°²È«²¿ÃÅÉî¶ÈºÏ×÷£¬¶¨ÖƵÄÊÊÓÃÓÚ 360 ¹«Ë¾²úÆ·µÄ°²×¿ APP °²È«¼ì²é¹æÔò¡£×ܹ²¸²¸Ç 61 Ïî´úÂë¼ì²é¡£Ê¹ÓÃÒ²·Ç³£·½±ã£¬Ï¸½Ú¿´ ʹÓÃÎĵµ£¬¿ÉÒÔÖ±½ÓʹÓà jar °ü²¢Ö´ÐÐÃüÁî»ò¼¯³É Android Studio Plugin Ö´Ðмì²é

4.4.2 pmd

pmd ´úÂë¼ì²é¹¤¾ß£¬°üº¬ 16 ¸ö¹æÔò¼¯£¬º­¸ÇÁË Java µÄ¸÷ÖÖ³£¼ûÎÊÌâ¡£ÆäÖйæÔò¼¯°üº¬ »ù±¾£¨rulesets/basic.xml£©£¬ÖսắÊý£¨finalizer£©£¬Î´Ê¹ÓõĴúÂ루rulesets/unusedcode.xml£©£¬Éè¼Æ£¨rulesets/design.xml£© µÈ¡£

Ïà±È FindBugs£¬pmd µÄһЩ¹æÔò¸ü¾ßÕùÒ飬µ« pmd Ö§³ÖÎÒÃǹ¹½¨×Ô¼ºµÄ¹æÔò¼¯

<?xml version="1.0"?>
<ruleset name="customruleset">
<description>
Sample ruleset for developerWorks article
</description>
<rule ref="rulesets/design.xml"/>
<rule ref="rulesets/naming.xml"/>
<rule ref="rulesets/basic.xml"/>
</ruleset>

4.5 ´úÂë¼ì²é¹¤¾ßÕûºÏ¼°¼¯³É jenkins

ΪÕûºÏÕâЩ¼ì²é¹¤¾ß£¬ÔÚ gradle ÖÐ×Ô¶¨Òå check ÃüÃû£¬²¢ÒÀÀµÆäËûµÄ task¡£ÔÚÖ´Ðмì²éµÄʱºò£¬¿ÉÒÔͨ¹ý ./gradlew check À´Ö´ÐÐÈ«²¿µÄ¼ì²éÃüÁî¡£

check.dependsOn 'checkstyle', 'findbugs', 'pmd', 'lint'

ÁíÒ»·½Ã棬ÕâÖÖ´úÂë¼ì²é£¬Èç¹ûµÈµ½¿ª·¢Íê³ÉµÄʱºòÔÙÈ¥Ö´ÐУ¬ºÜ¿ÉÄÜÎÊÌâ»ýÀÛÁ˺ܶ࣬ÉõÖÁµ¼Ö²úÆ·ÉÏÏßǰ£¬¿ª·¢²¢²»ÄÜÀ´µÃ¼°ÐÞÕýÈ«²¿µÄÎÊÌ⡣Ϊ´Ë£¬¿ÉÒÔ½«´úÂë¼ì²éµÄÃüÁ³É jenkins£¬±£Ö¤¿ª·¢Ã¿Ìì¶¼ÄÜ¿´µ½µ±Ç°µÄ´úÂëµÄȱÏÝ£¬Äܼ°Ê±µÄÐÞ¸Ä

5 ×ܽá

ÎÒÃÇ´Ó±àÂëǰµÄ±àÂë¹æ·¶£¬±àÂë½øÐÐÖеıàÂëÄ£°å£¬±àÂë½áÊøºóµÄ´úÂ뾲̬¼ì²é£¬±£ÕÏÁ˳ÌÐòС»ï°éÃǵĴúÂë¡£³ý´ËÖ®Í⣬»¹Óкܶ಻ÍêÉÆµÄµØ·½ÐèÒªÎÒÃÇ×ö½øÒ»²½´¦Àí£º

  1. ºÍÌØ¶¨ÏîÄ¿Ïà¹ØµÄ×Ô¶¨Òå Lint ¼ì²éÏ½öÖ§³ÖÁËÒ»²¿·ÖµÄ±àÂë¹æ·¶£¬×Ô¶¨Òå Lint ¼ì²éÏîÐèÒªºóÐøÍê³É
  2. ËäÈ»¼ì²é¹¤¾ßºÜ¶à£¬¼ì²éµÄ½á¹ûÄÚÈÝÒ²ºÜ¶à£¬¶øºÜÃ÷ÏÔ£¬ÕâЩ¼ì²é¹¤¾ßÏ໥֮¼äÊÇÓÐÖØ¸´µÄÇé¿ö£¨Ö÷ÒªÊÇ´¿ java ´úÂ벿·ÖµÄ¼ì²é£©£¬Òò´ËÈç¹ûÕûÀí¼ì²é½á¹û£¬²¢¹ýÂ˳öÎÒÃÇÕæÕý¹ØÐĵÄÎÊÌ⣬ҲÊǺóÐøÐèÒªÍê³ÉµÄÄÚÈÝ

 

   
2665 ´Îä¯ÀÀ       31
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì