´Ó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¸ö·½·¨ÏÞÖÆÎÊÌâ¡£
|