Android开发优化之——从代码角度进行优化

2019-03-11 16:21:26 阅读:2340

Android开发优化之——从代码角度进行优化通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的。一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构。重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能。下面我们就从几个方面来了解Android开发过程中的代码优化。通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的。一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构。重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能。下面我们就从几个方面来了解Android开发过程中的代码优化。1)静态变量引起内存泄露在代码优化的过程中,我们需要对代码中的静态变量特别留意。静态变量是类相关的变量,它的生命周期是从这个类被声明,到这个类彻底被垃圾回收器回收才会被销毁。所以,一般情况下,静态变量从所在的类被使用开始就要一直占用着内存空间,直到程序退出。如果不注意,静态变量引用了占用大量内存的资源,造成垃圾回收器无法对内存进行回收,就可能造成内存的浪费。先来看一段代码,这段代码定义了一个Activity。privatestaticResourcesmResources;@OverrideprotectedvoidonCreate(Bundlestate){super.onCreate(state);if(mResources==null){mResources=this.getResources();}}这段代码中有一个静态的Resources对象。代码片段mResources=this.getResources()对Resources对象进行了初始化。这时Resources对象拥有了当前Activity对象的引用,Activity又引用了整个页面中所有的对象。如果当前的Activity被重新创建(比如横竖屏切换,默认情况下整个Activity会被重新创建),由于Resources引用了第一次创建的Activity,就会导致第一次创建的Activity不能被垃圾回收器回收,从而导致第一次创建的Activity中的所有对象都不能被回收。这个时候,一部分内存就浪费掉了。经验分享:在实际项目中,我们经常会把一些对象的引用加入到集合中,如果这个集合是静态的话,就需要特别注意了。当不需要某对象时,务必及时把它的引用从集合中清理掉。或者可以为集合提供一种更新策略,及时更新整个集合,这样可以保证集合的大小不超过某值,避免内存空间的浪费。2)使用Application的Context在Android中,ApplicationContext的生命周期和应用的生命周期一样长,而不是取决于某个Activity的生命周期。如果想保持一个长期生命的对象,并且这个对象需要一个Context,就可以使用Application对象。可以通过调用Context.getApplicationContext()方法或者Activity.getApplication()方法来获得Application对象。依然拿上面的代码作为例子。可以将代码修改成下面的样子。privatestaticResourcesmResources;@OverrideprotectedvoidonCreate(Bundlestate){super.onCreate(state);if(mResources==null){//mResources=this.getResources();mResources=this.getApplication().getResources();}}在这里将this.getResources()修改为this.getApplication().getResources()。修改以后,Resources对象拥有的是Application对象的引用。如果Activity被重新创建,第一次创建的Activity就可以被回收了。3)及时关闭资源Cursor是Android查询数据后得到的一个管理数据集合的类。正常情况下,如果我们没有关闭它,系统会在回收它时进行关闭,但是这样的效率特别低。如果查询得到的数据量较小时还好,如果Cursor的数据量非常大,特别是如果里面有Blob信息时,就可能出现内存问题。所以一定要及时关闭Cursor。下面给出一个通用的使用Cursor的代码片段。Cursorcursor=null;try{cursor=mContext.getContentResolver().query(uri,null,null,null,null);if(cursor!=null){cursor.moveToFirst();//处理数据}}catch(Exceptione){e.printStatckTrace();}finally{if(cursor!=null){cursor.close();}}即对异常进行捕获,并且在finally中将cursor关闭。同样的,在使用文件的时候,也要及时关闭。4)使用Bitmap及时调用recycle()前面的章节讲过,在不使用Bitmap对象时,需要调用recycle()释放内存,然后将它设置为null。虽然调用recycle()并不能保证立即释放占用的内存,但是可以加速Bitmap的内存的释放。在代码优化的过程中,如果发现某个Activity用到了Bitmap对象,却没有显式的调用recycle()释放内存,则需要分析代码逻辑,增加相关代码,在不再使用Bitmap以后调用recycle()释放内存。5)对Adapter进行优化下面以构造ListView的BaseAdapter为例说明如何对Adapter进行优化。在BaseAdapter类中提供了如下方法:publicViewgetView(intposition,ViewconvertView,ViewGroupparent)当ListView列表里的每一项显示时,都会调用Adapter的getView方法返回一个View,来向ListView提供所需要的View对象。下面是一个完整的getView()方法的代码示例。publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ViewHolderholder;if(convertView==null){convertView=mInflater.inflate(R.layout.list_item,null);holder=newViewHolder();holder.text=(TextView)convertView.findViewById(R.id.text);convertView.setTag(holder);}else{holder=(ViewHolder)convertView.getTag();}holder.text.setText("line"+position);returnconvertView;}privateclassViewHolder{TextViewtext;}当向上滚动ListView时,getView()方法会被反复调用。getView()的第二个参数convertView是被缓存起来的List条目中的View对象。当ListView滑动的时候,getView可能会直接返回旧的convertView。这里使用了convertView和ViewHolder,可以充分利用缓存,避免反复创建View对象和TextView对象。如果ListView的条目只有几个,这种技巧并不能带来多少性能的提升。但是如果条目有几百甚至几千个,使用这种技巧只会创建几个convertView和ViewHolder(取决于当前界面能够显示的条目数),性能的差别就非常非常大了。6)代码“微优化”当今时代已经进入了“微时代”。这里的“微优化”指的是代码层面的细节优化,即不改动代码整体结构,不改变程序原有的逻辑。尽管Android使用的是Dalvik虚拟机,但是传统的Java方面的代码优化技巧在Android开发中也都是适用的。下面简要列举一部分。因为一般Java开发者都能够理解,就不再做具体的代码说明。创建新的对象都需要额外的内存空间,要尽量减少创建新的对象。将类、变量、方法等等的可见性修改为最小。针对字符串的拼接,使用StringBuffer替代String。不要在循环当中声明临时变量,不要在循环中捕获异常。如果对于线程安全没有要求,尽量使用线程不安全的集合对象。使用集合对象,如果事先知道其大小,则可以在构造方法中设置初始大小。文件读取操作需要使用缓存类,及时关闭文件。慎用异常,使用异常会导致性能降低。如果程序会频繁创建线程,则可以考虑使用线程池。经验分享:代码的微优化有很多很多东西可以讲,小到一个变量的声明,大到一段算法。尤其在代码Review的过程中,可能会反复审查代码是否可以优化。不过我认为,代码的微优化是非常耗费时间的,没有必要从头到尾将所有代码都优化一遍。开发者应该根据具体的业务逻辑去专门针对某部分代码做优化。比如应用中可能有一些方法会被反复调用,那么这部分代码就值得专门做优化。其它的代码,需要开发者在写代码过程中去注意。

PhpStorm 2018 安装及破解方法

2019-03-11 15:43:05 阅读:2334

https://blog.csdn.net/u012278016/article/details/81772566目录1>.安装:2>.破解PhpStorm是JetBrains公司开发的一款商业的PHP集成开发工具。PhpStorm可随时帮助用户对其编码进行调整,运行单元测试或者提供可视化debug功能和智能HTML/CSS/JavaScript/PHP编辑、代码质量分析、版本控制集成(SVN、GIT)、调试和测试等功能。另外,它还是跨平台。在Windows和MacOS下都可以使用。PhpStorm-让开发更智能,而不是更困难。1>.安装:首先官网下载PhpStorm。下载完软件之后,双击安装文件即可进行安装,双击后出现下图所示的提示,点击Next即可。然后会出现一个选择安装目标路径的提示,你可以自定义安装路径也可以选择默认安装路径(默认安装路径是在C盘,以后运行软件时会更加快),我是自定义安装路径把软件安装在D盘。选择完后点击Next即可。配置你的PhpStorm,除了32位,其他的全部选中,点击Next。点击Install即可。然后就会出现安装过程界面以及下载一些主要的程序。安装完成,点击Finish即可。第一次启动会出现下面设置界面,主要是IDE的配置信息,如果没有选择Donotimportsetting即可。然后出现注册界面。2>.破解修改电脑中hosts文件(地址:C:\Windows\System32\drivers\etc),改变IDE注册验证服务器地址如下:添加“0.0.0.0account.jetbrains.com”字符串到host文件中进入网站http://idea.lanyus.com/获取注册码。点击获取注册码。在激活界面粘贴注册码,点击Ok即可激活。激活后打开Phpstorm出现新建打开项目界面。完毕!

本文主要介绍APP漏洞挖掘中逻辑漏洞,包括任意用户密码重置,支付漏洞,任意用户未授权登录。

2019-03-09 15:03:06 阅读:2863

浅谈APP漏洞挖掘之逻辑漏洞作者:陈奕霖联系方式:1909498865@qq.com文章中若无特别说明,实例皆为本人自主挖掘。转载请注明出处,本文仅为个人经验总结,介绍的并非所有方法,只是一些最常见的方法。如有错误,烦请指出。0x00简介本文主要介绍APP漏洞挖掘中逻辑漏洞,包括任意用户密码重置,支付漏洞,任意用户未授权登录。0x01任意用户密码重置正文首先,我们来看看任意用户密码重置。方法一:密码找回的凭证太弱,为4位或6位纯数字,并且时效过长,导致可爆破从而重置用户密码。这里我们来看一个实例,目前厂商已经修复。验证码为4位纯数字,我们使用burpsuite爆破。可以看到成功爆破出了。4位数字0~9有9999种可能,我们线程设置10,五分钟之内就可以爆破出凭证。方法二:验证码传输在数据包中。这里共有两种可能,一种在返回包,一种在获取验证码的数据包中。我们来看两个实例。第一个:验证码在返回包中在输入好手机号点击下一步时,我们抓包,截取返回包。第二个:验证码在获取验证码的数据包中Checkcode后面的六位数字就为验证码了,这种情况我只见过一次。方法三:输入好凭证后,重置密码时替换手机号。看个实例:这款APP重置密码分为两步,第一步是输入手机号获取验证码并填入,正确后即跳转到下一步,然后就是输入新密码。我们在输入新密码后抓包,替换手机号放包即可重置。方法四:修改返回包内容,把错误的改为正确的。具体来看一个实例:我在输入好手机号获取验证码后,随便输入一个数字。然后抓包截取返回包修改1为0方法五:获取验证码时手机号为明文,修改为自己的从而达到欺骗验证。这种方法由于我在挖掘APP漏洞中暂时没有遇到,所以无法找到APP实例,但是有一个WEB实例,这里也贴上来,思路方法都是一样的。改为自己的,即可收到验证码。0x02支付漏洞正文方法一:修改金额还是来看一个实例,确认支付时候抓包,截取返回包。嘿嘿,放包即可成功一毛钱买飞机杯^_^方法二:修改金额为负数。此方法我目前没有遇到过,所以不配实例,操作起来也是一样的。0x03任意用户未授权登录方法一:登录时抓包,修改uid0x04总结以上漏洞修复方法:找回密码凭证够复杂并且不可猜测,同时注意以上逻辑问题,不可存在越权,或者重要的凭证在不该出现的地方出现。

上报错误