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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Android ¿ª·¢×î¼Ñʵ¼ù
 
×÷Õߣºcc_net À´Ô´£ºCSDN ·¢²¼ÓÚ 2015-04-03
  2869  次浏览      27
 

´ÓFuturice¹«Ë¾Android¿ª·¢ÕßÖÐѧµ½µÄ¾­Ñé¡£ ×ñÑ­ÒÔÏÂ×¼Ôò£¬±ÜÃâÖØ¸´·¢Ã÷ÂÖ×Ó¡£ÈôÄú¶Ô¿ª·¢iOS»òWindows Phone ÓÐÐËȤ£¬Çë¿´iOS Good PracticesºÍWindows client Good PracticesÕâÁ½ÆªÎÄÕ¡£

ÕªÒª

ʹÓà Gradle ºÍËüÍÆ¼öµÄ¹¤³Ì½á¹¹

°ÑÃÜÂëºÍÃô¸ÐÊý¾Ý·ÅÔÚgradle.properties

²»Òª×Ô¼ºÐ´ HTTP ¿Í»§¶Ë,ʹÓÃVolley»òOkHttp¿â

ʹÓÃJackson¿â½âÎöJSONÊý¾Ý

±ÜÃâʹÓÃGuavaͬʱʹÓÃһЩÀà¿âÀ´±ÜÃâ65k method limit£¨Ò»¸öAndroid³ÌÐòÖÐ×î¶àÄÜÖ´ÐÐ65536¸ö·½·¨£©

ʹÓà FragmentsÀ´³ÊÏÖUIÊÓͼ

ʹÓà Activities Ö»ÊÇΪÁ˹ÜÀí Fragments

Layout ²¼¾ÖÊÇ XMLs´úÂ룬×éÖ¯ºÃËüÃÇ

ÔÚlayoutout XMLs²¼¾Öʱ£¬Ê¹ÓÃstylesÎļþÀ´±ÜÃâʹÓÃÖØ¸´µÄÊôÐÔ

ʹÓöà¸östyleÎļþÀ´±ÜÃâµ¥Ò»µÄÒ»¸ö´óstyleÎļþ

±£³ÖÄãµÄcolors.xml ¼ò¶ÌDRY(²»ÒªÖظ´×Ô¼º)£¬Ö»ÊǶ¨Òåµ÷É«°å

×ÜÊÇʹÓÃdimens.xml DRY(²»ÒªÖظ´×Ô¼º)£¬¶¨ÒåͨÓó£Êý

²»Òª×öÒ»¸öÉî²ã´ÎµÄViewGroup

ÔÚʹÓÃWebViewsʱ±ÜÃâÔÚ¿Í»§¶Ë×ö´¦Àí£¬µ±ÐÄÄÚ´æÐ¹Â¶

ʹÓÃRobolectricµ¥Ôª²âÊÔ£¬Robotium ×öUI²âÊÔ

ʹÓÃGenymotion ×÷ΪÄãµÄÄ£ÄâÆ÷

×ÜÊÇʹÓÃProGuard ºÍ DexGuard»ìÏýÀ´ÏîÄ¿

Android SDK

½«ÄãµÄAndroid SDK·ÅÔÚÄãµÄhomeĿ¼»òÆäËûÓ¦ÓóÌÐòÎ޹صÄλÖᣠµ±°²×°ÓÐЩ°üº¬SDKµÄIDEµÄʱºò£¬¿ÉÄܻὫSDK·ÅÔÚIDEͬһĿ¼Ï£¬µ±ÄãÐèÒªÉý¼¶£¨»òÖØÐ°²×°£©IDE»ò¸ü»»µÄIDEʱ£¬»á·Ç³£Âé·³¡£ ´ËÍ⣬Èô¹ûÄãµÄIDEÊÇÔÚÆÕͨÓû§£¬²»ÊÇÔÚrootÏÂÔËÐУ¬»¹Òª±ÜÃâ°ÉSDK·Åµ½Ò»ÏÂÐèÒªsudoȨÏÞµÄϵͳ¼¶±ðĿ¼Ï¡£

¹¹½¨ÏµÍ³

ÄãµÄĬÈϱàÒë»·¾³Ó¦¸ÃÊÇGradle. Ant ÓкܶàÏÞÖÆ£¬Ò²ºÜÈßÓࡣʹÓÃGradle£¬Íê³ÉÒÔϹ¤×÷ºÜ·½±ã£º

¹¹½¨APP²»Í¬°æ±¾µÄ±äÖÖ

ÖÆ×÷¼òµ¥ÀàËÆ½Å±¾µÄÈÎÎñ

¹ÜÀíºÍÏÂÔØÒÀÀµ

×Ô¶¨ÒåÃØÔ¿

¸ü¶à

ͬʱ£¬Android Gradle²å¼þ×÷Ϊбê×¼µÄ¹¹½¨ÏµÍ³ÕýÔÚ±»Google»ý¼«µÄ¿ª·¢¡£

¹¤³Ì½á¹¹

ÓÐÁ½ÖÖÁ÷ÐеĽṹ£ºÀϵÄAnt & Eclipse ADT ¹¤³Ì½á¹¹£¬ºÍеÄGradle & Android Studio ¹¤³Ì½á¹¹£¬ ÄãÓ¦¸ÃÑ¡ÔñÐµĹ¤³Ì½á¹¹£¬Èç¹ûÄãµÄ¹¤³Ì»¹ÔÚʹÓÃÀϵĽṹ£¬¿¼ÂÇ·ÅÆú°É£¬½«¹¤³ÌÒÆÖ²µ½ÐµĽṹ¡£

ÀϵĽṹ:

old-structure ©À©¤ assets ©À©¤ libs ©À©¤ res ©À©¤ src ©¦  ©¸©¤ com/futurice/project ©À©¤ AndroidManifest.xml 
©À©¤ build.gradle ©À©¤ project.properties ©¸©¤ proguard-rules.pro 

еĽṹ

new-structure ©À©¤ library-foobar ©À©¤ app ©¦  ©À©¤ libs ©¦  ©À©¤ src ©¦  ©¦  ©À©¤ androidTest
 ©¦  ©¦  ©¦  ©¸©¤ java ©¦  ©¦  ©¦     ©¸©¤ com/futurice/project ©¦  ©¦  ©¸©¤ main
 ©¦  ©¦     ©À©¤ java ©¦  ©¦     ©¦  ©¸©¤ com/futurice/project ©¦  ©¦     ©À©¤ res 
©¦  ©¦     ©¸©¤ AndroidManifest.xml ©¦  ©À©¤ build.gradle ©¦  ©¸©¤ proguard-rules.pro 
©À©¤ build.gradle ©¸©¤ settings.gradle

Ö÷ÒªµÄÇø±ðÔÚÓÚ£¬ÐµĽṹÃ÷È·µÄ·Ö¿ªÁË'source sets' (main,androidTest)£¬GradleµÄÒ»¸öÀíÄî¡£ Äã¿ÉÒÔ×öµ½£¬ÀýÈ磬Ìí¼ÓÔ´×é¡®paid¡¯ºÍ¡®free¡¯ÔÚsrcÖУ¬Õ⽫³ÉΪÄúµÄÓ¦ÓóÌÐòµÄ¸¶·ÑºÍÃâ·ÑµÄÁ½ÖÖģʽµÄÔ´´úÂë¡£

ÄãµÄÏîÄ¿ÒýÓõÚÈý·½ÏîÄ¿¿âʱ£¨ÀýÈ磬library-foobar£©£¬ÓµÓÐÒ»¸ö¶¥¼¶°üÃûapp´ÓµÚÈý·½¿âÏîÄ¿Çø·ÖÄãµÄÓ¦ÓóÌÐòÊǷdz£ÓÐÓõġ£ È»ºósettings.gradle²»¶ÏÒýÓÃÕâЩ¿âÏîÄ¿£¬ÆäÖÐapp/build.gradle¿ÉÒÔÒýÓá£

Gradle ÅäÖÃ

³£Óýṹ²Î¿¼Google's guide on Gradle for Android

СÈÎÎñ³ýÁË(shell, Python, Perl, etc)ÕâЩ½Å±¾ÓïÑÔ£¬ÄãÒ²¿ÉÒÔʹÓÃGradle ÖÆ×÷ÈÎÎñ¡£ ¸ü¶àÐÅÏ¢Çë²Î¿¼Gradle's documentation¡£

ÃÜÂëÔÚ×ö°æ±¾releaseʱÄãappµÄbuild.gradleÄãÐèÒª¶¨ÒåsigningConfigs.´ËʱÄãÓ¦¸Ã±ÜÃâÒÔÏÂÄÚÈÝ£º

²»Òª×öÕâ¸ö. Õâ»á³öÏÖÔÚ°æ±¾¿ØÖÆÖС£

signingConfigs {
release {
storeFile file("myapp.keystore")
storePassword "password123"
keyAlias "thekey"
keyPassword "password789"
}
}

¶øÊÇ£¬½¨Á¢Ò»¸ö²»¼ÓÈë°æ±¾¿ØÖÆÏµÍ³µÄgradle.propertiesÎļþ¡£

KEYSTORE_PASSWORD=password123 KEY_PASSWORD=password789 

ÄǸöÎļþÊÇgradle×Ô¶¯ÒýÈëµÄ£¬Äã¿ÉÒÔÔÚbuld.gradleÎļþÖÐʹÓã¬ÀýÈ磺

signingConfigs {
release {
try {
storeFile file("myapp.keystore")
storePassword KEYSTORE_PASSWORD
keyAlias "thekey"
keyPassword KEY_PASSWORD
}
catch (ex) {
throw new InvalidUserDataException ("You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.")
}
}
}

ʹÓà Maven ÒÀÀµ·½°¸´úÌæÊ¹Óõ¼Èëjar°ü·½°¸Èç¹ûÔÚÄãµÄÏîÄ¿ÖÐÄãÃ÷ȷʹÓÃÂÊ jarÎļþ£¬ÄÇôËüÃÇ¿ÉÄܳÉΪÓÀ¾ÃµÄ°æ±¾£¬Èç2.1.1.ÏÂÔØjar°ü¸üÐÂËûÃÇÊǺܷ±ËöµÄ£¬ Õâ¸öÎÊÌâMavenºÜºÃµÄ½â¾öÁË£¬ÕâÔÚAndroid Gradle¹¹½¨ÖÐÒ²ÊÇÍÆ¼öµÄ·½·¨¡£Äã¿É ÒÔÖ¸¶¨°æ±¾µÄÒ»¸ö·¶Î§£¬Èç2.1.+,È»ºóMaven»á×Ô¶¯Éý¼¶µ½Öƶ¨µÄ×îа汾£¬ÀýÈ磺

dependencies {
compile 'com.netflix.rxjava:rxjava-core:0.19.+'
compile 'com.netflix.rxjava:rxjava-android:0.19.+'
compile 'com.fasterxml.jackson.core:jackson-databind:2.4.+'
compile 'com.fasterxml.jackson.core:jackson-core:2.4.+'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.4.+'
compile 'com.squareup.okhttp:okhttp:2.0.+'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.+'
}

IDEs and text editors

IDE¼¯³É¿ª·¢»·¾³ºÍÎı¾±à¼­Æ÷

ÎÞÂÛʹÓÃʲô±à¼­Æ÷£¬Ò»¶¨Òª¹¹½¨Ò»¸öÁ¼ºÃµÄ¹¤³Ì½á¹¹±à¼­Æ÷ÿ¸öÈ˶¼ÓÐ×Ô¼ºµÄ Ñ¡Ôñ£¬ÈÃÄãµÄ±à¼­Æ÷¸ù¾Ý¹¤³Ì½á¹¹ºÍ¹¹½¨ÏµÍ³ÔË×÷£¬ÄÇÊÇÄã×Ô¼ºµÄÔðÈΡ£

µ±ÏÂÊ×ÍÆAndroid Studio,ÒòΪËûÊÇÓɹȸ迪·¢£¬×î½Ó½üGradle£¬Ä¬ÈÏʹÓÃ×îÐµĹ¤³Ì½á¹¹£¬ÒѾ­µ½beta½×¶Î £¨Ä¿Ç°ÒѾ­ÓÐrelease 1.0ÁË£©£¬Ëü¾ÍÊÇΪAndroid¿ª·¢¶¨ÖƵġ£

ÄãÒ²¿ÉÒÔʹÓÃEclipse ADT£¬µ«ÊÇÄãÐèÒª¶ÔËü½øÐÐÅäÖã¬ÒòΪËüʹÓÃÁ˾ɵŤ³Ì½á¹¹ ºÍAnt×÷Ϊ¹¹½¨ÏµÍ³¡£ÄãÉõÖÁ¿ÉÒÔʹÓô¿Îİæ±à¼­Æ÷ÈçVim£¬Sublime Text£¬»òÕßEmacs¡£Èç¹ûÄÇÑùµÄ»°£¬ÄãÐèҪʹÓÃGardleºÍadbÃüÁîÐС£Èç¹ûʹÓÃEclipse¼¯³ÉGradle ²»ÊʺÏÄ㣬ÄãÖ»ÊÇʹÓÃÃüÁîÐй¹½¨¹¤³Ì£¬»òÇ¨ÒÆµ½Android StudioÖÐÀ´°É¡£

ÎÞÂÛÄãʹÓúÎÖÖ¿ª·¢¹¤¾ß£¬Ö»ÒªÈ·±£GradleºÍеÄÏîÄ¿½á¹¹±£³Ö¹Ù·½µÄ·½Ê½¹¹½¨Ó¦ÓóÌÐò£¬±ÜÃâÄãµÄ±à¼­Æ÷ÅäÖÃÎļþ¼ÓÈëµ½°æ±¾¿ØÖÆ¡£ÀýÈ磬±ÜÃâ¼ÓÈëAntbuild.xmlÎļþ¡£ ÌØ±ðÈç¹ûÄã¸Ä±äAntµÄÅäÖ㬲»ÒªÍü¼Ç±£³Öbuild.gradleÊÇ×îÐÂºÍÆð×÷Óõġ£Í¬Ê±£¬ÉÆ´ýÆäËû¿ª·¢Õߣ¬²»ÒªÇ¿ÖƸıäËûÃǵĿª·¢¹¤¾ßºÍÆ«ºÃ¡£

Àà¿â

JacksonÊÇÒ»¸ö½«java¶ÔÏóת»»³ÉJSONÓëJSONת»¯javaÀàµÄÀà¿â¡£GsonÊǽâ¾öÕâ¸öÎÊÌâµÄÁ÷Ðз½°¸£¬È»¶øÎÒÃÇ·¢ÏÖJackson¸ü¸ßЧ,ÒòΪËüÖ§³ÖÌæ´úµÄ·½·¨´¦ÀíJSON:Á÷¡¢ÄÚ´æÊ÷Ä£ÐÍ,ºÍ´«Í³JSON-POJOÊý¾Ý°ó¶¨¡£²»¹ý£¬Çë¼Çס£¬ Jsonkson¿â±ÈÆðGSON¸ü´ó£¬ËùÒÔ¸ù¾ÝÄãµÄÇé¿öÑ¡Ôñ£¬Äã¿ÉÄÜÑ¡ÔñGSONÀ´±ÜÃâAPP 65k¸ö·½·¨ÏÞÖÆ¡£ÆäËüÑ¡Ôñ:Json-smartandBoon JSON

ÍøÂçÇëÇ󣬻º´æ£¬Í¼Æ¬Ö´ÐÐÇëÇóºó¶Ë·þÎñÆ÷£¬Óм¸ÖÖ½»»¥µÄ½â¾ö·½°¸£¬ÄãÓ¦¸Ã¿¼ÂÇʵÏÖÄã×Ô¼ºµÄÍøÂç¿Í»§¶Ë¡£Ê¹ÓÃVolley»òRetrofit¡£Volley ͬʱÌṩͼƬ»º´æÀà¡£Èô¹ûÄãÑ¡ÔñʹÓÃRetrofit,ÄÇô¿¼ÂÇʹÓÃPicassoÀ´¼ÓÔØÍ¼Æ¬ºÍ»º´æ£¬Í¬Ê±Ê¹ÓÃOkHttp×÷Ϊ¸ßЧµÄÍøÂçÇëÇó¡£Retrofit£¬PicassoºÍOkHttp¶¼ÊÇÓÐͬһ¼Ò¹«Ë¾¿ª·¢£¨×¢£º ÊÇÓÉSquare¹«Ë¾¿ª·¢£©£¬ËùÒÔËüÃÇÄܺܺõÄÔÚÒ»ÆðÔËÐС£OkHttp ͬÑù¿ÉÒÔºÍVolleyÔÚÒ»ÆðʹÓà Volley.

RxJavaÊǺ¯Êýʽ·´Ó¦ÐÔµÄÒ»¸öÀà¿â£¬»»¾ä»°Ëµ£¬ÄÜ´¦ÀíÒì²½µÄʼþ¡£ ÕâÊÇÒ»¸öÇ¿´óµÄºÍÓÐǰ;µÄģʽ£¬Í¬Ê±Ò²¿ÉÄÜ»áÔì³É»ìÏý£¬ÒòΪËüÊÇÈç´ËµÄ²»Í¬¡£ ÎÒÃǽ¨ÒéÔÚʹÓÃÕâ¸ö¿â¼Ü¹¹Õû¸öÓ¦ÓóÌÐò֮ǰҪ½÷É÷¿¼ÂÇ¡£ ÓÐһЩÏîÄ¿ÊÇʹÓÃRxJavaÍê³ÉµÄ£¬Èç¹ûÄãÐèÒª°ïÖú¿ÉÒÔ¸úÕâЩÈËÈ¡µÃÁªÏµ£º Timo Tuominen, Olli Salonen, Andre Medeiros, Mark Voit, Antti Lammi, Vera Izrailit, Juha Ristolainen. ÎÒÃÇҲдÁËһЩ²©¿Í£º[1],[2],[3],[4].

ÈçÈôÄã֮ǰÓÐʹÓùýRxµÄ¾­Àú£¬¿ªÊ¼´ÓAPIÏìÓ¦Ó¦ÓÃËü¡£ ÁíÍ⣬´Ó¼òµ¥µÄUIʼþ´¦Àí¿ªÊ¼ÔËÓã¬Èçµ¥»÷ʼþ»òÔÚËÑË÷À¸ÊäÈëʼþ¡£ Èô¶ÔÄãµÄRx¼¼ÊõÓÐÐÅÐÄ£¬Í¬Ê±ÏëÒª½«ËüÓ¦Óõ½ÄãµÄÕûÌå¼Ü¹¹ÖУ¬ÄÇôÇëÔÚ¸´ÔӵIJ¿·ÖдºÃJavadocsÎĵµ¡£ Çë¼ÇסÆäËû²»ÊìϤRxJavaµÄ¿ª·¢ÈËÔ±£¬¿ÉÄÜ»á·Ç³£ÄÑÀí½âÕû¸öÏîÄ¿¡£ ¾¡ÄãµÄµÄÈ«Á¦°ïÖúËûÃÇÀí½âÄãµÄ´úÂëºÍRx¡£

RetrolambdaÊÇÒ»¸öÔÚAndroidºÍÔ¤JDK8ƽ̨ÉϵÄʹÓÃLambda±í´ïʽÓï·¨µÄJavaÀà¿â¡£ ËüÓÐÖúÓÚ±£³ÖÄã´úÂëµÄ½ô´ÕÐԺͿɶÁÐÔ£¬Ìرðµ±ÄãʹÓÃÈçRxJavaº¯Êý·ç¸ñ±à³Ìʱ¡£ ʹÓÃËüʱÏȰ²×°JDK8£¬ÔÚAndroid Studio¹¤³Ì½á¹¹¶Ô»°¿òÖаÑËüÉèÖóÉΪSDK·¾¶£¬Í¬Ê±ÉèÖÃJAVA8_HOMEºÍJAVA7_HOME»·¾³±äÁ¿£¬ È»ºóÔÚ¹¤³Ì¸ùĿ¼ÏÂÅäÖà build.gradle£º

dependencies {
classpath 'me.tatarka:gradle-retrolambda:2.4.+'
}

ͬʱÔÚÿ¸ömodule µÄbuild.gradleÖÐÌí¼Ó

apply plugin: 'retrolambda'
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
} retrolambda {
jdk System.getenv("JAVA8_HOME")
oldJdk System.getenv("JAVA7_HOME")
javaVersion JavaVersion.VERSION_1_7
}

Android Studio ÌṩJava8 lambdas±í´øÊÇ´úÂëÌáʾ֧³Ö¡£Èç¹ûÄã¶Ôlambdas²»ÊìϤ£¬Ö»Ðè²ÎÕÕÒÔÏ¿ªÊ¼Ñ§Ï°°É£º

ÈκÎÖ»°üº¬Ò»¸ö½Ó¿ÚµÄ·½·¨¶¼ÊÇ"lambda friendly"ͬʱ´úÂë¿ÉÒÔ±»ÕÛµþ³É¸ü½ô´ÕµÄÓï·¨

Èç¹û¶Ô²ÎÊý»òÀàËÆÓÐÒÉÎÊ£¬¾Íдһ¸öÆÕͨµÄÄäÃûÄÚ²¿À࣬ȻºóÈÃAndroid StatusΪÄãÉú³ÉÒ»¸ölambda¡£

µ±ÐÄdex·½·¨ÊýÏÞÖÆ£¬Í¬Ê±±ÜÃâʹÓùý¶àµÄÀà¿âAndroid apps£¬µ±´ò°ü³ÉÒ»¸ödexÎļþʱ£¬ÓÐÒ»¸ö65535¸öÓ¦Ó÷½·¨Ç¿Ó²ÏÞÖÆ[1][2][3]¡£ µ±ÄãÍ»ÆÆ65kÏÞÖÆÖ®ºóÄã»á¿´µ½Ò»¸öÖÂÃü´íÎó¡£Òò´Ë£¬Ê¹ÓÃÒ»¸öÕý³£·¶Î§µÄÀà¿âÎļþ£¬Í¬Ê±Ê¹ÓÃdex-method-counts¹¤¾ßÀ´¾ö¶¨ÄÄЩÀà¿â¿ÉÒÔÔÙ65kÏÞÖÆÖ®ÏÂʹÓã¬ÌرðµÄ±ÜÃâʹÓÃGuavaÀà¿â£¬ÒòΪËü°üº¬³¬¹ý13k¸ö·½·¨¡£

Activities and Fragments

FragmentsÓ¦¸Ã×÷ΪÄãʵÏÖUI½çÃæÄ¬ÈÏÑ¡Ôñ¡£Äã¿ÉÒÔÖØ¸´Ê¹ÓÃFragmentsÓû§½Ó¿ÚÀ´ ×éºÏ³ÉÄãµÄÓ¦Óá£ÎÒÃÇÇ¿ÁÒÍÆ¼öʹÓÃFragments¶ø²»ÊÇactivityÀ´³ÊÏÖUI½çÃæ£¬ÀíÓÉÈçÏ£º

Ìṩ¶à´°¸ñ²¼¾Ö½â¾ö·½°¸Fragments µÄÒýÈëÖ÷Òª½«ÊÖ»úÓ¦ÓÃÑÓÉ쵽ƽ°åµçÄÔ£¬ËùÒÔÔÚÆ½°åµçÄÔÉÏÄã¿ÉÄÜÓÐA¡¢BÁ½¸ö´°¸ñ£¬µ«ÊÇÔÚÊÖ»úÓ¦ÓÃÉÏA¡¢B¿ÉÄÜ·Ö±ð³äÂú Õû¸öÆÁÄ»¡£Èç¹ûÄãµÄÓ¦ÓÃÔÚ×î³õ¾ÍʹÓÃÁËfragments£¬ÄÇôÒÔºó½«ÄãµÄÓ¦ÓÃÊÊÅäµ½ÆäËû²»Í¬³ß´çÆÁÄ»¾Í»á·Ç³£¼òµ¥¡£

ÆÁÄ»¼äÊý¾ÝͨÐÅ´ÓÒ»¸öActivity·¢Ë͸´ÔÓÊý¾Ý(ÀýÈçJava¶ÔÏó)µ½ÁíÍâÒ»¸öActivity£¬AndroidµÄAPI²¢Ã»ÓÐÌṩºÏÊʵķ½·¨¡£²»¹ýʹÓÃFragment£¬Äã¿ÉÒÔʹÓà һ¸öactivityʵÀý×÷ΪÕâ¸öactivity×ÓfragmentsµÄͨÐÅͨµÀ¡£¼´Ê¹ÕâÑù±ÈActivityÓëActivity¼äµÄͨÐźã¬ÄãÒ²Ï뿼ÂÇʹÓÃEvent Bus¼Ü¹¹£¬Ê¹ÓÃÈçOtto»òÕßgreenrobot EventBus×÷Ϊ¸ü¼ò½àµÄʵÏÖ¡£ Èç¹ûÄãÏ£Íû±ÜÃâÌí¼ÓÁíÍâÒ»¸öÀà¿â£¬RxJavaͬÑù¿ÉÒÔʵÏÖÒ»¸öEvent Bus¡£

Fragments Ò»°ãͨÓõIJ»Ö»ÓÐUIÄã¿ÉÒÔÓÐÒ»¸öûÓнçÃæµÄfragment×÷ΪActivityÌṩºǫ́¹¤×÷¡£ ½øÒ»²½Äã¿ÉÒÔʹÓÃÕâ¸öÌØÐÔÀ´´´½¨Ò»¸öfragment °üº¬¸Ä±äÆäËüfragmentµÄÂß¼­¶ø²»ÊǰÑÕâ¸öÂß¼­·ÅÔÚactivityÖС£

ÉõÖÁActionBar ¶¼¿ÉÒÔʹÓÃÄÚ²¿fragmentÀ´¹ÜÀíÄã¿ÉÒÔÑ¡ÔñʹÓÃÒ»¸öûÓÐUI½çÃæµÄfragmentÀ´×¨ÃŹÜÀíActionBar,»òÕßÄã¿ÉÒÔÑ¡ÔñʹÓÃÔÚÿ¸öFragmentÖÐ Ìí¼ÓËü×Ô¼ºµÄaction À´×÷Ϊ¸¸ActivityµÄActionBar.²Î¿¼.

ºÜ²»ÐÒ£¬ÎÒÃDz»½¨Òé¹ã·ºµÄʹÓÃǶÌ×µÄfragments£¬ÒòΪ ÓÐʱ»áÒýÆðmatryoshka bugs¡£ÎÒÃÇÖ»Óе±ËüÓÐÒâÒå(ÀýÈ磬ÔÚˮƽ»¬¶¯µÄViewPagerÔÚ ÏñÆÁĻһÑùfragmentÖÐ)»òÕßËûµÄÈ·ÊÇÒ»¸öÃ÷ÖǵÄÑ¡ÔñµÄʱºò²Å¹ã·ºµÄʹÓÃfragment¡£

ÔÚÒ»¸ö¼Ü¹¹¼¶±ð£¬ÄãµÄAPPÓ¦¸ÃÓÐÒ»¸ö¶¥¼¶µÄactivityÀ´°üº¬¾ø´ó²¿·ÖÒµÎñÏà¹ØµÄfragment¡£ÄãÒ²¿ÉÄÜ»¹ÓÐһЩ¸¨ÖúµÄactivity £¬ÕâЩ¸¨ÖúµÄactivityÓëÖ÷activity ͨÐźܼòµ¥ÏÞÖÆÔÚÕâÁ½ÖÖ·½·¨Intent.setData()»òIntent.setAction()»òÀàËÆµÄ·½·¨¡£

Java °ü½á¹¹

Android Ó¦ÓóÌÐòÔڼܹ¹ÉÏ´óÖÂÊÇJavaÖеÄModel-View-Controller½á¹¹¡£ ÔÚAndroid ÖÐ FragmentºÍActivityͨ³£ÉÏÊÇ¿ØÖÆÆ÷Àà(http://www.informit.com/articles/article.aspx?p=2126865). »»¾ä»°Ëµ£¬ËûÃÇÊÇÓû§½Ó¿ÚµÄ²¿·Ö£¬Í¬ÑùÒ²ÊÇViewsÊÓͼµÄ²¿·Ö¡£

ÕýÊÇÒòΪÈç´Ë£¬²ÅºÜÄÑÑϸñµÄ½«fragments (»òÕß activities) ÑϸñµÄ»®·Ö³É ¿ØÖÆÆ÷controlloers»¹ÊÇÊÓͼ views¡£ ×Êǽ«ËüÃÇ·ÅÔÚ×Ô¼ºµ¥¶ÀµÄfragments°üÖС£Ö»ÒªÄã×ñѭ֮ǰÌáµ½µÄ½¨Ò飬Activities Ôò¿ÉÒÔ·ÅÔÚ¶¥¼¶Ä¿Â¼Ï¡£ Èô¹ûÄã¹æ»®ÓÐ2µ½3¸öÒÔÉϵÄactivity£¬ÄÇô»¹ÊÇͬÑùн¨Ò»¸öactivities°ü°É¡£

È»¶ø£¬ÕâÖּܹ¹¿ÉÒÔ¿´×öÊÇÁíÒ»ÖÖÐÎʽµÄMVC£¬ °üº¬Òª±»½âÎöAPIÏìÓ¦µÄJSONÊý¾Ý£¬À´Ìî³äµÄPOJOµÄmodels°üÖС£ ºÍÒ»¸öviews°üÀ´°üº¬ÄãµÄ×Ô¶¨ÒåÊÓͼ¡¢Í¨Öª¡¢µ¼º½ÊÓͼ£¬widgetsµÈµÈ¡£ ÊÊÅäÆ÷AdapterÊÇÔÚÊý¾ÝºÍÊÓͼ֮¼ä¡£È»¶øËûÃÇͨ³£ÐèҪͨ¹ýgetView()·½·¨À´µ¼³öһЩÊÓͼ£¬ ËùÒÔÄã¿ÉÒÔ½«adapters°ü·ÅÔÚviews°üÀïÃæ¡£

һЩ¿ØÖÆÆ÷½ÇÉ«µÄÀàÊÇÓ¦ÓóÌÐò¼¶±ðµÄ£¬Í¬Ê±ÊǽӽüϵͳµÄ¡£ ÕâЩÀà·ÅÔÚmanagers°üÏÂÃæ¡£ һЩ·±ÔÓµÄÊý¾Ý´¦ÀíÀ࣬±ÈÈç˵"DateUtils",·ÅÔÚutils°üÏÂÃæ¡£ Óëºó¶Ë½»»¥¸ºÔðÍøÂç´¦ÀíÀ࣬·ÅÔÚnetwork°üÏÂÃæ¡£

×ܶøÑÔÖ®£¬ÒÔ×î½Ó½üÓû§¶ø²»ÊÇ×î½Ó½üºó¶ËÈ¥°²ÅÅËûÃÇ¡£

com.futurice.project ©À©¤ network ©À©¤ models ©À©¤ managers ©À©¤ utils 
©À©¤ fragments ©¸©¤ views    ©À©¤ adapters    ©À©¤ actionbar    ©À©¤ widgets    ©¸©¤ notifications 

×ÊÔ´Îļþ Resources

ÃüÃû×ñѭǰ׺±íÃ÷ÀàÐ͵Äϰ¹ß£¬ÐÎÈçtype_foo_bar.xml¡£Àý

×éÖ¯²¼¾ÖÎļþÈô¹ûÄ㲻ȷ¶¨ÈçºÎÅŰæÒ»¸ö²¼¾ÖÎļþ£¬×ñѭһϹæÔò¿ÉÄÜ»áÓаïÖú¡£

ÿһ¸öÊôÐÔÒ»ÐУ¬Ëõ½ø4¸ö¿Õ¸ñ

android:id×ÜÊÇ×÷ΪµÚÒ»¸öÊôÐÔ

android:layout_****ÊôÐÔÔÚÉϱß

styleÊôÐÔÔڵײ¿

¹Ø±Õ±êÇ©/>µ¥¶ÀÆðÒ»ÐУ¬ÓÐÖúÓÚµ÷ÕûºÍÌí¼ÓеÄÊôÐÔ

¿¼ÂÇʹÓÃDesigntime attributes Éè¼ÆÊ±²¼¾ÖÊôÐÔ£¬Android StudioÒѾ­Ìṩ֧³Ö£¬¶ø²»ÊÇÓ²±àÂëandroid:text(ÒëÕß×¢£ºÇ½ÄÚÒ²¿ÉÒԲο¼stormzhangµÄÕâÆª²©¿ÍÁ´½Ó)¡£

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
> <TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="@string/name"
style="@style/FancyText"
/> <include layout="@layout/reusable_part" /> </LinearLayout>

×÷Ϊһ¸ö¾­Ñé·¨Ôò,android:layout_****ÊôÐÔÓ¦¸ÃÔÚ layout XML Öж¨Òå,ͬʱÆäËüÊôÐÔandroid:****Ó¦·ÅÔÚ styler XMLÖС£´Ë¹æÔòÒ²ÓÐÀýÍ⣬²»¹ý´óÌ幤×÷ µÄºÜºÃ¡£Õâ¸ö˼ÏëÕûÌåÊDZ£³ÖlayoutÊôÐÔ(positioning, margin, sizing) ºÍcontentÊôÐÔÔÚ²¼¾ÖÎļþÖУ¬Í¬Ê±½«ËùÓеÄÍâ¹Ûϸ½ÚÊôÐÔ£¨colors, padding, font£©·Å ÔÚstyleÎļþÖС£

ÀýÍâÓÐÒÔÏÂÕâЩ:

android:idÃ÷ÏÔÓ¦¸ÃÔÚlayoutÎļþÖÐ

layoutÎļþÖÐandroid:orientation¶ÔÓÚÒ»¸öLinearLayout²¼¾Öͨ³£¸üÓÐÒâÒå

android:textÓÉÓÚÊǶ¨ÒåÄÚÈÝ£¬Ó¦¸Ã·ÅÔÚlayoutÎļþÖÐ

ÓÐʱºò½«android:layout_widthºÍandroid:layout_heightÊôÐԷŵ½Ò»¸östyleÖÐ×÷Ϊһ¸öͨÓõķç¸ñÖиüÓÐÒâÒ壬µ«ÊÇĬÈÏÇé¿öÏÂÕâЩӦ¸Ã·Åµ½layoutÎļþÖС£

ʹÓÃstyles¼¸ºõÿ¸öÏîÄ¿¶¼ÐèÒªÊʵ±µÄʹÓÃstyleÎļþ£¬ÒòΪ¶ÔÓÚÒ»¸öÊÓͼÀ´ËµÓÐÒ»¸öÖØ¸´µÄÍâ¹ÛÊǺܳ£¼ûµÄ¡£ ÔÚÓ¦ÓÃÖжÔÓÚ´ó¶àÊýÎı¾ÄÚÈÝ£¬×îÆðÂëÄãÓ¦¸ÃÓÐÒ»¸öͨÓõÄstyleÎļþ£¬ÀýÈ磺

<style name="ContentText">
<item name="android:textSize">@dimen/font_normal</item>
<item name="android:textColor">@color/basic_black</item>
</style>

Ó¦Óõ½TextView ÖÐ:

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/price"
style="@style/ContentText"
/>

Äã»òÐíÐèҪΪ°´Å¥¿Ø¼þ×öͬÑùµÄÊÂÇ飬²»ÒªÍ£Ö¹ÔÚÄÇÀï¡£½«Ò»×éÏà¹ØµÄºÍÖØ¸´android:****µÄÊôÐԷŵ½Ò»¸öͨÓõÄstyleÖС£

½«Ò»¸ö´óµÄstyleÎļþ·Ö¸î³É¶à¸öÎļþÄã¿ÉÒÔÓжà¸östyles.xmlÎļþ¡£Android SDKÖ§³ÖÆäËüÎļþ£¬stylesÕâ¸öÎļþÃû³Æ²¢Ã»ÓÐ×÷Óã¬Æð×÷ÓõÄÊÇÔÚÎļþ ÀïxmlµÄ<style>±êÇ©¡£Òò´ËÄã¿ÉÒÔÓжà¸östyleÎļþstyles.xml,style_home.xml,style_item_details.xml,styles_forms.xml¡£ ²»ÓÃÓÚ×ÊÔ´Îļþ·¾¶ÐèҪΪϵͳ¹¹½¨ÆðµÄÓÐÒâÒ壬ÔÚres/valuesĿ¼ÏµÄÎļþ¿ÉÒÔÈÎÒâÃüÃû¡£

colors.xmlÊÇÒ»¸öµ÷É«°åÔÚÄãµÄcolors.xmlÎļþÖÐÓ¦¸ÃÖ»ÊÇÓ³ÉäÑÕÉ«µÄÃû³ÆÒ»¸öRGBAÖµ£¬¶øÃ»ÓÐÆäËüµÄ¡£²»ÒªÊ¹ÓÃËüΪ²»Í¬µÄ°´Å¥À´¶¨ÒåRGBAÖµ¡£

²»ÒªÕâÑù×ö

<resources>
<color name="button_foreground">#FFFFFF</color>
<color name="button_background">#2A91BD</color>
<color name="comment_background_inactive">#5F5F5F</color>
<color name="comment_background_active">#939393</color>
<color name="comment_foreground">#FFFFFF</color>
<color name="comment_foreground_important">#FF9D2F</color>
...
<color name="comment_shadow">#323232</color>

ʹÓÃÕâÖÖ¸ñʽ£¬Äã»á·Ç³£ÈÝÒ׵ĿªÊ¼Öظ´¶¨ÒåRGBAÖµ£¬ÕâʹÈç¹ûÐèÒª¸Ä±ä»ù±¾É«±äµÄºÜ¸´ÔÓ¡£Í¬Ê±£¬ÕâЩ¶¨ÒåÊǸúһЩ»·¾³¹ØÁªÆðÀ´µÄ£¬Èçbutton»òÕßcomment, Ó¦¸Ã·Åµ½Ò»¸ö°´Å¥·ç¸ñÖУ¬¶ø²»ÊÇÔÚcolor.xmlÎļþÖС£

Ïà·´£¬ÕâÑù×ö:

<resources>
 <!-- grayscale -->
<color name="white" >#FFFFFF</color>
<color name="gray_light">#DBDBDB</color>
<color name="gray" >#939393</color>
<color name="gray_dark" >#5F5F5F</color>
<color name="black" >#323232</color> <!-- basic colors -->
<color name="green">#27D34D</color>
<color name="blue">#2A91BD</color>
<color name="orange">#FF9D2F</color>
<color name="red">#FF432F</color> </resources>

ÏòÓ¦ÓÃÉè¼ÆÕßÄÇÀïÒªÕâ¸öµ÷É«°å£¬Ãû³Æ²»ÐèÒª¸ú"green", "blue", µÈµÈÏàͬ¡£ "brand_primary", "brand_secondary", "brand_negative" ÕâÑùµÄÃû×ÖÒ²ÊÇÍêÈ«¿ÉÒÔ½ÓÊܵġ£ ÏñÕâÑù¹æ·¶µÄÑÕÉ«ºÜÈÝÒ×Ð޸ĻòÖØ¹¹£¬»áʹӦÓÃÒ»¹²Ê¹ÓÃÁ˶àÉÙÖÖ²»Í¬µÄÑÕÉ«±äµÃ·Ç³£ÇåÎú¡£ ͨ³£Ò»¸ö¾ßÓÐÉóÃÀ¼ÛÖµµÄUIÀ´Ëµ£¬¼õÉÙʹÓÃÑÕÉ«µÄÖÖÀàÊǷdz£ÖØÒªµÄ¡£

Ïñ¶Ô´ýcolors.xmlÒ»Ñù¶Ô´ýdimens.xmlÎļþÓ붨ÒåÑÕÉ«µ÷É«°åÒ»Ñù£¬ÄãͬʱҲӦ¸Ã¶¨ÒåÒ»¸ö¿Õ϶¼ä¸ôºÍ×ÖÌå´óСµÄ¡°µ÷É«°å¡±¡£ Ò»¸öºÃµÄÀý×Ó£¬ÈçÏÂËùʾ£º

<resources>
 <!-- font sizes -->
<dimen name="font_larger">22sp</dimen>
<dimen name="font_large">18sp</dimen>
<dimen name="font_normal">15sp</dimen>
<dimen name="font_small">12sp</dimen> <!-- typical spacing between two views -->
<dimen name="spacing_huge">40dp</dimen>
<dimen name="spacing_large">24dp</dimen>
<dimen name="spacing_normal">14dp</dimen>
<dimen name="spacing_small">10dp</dimen>
<dimen name="spacing_tiny">4dp</dimen> <!-- typical sizes of views -->
<dimen name="button_height_tall">60dp</dimen>
<dimen name="button_height_normal">40dp</dimen>
<dimen name="button_height_short">32dp</dimen> </resources>

²¼¾ÖʱÔÚд margins ºÍ paddings ʱ£¬ÄãÓ¦¸ÃʹÓÃspacing_****³ß´ç¸ñʽÀ´²¼¾Ö£¬¶ø²»ÊÇÏñ¶Ô´ýString×Ö·û´®Ò»ÑùÖ±½Óдֵ¡£ ÕâÑùд»á·Ç³£Óиоõ£¬»áʹ×éÖ¯ºÍ¸Ä±ä·ç¸ñ»ò²¼¾ÖÊǷdz£ÈÝÒס£

±ÜÃâÉî²ã´ÎµÄÊÓͼ½á¹¹ÓÐʱºòΪÁ˰ڷÅÒ»¸öÊÓͼ£¬Äã¿ÉÄܳ¢ÊÔÌí¼ÓÁíÒ»¸öLinearLayout¡£Äã¿ÉÄÜʹÓÃÕâÖÖ·½·¨½â¾ö£º

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
> <RelativeLayout
...
> <LinearLayout
...
> <LinearLayout
...
> <LinearLayout
...
>
</LinearLayout> </LinearLayout> </LinearLayout> </RelativeLayout> </LinearLayout>

¼´Ê¹ÄãûÓзdz£Ã÷È·µÄÔÚÒ»¸ölayout²¼¾ÖÎļþÖÐÕâÑùʹÓã¬Èç¹ûÄãÔÚJavaÎļþÖдÓÒ»¸öview inflate£¨Õâ¸öinflate·­Òë²»¹ýÈ¥£¬´ó¼ÒÀí½â¾ÍÐУ© µ½ÆäËûviewsµ±ÖУ¬Ò²ÊÇ¿ÉÄܻᷢÉúµÄ¡£

¿ÉÄܻᵼÖÂһϵÁеÄÎÊÌâ¡£Äã¿ÉÄÜ»áÓöµ½ÐÔÄÜÎÊÌ⣬ÒòΪ´¦ÀíÆðÐèÒª´¦ÀíÒ»¸ö¸´ÔÓµÄUIÊ÷½á¹¹¡£ »¹¿ÉÄܻᵼÖÂÒÔϸüÑÏÖØµÄÎÊÌâStackOverflowError.

Òò´Ë¾¡Á¿±£³ÖÄãµÄÊÓͼtree£ºÑ§Ï°ÈçºÎʹÓÃRelativeLayout, ÈçºÎoptimize ÄãµÄ²¼¾ÖºÍÈçºÎʹÓÃ<merge>±êÇ©.

СÐĹØÓÚWebViewsµÄÎÊÌâ.Èç¹ûÄã±ØÐëÏÔʾһ¸öwebÊÓͼ£¬ ±ÈÈç˵¶ÔÓÚÒ»¸öÐÂÎÅÎÄÕ£¬±ÜÃâ×ö¿Í»§¶Ë´¦ÀíHTMLµÄ¹¤×÷£¬ ×îºÃÈúó¶Ë¹¤³ÌʦЭÖú£¬È»Ëû·´»áÒ»¸ö "´¿" HTML¡£WebViews Ò²Äܵ¼ÖÂÄÚ´æÐ¹Â¶µ±±£³ÖÒýËûÃǵÄActivity£¬¶ø²»ÊDZ»°ó¶¨µ½ApplicationContextÖеÄʱºò¡£ µ±Ê¹Óüòµ¥µÄÎÄ×Ö»ò°´Å¥Ê±£¬±ÜÃâʹÓÃWebView£¬ÕâʱʹÓÃTextView»òButtons¸üºÃ¡£

²âÊÔ¿ò¼Ü

Android SDKµÄ²âÊÔ¿ò¼Ü»¹´¦ÓÚ³õ¼¶½×¶Î£¬ÌرðÊǹØÓÚUI²âÊÔ·½Ãæ¡£Android Gradle ĿǰʵÏÖÁËÒ»¸ö½ÐconnectedAndroidTestµÄ²âÊÔ£¬ ËüʹÓÃÒ»¸öJUnit ΪAndroidÌṩµÄÀ©Õ¹²å¼þ extension of JUnit with helpers for Android.¿ÉÒÔÅÜÄãÉú³ÉµÄJUnit²âÊÔ£¬

Ö»µ±×öµ¥Ôª²âÊÔʱʹÓÃRobolectric£¬views ²»ÓÃËüÊÇÒ»¸ö×îÇóÌṩ"²»Á¬½ÓÉ豸µÄ"ΪÁ˼ÓËÙ¿ª·¢µÄ²âÊÔ£¬ ·Ç³£Ê±ºò×ö models ºÍ view models µÄµ¥Ôª²âÊÔ¡£ È»¶ø£¬Ê¹ÓÃRobolectric²âÊÔʱ²»¾«È·µÄ£¬Ò²²»ÍêÈ«¶ÔUI²âÊÔ¡£ µ±Äã¶ÔÓйض¯»­µÄUIÔªËØ¡¢¶Ô»°¿òµÈ£¬²âÊÔʱ»áÓÐÎÊÌ⣬ ÕâÖ÷ÒªÊÇÒòΪÄãÊÇÔÚ ¡°ÔÚºÚ°µÖй¤×÷¡±£¨ÔÚûÓпɿصĽçÃæÇé¿öϲâÊÔ£©

*RobotiumʹдUI²âÊԷdz£¼òµ¥¡£ *¶ÔÓÚUI²âÊÔÄã²»Ðè Robotium ÅÜÓëÉ豸Á¬½ÓµÄ²âÊÔ¡£ µ«Ëü¿ÉÄÜ»á¶ÔÄãÓÐÒæ£¬ÊÇÒòΪËüÓÐÐí¶àÀ´°ïÖúÀàµÄ»ñµÃºÍ·ÖÎöÊÓͼ£¬¿ØÖÆÆÁÄ»¡£ ²âÊÔÓÃÀý¿´ÆðÀ´ÏñÕâÑù¼òµ¥£º

solo.sendKey(Solo.MENU);
solo.clickOnText("More"); // searches for the first occurence of "More" and clicks on it
solo.clickOnText("Preferences");
solo.clickOnText("Edit File Extensions");
Assert.assertTrue(solo.searchText("rtf"));

Ä£ÄâÆ÷

Èç¹ûÄãȫְ¿ª·¢Android App,ÄÇôÂòÒ»¸öGenymotion emulatorlicense°É¡£ Genymotion Ä£ÄâÆ÷ÔËÐиü¿ìµÄÃëÖ¡µÄËÙ¶È£¬±ÈÆðµäÐ͵ÄAVDÄ£ÄâÆ÷¡£ËûÓÐÑÝʾÄãAPPµÄ¹¤¾ß£¬¸ßÖÊÁ¿µÄÄ£ÄâÍøÂçÁ¬½Ó£¬GPSλÖ㬵ȵȡ£Ëüͬʱ»¹ÓÐÀíÏëµÄÁ¬½Ó²âÊÔ¡£ ÄãÈôÉæ¼°ÊÊÅäʹÓúܶ಻ͬµÄÉ豸£¬ÂòÒ»¸öGenymotion °æÈ¨ÊDZÈÄãÂòºÜ¶àÕæÉ豸±ãÒ˶àµÄ¡£

×¢Ò⣺GenymotionÄ£ÄâÆ÷ûÓÐ×°ÔØËùÓеÄGoogle·þÎñ£¬ÈçGoogle Play StoreºÍMaps¡£ÄãÒ²¿ÉÄÜÐè Òª²âÊÔSamsungÖ¸¶¨µÄAPI£¬ÈôÕâÑùµÄ»°Ä㻹ÊÇÐèÒª¹ºÂòÒ»¸öÕæÊµµÄSamsungÉ豸¡£

»ìÏýÅäÖÃ

ProGuardÊÇÒ»¸öÔÚAndroidÏîÄ¿Öй㷺ʹÓõÄѹËõºÍ»ìÏý´ò°üµÄÔ´ÂëµÄ¹¤¾ß¡£

ÄãÊÇ·ñʹÓÃProGuardÈ¡¾öÄãÏîÄ¿µÄÅäÖ㬵±Äã¹¹½¨Ò»¸örelease°æ±¾µÄapkʱ£¬Í¨³£ÄãÓ¦¸ÃÅäÖÃgradleÎļþ¡£

buildTypes {
debug {
minifyEnabled false
}
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles 'proguard-rules.pro'
}
}

ΪÁ˾ö¶¨ÄÄЩ´úÂëÓ¦¸Ã±»±£Áô£¬ÄÄЩ´úÂëÓ¦¸Ã±»»ìÏý£¬Äã²»µÃ²»Ö¸¶¨Ò»¸ö»ò¶à¸öʵÌåÀàÔÚÄãµÄ´úÂëÖС£ ÕâЩʵÌåÓ¦¸ÃÊÇÖ¸¶¨µÄÀà°üº¬main·½·¨£¬applets£¬midlets£¬activities£¬µÈµÈ¡£ Android framework ʹÓÃÒ»¸öĬÈϵÄÅäÖÃÎļþ£¬¿ÉÒÔÔÚSDK_HOME/tools/proguard/proguard-android.txtĿ¼ÏÂÕÒµ½¡£×Ô¶¨ÒåµÄ¹¤³ÌÖ¸¶¨µÄ project-specific »ìÏý¹æÔò£¬ÈçÔÚmy-project/app/proguard-rules.proÖж¨Ò壬 »á±»Ìí¼Óµ½Ä¬ÈϵÄÅäÖÃÖС£

¹ØÓÚ ProGuard Ò»¸öÆÕ±éµÄÎÊÌ⣬ÊÇ¿´Ó¦ÓóÌÐòÊÇ·ñ±ÀÀ£²¢±¨ClassNotFoundException»òÕßNoSuchFieldException»òÀàËÆµÄÒì³££¬ ¼´Ê¹±àÒëÊÇûÓо¯¸æ²¢ÔËÐгɹ¦¡£ ÕâÒâζ×ÅÒÔÏÂÁ½ÖÖ¿ÉÄÜ£º

ProGuard ÒѾ­ÒƳýÁËÀ࣬ö¾Ù£¬·½·¨£¬³ÉÔ±±äÁ¿»ò×¢½â£¬¿¼ÂÇÊÇ·ñÊDZØÒªµÄ¡£

ProGuard »ìÏýÁËÀ࣬ö¾Ù£¬³ÉÔ±±äÁ¿µÄÃû³Æ£¬µ«ÊÇÕâЩÃû×ÖÓÖ±»ÄÃԭʼÃû³ÆÊ¹ÓÃÁË£¬±ÈÈçͨ¹ýJavaµÄ·´Éä¡£

¼ì²éapp/build/outputs/proguard/release/usage.txtÎļþ¿´ÓÐÎÊÌâµÄ¶ÔÏóÊÇ·ñ±»ÒƳýÁË¡£ ¼ì²éapp/build/outputs/proguard/release/mapping.txtÎļþ¿´ÓÐÎÊÌâµÄ¶ÔÏóÊÇ·ñ±»»ìÏýÁË¡£

In order to prevent ProGuard fromstripping awayneeded classes or class members, add akeepoptions to your proguard config: ÒÔ·À ProGuard°þÀëÐèÒªµÄÀàºÍÀà³ÉÔ±£¬Ìí¼ÓÒ»¸ökeepÑ¡ÏîÔÚÄãµÄ proguard ÅäÖÃÎļþÖУº

-keep class com.futurice.project.MyClass { *; } 

·ÀÖ¹ ProGuard»ìÏýһЩÀàºÍ³ÉÔ±£¬Ìí¼Ókeepnames:

-keepnames class com.futurice.project.MyClass { *; } 

²é¿´this template's ProGuard configÖеÄһЩÀý×Ó¡£ ¸ü¶àÀý×ÓÇë²Î¿¼Proguard¡£

ÔÚ¹¹½¨ÏîĿ֮³õ£¬·¢²¼Ò»¸ö°æ±¾À´¼ì²éProGuard¹æÔòÊÇ·ñÕýÈ·µÄ±£³ÖÁËÖØÒªµÄ²¿·Ö¡£ ͬʱÎÞÂÛºÎʱÄãÌí¼ÓÁËеÄÀà¿â£¬×öÒ»¸ö·¢²¼°æ±¾£¬Í¬Ê±apkÔÚÉ豸ÉÏÅÜÆðÀ´²âÊÔһϡ£ ²»ÒªµÈµ½ÄãµÄappÒª·¢²¼ "1.0"°æ±¾Á˲Å×ö°æ±¾·¢²¼£¬ÄÇʱºòÄã¿ÉÄÜ»áÅöµ½ºÃ¶àÒâÏë²»µ½µÄÒì³££¬ÐèҪһЩʱ¼äÈ¥ÐÞ¸´ËûÃÇ¡£

Tipsÿ´Î·¢²¼Ð°汾¶¼ÒªÐ´mapping.txt¡£Ã¿·¢²¼Ò»¸ö°æ±¾£¬Èç¹ûÓû§Óöµ½Ò»¸öbug£¬Í¬Ê±Ìá½»ÁËÒ»¸ö»ìÏý¹ýµÄ¶ÑÕ»¸ú×Ù¡£ ͨ¹ý±£Áômapping.txtÎļþ£¬À´È·¶¨Äã¿ÉÒÔµ÷ÊÔµÄÎÊÌâ¡£

DexGuardÈô¹ûÄãÐèÒªºËÐŤ¾ßÀ´ÓÅ»¯£¬ºÍרÃÅ»ìÏýµÄ·¢²¼´úÂ룬¿¼ÂÇʹÓÃDexGuard, Ò»¸öÉÌÒµÈí¼þ£¬ProGuard Ò²ÊÇÓÐËûÃÇÍŶӿª·¢µÄ¡£ Ëü»áºÜÈÝÒ×½«DexÎļþ·Ö¸î£¬À´½â¾ö65K¸ö·½·¨ÏÞÖÆÎÊÌâ¡£

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