flash游戏编程爱好者诚信求助,半条命针锋相对武器武器大

已有 191 人访问
活跃用户推荐
上海隐志网络科技有限公司本帖子已过去太久远了,不再提供回复功能。多图长文预警,不定期更新,适宜收藏,流量党慎入。&br&&br&新年快乐。更新&br&&br&上次更新时间是去年8月份了,因为某些特殊原因很长时间没有更新,机器换了后还想起有这么一个坑没填,龟速更新吧。&br&&br&◆网络信号大师&br&&figure&&img src=&/v2-fffcf6f49c186911bdca1d_b.png& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/v2-fffcf6f49c186911bdca1d_r.png&&&/figure&这是国内开发者针对国内的运营商以及网络环境所开发的移动网络信号监测程序,功能非常的强大。&br&&br&包括2G 3G 4G频段监测,GSM,WCDMA,TD-SCDMA,CDMA2000,TDD-LTE,FDD-LTE等常用频段监测数据,LTE载波聚合(也就是4G+)状态监测(作者提供的截图内为3*载波聚合),基站小区讯息,频段参数,mimo状态以及调制方式等等复杂的参数,并且可以记录日志,适合通讯爱好者和从业者,答主不是很了解通讯技术,对参数了解的也不是很多,介绍如有不妥请指正。&br&&figure&&img src=&/v2-955afa965f6_b.png& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/v2-955afa965f6_r.png&&&/figure&&br&另外该软件提供某些高级功能,强制锁定网络类型,锁定连接频段等,目前答主仅在高通平台上测试过,需要root权限才可以查看并且记录某些高级参数。&br&&br&Google play免费软件,无内购。&br&&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dcom.qtrun.QuickTest& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=com.qtrun.QuickTest&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&&br&◆App Tune-up Kit&br&&figure&&img src=&/v2-1d9b0b940727ebcd460d_b.png& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/v2-1d9b0b940727ebcd460d_r.png&&&/figure&&br&这款应用是高通针对开发者推出的性能监测统计APP,可以对运行的APP进行运行时监测,并且得出准确度比较高的统计信息。&br&&br&可以统计整机功耗,平均功耗,峰值功耗,GPU负载,CPU负载,峰值负载等信息,配合Trepn悬浮监控程序食用效果更佳,搞机用户必备。&br&&figure&&img src=&/v2-6a3c8a5bb3b35a824b98f_b.png& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/v2-6a3c8a5bb3b35a824b98f_r.png&&&/figure&&br&答主目前未使用非高通方案的机器进行测试,所以其它平台的安卓机能否使用暂时未知。&br&&br&Google play免费软件,且无内购。&br&&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dcom.quicinc.tuneupkit& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=com.quicinc.tuneupkit&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&--------------------------------------------&br&&br&◆FlashFire&br&&figure&&img src=&/da05fdde562a4eaf512d58f0a54ffdc5_b.png& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/da05fdde562a4eaf512d58f0a54ffdc5_r.png&&&/figure&&br&这款APP是supersu的作者Chainfire所开发的刷机APP,可以给已修改system的Android设备刷入OTA包,完成系统更新的同时也可以保留用户对系统所作出的所有更改。&br&&br&说白了就是用这个APP刷入OTA包后,你的root还在,你的系统插件还在,这样就免除了重新刷入完整包还要清除数据和恢复以及重做系统修改的烦恼。&br&&figure&&img src=&/fda412d76e4a4_b.png& data-rawwidth=&1080& data-rawheight=&711& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/fda412d76e4a4_r.png&&&/figure&当然还有更多的定制选项供玩家使用,功能强大,Chainfire大神的作品。&br&&br&Google play免费软件,提供内购以解锁高级功能。&br&&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Deu.chainfire.flash& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=eu.chainfire.flash&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&◆MathStudio Express&br&&figure&&img src=&/38ae8905b6acea114fce_b.png& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/38ae8905b6acea114fce_r.png&&&/figure&&br&这款专业的数学计算APP可以进行更加方便和直观的计算。&br&&figure&&img src=&/d53b038f16caa93a6acbd7f2_b.png& data-rawwidth=&1080& data-rawheight=&708& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/d53b038f16caa93a6acbd7f2_r.png&&&/figure&&br&&figure&&img src=&/7bd25d3c98e577f56bdcc_b.png& data-rawwidth=&1080& data-rawheight=&709& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/7bd25d3c98e577f56bdcc_r.png&&&/figure&&br&关于这个软件,隔壁APP store介绍的非常详细。&br&&br&详细介绍请参见 &a data-hash=&7ffed882ad4& href=&///people/7ffed882ad4& class=&member_mention& data-hovercard=&p$b$7ffed882ad4&&@Barbarbarbarian&/a& 的回答:&br&&a href=&/question//answer/& class=&internal&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/question/3752&/span&&span class=&invisible&&4914/answer/&/span&&span class=&ellipsis&&&/span&&/a&&br&&br&感谢 &a data-hash=&ff2e06e0b8dadcf0eedc0fea7ec6117f& href=&///people/ff2e06e0b8dadcf0eedc0fea7ec6117f& class=&member_mention& data-hovercard=&p$b$ff2e06e0b8dadcf0eedc0fea7ec6117f&&@Mation Wang&/a& 在Google play发现此APP。&br&&br&Google play收费软件,正版许可验证未知。&br&&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dcom.PomegranateApps.MathStudioExpress& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=com.PomegranateApps.MathStudioExpress&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&----------------------------------------------&br&◆Manual Camera(手动相机)&br&&figure&&img src=&/5e65cccf40a67c23c41119_b.png& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/5e65cccf40a67c23c41119_r.png&&&/figure&自从Android 5.0以后,Google开放了相机的更多API,包括ISO,焦距,曝光时间等等。这款相机应用是开发者针对Android 5.0及以上系统开放的一系列相机API所开发的。&br&&br&在这款应用的界面中你可以选择自动模式,另外包含更多的手动控制选项。&br&手动调节焦距(1%-100%完全控制你的镜组)&br&手动调节ISO(100-6400可调)&br&色温调节(k)&br&曝光时间(0.8s-1/64000)&br&曝光补偿(-2~2)&br&&figure&&img src=&/098cee05c34c982a3add1bedde3b708c_b.png& data-rawwidth=&1080& data-rawheight=&589& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/098cee05c34c982a3add1bedde3b708c_r.png&&&/figure&&br&Google play付费软件。无正版许可验证&br&&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dpl.vipek.camera2& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=pl.vipek.camera2&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&相信这些可以手动控制的参数可以让手机摄影爱好者体验到更多的乐趣。如果你嫌不高端,参数不够多,没关系,接着往下看。&br&&br&◆Camera FV-5(专业相机)&br&&figure&&img src=&/fe04fd54a9a3d99fda5e08b540d187b0_b.png& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/fe04fd54a9a3d99fda5e08b540d187b0_r.png&&&/figure&&br&这款相机应用相比上面的手动相机包含更多的自定义选项。&br&&figure&&img src=&/877c14a219b7a27a6b6ff77f3482355e_b.png& data-rawwidth=&1080& data-rawheight=&1920& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/877c14a219b7a27a6b6ff77f3482355e_r.png&&&/figure&&br&&figure&&img src=&/34cee0c3db61cf_b.png& data-rawwidth=&1080& data-rawheight=&599& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/34cee0c3db61cf_r.png&&&/figure&&br&&figure&&img src=&/69f2f05e7fbcfa76a97f2_b.png& data-rawwidth=&1078& data-rawheight=&588& class=&origin_image zh-lightbox-thumb& width=&1078& data-original=&/69f2f05e7fbcfa76a97f2_r.png&&&/figure&&br&特色功能包括直接输出DNG图像,方便后期处理,白平衡动态调节与锁定,还可以单独调节出片的锐利度,饱和度和对比度等等,更加方便手动爱好者。&br&&br&Google play付费软件,另有免费版,无正版许可验证。&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dcom.flavionet.android.camera.pro& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=com.flavionet.android.camera.pro&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&另外还有cinema fv-5,另一款录制视频的APP,同样有可以手动调节的各种参数,手动爱好者的福音。&br&&figure&&img src=&/fc85a1e0d7fc20e9a63764b_b.png& data-rawwidth=&1080& data-rawheight=&598& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/fc85a1e0d7fc20e9a63764b_r.png&&&/figure&&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dcom.flavionet.android.cinema.pro& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=com.flavionet.android.cinema.pro&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&-----------------------------------------------------------------&br&&br&◆ Unlimited Screen Recorder(无限视频录制工具)&br&&figure&&img src=&/8dd88db7d7d5e992a0f8aaf32e0aca6f_b.png& data-rawwidth=&984& data-rawheight=&1749& class=&origin_image zh-lightbox-thumb& width=&984& data-original=&/8dd88db7d7d5e992a0f8aaf32e0aca6f_r.png&&&/figure&这是一款可以在Android5.0及以上操作系统中实现无需root权限进行屏幕录制的APP,强大之处在于调用系统投射屏幕API(类似Air Play的屏幕投射方式)实现无需root进行本地存储器屏幕录像的生成,并且码率,分辨率,声音捕获等参数都可自定义。&br&&figure&&img src=&/6cc456ee5d707e209b3e6a_b.png& data-rawwidth=&984& data-rawheight=&1749& class=&origin_image zh-lightbox-thumb& width=&984& data-original=&/6cc456ee5d707e209b3e6a_r.png&&&/figure&该软件录制720p 60Hz耗费系统资源较少,对机器流畅度影响不大,录制效果超越以往需要root权限强制截取屏幕的APP,根据机器性能适当视频码率和帧率以及分辨率会有更好的效果。&br&&br&Google play免费软件,有广告。提供内购以去掉广告。&br&Google play链接&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dorg.mistygames.screenrecord& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=org.mistygames.screenrecord&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&◆Kernel Adiutor&br&&figure&&img src=&/003b8c2baee5c8c6737ac7_b.png& data-rawwidth=&984& data-rawheight=&1749& class=&origin_image zh-lightbox-thumb& width=&984& data-original=&/003b8c2baee5c8c6737ac7_r.png&&&/figure&作为一款Android平台内核控制软件,Kernel Adiutor算是最良心的一款,随着版本的更新也支持越来越多的设备和更多的第三方内核。&br&&figure&&img src=&/4fead53acf66_b.png& data-rawwidth=&984& data-rawheight=&1749& class=&origin_image zh-lightbox-thumb& width=&984& data-original=&/4fead53acf66_r.png&&&/figure&Kernel Adiutor可以控制机器内核所允许用户自定义的所有系统参数,包括CPU频率调节,超频降频,电压调节,GPU控制,屏幕色彩,温控策略,唤醒策略,以及磁盘缓冲区,杂项等等系统控制,当然,软件能否显示这些设置项取决于你的机器系统和内核是否开放(答主的是Nexus5搭配ElementalX内核),软件内提供适配机型的特定的第三方内核下载和刷入,有兴趣的朋友可以体验一下,但请先备份好system分区,以防止boot loop,geek用户必备,类似的内核控制器还有很多,这里就不再一一例举。&figure&&img src=&/6da4ec0f1276eb5bfa12d8_b.png& data-rawwidth=&984& data-rawheight=&1749& class=&origin_image zh-lightbox-thumb& width=&984& data-original=&/6da4ec0f1276eb5bfa12d8_r.png&&&/figure&&br&&br&Google play免费软件,无广告,提供捐赠版下载。需要root权限以及机器内拥有BusyBox组件。&br&Google play链接&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dcom.grarak.kerneladiutor& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=com.grarak.kerneladiutor&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&◆ MultiROM Manager(多系统引导管理器)&br&&figure&&img src=&/254c5caa999d2bd4c37d2b5d04a3d4c4_b.png& data-rawwidth=&984& data-rawheight=&1749& class=&origin_image zh-lightbox-thumb& width=&984& data-original=&/254c5caa999d2bd4c37d2b5d04a3d4c4_r.png&&&/figure&想在Android机上体验类似PC那样无拘无束的多系统引导吗?拥有这个神器你就可以在设备上安装无限数目的操作系统,不同于猴王机,不仅仅限于Android,你可以【同时】安装原生5.0,原生6.0,Android N预览版,CM13,猴UI,bugme,firefoxOS,Ubuntu Touch等等操作系统,只要你的存储空间够用,只要你的机器有够多的第三方资源,你就可以同时安装并且体验各种各样的系统。&br&另外仅system和data分区相互独立,剩余空间所有ROM共享,比如音乐,图片等所有系统都可联动。&br&&figure&&img src=&/3b806ab471eafeca6b91eef8fb56c1a8_b.png& data-rawwidth=&984& data-rawheight=&1749& class=&origin_image zh-lightbox-thumb& width=&984& data-original=&/3b806ab471eafeca6b91eef8fb56c1a8_r.png&&&/figure&&br&切换系统的方式可以通过该APP启动,也可以通过重新启动机器在未进入系统时在菜单选择操作系统(类似Windows boot manager),还可以选择usb otg引导,也就是从u盘启动你的Android设备,这样的话,u盘救砖,不仅仅适用于PC(手动斜眼)。&br&&br&要求:&br&root权限,解锁bootloader。&br&需要设备支持TeamWin团队的MultiROM TWRP专用recovery并且刷入。&br&需要你的设备制造商支持,需要第三方内核的支持。&br&&br&要求太高?随着该APP的更新,国外机器支持越来越多,更多的国产机也同样被添加到了支持列表,如果你的设备支持的话,安装教程可以在Google搜索到,gfan,XDA专区也有更详细的资源,这里就不再多写。&br&&br&Google play免费软件,无广告。另有捐赠版以提供高级功能。&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dcom.tassadar.multirommgr& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=com.tassadar.multirommgr&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&全文手机码字,排版或内容不周请见谅&br&———————————————————————&br&&br&◆ DiskUseage&br&&figure&&img src=&/e6b89fc883ba852fb679b7e6f69bf30b_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/e6b89fc883ba852fb679b7e6f69bf30b_r.png&&&/figure&&br&这个APP类似PC上的第三方磁盘空间分析程序(感谢评论区知友的补充)会以非常直观非常快速的方式列出你存储空间所有的文件,每个文件夹和子文件夹以及下面对应的文件,精确到每一个微小的文件。通过这个APP你可以快速的连接你想要的文件在具体什么位置,什么样的文件夹下应该存在什么样的文件,这对于普通视图的文件管理器来说简直就是神一般的助手。&figure&&img src=&/8f30afefe982_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/8f30afefe982_r.png&&&/figure&&br&&figure&&img src=&/5c3ac6c041ed11f9af7a5_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/5c3ac6c041ed11f9af7a5_r.png&&&/figure&&br&另外,还可以根据系统内不同的分区进行分别的扫描视图显示,选中的内容还可以在右上角的菜单中进行删除操作。另外你的外置SD卡也可以扫描,也可以轻松管理。该软件对于极客用户来说,可能是必须品,因为掌握好后完全可以取代垃圾清理软件。&br&&br&Google play免费软件,体积小巧,仅为185KB,除需要存储空间权限外无其它权限&br&&br&Google play链接&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dcom.google.android.diskusage& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=com.google.android.diskusage&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&&br&◆ Developer(MD)&br&&figure&&img src=&/dde0f742b22ad_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/dde0f742b22ad_r.png&&&/figure&&br&&br&这是一款类似于PC版AIDA64的软硬件信息查询工具,可以提供比AIDA64更丰富的设备状态实时监测信息。&br&&figure&&img src=&/546b6f1ca8aa9ba2e0bcfd_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/546b6f1ca8aa9ba2e0bcfd_r.png&&&/figure&&br&&br&&figure&&img src=&/53becdebd1c566_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/53becdebd1c566_r.png&&&/figure&&br&如图,这个APP其中包括:机器内部Android系统相关信息,系统声音配置,蓝牙,电池,相机,网络连接,GPS,GPU,系统语言,CPU,屏幕,传感器,存储器,系统时间,内外置usb设备,以及WLAN状态的相关信息。下面还附有调节小工具,受限于篇幅就不再一一列举。&br&&br&这个软件冷门是有的,功能强大也是有的,界面也使用了最新的MD风格,目前在Google play中免费,可以捐赠以去掉广告。&br&&br&Google play链接&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dtursky.jan.settings& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=tursky.jan.settings&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&◆ WIFI Mac changer&br&&figure&&img src=&/eac2c1d6b6cca_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/eac2c1d6b6cca_r.png&&&/figure&&figure&&img src=&/ee833f41b7684191edc9ce78e35d2fbf_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/ee833f41b7684191edc9ce78e35d2fbf_r.png&&&/figure&&br&看到这个名字后我想功能就不用多说了吧,通过root权限直接更改设备的WLAN MAC地址,目前已经可以完美支持Android6.0,窝测试过很多类似APP,这可能是唯一可以真正热修改mac的APP,目前博通的网卡测试通过(这个软件非常冷门,至于具体的用途,功能是否强大我想很多人会了解到的)。&br&&br&Google play免费软件,可以根据需要购买高级版解锁特殊功能。&br&&br&Google play链接&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dcom.wireless.macchanger& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=com.wireless.macchanger&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&◆ AndroDumpper&br&&figure&&img src=&/5fb02d82e8106dbd9bd4ac093cfddb2d_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/5fb02d82e8106dbd9bd4ac093cfddb2d_r.png&&&/figure&&figure&&img src=&/4f9e85f9a02_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/4f9e85f9a02_r.png&&&/figure&&br&看到截图的应用名称也许很多人都已经懂得了这个软件的具体用途,嗯,你没看错,这个APP可以通过某些设备的WPS PIN漏洞成功获取WLAN网络的PSK,虽然这个功能在Android4.0就已经被内置,但是由于某些特殊原因在后续的安卓版本中被去掉了。开发者做的只是添加而已,默认操作不需要root权限。&br&&br&Google play免费软件,需要的话可以捐赠以解锁特殊功能。&br&&br&Google play链接&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dcom.bigos.androdumpper& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=com.bigos.androdumpper&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&◆ 4G LTE Switch&br&&figure&&img src=&/05ee1f409fbcce50dd65b5e_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/05ee1f409fbcce50dd65b5e_r.png&&&/figure&&br&安装后点击这款APP可以快速跳转到Android系统内置的测试模式,不需要再次在拨号盘中输入*#*#4636#*#*这条指令就可以快速进入,在这里可以根据需要切换网络类型。&br&&figure&&img src=&/c1a0fb924b6ba53eba2defe_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/c1a0fb924b6ba53eba2defe_r.png&&&/figure&&br&这个APP的用途在于某些必须破解特定运营商4G网络或者3G网络才能使用的设备进入手动网络模式选择会更加的方便快捷,而且可以无视开机时拨号盘输入指令的延迟响应时间。&br&另外还有在某些极限情况下你需要强制保持特定的网络连接状态,比如在列车上或者郊外开启WCDMA only(联通卡)或者TD-SCDMA Only(移动卡)或者CDMA Only(电信卡)以保持相对稳定的数据连接或者GSM Only来保持稳定的语音通话和短信服务等等,无需输入指令,一步到位(当网络环境良好后要记得切回去,否则可能出现无法接打电话收发短信之类的问题)。当然,具体可用的网络制式取决于机器本身软硬件方面的支持,与APP无关,该APP只是提供一个快捷入口而已。&br&&br&Google play免费软件,另外无需任何权限。&br&&br&Google play链接&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dcom.tapbase.LTEswitcher& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=com.tapbase.LTEswitcher&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&=================&br&&br&&br&◆ GLTools&br&&figure&&img src=&/9d790c7014_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/9d790c7014_r.png&&&/figure&&br&&figure&&img src=&/e438d66ce3087cddb12a5656ade27a9f_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/e438d66ce3087cddb12a5656ade27a9f_r.png&&&/figure&&br&这款名为GLTools的应用曾经应该是Chainfire大神(大名鼎鼎的SuperSU的作者)所开发的3D神器步入Android4.1及后续系统的续作。&br&该软件通过对system分区GPU驱动程序注入插件可以实现对CPU,GPU名称,CPU,GPU供应商,以及渲染分辨率,全局抗锯齿,GPU的渲染模式等进行自定义修改的插件(答主不是很了解图形学,暂时只知道这些,还望知友们给予补充),从而用来展示出某些游戏针对特定GPU的优化而生的特效,比如某些针对Mali GPU优化而成的独占特效的游戏经过GLTools模拟后可以在Adreno或者PowerVR GPU的设备上呈现,NVIDIA系列GPU专属的THD游戏特效也可以正常在其它设备上运行和呈现。还可以通过修改CPU供应商来实现对某些特定游戏的支持。&br&&br&代表作品:现代战争4,5,超凡蜘蛛侠2,暗影之枪THD,Android版半条命2。&br&&br&这些游戏都可以通过修改CPU和GPU供应商以及GPU渲染模式来让游戏正常运行或呈现更高阶的特效,或者也可以降低渲染分辨率提高流畅度&br&&br&由于这款软件需要通过root权限对系统驱动分区进行读写操作。因此对不兼容的设备可能会产生假砖的现象,所以本插件适合拥有一定搞机基础的用户使用。&br&&br&Google play收费软件,目前因为暂时停止更新可能并不兼容Android6.0,不过类aosp的4.4和5.0的ROM似乎还可以支持。&br&&br&Google play链接&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dcom.n0n3m4.gltools& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=com.n0n3m4.gltools&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&&br&&br&&br&在这里说些题外话,仅作为个人观点。&br&&br&为什么这个APP用来举例模拟的都是老游戏呢??非常遗憾,因为手机游戏市场自从经过12和13年由gameloft(智乐),EA(美国艺电),madfinger(狂指),RockStar(R星)等国际厂商的带领下蓬勃发展并且画面和可玩性到达巅峰之后到了现在一直在走下坡路,已经没有真正意义上的大作。随着移动端游戏市场的持续发展和以上这些国际厂商的退出,至少到现在为止,腾讯,网易,以及其它国内游戏开发商根本没有与以上开发商所开发的移动版Modern Combat(现代战争),Asphalt(狂野飙车),Need For Speed(极品飞车),Real Racing(真实赛车),Dead Tigger(死亡扳机)系列游戏抗衡的能力,尤其是在影响力上。除了以上还未停止更新的作品还保持着发挥移动端GPU的优势之外,各种杂七杂八厂商的产品残食移动端市场,同样由于移动端游戏的利润问题,各种大作相继成为历史,移动端从今往后也许一直会开倒车,我想这个问题似乎是很多90,95后所心痛的一件事情。&br&&br&在两年前,测试移动端设备性能的不只有跑分APP,还有各种大型游戏,而如今,测试移动端设备性能的,似乎只有那几个寥寥无几的跑分APP,比如业界公认的GeekBench3和GFXBench,我想这些似乎并不是移动智能设备硬件发展的初衷吧。用户应该需要的是栩栩如生的3D即时渲染,而不是2D的动画CG。&br&&br&面对未来逐渐没有用武之地的更强大的移动SoC时,我们是要推出条件更加苛刻的跑分APP还是制作要求更加更加苛刻的跑分APP呢?&br&&br&==============================&br&&br&&br&◆ Trepn Profiler&br&&figure&&img src=&/8a9b8c9aeef1527bde2c3_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/8a9b8c9aeef1527bde2c3_r.png&&&/figure&&figure&&img src=&/7c9cac1f66fa4d918e2f7d97f5fa774b_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/7c9cac1f66fa4d918e2f7d97f5fa774b_r.png&&&/figure&&br&这款APP是高通公司专门为开发者和极客用户准备的系统信息实时监测统计及记录收集程序,通过Google play的截图也能一目了然。&br&&figure&&img src=&/e5f60819e7ddf673eb8032add6645234_b.png& data-rawwidth=&1032& data-rawheight=&1835& class=&origin_image zh-lightbox-thumb& width=&1032& data-original=&/e5f60819e7ddf673eb8032add6645234_r.png&&&/figure&&br&&br&该APP不仅提供了CPU悬浮窗监控,还提供了GPU占用,GPU频率,整机功耗,蓝牙数据统计,移动数据和WLAN数据统计,以及内存,GPS,当前运行的APP统计,都可以打开悬浮窗进行实时查看,而且同时进行后台数据记录功能,并支持生成log文件供后期查看与分析,说是目前Android平台功能最全的系统监测APP并不为过,可以为开发者调试开发应用提供便利,也为极客们提供最为准确最为详细的硬件实时监测信息。&br&&br&Google play免费软件,Qualcomm公司提供技术支持,完美兼容使用高通骁龙处理器的机型,不需要root权限,不可不用的好软件。&br&&br&Google play链接&br&&a href=&///?target=https%3A///store/apps/details%3Fid%3Dcom.quicinc.trepn& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/store/a&/span&&span class=&invisible&&pps/details?id=com.quicinc.trepn&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&br&&br&&br&(以上软件仅供个人学习交流和测试之用,切勿用于非法用途)
多图长文预警,不定期更新,适宜收藏,流量党慎入。 新年快乐。更新 上次更新时间是去年8月份了,因为某些特殊原因很长时间没有更新,机器换了后还想起有这么一个坑没填,龟速更新吧。 ◆网络信号大师 这是国内开发者针对国内的运营商以及网络环境…
&figure&&img src=&/50/v2-bafdaeba5397_b.jpg& data-rawwidth=&1620& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1620& data-original=&/50/v2-bafdaeba5397_r.jpg&&&/figure&&blockquote&&b&本文已授权微信公众号 AndroidDeveloper 独家发布。&/b&&/blockquote&&p&入职安居客三年从工程师到Team Leader,见证了Android团队一路走来的发展历程。因此有心将这些记录下来与大家分享,也算是对自己三年来一部分工作的总结。希望对大家有所帮助,更希望能得到大家宝贵的建议。&/p&&h2&&b&一、三网合并&/b&&/h2&&p&三年前入职时安居客在业务上刚完成了三网合并(新房、二手房、好租和商业地产多个平台多个网站合成现在的&a href=&/?target=http%3A//& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&,这在公司历史上称之为三网合并),因此app端也将原先的新房、二手房、好租和商业地产多个app合并成为了现在的安居客app。所谓的合并也差不多就是将多个项目的代码拷贝到了一起组成了新的Anjuke Project。下面这张图能更加直观的呈现当时的状况。&figure&&img src=&/v2-e36b8a26b42cc0f086ed5_b.png& data-rawwidth=&1688& data-rawheight=&748& class=&origin_image zh-lightbox-thumb& width=&1688& data-original=&/v2-e36b8a26b42cc0f086ed5_r.png&&&/figure&这一时期代码结构混乱、层次不清,各业务技术方案不统一,冗余代码充斥项目的各个角落;甚至连基本的包结构也是胡乱不堪,项目架构更是无从谈起。大家只不过是不停地往上堆砌代码添加新功能罢了。于是我进入公司的第一件事就是向Leader申请梳理了整个项目的结构。&/p&&br&&p&而后随着项目的迭代,我们不断引入了Retrofit、UniversalImageLoader、OKHttp、ButterKnife等一系列成熟的开源库,同时我们也开发了自己的UI组件库UIComponent、基础工具库CommonUtils、基于第三方地图封装的MapSDK、即时聊天模块ChatLibrary等等。这之后安居客项目架构大致演变成了由基础组件层、业务组件层和业务层组成的三层架构。如下图:&figure&&img src=&/v2-0bc7c0fea34fd3e2c45a0_b.png& data-rawwidth=&1644& data-rawheight=&598& class=&origin_image zh-lightbox-thumb& width=&1644& data-original=&/v2-0bc7c0fea34fd3e2c45a0_r.png&&&/figure&其中业务层是一种非标准的MVC架构,Activity和Fragment承担了View和Controller的职责:&figure&&img src=&/v2-4b95eadd35cb0ea4e851f_b.png& data-rawwidth=&2152& data-rawheight=&828& class=&origin_image zh-lightbox-thumb& width=&2152& data-original=&/v2-4b95eadd35cb0ea4e851f_r.png&&&/figure&前面这种分层的架构本身是没太大问题的,即使到了现在我们的业务项目也已然是基于这种分层的架构来构建的,只不过在不断的迭代中我们做了些许调整(分层架构后面在介绍组件化和模块化的时候会详细介绍)。但是随着业务的不断迭代,我们慢慢发现业务层这种非标准的MVC架构带来了种种影响团队开发效率的问题:&/p&&br&&ul&&li&Activity和Fragment越来越多的同时承担了Controller和View的职责,导致他们变得及其臃肿且难以维护;&/li&&li&由于Controller和View的揉合,导致单元测试起来很困难;&/li&&li&回调嵌套太多,面对复杂业务时的代码逻辑不清晰,难以理解且不利于后期维护;&/li&&li&各层次模块之间职责不清晰等等&/li&&/ul&&blockquote&&p&鉴于三网合并时期我还未加入安居客,所以对这一块的理解难免有偏差,如果有安居客的老同事发现文章中的描述有不对的地方还望批评指正。&/p&&/blockquote&&h2&&b&二、由RxJava驱动的MVP架构&/b&&/h2&&p&一种技术架构无法满足所有的业务项目,更不可能有一种架构方案能够一劳永逸。正如上一节中提到的随着业务的不断迭代,现有架构的缺陷逐渐浮出水面,项目架构必需不断升级迭代才能更好地服务于业务。&/p&&h2&&i&2.1 MVP的设计与实现&/i&&/h2&&p&在研究了Google推出的基于MVP架构的demo后,我们发现MVP架构能解决现在所面临过的很多问题,于是我们学习并引入到了我们的项目中来,并针对性的做了部分调整。下图呈现的是安居客MVP方案:&figure&&img src=&/v2-da9aaa74d53ff495d6bc7e7a_b.png& data-rawwidth=&2226& data-rawheight=&1302& class=&origin_image zh-lightbox-thumb& width=&2226& data-original=&/v2-da9aaa74d53ff495d6bc7e7a_r.png&&&/figure&以前面提到的三层架构的方案来看是这样的:&figure&&img src=&/v2-303d482ea8672eeefa814e_b.png& data-rawwidth=&1648& data-rawheight=&598& class=&origin_image zh-lightbox-thumb& width=&1648& data-original=&/v2-303d482ea8672eeefa814e_r.png&&&/figure&&/p&&br&&blockquote&&p&基于此架构我在GitHub上开源了一个项目&a href=&/?target=https%3A///BaronZ88/MinimalistWeather& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MinimalistWeather&i class=&icon-external&&&/i&&/a&,有兴趣的小伙伴可以去clone下来看看,如果觉得对你有帮助就给个star吧。 :)&/p&&/blockquote&&ul&&li&&strong&View Layer&/strong&: 只负责UI的绘制呈现,包含Fragment和一些自定义的UI组件,View层需要实现ViewInterface接口。Activity在项目中不再负责View的职责,仅仅是一个全局的控制者,负责创建View和Presenter的实例;&/li&&li&&strong&Model Layer&/strong&: 负责检索、存储、操作数据,包括来自网络、数据库、磁盘文件和SharedPreferences的数据;&/li&&li&&strong&Presenter Layer&/strong&: 作为View Layer和Module Layer的之间的纽带,它从model层中获取数据,然后调用View的接口去控制View;&/li&&li&&strong&Contract&/strong&: 我们参照Google的demo加入契约类Contract来统一管理View和Presenter的接口,使得某一功能模块的接口能更加直观的呈现出来,这样做是有利于后期维护的。&/li&&/ul&&p&另外这套MVP架构还为我们带来了一个额外的好处:&strong&我们有了足够明确的开发规范和标准&/strong&。细致到了每一个类应该放到哪个包下,哪个类具体应该负责什么职责等等。这对于我们的Code Review、接手他人的功能模块等都提供了极大的便利。前面提到的&a href=&/?target=https%3A///BaronZ88/MinimalistWeather& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MinimalistWeather&i class=&icon-external&&&/i&&/a&就是为了定规范定标准而开发的。&/p&&p&这一时期我们还在项目中引入了RxJava,很好的解决了前面提到的嵌套回调的问题,同时能够帮助我们简化复杂业务场景下的代码逻辑(当然RxJava的好处远远不止这么一点,对RxJava不了解的同学可以去翻翻我之前&a href=&/p/?refer=baron& class=&internal&&一系列关于RxJava的文章&/a&)。我们也将网络库升级到了Retrofit2+OKHttp3,它们和RxJava之间能更好的配合。&/p&&h3&&i&2.2 MVP带来的新问题及解决方案&/i&&/h3&&p&是不是升级到了MVP架构就高枕无忧了呢?很明显不是这样!MVP架构也会带来以下新的问题:&/p&&ul&&li&由于大量的业务逻辑处理转移到了Presenter层,在一些复杂的业务场景中Presenter同样会变得臃肿难懂。细心的同学可能注意到了前面的架构图中的Model层有个Data Repository模块,Data Repository在这里有两个作用:一是可以将原本由Presenter处理的部分逻辑转移到这里来处理,包括数据的校验、部分单纯只与数据相关的逻辑等等,向Presenter屏蔽数据处理细节,比如作为Presenter就不必关心Model层传递过来的数据到底是来至网络还是来至数据库还是来至本地文件等等;二是我们引入了RxJava,但是只有网络层中的Retrofit能返回Observable对象,其他模块都是返回的还是一些非Observable的Java对象,为了能在整个Presenter层中都体验RxJava带来的美妙之处,因此可以通过Data Repository做一层转换;&/li&&li&现在的MVP架构中最重的部分就是Model Layer了,这一点从前面的架构图中就能体现。因此这就要求我们在Model层的设计过程中职责划分要足够清晰,分包更明确,耦合度更低。至于分包大家可以参考&a href=&/?target=https%3A///BaronZ88/MinimalistWeather& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MinimalistWeather&i class=&icon-external&&&/i&&/a&的方案:db包为数据库模块、http包为网络模块、preference包是对SharedPreferences的一些封装、repository包就是前面提到的Data Repository模块;&/li&&li&同时还有一点需要注意,很多人在使用RxJava的过程中往往忘记了对生命周期的管理,这很容易造成内存泄露。&a href=&/?target=https%3A///BaronZ88/MinimalistWeather& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MinimalistWeather&i class=&icon-external&&&/i&&/a&中采用了CompositeSubscription来管理,你也可以使用RxLifecycle这类开源库来管理生命周期。&/li&&/ul&&h2&&b&三、组件化与模块化&/b&&/h2&&p&去年下半年我们Android团队内部成立了技术小组,基础组件的开发是技术小组很重要的一部分工作,所以组件化是我们正在做的事;模块化更多的是现有的方案受到来自业务上的挑战以及受到了Oasis Feng在MDCC上的分享和整个大环境的启发,现在正处于设计规划和demo开发的阶段。&/p&&h2&&i&3.1 组件化&/i&&/h2&&p&组件化不是个新概念,通俗的讲组件化就是基于可重用的目的,将一个大的软件系统拆分成一个个独立组件。&/p&&p&组件化的带来的好处不言而喻:&/p&&ul&&li&避免重复造轮子,节省开发维护成本;&/li&&li&降低项目复杂性,提升开发效率;&/li&&li&多个团队公用同一个组件,在一定层度上确保了技术方案的统一性。&/li&&/ul&&p&现在的安居客有是三个业务团队:安居客用户app、经纪人app、集客家app。为了避免各个业务团队重复造轮子,团队中也需要有一定的技术沉淀,因此组件化是必须的。从本篇的第一节大家就能看到组件化的影子,只不过在这之前我们做的并不好。现在我们需要提供更多的、职能单一、性能更优的组件供业务团队使用。根据业务相关性,我们将这些组件分为:基础组件和业务组件。后面在介绍模块化的时候会有进一步的描述。&/p&&h2&&i&3.2 模块化&/i&&/h2&&p&自从Oasis Feng在去年的MDCC2016上分享了模块化的经验后,模块化在Android社区越来越多的被提起。我们自然也不落俗的去做了一些研究和探索。安居客现在面临很多问题:例如全量编译时间太长(我这台13款的MacBook Pro打一次包得花十多分钟);例如新房、二手房、租房等等模块间耦合严重,不利于多团队并行开发测试;另外在17年初公司重新将租房app捡起推广,单独让人来开发维护一个三年前的项目并不划算,所以我们希望能直接从现在的安居客用户端中拆分出租房模块作为一个单独的app发布上线。这样看来模块化似乎是一个不错的选择。&/p&&p&所以我们做模块化的目的大致是这样的:&/p&&ul&&li&业务模块间解耦&/li&&li&单个业务模块单独编译打包,加快编译速度&/li&&li&多团队间并行开发、测试&/li&&li&解决好租App需要单独维护的问题,降低研发成本&/li&&/ul&&blockquote&&p&15年&a href=&/?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Trinea&i class=&icon-external&&&/i&&/a&还在安居客的时候开发了一套插件化框架,但受限于当时的团队规模并且插件化对整个项目的改造太大,因此在安居客团队中插件化并未实施下来。而模块化其实是个很好的过渡方案,将项目按照模块拆分后各业务模块间解耦的问题不存在了,后续如有必要,再进行插件化改造只不过是水到渠成的事。&/p&&/blockquote&&p&来看看安居客用户app的模块化设计图:&/p&&figure&&img src=&/v2-faadc3b573ca874a722e3780_b.png& data-rawwidth=&2222& data-rawheight=&1226& class=&origin_image zh-lightbox-thumb& width=&2222& data-original=&/v2-faadc3b573ca874a722e3780_r.png&&&/figure&&p&整个项目分为三层,从下往上分别是:&/p&&ul&&li&Basic Component Layer: 基础组件层,顾名思义就是一些基础组件,包含了各种开源库以及和业务无关的各种自研工具库;&/li&&li&Business Component Layer: 业务组件层,这一层的所有组件都是业务相关的,例如上图中的支付组件AnjukePay、数据模拟组件DataSimulator等等;&/li&&li&Business Module Layer: 业务module层,在Android Studio中每块业务对应一个单独的module。例如安居客用户app我们就可以拆分成新房module、二手房module、IM module等等,每个单独的Business Module都必须准遵守前面提到的MVP架构。&/li&&/ul&&p&同时针对模块化我们也需要定义一些自己的游戏规则:&/p&&ul&&li&对于Business Module Layer,各业务模块之间的通讯跳转采用路由框架Router来实现(可能会采用成熟的开源库,也可能会选择重复造轮子);&/li&&li&对于Business Component Layer,单一业务组件只能对应某一项具体的业务,对于有个性化需求的对外部提供接口让调用方定制;&/li&&li&合理控制各组件和各业务模块的拆分粒度,太小的公有模块不足以构成单独组件或者模块的,我们先放到类似于CommonBusuness的组件中,在后期不断的重构迭代中视情况进行进一步的拆分(这一点的灵感来源于&a href=&/?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Trinea&i class=&icon-external&&&/i&&/a&的文章);&/li&&li&上层的公有的业务或者功能模块可以逐步下放到下层,合理把握好度就好;&/li&&li&各Layer间严禁反向依赖,横向依赖关系由各业务Leader和技术小组商讨决定。&/li&&/ul&&p&对于模块化项目,每个单独的business module都可以单独编译成APK。在开发阶段需要单独打包编译,项目发布的时候又需要它作为项目的一个module来整体编译打包。简单的说就是开发时是application,发布时是library。因此需要你在business module的gradle配置文件中加入如下代码:&/p&&div class=&highlight&&&pre&&code class=&language-groovy&&&span&&/span&&span class=&k&&if&/span&&span class=&o&&(&/span&&span class=&n&&isBuildModule&/span&&span class=&o&&.&/span&&span class=&na&&toBoolean&/span&&span class=&o&&()){&/span&
&span class=&n&&apply&/span& &span class=&nl&&plugin:&/span& &span class=&s1&&'com.android.application'&/span&
&span class=&o&&}&/span&&span class=&k&&else&/span&&span class=&o&&{&/span&
&span class=&n&&apply&/span& &span class=&nl&&plugin:&/span& &span class=&s1&&'com.android.library'&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&如果我们需要把租房模块打包成一个单独的租房app,像下面这样就好:&figure&&img src=&/v2-ca124a4a2_b.png& data-rawwidth=&2194& data-rawheight=&1040& class=&origin_image zh-lightbox-thumb& width=&2194& data-original=&/v2-ca124a4a2_r.png&&&/figure&我们可以把Basic Component Layer和Business Component Layer放在一起看做是Anjuke SDK,新的业务或者项目只需要依赖Anjuke SDK就好(这一点同样是受到了&a href=&/?target=http%3A//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Trinea&i class=&icon-external&&&/i&&/a&文章的启发)。甚至我们可以做得更极致一些,开发一套自己的组件管理平台,业务方可以根据自己的需求选择自己需要的组件,定制业务专属的Anjuke SDK。业务端和Anjuke SDK的关系如下图所示:&figure&&img src=&/v2-bc97c91e107e7e4badf7b9_b.png& data-rawwidth=&1886& data-rawheight=&1104& class=&origin_image zh-lightbox-thumb& width=&1886& data-original=&/v2-bc97c91e107e7e4badf7b9_r.png&&&/figure&最后看看安居客模块化的整体设计图:&figure&&img src=&/v2-124ecbbff9b843f63499ca_b.png& data-rawwidth=&2248& data-rawheight=&1210& class=&origin_image zh-lightbox-thumb& width=&2248& data-original=&/v2-124ecbbff9b843f63499ca_r.png&&&/figure&模块化拆分对于安居客这种比较大型的商业项目而言,由于历史比较久远很多代码都运行五六年了;各个业务相互交叉耦合严重,所以实施起来还是有很大难度的。过程中难免会有预料不到的坑,这就需要我们对各个业务有较深的理解同时也要足够的耐心和细致。虽然辛苦,但是一旦完成模块化拆分对整个团队及公司业务上的帮助是很大的。&/p&&p&以上是我的简单总结以及对模块化的一些思考,不足之处还望大家批评指正。后面模块化的demo完善后我会把它放到GitHub,并再出一篇文章详细介绍模块化的设计实现细节。&/p&&p&参考资料:&/p&&ul&&li&&a href=&/?target=http%3A//www.csdn.net/article//2826499-android-app-architecture%3FlocationNum%3D7%26fps%3D1& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&csdn.net/article/2015-1&/span&&span class=&invisible&&2-16/2826499-android-app-architecture?locationNum=7&fps=1&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/li&&li&&a href=&/?target=http%3A///android/didi-internationalization-android-evolution/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/android/didi-&/span&&span class=&invisible&&internationalization-android-evolution/&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/li&&li&&a href=&/?target=https%3A///tutorial/AndroidMVC& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/tutorial&/span&&span class=&invisible&&/AndroidMVC&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/li&&li&&a href=&/?target=https%3A//www.diycode.cc/topics/362& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&diycode.cc/topics/362&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&/li&&li&&a href=&/?target=https%3A///MDCC2016/Android-Session-Slides/blob/master/02-From.Containerization.To.Modularity.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/MDCC2016/And&/span&&span class=&invisible&&roid-Session-Slides/blob/master/02-From.Containerization.To.Modularity.pdf&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/li&&/ul&&blockquote&&p&如果你喜欢我的文章,就关注下我的知乎专栏或者在GitHub上添个star吧!&/p&&ul&&li&知乎专栏:&a href=&/baron& class=&internal&&&span class=&invisible&&https://&/span&&span class=&visible&&/baro&/span&&span class=&invisible&&n&/span&&span class=&ellipsis&&&/span&&/a&&/li&&li&GitHub:&a href=&/?target=https%3A///BaronZ88& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/BaronZ88&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&/li&&/ul&&/blockquote&
本文已授权微信公众号 AndroidDeveloper 独家发布。入职安居客三年从工程师到Team Leader,见证了Android团队一路走来的发展历程。因此有心将这些记录下来与大家分享,也算是对自己三年来一部分工作的总结。希望对大家有所帮助,更希望能得到大家宝贵的建议。…
&figure&&img src=&/50/v2-76e2c1fba8d0c332cd7f5df33ca29c03_b.jpg& data-rawwidth=&750& data-rawheight=&340& class=&origin_image zh-lightbox-thumb& width=&750& data-original=&/50/v2-76e2c1fba8d0c332cd7f5df33ca29c03_r.jpg&&&/figure&&p&原文链接:&a href=&/?target=http%3A//www.oschina.net/news/78857/best-android-libraries-for-developers& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&oschina.net/news/78857/&/span&&span class=&invisible&&best-android-libraries-for-developers&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&作者:达尔文&/p&&p&&/p&&p&软件库的存在使得Android编码更方便快捷。在如此多 Android库中,我们该如何寻找最合适的一款呢?下面我们做了一个列表供你参考。&br&&/p&&h2&动画(Animation)&/h2&&p&&a href=&/?target=https%3A///daimajia/AndroidViewAnimations& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android View Animations&i class=&icon-external&&&/i&&/a&:强大的动画库,通过对它的使用,可以轻松创建各种动画效果。&/p&&p&&a href=&/?target=https%3A///wasabeef/recyclerview-animators& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RecyclerView Animators&i class=&icon-external&&&/i&&/a&:允许操作者使用含炫酷动画效果的RecyclerView类。&/p&&h2&APIs&/h2&&p&&a href=&/?target=https%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CloudRail&i class=&icon-external&&&/i&&/a&:帮助操作者更快地进行API集成服务。它将多个服务(例如Dropbox,Google Drive和OneDrive)捆绑成一个统一的API。此外,它可自动处理API更新,并保持API的代码一致。其接口可用于云存储,社交,支付等。&/p&&p&&a href=&/?target=http%3A//square.github.io/retrofit/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Retrofit&i class=&icon-external&&&/i&&/a&:Retrofit由Square公司开发,是Android的REST客户端,其类型安全,可将http API转换成Java接口。&/p&&h2&图表(Charts)&/h2&&p&&a href=&/?target=https%3A///PhilJay/MPAndroidChart& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MPAndroidChart&i class=&icon-external&&&/i&&/a&:一款强大的图表生成库,可在Android上生成图表,同时还提供8种不同的图表类型和多种手势。&/p&&p&&a href=&/?target=https%3A///HackPlan/AndroidCharts& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&AndroidCharts&i class=&icon-external&&&/i&&/a&:一款简单的图表创建工具,具有自定义的功能。&/p&&h2&数据库(Database)&/h2&&p&&a href=&/?target=https%3A///square/sqlbrite& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SQLBrite:&i class=&icon-external&&&/i&&/a& 围绕SQLiteOpenHelper和ContentResolver创建封装,以在查询中使用流式语义。&/p&&p&&a href=&/?target=https%3A///satyan/sugar& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sugar ORM&i class=&icon-external&&&/i&&/a&:使用SQLite数据库的简单操作,优势在于无需编写SQL查询。&/p&&p&&b&数据架构(Data Structure)&/b&&/p&&p&&a href=&/?target=https%3A//www.eclipse.org/collections/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Eclipse Collections&i class=&icon-external&&&/i&&/a&:用于Java的Collections框架,可为容器类型附加迭代方法的操作等。&/p&&h2&日期和时间(Date & Time)&/h2&&p&&a href=&/?target=https%3A///square/android-times-square& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TimesSquare for Android&i class=&icon-external&&&/i&&/a&:简单独立的日历小部件,可在日历视图中选择日期。&/p&&p&&a href=&/?target=https%3A///prolificinteractive/material-calendarview& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Material Calendar View&i class=&icon-external&&&/i&&/a&:移植到Material design的安卓CalendarView。&/p&&h2&依赖(Dependencies)&/h2&&p&&a href=&/?target=https%3A///square/dagger& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Dagger&i class=&icon-external&&&/i&&/a&:进行Android依赖注入的快捷方式。&/p&&h2&文档(Files)&/h2&&p&&a href=&/?target=https%3A///DroidNinja/Android-FilePicker& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android-FilePicker&i class=&icon-external&&&/i&&/a&:一款照片选择器,可从列表中选择图片或文档。&/p&&p&&a href=&/?target=https%3A///nbsp-team/MaterialFilePicker& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Material File Picker&i class=&icon-external&&&/i&&/a&:Material design中的文件选择器。&/p&&h2&函数式编程(Functional Programing)&/h2&&p&&a href=&/?target=https%3A///orfjackal/retrolambda& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Retrolambda&i class=&icon-external&&&/i&&/a&:在Java 7中使用Lambdas的一种操作。&/p&&h2&手势(Gestures)&/h2&&p&&a href=&/?target=https%3A///nisrulz/Sensey& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sensey&i class=&icon-external&&&/i&&/a&:在Android应用程序中添加手势的简单操作。&/p&&p&&a href=&/?target=https%3A///klinker24/Android-3DTouch-PeekView& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android 3D Touch – PeekView&i class=&icon-external&&&/i&&/a&:类似于iOS上的3D Touch,用以“预览”程序内容。&/p&&h2&蓝牙(Bluetooth)&/h2&&p&&a href=&/?target=https%3A///akexorcist/Android-BluetoothSPPLibrary& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android-BluetoothSPPLibrary&i class=&icon-external&&&/i&&/a&:使用序列化蓝牙端口(Bluetooth Serial Port Profile)的简单操作。&/p&&p&&a href=&/?target=https%3A///Polidea/RxAndroidBle& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RxAndroidBle&i class=&icon-external&&&/i&&/a&:蓝牙低耗能处理工具。&/p&&h2&相机(Camera)&/h2&&p&&a href=&/?target=https%3A///nekocode/CameraFilter& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CameraFilter&i class=&icon-external&&&/i&&/a&:使用OpenGL着色器的实时相机滤镜。&/p&&p&&a href=&/?target=https%3A///afollestad/material-camera& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Material Camera&i class=&icon-external&&&/i&&/a&:Android开发的快速简易的相机框架。&/p&&h2&位置(Location)&/h2&&p&&a href=&/?target=https%3A///mcharmas/Android-ReactiveLocation& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ReactiveLocation&i class=&icon-external&&&/i&&/a&:Google Play API的小型但实用的封装程序,用于获取位置。&/p&&p&&a href=&/?target=https%3A///mrmans0n/smart-location-lib& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Smart Location Library&i class=&icon-external&&&/i&&/a&:简化位置提供项的库。&/p&&h2&布局(Layout)&/h2&&p&&a href=&/?target=https%3A///daimajia/AndroidSwipeLayout& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android Swipe Layout&i class=&icon-external&&&/i&&/a&:为对象提供滑动布局,如,向左滑动即删除的操作。&/p&&p&&a href=&/?target=https%3A///google/flexbox-layout& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&FlexboxLayout &i class=&icon-external&&&/i&&/a&:为Android提供框布局,其内容可通过CSS了解。&/p&&h2&日志(Logging)&/h2&&p&&a href=&/?target=https%3A///orhanobut/logger& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Logger&i class=&icon-external&&&/i&&/a&:Android日志记录器。&/p&&p&&a href=&/?target=https%3A///JakeWharton/hugo& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Hugo&i class=&icon-external&&&/i&&/a&:用触发注释的方法调用记录。&/p&&h2&地图(Maps)&/h2&&p&&a href=&/?target=https%3A///airbnb/AirMapView& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&AirMapView &i class=&icon-external&&&/i&&/a&:用以查看Google Maps API摘要,非常适合没有Google Play服务的应用程式。&/p&&p&&a href=&/?target=https%3A///googlemaps/android-maps-utils& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Google地图的实用程序,如,热点地图或标记聚类。&i class=&icon-external&&&/i&&/a&&/p&&h2&音频播放器(Audio)&/h2&&p&&a href=&/?target=https%3A///andremion/Music-Player& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Music Player&i class=&icon-external&&&/i&&/a&:含UI的完整音乐播放器。&/p&&p&&a href=&/?target=https%3A///Piasy/RxAndroidAudio& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RxAndroidAudio &i class=&icon-external&&&/i&&/a&:封装带有Rx支持的Android Audio API RxAndroid音频播放器。&/p&&h2&GIF&/h2&&p&&a href=&/?target=https%3A///koral--/android-gif-drawable& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&android-gif-drawable&i class=&icon-external&&&/i&&/a&:使用视图和可绘制的GIF动图。&/p&&p&&a href=&/?target=https%3A///Cutta/GifView& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GifView &i class=&icon-external&&&/i&&/a&:Android上使用View播放的GIF库。&/p&&h2&图像(Image)&/h2&&p&&a href=&/?target=https%3A///Yalantis/uCrop& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&uCrop&i class=&icon-external&&&/i&&/a&:对Android上的图片进行裁剪的库。&/p&&p&&a href=&/?target=https%3A///bumptech/glide& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Glide&i class=&icon-external&&&/i&&/a&:Android的媒体管理和图片加载库。&/p&&h2&视频播放器(Video)&/h2&&p&&a href=&/?target=https%3A///danylovolokh/VideoPlayerManager& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&VideoPlayerManager&i class=&icon-external&&&/i&&/a&:对Android MediaPlayer类的使用进行帮助说明的库。&/p&&p&&a href=&/?target=https%3A///afollestad/easy-video-player& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Easy Video Player&i class=&icon-external&&&/i&&/a&:易于操作的视频播放器,可通过视图使用。&/p&&h2&信息(Messaging)&/h2&&p&&a href=&/?target=https%3A///badoo/Chateau& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Chateau&i class=&icon-external&&&/i&&/a&:在Android应用中提供聊天功能的框架。&/p&&h2&网络(Networking)&/h2&&p&&a href=&/?target=https%3A///square/okhttp& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&OkHttp&i class=&icon-external&&&/i&&/a&:Android的HTTP客户端。&/p&&p&&a href=&/?target=https%3A///koush/AndroidAsync& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&AndroidAsync&i class=&icon-external&&&/i&&/a&:基础级网络协议库。&/p&&h2&消息推送(Push Notifications)&/h2&&p&&a href=&/?target=https%3A///pubnub/java& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PubNub&i class=&icon-external&&&/i&&/a&:用于处理推送通知的商业服务。&/p&&p&&a href=&/?target=https%3A///btkelly/gandalf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Gandalf&i class=&icon-external&&&/i&&/a&:用于发送更新或维护相关的通知。&/p&&h2&支付(Payments)&/h2&&p&&a href=&/?target=https%3A///anjlab/android-inapp-billing-v3& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android In-App Billing v3 Library&i class=&icon-external&&&/i&&/a&:通过Android v3 API轻松处理应用内置付款的库。&/p&&p&&a href=&/?target=https%3A///serso/android-checkout& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Checkout&i class=&icon-external&&&/i&&/a&:处理应用内购买操作的库。&/p&&h2&安全(Security)&/h2&&p&&a href=&/?target=https%3A///jedisct1/libsodium& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sodium&i class=&icon-external&&&/i&&/a&:轻松做加密,解密,签名和散列操作的工具。&/p&&p&&a href=&/?target=https%3A///javiersantos/PiracyChecker& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PiracyChecker&i class=&icon-external&&&/i&&/a&:通过使用Google的LVL,防止应用程式被盗用的工具。&/p&&h2&文本(Text)&/h2&&p&&a href=&/?target=https%3A///robinhood/ticker& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ticker&i class=&icon-external&&&/i&&/a&:显示滚动文本的UI组件。&/p&&p&&a href=&/?target=https%3A///rengwuxian/MaterialEditText& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MaterialEditText&i class=&icon-external&&&/i&&/a&:Material Design的文本输入器。&/p&&h2&字体(Font)&/h2&&p&&a href=&/?target=https%3A///lisawray/fontbinding& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&fontbinding&i class=&icon-external&&&/i&&/a&:使用数据绑定的XML自定义字体的操作。&/p&&p&&a href=&/?target=https%3A///chrisjenx/Calligraphy& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Calligraphy&i class=&icon-external&&&/i&&/a&:在Android应用程式上使用传统字体的简易操作。&/p&&h2&用户界面(User Interface)&/h2&&p&&a href=&/?target=https%3A///navasmdc/MaterialDesignLibrary& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Material Design Android Library&i class=&icon-external&&&/i&&/a&:在Android中使用Google的Material Design(Android 2.2版)的库。&/p&&p&&a href=&/?target=https%3A///rey5137/Material& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Material&i class=&icon-external&&&/i&&/a&:将Material Design导入原有应用程序的库。&/p&&h2&指示器(Activity Indicator)&/h2&&p&&a href=&/?target=https%3A///PaoloRotolo/AppIntro& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&AppIntro&i class=&icon-external&&&/i&&/a&:为应用程序创建炫酷简介,类似于Google原始应用中的。&/p&&p&&a href=&/?target=https%3A///OrangeGangsters/LolliPin& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&LolliPin&i class=&icon-external&&&/i&&/a&:为应用程序提供pin密码。&/p&&h2&操作按钮(Buttons)&/h2&&p&&a href=&/?target=https%3A///Bearded-Hen/Android-Bootstrap& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android-Bootstrap&i class=&icon-external&&&/i&&/a&:通过使用Bootstrape规则,进行诸如在APP中创建按钮的操作。&/p&&p&&a href=&/?target=https%3A///dmytrodanylyk/android-morphing-button& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android Morphing Button&i class=&icon-external&&&/i&&/a&:Android的操作按钮,其形状大小可更改。&/p&&h2&表格(Form)&/h2&&p&&a href=&/?target=https%3A///ernestoyaquello/vertical-stepper-form& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Vertical Stepper Form Library&i class=&icon-external&&&/i&&/a&:在Material Design中创建表单的库。&/p&&h2&键盘(Keyboard)&/h2&&p&&a href=&/?target=https%3A///yshrsmz/KeyboardVisibilityEvent& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&KeyboardVisibilityEvent&i class=&icon-external&&&/i&&/a&:显示与隐藏键盘的简单操作。&/p&&p&&a href=&/?target=https%3A///AzimoLabs/AndroidKeyboardWatcher& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&AndroidKeyboardWatcher&i class=&icon-external&&&/i&&/a&:追踪键盘开启/关闭操作情况的库。&/p&&h2&菜单(Menu)&/h2&&p&&a href=&/?target=https%3A///roughike/BottomBar& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&BottomBar&i class=&icon-external&&&/i&&/a&:在Material Design中提供底部导航栏的视图组件。&/p&&p&&a href=&/?target=https%3A///Yalantis/Side-Menu.Android& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Side Menu&i class=&icon-external&&&/i&&/a&:为应用程序添加侧边菜单栏的工具。&/p&&h2&评分(Rating)&/h2&&p&&a href=&/?target=https%3A///hotchemi/Android-Rate& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android-Rate&i class=&icon-external&&&/i&&/a&:提醒用户对应用程序进行评价的简易库。&/p&&p&&a href=&/?target=https%3A///FlyingPumba/SimpleRatingBar& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SimpleRatingBar&i class=&icon-external&&&/i&&/a&:用于星级评分的UI组件。&/p&&h2&滑屏(Slider)&/h2&&p&&a href=&/?target=https%3A///jfeinstein10/SlidingMenu& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SlidingMenu&i class=&icon-external&&&/i&&/a&:轻松为应用程序创建滑动式菜单项。&/p&&p&&a href=&/?target=https%3A///mikepenz/MaterialDrawer& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MaterialDrawer&i class=&icon-external&&&/i&&/a&:Android中轻便灵活的抽屉布局式库。&/p&&p&&a href=&/?target=http%3A//www.oschina.net/news/78857/best-android-libraries-for-developers& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阅读原文&i class=&icon-external&&&/i&&/a&&/p&&figure&&img src=&/50/v2-cd61ec7c2ff09ddd21930_b.jpg& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&/50/v2-cd61ec7c2ff09ddd21930_r.jpg&&&/figure&
原文链接:作者:达尔文软件库的存在使得Android编码更方便快捷。在如此多 Android库中,我们该如何寻找最合适的一款呢?下面我们做了一个列表供你参考。 动画(Animation):强大的动画库,通过对它的使用,可…
&figure&&img src=&/50/8ee66caa0b0bb2cb90db_b.png& data-rawwidth=&1010& data-rawheight=&553& class=&origin_image zh-lightbox-thumb& width=&1010& data-original=&/50/8ee66caa0b0bb2cb90db_r.png&&&/figure&&h2&前言&/h2&&p&
通过这几天对好几个应用的内存泄露检测和改善,效果明显:&/p&&ul&&li&&p&完全退出应用时,手动触发GC,从原来占有内存100多M降到低于20M;&/p&&/li&&li&&p&手动触发GC后,通过adb shell dumpsys meminfo packagename -d查看Activity和View的数量也趋近于0了(没有做到归零是因为SDK中存在内存泄露,需要中间层去处理);&/p&&/li&&li&&p&发现了一个SDK中的内存泄露(&a href=&/p/& class=&internal&&Android InputMethodManager 导致的内存泄露及解决方案&/a&);&/p&&/li&&li&&p&发现一个MTK Webview的内存泄露(org.chromium.android_webview.AwPasswordHandler.java中private static AwPasswordHandler sInstance = null导致的内存泄露)。&/p&&/li&&/ul&&p&
从结果来看我分析和改善内存泄露的方法是对的,这个过程并不复杂,所以可以梳理总结出来作为分享。&/p&&h2&原则&/h2&&p&
对于性能问题,分析和改善有必要遵循以下原则:&/p&&ul&&li&&p&一切看数据说话,不能跟着感觉走,感觉哪有问题就去改,很有可能会适得其反;&/p&&/li&&li&&p&性能优化是一个持续的过程,需要不断地改善,不要想着一气呵成;&/p&&/li&&li&&p&对于性能问题,不一定必须要改善,受限于架构或者其它原因某些问题可能会很难改善,必须要先保证能用,再才考虑好用。&/p&&/li&&li&&p&改善后一定要验证,任何一个地方的改动都需要验证,避免因为改善性能问题导致其它的问题。&/p&&/li&&/ul&&h2&步骤&/h2&&p&
下面是我在针对内存泄露这个性能问题上的解决步骤:&/p&&h3&优先处理常见的内存泄露问题&/h3&&p&
首先解决常见的内存泄露问题,这个过程可以借助Android Studio的Analyze-Inspect Code对代码做静态分析,常见的内存泄露问题有:&/p&&ul&&li&&p&非静态内部类导致的内存泄露,比如Handler,解决方法是将内部类写成静态内部类,在静态内部类中使用软引用/弱引用持有外部类的实例,eg:&/p&&div class=&highlight&&&pre&&code class=&language-js&&&span&&/span&
&span class=&kr&&static&/span& &span class=&kr&&class&/span& &span class=&nx&&ExerciseHandler&/span& &span class=&kr&&extends&/span& &span class=&nx&&Handler&/span&&span class=&p&&{&/span&
&span class=&kr&&private&/span& &span class=&nx&&SoftReference&/span&&span class=&o&&&&/span&&span class=&nx&&ExerciseActivity&/span&&span class=&o&&&&/span& &span class=&nx&&exerciseActivitySoftReference&/span& &span class=&o&&=&/span& &span class=&kc&&null&/span&&span class=&p&&;&/span&
&span class=&kr&&public&/span& &span class=&nx&&ExerciseHandler&/span&&span class=&p&&(&/span&&span class=&nx&&ExerciseActivity&/span& &span class=&nx&&exerciseActivity&/span&&span class=&p&&){&/span&
&span class=&nx&&exerciseActivitySoftReference&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&nx&&SoftReference&/span&&span class=&o&&&&/span&&span class=&nx&&ExerciseActivity&/span&&span class=&o&&&&/span&&span class=&p&&(&/span&&span class=&nx&&exerciseActivity&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&err&&@&/span&&span class=&nx&&Override&/span&
&span class=&kr&&public&/span& &span class=&k&&void&/span& &span class=&nx&&handleMessage&/span&&span class=&p&&(&/span&&span class=&nx&&Message&/span& &span class=&nx&&msg&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&nx&&ExerciseActivity&/span& &span class=&nx&&exerciseActivity&/span& &span class=&o&&=&/span& &span class=&nx&&exerciseActivitySoftReference&/span&&span class=&p&&.&/span&&span class=&nx&&get&/span&&span class=&p&&();&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&kc&&null&/span& &span class=&o&&!=&/span& &span class=&nx&&exerciseActivity&/span&&span class=&p&&){&/span&
&span class=&kr&&super&/span&&span class=&p&&.&/span&&span class=&nx&&handleMessage&/span&&span class=&p&&(&/span&&span class=&nx&&msg&/span&&span class=&p&&);&/span&
&span class=&k&&switch&/span& &span class=&p&&(&/span&&span class=&nx&&msg&/span&&span class=&p&&.&/span&&span class=&nx&&what&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&k&&case&/span& &span class=&nx&&MSG_XX&/span&&span class=&o&&:&/span&
&span class=&nx&&exerciseActivity&/span&&span class=&p&&.&/span&&span class=&o&&***&/span&&span class=&p&&;&/span&
&span class=&k&&break&/span&&span class=&err&&;&/span&
&span class=&k&&default&/span&&span class=&o&&:&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&/li&&li&&p&IO操作后,没有关闭文件导致的内存泄露,比如Cursor、FileInputStream、FileOutputStream使用完后没有关闭,这种问题在Android Studio 2.0中能够通过静态代码分析检查出来,直接改善就可以了;&/p&&/li&&li&&p&自定义View中使用TypedArray后,没有recycle,这种问题也可以在Android Studio 2.0中能够通过静态代码分析检查出来,直接改善就可以了;&/p&&/li&&li&&p&某些地方使用了四大组件的context,在离开这些组件后仍然持有其context导致的内存泄露,这种问题属于共识,在编写代码的过程中就应该按照规则来,使用Application的Context就可以解决这类内存泄露的问题了,至于什么情况下应该使用四大组件的Context,什么时候应该使用Application的context可以参见下表:&figure&&img src=&/8ee66caa0b0bb2cb90db_b.png& data-rawwidth=&1010& data-rawheight=&553& class=&origin_image zh-lightbox-thumb& width=&1010& data-original=&/8ee66caa0b0bb2cb90db_r.png&&&/figure&&/p&&/li&&/ul&&p&&strong&备注:&/strong&大家注意看到有一些NO上添加了一些数字,其实这些从能力上来说是YES,但是为什么说是NO呢?下面一个一个解释:&/p&&p&1、数字1:启动Activity在这些类中是可以的,但是需要创建一个新的task,一般情况不推荐;&br&&br&
2、数字2:在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用;&br&&br&
3、数字3:在Receiver为null时允许,在4.2或以上的版本中,用于获取黏性广播的当前值。(可以无视);&br&&br&
4、ContentProvider、BroadcastReceiver之所以在上述表格中,是因为在其内部方法中都有一个context用于使用。&br&&/p&&ul&&li&&p&还有一种不属于内存泄露,但在分析内存泄露的问题时应该一并解决:同一个APP,将图片放在不同的drawable文件夹下,在相同的设备上占用的内存情况不一样,具体可以参见:&a href=&/?target=http%3A//blog.csdn.net/zhaokaiqiang1992/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&关于Android中图片大小、内存占用与drawable文件夹关系的研究与分析&i class=&icon-external&&&/i&&/a&。解决这个问题遵循以下原则就可以了:&/p&&p&1、UI只提供一套高分辨率的图,图片建议放在drawable-xxhdpi文件夹下(放在xxxhdpi或者更高分辨率的文件夹下没有必要,权衡利弊,照顾主流设备即可),这样在低分辨率设备中图片的大小只是压缩,不会存在内存增大的情况;&/p&&p&2、涉及到桌面插件或者不需要缩放的图片,放在drawable-nodpi文件夹下,这个文件夹下的图片在任何设备上都是不会缩放的。&/p&}

我要回帖

更多关于 半条命1.6 买武器b 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信