第一篇:安卓颜色代码的分析
第二篇:安卓学习心得
Android学习心得
-----093380117
计算机应用(1)
张峰
1.关于Activity
1.在一个Activity中使用多个View
如果把Activity看作MVC中的Control?它负责管理UI和接受事件(包括用户的输入),虽然说一个Activity通常对应一个屏幕,但事实上,我们是可以只用一个Activity管理多个不同的View来实现简单的逻辑。首先,我们增加一个新的资源描述layout/second.xml。
除了一个“Hello中国”以外,增加一个按钮可以返回前一个界面。然后,在代码中我们要为helloTwo增加两个方法,setViewOneCommand和setViewTwoCommand,分别处理一下在不同界面时,从资源里加载组件并为组件绑定一个事件处理器最后,我们需要在onCreate的时候,也就是启动后的main界面上设置一下按钮事件处理器。2.还是回到正道上,多个Activity之间的跳转
Android中提供一个叫Intent的类来实现屏幕之间的跳转,按文档的说法,似乎他们也建议采用这种方法,Intent的用法比较复杂,现在我先看看它最简单的用法。
这里的跳转功能用Intent来操作,它的最简单用法就是用函数setClass()设置跳转前后两个Activity类的实例,然后调用Activity自己的startActivity(intent)即可。最后一句finish()表示将当前Activity关掉(如果不关掉会如何?你可以自己试一下看效果,事实上有时我们是不需要关掉当前Activity的)。
然后,我们同样弄一个Activity类HelloThreeB,代码与前面的差不多,只是将setClass的两个参数反一下,这样就可以简单地实现在两个Activity界面中来回切换的功能了。
2.关于 Intent的使用
Intent分为两大类,显性的(Explicit)和隐性的(Implicit)。一般来说,intent要定位事件的目的地,无外乎需要以下几个信息: 1.种类(category),比如我们常见的 LAUNCHER_CATEGORY 就是表示这是一类应用程序。
2.类型(type),在前面的例子中没用过,表示数据的类型,这是隐性Intent定位目标的重要依据。
3.组件(component),前面的例子中用的是setClass,不过也可以用setComponent来设置intent跳转的前后两个类实例。4.附加数据(extras),在ContentURI之外还可以附加一些信息,它是Bundle类型的对象。
其实,如果是在一个应用内部,这种隐性的intent实在有点别扭,个人觉得,这种松藕合的实现方法,只适用于那些较大的系统或者多个不同的应用之间的调用,可手机上又有什么“较大”的系统呢?无非是可以与不同来源的多个应用之间方便地互操作而已,那么会是什么样的场景呢?比如,给QQ好友发送gmail邮件,用GoogleMap查找QQ好友所在的位置?看上去挺不错的。
关于这个ContentProvider,其实还有话说,它主要是的那些看似数据库操作的方法我们都没真正去实现呢。不过今天就到这里了,等下回再去研究吧。
3.关于ListActivity
准备一个List对象并借助Adapter就可以构造出一个列表。重载onListItemClick方法可以响应选择事件,利用第一个参数可以访问到这个ListView实例以得到选中的条目信息。这里有一点要说明的,就是如果更简单的话,其实连那个setContentView都可以不要了,Android也会自动帮我们构造出一个全屏的列表。但是本例中我们需要一个TextView来显示选中的条目,所以我们需要一个layout.mainb描述一下这个列表窗口。
这里需要注意的是那个ListView的ID,是系统自定义的android:list,不是我们随便取的,否则系统会说找不到它想要的listview了。然后,在这个listview之外,我们又增加了一个TextView,用来显示选中的条目。
再来说说这里用到的ArrayAdapter,它的构造函数中第二个参数是一个资源ID,ArrayAdapter的API文档中说是要求用一个包含TextView的layout文件,平台用它来显示每个选择条目的样式,这里的取值是R.layout.list_row,所以,我们还有一个list_row.xml文件来描述这个布局,相当简单。
从ArrayAdapter上溯到BaseAdapter,发现还有几个同源的Adapter也应该可以使用,象SimpleAdapter和CursorAdapter,还是做个例子来实验一下吧。
然后,在HelloTwoB中的onCreate函数中,修改代码,有几个不同:items的元素是HashMap实例,这是一点变化,然后构造函数除了要求items以外,还要求提供一个string[]来说明用hash表中的哪个字段显示在列表中,而后是一个资源ID的数组。
因为单纯的CursorAdapter是抽象类,所以我用的是它的子类SimpleCursorAdapter,很好理解,先用ContentResolver查询通讯簿得到一个游标,然后告诉SimpleCursorAdapter要用其中的People.NAME作为显示项来构造出一个adapter即可。4.关于Dialog
注意到android.app包下除了Dialog(可用于制作复杂的对话框)以外,还包括了几个系统定义好的对话框类,如DatePickerDialog、TimePickerDialog及AlertDialog。
其中AlertDialog我上回用过一次,基本上就那样子了,今天看看另外两个对话框的使用吧。
很简单的,无非是需要一个OnDateSetListener接口的实现而已,在它里面的dateSet方法中就可以得到选择的日期了。而TimePickerDialog与DatePickerDialog使用如出一辙。
看看另一个ProgressDialog的用法吧,这个类与AlertDialog一样包含了多个static的方法,所以使用起来是非常方便的。比如说,如果我们需要用它来表示一个长时间的操作。
5.关于Service和Notification
大略地看了一下android.app下的Service类,觉得它与Activity非常相似,只是要注意几个地方:
1.生命周期,Service的从onCreate()->onStart(int,Bundle)->onDestroy()显得更为简单。但是它的onStart是带参数的,第一个ID可用来标识这个service,第二个参数显示是用来传递数据的了。比较Activity,传递数据的Bundle是在onCreate就带进入的。
2.Service的启动由Context.startService开始,其实Activity或者Service都是Context的派生类。结束于Context.stopService()或者它自己的stopSelf()。
3.Service还有一个与Activity不一样的是它可以由另一个Context去绑定一个已存在的Service。就是这个方法Context.bindService(),被绑定的Service要求是已经onCreate了但可以没有onStart。在Service类中有个抽象方法getBinder()可以得到这个IBinder对象。关于这方面的细节,以后再看,这里只做个记录罢。
4.与Service有关的还有一个安全的问题,可以在AndroidManifest.xml中用
6.GridView与ImageView
简单一点吧,就瞧瞧那个Grid的效果,Android提供了一个GridView,不过从APIDemo中看来,它似乎与PC上的GRID差别还是挺大的,更像那个IconView的感觉。不知道Android中如何实现表格界面?虽然在移动终端上,表格一般不会有谁使用,大家似乎更倾向于使用ListView,而Android对于ListView则有更简单的实现ListActivity。
很简单,只要重载几个方法就可以了,关键是那个getView方法,它负责构建出每个单元格中的对象实例。这里我们构造的是一个ImageView实例。
然后就是同样的将这个Adapter赋给GridView即可,大家可以看看效果,注意在做这个例子前,先放几个小图片到res/drawable目录下,buildproject一下就可以得到那个R.drawable.a了(这里的a是图像文件名,如a.png)。
在getView方法中我们使用了ImageView类,这又是一个widget。除了上面用到的几个方法以外,还有以下几个方法值得注意: 与图像来源有关的方法,我们只用了资源文件的方式。
还是习惯性跑题了,其实,我是想通过我对这个类的无数次Debugger跟进,说说它的多线程异步处理的解决策略的。他的基本策略如下: 1.当你实例化一个AsyncQueryHandler类时(包括其子类...),它会单件构造一个线程(后面会详述...),这个线程里面会构建一个消息循环。
2.获得该消息循环的指针,用它做参数实例化另一个Handler类,该类为内部类。至此,就有了两个线程,各自有一个Handler来处理消息。3.当调用onXXX的时候,在XXX函数内部会将请求封装成一个内部的参数类,将其作为消息的参数,将此消息发送至另一个线程。4.在该线程的Handler中,接受该消息,并分析传入的参数,用初始化时传入的ContentResolver进行XXX操作,并返回Cursor或其他返回值。
5.构造一个消息,将上述返回值以及其他相关内容绑定在该消息上,发送回主线程。
6.主线程默认的AsyncQueryHandler类的handleMessage方法(可自定义,但由于都是内部类,基本没有意义...)会分析该消息,并转发给对应的onXXXComplete方法。
7.用户重写的onXXXComplete方法开始工作。
这就是它偷偷摸摸做过的事情,基本还是很好理解的。我唯一好奇的是它的线程管理方式,我猜测他是用的单件模式。第一个AsyncQueryHandler的实例化会导致创建一个线程,从此该线程成为不死老处男,所有的ContentResolver相关的工作,都由该线程统一完成。个人觉得这种解决方式很赞。本来这个线程的生命周期就很难估量,并且,当你有一个ContentProvider的请求的时候,判断你会做更多的类似操作并不过分。就算错了,花费的也只是一个不死的线程(与进程同生死共存亡...),换来的却是简单的生命周期管理和无数次线程生死开销的节约。同时另外一个很重要的问题,他并会涉及到单件中数据同步的问题,每个类都有各自的Handler类,彼此互不干扰,分发可以分别进行。当多个数据请求的时候,在同一个ContentResolver上进行的可能微乎其微,这就避免了堵塞。总而言之,这套解决办法和Android的整体设计算是天作之合了。
所以建议,如果你有什么非ContentProvider操作,却需要异步多线程执行的话,模拟一套,是个不错的策略,当然,具体情况具体分析,生搬硬套是学不好马列主义的。
7.显示控件使用
Android的界面显示同样也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的样式来做的。具体细节不想说了,可以参考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI这篇Doc。其他还有很多,感觉算是SDK讲述的最多的内容。
从控件的使用上,和网页的设计类似,尽量用parent_width之类的抽象长度,用Theme来做风格,抽取所有的字串等信息做本地化设计。相关内容参看Implementing a UI就好。
一类比较重要的是数据绑定控件。如果做过ASP.Net会从中看到很多类似的地方。一个支持数据绑定的控件,比如ListView。可以通过一个 ListAdapter绑定到一个数据源上。ListAdapter是一个抽象类,主要的实现类包括SimpleAdapter和 SimpleCursorAdapter。前者是绑定一个静态的Array,后者是绑定一个动态的Cursor。Cursor前面说过,是一个指向数据源的随机迭代器,将View绑定到Cursor通常要设置这样几个参数。一个是每一行的样式,称作Row Layout,其实就是一个普通的Layout的XML文件。还有就是一个列和现实控件的对应关系。那个控件显示哪个列的值,这是需要配置的。为了定制一个良好的数据显示控件,最简单你可以定制很PP的Row Layout,复杂一点就是可以重载绑定控件View,或者是适配器ListAdapter。如果是一个数据显示密集的应用,且你对UI有些追求,这个工作估计是必不可少的。
一个主要用于显示数据内容的Activity,可以选择派生自ListActivity。它提供了一个具有ListView 的Layout,还有simple_list_item_1, simple_list_item_2, two_line_list_item等默认的Row Layout,还有一些比较不错的API,和可供响应选择Item的事件。可以满足你比较基础的需求。如果你觉得只有一个ListView的界面太突兀,你可以为这个ListActivity指定一个Layout,需要注意的是,你需要提供一个id为@android:id/list的ListView控件,避免Activity在内部偷偷寻找该控件的时候失败。
除了这些要求,做好UI还有注意易用性和效率。快捷键是一个比较不错的选择,在 Activity中调用setDefaultkeyMode(SHORTCUT_DEFAULT_KEYS),可以开启快捷键模式,然后你可以将菜单绑定到指定快捷键上就OK了。个人觉得Tip也是一个比较重要的东西,但目前观察看来,这个东西只能够自己提供了。界面的动态性有时候是不可避免的,比如说菜单就是一个需要经常根据光标位置提供不同的选项。这个东西Android很人道的考虑到了,你可以参看NodeList这个Sample。它采取的应该是一个静态模拟动态的方式,这样有助于提高速度。你也可以利用ViewInflate,动态从一个XML创建一个控件。成本据Doc说很大,不到万不得已不要使用。
8.Intent消息传递
在前面写Android的ContentProvider时候,可以看到那是基于观察者模式的一个消息传递方法。每一个Cursor、ContentResolver做为一个小的注册中心,相关观察者可以在这个中心注册,更新消息由注册中心分发给各个观察者。而在MFC或Winform中,都会形成一个消息网,让消息在网中流动,被各节点使用、吃掉或者在出口死掉。
相比之下,我个人觉得基于Intent的Android核心消息传递机制是有所不同的。它应该会有一个全局性的注册中心,这个注册中心是隐性的,整个Android系统中就那么一个。所有的消息接收者,都被隐形的注册到这个中心。包括Activity,Service和IntentReceiver。其实说隐形注册是不确切的,所有注册都还是我们手动告诉注册中心的,只是与传统的方式不一样,我们通常不是通过代码,而是通过配置文件来做。在应用的Manifest中,我们会为一些Activity或Service添加上Intent-filter,或在配置文件中添加
当程序有一个消息希望发出去的时候,它需要将消息封装成一个Intent,并发送。这时候,应该是有一个统一的中心(恩,有可能Android底层实现的时候不是,但简单这样看是没问题的...)接受到这个消息,并对它进行解析、判定消息类型(这个步骤降低了耦合...),然后检查注册了相匹配的filter或receiver,并创建或唤醒接收者,将消息分发给它。这样做有很多好处。虽然这种传递有的时候不如点对点的传递快(这有些需要速度的地方,我们看到Android会通过直接通信来做),但有时候又因为它只经过一跳(姑且这么叫吧...),比复杂的流动又要更快。更重要的是,它耦合性低,在手机平台这种程序组件多变的条件下使用十分适合。并且它可以很容易实现消息的精确或模糊匹配,弹性很大。(我个人曾想在开发一个C++二次平台的时候引入这样的机制,但在C++中,建立一套完整的数据marshal机制不容易,相比之下,用java来做会简单很多...)
恩,废话说了很多,具体讲讲Android中Intent的使用。当你有一个消息需要传递,如果你明确知道你需要哪个Activity或者其他Class来响应的话,你可以指定这个类来接受该消息,这被称为显性发送。你需要将Intent的class属性设置成目标。这种情况很常见,比如startActivity的时候,会清楚当前Activity完了应该是哪个Activity,那就明确的发送这个消息。
但是,有的时候你并不确定你的消息是需要具体哪个类来执行,而只是知道接收者该符合哪些条件。比如你只需要有一个接收者能显示用户所选的数据,而不想制定某个具体的方法,这时候你就需要用到隐形发送(传统上,我们可能会考虑用多态,但显然这种方式更为灵活...)。在Android中,你可以为Intent指定一个action,表示你这个指令需要处理的事情。系统为我们定义了很多Action类型,这些类型使系统与我们通信的语言(比如在Activity里面加一个Main的filter,该activity就会做成该应用的入口点),当然你也可以用于你自己的应用之间的通信(同样当然,也可以自定义...)。强烈建议,在自己程序接收或发出一个系统action的时候,要名副其实。比如你响应一个view动作,做的确实edit的勾当,你发送一个pick消息,其实你想让别人做edit的事,这样都会造成混乱。当然只有Action有时候是不够的,在Android中我们还可以指定catalog信息和type/data信息,比如所有的显示数据的Activity,可能都会响应View action。但很多与我们需要显示的数据类型不一样,可以加一个type信息,明确的指出我们需要显示的数据类型,甚至还可以加上一个catalog信息,指明只有你只有按的是“中键”并发出这样的消息才响应。从上面可以看出,Android的Intent可以添加上class, action, data/type, catalog等消息,注册中心会根据这些信息帮你找到符合的接收者。其中class是点对点的指示,一旦指明,其他信息都被忽略。Intent中还可以添加key/value的数据,发送方和接收方需要保持统一的key信息和value类型信息,这种数据的marshal在java里做,是不费什么力气的。
Android的Intent发送,可以分成单播和广播两种。广播的接收者是所有注册了的符合条件的IntentReceiver。在单播的情况下,即使有很多符合条件的接收者,也只要有一个出来处理这个消息就好(恩,个人看法,没找到确切条款或抉择的算法,本来想实验一下,没来得及...),这样的情况很容易理解,当你需要修改某个数据的时候,你肯定不会希望有十个编辑器轮流让你来处理。当广播不是这样,一个receiver没有办法阻止其他receiver进行对广播事件的处理。这种情况也很容易理解,比如时钟改变了,闹钟、备忘录等很多程序都需要分别进行处理。在自己的程序的使用中,应该分清楚区别,合理的使用。
9.ContentProvider数据模型
数据库操作
从我目前掌握的知识来看,SQLite比较轻量(没有存储过程之类的繁杂手段),用起来也比较简单。实例化一个SQLiteDatabase类对象,通过它的APIs可以搞定大部分的操作。从sample中看,Android中对db的使用有一种比较简单的模式,即派生一个 ContentProviderDatabaseHelper类来进行SQLiteDatabase对象实例的获取工作。基本上,ContentProviderDatabaseHelper类扮演了一个singleton的角色,提供单一的实例化入口点,并屏蔽了数据库创建、打开升级等细节。在ContentProvider中只需要调用ContentProviderDatabaseHelper的openDatabase方法获取SQLiteDatabase的实例就好,而不需要进行数据库状态的判断。URI 像进行数据库操作需要用SQL一样,对ContentProivder进行增删改查等操作都是通过一种特定模式的URI来进行的(ig:content: //provider/item/id),URI的能力与URL类似,具体细节可以查看SDK。建立自己的ContentProvider,只需要派生 ContentProivder类并实现insert, delete, update等抽象函数即可。在这些接口中比较特殊的是getType(uri)。根据传入的uri,该方法按照MIME格式返回一个字符串(==!没听过的诡异格式...)唯一标识该uri的类型。所谓uri的类型,就是描述这个uri所进行的操作的种类,比如content://xx/a与 content://xx/a/1不是一个类型(前者是多值操作,后者是单值),但content://xx/a/1和content://xx/a/2 就会是一个类型(只是id号不同而已)。
在ContentProvider通常都会实例化一个ContentURIPraser来辅助解析和操作传入的URI。你需要事先(在static域内)为该ContentURIPraser建立一个uri的语法树,之后就可以简单调用 ContentURIPraser类的相关方法进行uri类型判断(match方法),获取加载在uri中的参数等操作。但我看来,这只是在使用上简化了相关操作(不然就需要自己做人肉解析了...),但并没有改变类型判定的模式。你依然需要用switch...case...对uri的类型进行判断,并进行相关后续的操作。从模式来看,这样无疑是具有强烈的坏味道,类似的switch...case...代码要出现N此,每次一个 ContentProvider做uri类型的增减都会需要遍历修改每一个switch...case...,当然,如果你使用模式(策略模式...)进行改造对手机程序来说无疑是崩溃似的(类型膨胀,效率降低...),所以,只能是忍一忍了(恩,还好不会扩散到别的类中,维护性上不会有杀人性的麻烦...)。增删改查
ContentProvider 和所有数据源一样,向外提供增删改查操作接口,这些都是基于uri的指令。进行insert操作的时候,你需要传入一个uri和 ContentValues。uri的作用基本就限于指明增减条目的类型(从数据库层面来看就是table名),ContentValues是一个 key/value表的封装,提供方便的API进行插入数据类型和数据值的设置和获取。在数据库层面上来看,这应该是column name与value的对应。但为了屏蔽ContentProvider用户涉及到具体数据库的细节,在Android的示例中,用了一个小小的模式。它为每一个表建一个基于BaseColumn类的派生类(其实完全可以不派生自BaseColumn,特别当你的表不基于默认的自动id做主键的时候),这个类通常包括一个描述该表的ContentURI对象和形如 public static final TITLE = “title”这样的column到类数据的对应。从改变上角度来看,你可以修改column的名字而不需要更改用户上层代码,增加了灵活性。insert方法如果成功会返回一个uri,该uri会在原有的uri基础上增加有一个row id。对于为什么使用row id而不是key id我想破了脑袋。到最后,我发现我傻了,因为ContentProvider不一定需要使用数据库,使用数据库对应的表也可以没有主键,只有row id,才能在任何底层介质下做索引标识。
但,基于row id在删除和修改操作是会造成一定的混乱。删除和修改操作类似。删除操作需要传入一个uri,一个where字串,一组where的参数(做条件判定...),而修改操作会多一个ContentValues做更新值。着两个操作的uri都支持在末尾添加一个row id。于是混乱就出现了。当在where参数中指明了key id,而在uri中提供了row id,并且row id和key id所指函数不一致的时候,你听谁的?示例代码中的做法是完全无视row id(无语...),如此野蛮的方式我估计也只能在示例中出现,在实际中该如何用,恩,我也不知道。幸运的是,我看了下上层对 ContentProvider的删除操作,其实都不会直接进行,而是通过调用Cursor的delete方法进行,在这前提下,我想Cursor会处理好这些东西吧。
最后一个操作是查询操作,可以想见,查询的参数是最多的,包括uri和一组条件参数。条件参数类型和标准的sql类似,包括 sort, projection 之类的。从这些参数到sql语句的生成,可以寻求QueryBuilder类的帮助,它提供了一组操作接口,简化了参数到sql的生成工作,哪怕你不懂 sql都完全没有问题(这话说的我自己都觉得有点悬...)。查询返回一个Cursor。Cursor是一个支持随机读写的指针,不仅如此,它还提供了方便的删除和修改的API,是上层对ContentProvider进行操作一个重要对象,需要仔细掌握(Cursor还可以绑定到view上,直接送显,并与用户进行交互,真是程序越往上,封装越好,工作越机械没有复杂性了...)。数据模型
在与界面打交道的Cursor、ContentResolver等数据操作层中,大量采用观察者模式建立数据层与显示层的联系。一个显示层的视图,可以做成某一种观察者注册到Cursor或ContentResolver等数据中间层中,在实现底层ContentProvider中,我们需要特别注意在对数据进行修改操作(包括增删改...)后,调用相应类型的notify函数,帮助表层对象进行刷新(还有一种刷新方式是从一个view发起的)。可以看到 Android的整体数据显示框架有点像MVC的方式。Cursor、ContentResolver相当于控制层,数据层和显示层的交互通过控制层来掌管,而且控制层很稳定不需要特别定制,通常工作只在定制数据层和显示层空间,还是比较方便和清晰的。
10.学习感想
通过这学期对安卓的学习,大概了解了以上一些知识,对安卓有了初步的了解,这几个月给我的东西我想用有形的和无形的两部分概叙,形的当然就是技术水平的长进,虽然其中肯定有很多的不足,相信慢慢会体会到。
第三篇:2015年安卓APP安全漏洞分析报告
2015年安卓APP安全漏洞分析报告
2015年,CNNIC统计显示我国手机网民规模达6.20亿,手机上网人群的占比提升至90%。随着移动端用户群体的快速扩张,除了一开始就注重移动市场的新互联网企业之外,传统企业也正不断提高对移动端的重视程度并加大投入,移动端市场的竞争呈现白热化趋势。
截止2015年12月31日,安卓APP总体数量已超过140万。据Yahoo Flurry 统计分析,2015年安卓APP整体同比增长超过14%,其中面向细分市场的个性化APP爆炸性增长达332%。新闻杂志、商务理财和旅行出游等APP,2015年的增长率也超过100%。
移动APP已经全面覆盖衣食住行,“指尖社会”的安全风险也随着急遽聚拢的财富而不断推高。
不安全的“指尖社会”
互联网的PC端安全经过十几年的实践,已经较为完善,但是移动端安全目前还是短板,传统的PC端安全防护措施无法有效保障移动端安全,作为移动端重要载体的APP因此安全事件频发。
大量安全事件中,APP的安全漏洞被黑客作为攻击入口,通过侵入APP获取用户隐私以及企业数据库存储的数据,损坏用户和企业的利益,影响恶劣。
2015年,APP安全事件泄露的信息以用户的姓名、地址、账号、密码、手机号等信息为主,尤其金融理财和生活服务类的APP是安全事件爆发的重灾区。仅以乌云漏洞平台曝光的安全漏洞为例,2015年,超过10家知名APP被曝存在安全漏洞可导致超1000万用户隐私泄露,这些安全漏洞的种类不一,漏洞的利用攻击手法也不同,但是攻击的最终指向目标都是用户隐私及企业数据。
触目惊心的安全现状,超9成APP含有安全漏洞
截止2015年12月31日,网蛙科技对当前市场上129万个多类别的APP做了全面的漏洞扫描检测,检测结果显示,App漏洞总量超过1700万个,仅程序代码中硬编码开发者密码(5744940个)、Sqllite SQLlnject漏洞(2196703个)与ContentProvider SQL lnjection漏洞(1243679)三类漏洞数量就超过918万个。
据检测结果,129万多个被检测APP中,超过95%以上APP含有不同类型的安全漏洞,平均每个APP含13.8个漏洞,高危漏洞比例达16%。
2015年高中低危漏洞分布图
1、APP 九大行业榜单产品,平均漏洞数达到9.3个
网蛙科技根据2015的APP分类排行榜,经综合考虑,选取视频、理财、音乐、电商、新闻、社交、自拍、工具以及游戏九类APP榜单(参考艾媒咨询、艾瑞网、互联网周刊、猎豹移动等APP排行榜榜单),共计90个APP产品进行了检测。
据检测结果,90个APP榜单产品(以发行的最新版本漏洞扫描检测结果数据为准),漏洞总数达到847个,平均每个APP含有9.3个漏洞。分行业计,游戏行业所含漏洞数最高,平均漏洞数目超过12个,安全隐患相对较大;金融理财、电商、社交这三个行业的平均漏洞数都接近或超过10个,同样需要高度重视。
这些被检测的APP中近70%面世时间达3-5年,具备成熟的市场口碑,当前用户规模和资产规模都高于同行业其他产品。它们高于普通APP的商业价值也更容易吸引黑产注意,如果遭遇安全事故,对APP有形的资产和无形的品牌都将造成严重损失。网蛙科技建议APP开发者们加强安全工作,切实提高产品的安全性,更好地维护APP用户利益和公司的品牌形象。
2、应用商店安全检测不到位,无法完全保障上架APP安全
网蛙科技对当前市场上两类应用商店的APP进行检测,分别为豌豆荚、应用宝、360手机助手等知名独立第三方应用商店,以及小米应用商店、华为应用市场等终端厂商自建的应用商店。
据不完全统计,截止2015年12月,手机应用商店漏洞总数超过1700万,单个应用商店最高漏洞数目超过493万个,其中第三方应用商店漏洞数目平均达到57万个,终端厂商自建的应用商店漏洞数目平均达到64万个,第三方应用商店的安全系数相对高于终端厂商自建的应用商店。
据艾媒咨询,从当前市场APP下载情况来看,APP下载渠道占比最高的为第三方应用商店(占比54%),其次为终端厂商自建的应用商店(占比34%),这两大类应用商店是当前用户下载APP的主要渠道。由于APP已经实质性地触及个人财产信息与隐私信息等,用户对APP安全性的要求不断提高,与此同步上涨的是用户对应用商店安全工作的不满情绪。截止2015年12月,超过60%用户认为应用商店应该对商店内恶意软件的出现负审核不严的责任。2016年,应用商店需要在安全能力提升方面做更多工作。
部分手机应用商店APP漏洞检测结果 3、19类行业漏洞检测,游戏和生活服务类APP危险系数最高
网蛙科技对当前市场上包括金融理财、网络购物、商务办公等19类APP进行了分类漏洞统计。需警惕的是,直接涉及数据资产、用户隐私等高商业价值信息的行业,APP检测结果显示漏洞分布数目远高于其他行业。
据检测结果,直接关联数据资产(如银行卡、移动支付等信息)的APP行业漏洞数目最高,游戏类APP漏洞数目高达457万,生活服务类APP以250万的漏洞数目排名第二,购物、金融理财类APP漏洞数目均超过80万;直接关联用户隐私(如姓名、联系方式信息)的APP漏洞数量也非常高,需要引起重视,社交、办公类APP漏洞数量分别达到139万和100万,而影音、教育类的APP漏洞数量也均超过50万。
近几年由漏洞引发的APP安全事故已经表明,无论是哪个行业,漏洞对APP安全都具有“一票否决权”。安全是一切发展的基础,APP开发者需要加强安全工作,不可掉以轻心。
2015年全行业APP漏洞分布图
给移动APP漏洞防护的四点建议
移动APP的安全问题涵盖开发、发布、维护等,贯穿APP产品的整个生命周期,因此网蛙科技针对当前移动APP的安全现状,提出以下几点建议,供行业从业者参考:
(1)安全工作,从开发抓起
当前APP市场呈现井喷式增长,跑马圈地的格局导致不少APP开发者因为急于占领市场,而相对忽视了APP开发时的安全工作。
网蛙科技检测中发现超过20%的漏洞是由于开发者的疏忽导致的,认真遵循APP开发的安全编程规范是完全可以避免的。
(2)应用商店,把好安全关
当前市场上,APP主流发行渠道为应用商店,其中第三方的应用商店占比最高。应用商店应负起责任,为上架的APP进行更全面可靠的安全测评。满足用户的安全需求,同时也为APP开发商进行最后一道安全把关。
具体可借鉴欧美地区应用商店,对于在其应用商店上架的APP,设置安全性的权重,将安全性高低与APP信誉相关联,既维护了用户对APP安全的知情权,更提升应用商店自身的品牌形象。
(3)即时监测及时修复
随着移动互联网渗透率的大幅提高,移动APP漏洞的曝光频率持续走高。漏洞曝光之后,厂商应高度重视并及时响应,在尽可能短的时间内推出相应的漏洞修复措施。
当前市面上仍有相当大比例的APP漏洞是属于早期已有尚未修复的漏洞,网蛙科技此次检测就有超过35%的漏洞是属于此类漏洞。建议APP开发者应持续关注最新安全信息,及时修复漏洞。
(4)防范0-day漏洞,使APP更安全
信息安全意义上的0-day漏洞是指软件厂商在知晓并发布相关补丁前就被掌握或者公开的漏洞信息。高危险级别的0-day漏洞如果被互联网不法分子利用,会对软件产品产生巨大的威胁,极大的影响用户体验甚至损害品牌价值。如2015年爆发的Hacking Team事件,该公司就是主要通过0-day漏洞进行不当盈利,此次事件中泄露的漏洞数据对全球众多公司造成了严重影响。
而与此相对的是,绝大部分的APP开发者并不具备0-day漏洞挖掘能力,同时因为漏洞挖掘耗时久,从商业效益上说,企业自行挖掘0-day漏洞的性价比不高,建议APP开发者与0-day漏洞研究团队合作,借助专业的力量,打造更加安全的APP产品。
APP安全,从防护漏洞开始
2015 年,云计算、物联网、大数据技术和相关产业迅速崛起,互联网移动端的发展将占据越来越重要的位置,作为载体之一的APP的安全更是互联网安全至关重要的一环。
国家对APP安全的规范工作正在不断建设与完善。2014年4月至9月工业和信息化部联合公安部、工商总局在全国范围开展打击移动互联网恶意程序专项行动,将互联网恶意程序设为重点打击治理项目之一,督促应用商店落实安全责任。国家网信办主任鲁炜也曾公开表示,网信办将出台APP应用程序发展管理办法。当前APP市场乱象的生存空间将不断缩小,APP开发者应提前部署应对措施。
APP安全,是国家、开发商、广大用户三方面共同的需求。而随着APP市场发展周期的推进,错综复杂的安全情况,越来越高频的安全威胁,都预示着APP安全攻防战场焦点将从漏洞防护开始。参考互联网移动端安全发展的轨迹,APP开发者与独立的第三方APP安全企业合作将成为互联网移动端安防的主流趋势。
第四篇:安卓目录总结
原装软件: AccountAndSyncSettings.apk.........账户与同步设置 AIMail_Android_V332a.apk.........手机邮箱 ApplicationsProvider.apk...........应用程序支持服务 BaiduSeach-v1.0.3.32_643e.apk.....百度快搜 Balance_ball_V128.apk.....平衡滚球 Bluetooth.apk...............蓝牙 Bowling_V116.apk.....保龄球对战 Browser.apk..........浏览器 Calculator.apk..............计算器 Calendar.apk................日程表 CalendarProvider.apk........日程表存储 Camera.apk...........相机 CertInstaller.apk...........证书安装 CIT.apk..............用户接口测试 ClockSet.apk................时钟 Contacts.apk................联系人 ContactsProvider.apk........联系人存储 Conversion.apk..............转换工具 DeviceInfo.apk..............设备信息 Dictionary.apk..............词典 DocViewer_STD...............Polaris 文档阅读器 DownloadProvider.apk........下载管理器 DrmProvider.apk.............受DRM 保护的内容的存储 DrmService.apk..............DRM 保护服务 Email.apk............电子邮件 FileManager.apk.............文件管理器 FilePicker.apk..............选择文件 FMRadio.apk..........收音机 Gallery.apk..........7库 GlobalSearch.apk............快速搜索框 GoogleSearch.apk............谷歌搜索 GPSUI.apk............GPS 界面,用途未知 HTMLViewer.apk..............HTML 查看器 kaixin_1.0.2.apk---开心网 LatinIME.apk................Android 键盘 Launcher.apk................主屏幕 LeMei.apk............乐媒 Lunar.apk............农历 MediaProvider.apk...........媒体存储 Mms.apk..............信息 Mob.apk..............手机营业厅 Motorboat_V110.apk------------------------急速摩托艇 Music.apk............音乐 NotePad.apk..........记本 PackageInstaller.apk........打包安装程序 Palmebool_5_1_03.apk-----------------------爱读掌阅 PekAllIME.apk...............京联云输入法 Phone.apk............拨号器 PhoneLocationProvider.apk..........本地拨号器存储 PicoTts.apk..........语音程序 PinyinIME.apk...............谷歌拼音输入法 ProfileSetting.apk..........情景模式 QQ_K-Touch_W606.apk---------------------手机QQ QQBrowser_W606.apk-----------------------QQ 浏览器 QQLord2009_W606.apk---------------------QQ 斗地主 renren_android_1.5.apk----------------------人人网 ServiceGuide.apk-----------------------------服务指南 Settings.apk................设置 SettingsProvider.apk........设置存储 SetupWizard.apk.............设置向导程序 SogouInput_oem_w606.apk------------------搜狗输入法 SoundRecorder.apk...........录音机 Stk.apk..............USIM 卡应用
Straightflush_SC_VER_7_20_06.apk-------------------同花顺 SuperUser.apk...............授权管理 TelephonyProvider.apk..............拨号器存储 Tetris_V117.apk对战俄罗斯方块 TtsServices.apk.............GoogleTTS 语音库服务 UHotline.apk................联通热线 UserDictionaryProvider.apk.........用户字典 VoiceRecorder.apk...........录音机 V.p.n.Services.apk..........虚拟专用网服务 Weather.apk-天气预报 WeatherWidget----------------------------天气预报桌面小工具 Weibo2.0.4.apk---------------------------新浪微博 Wo.apk...............沃3G WordMemo.apk................背单词 WoStore_v16_v101.apk--------------------------沃商店 其他:
1、.android_secure 是官方app2sd 的产物,删了之后装到sd 卡中的软件就无法使用了
2、.Bluetooth 顾名思义,用蓝牙之后就会有这个。
3、.mobo 顾名思义,Moboplayer 的缓存文件。
4、.QQ 顾名思义,QQ 的缓存文件。
5、.quickoffice 顾名思义,quickoffice 的缓存文件。
6、.switchpro 顾名思义,switchprowidget(多键开关)的缓存文件。
7、.ucdlres 顾名思义,UC 迅雷的缓存文件。
8、albumart 音乐专辑封面的缓存文件夹。
9、albums 相册缩略图的缓存文件夹。
10、Android 比较重要的文件夹,面是一些程序数据,比如google map 的地图缓存。
11、backups 一些备份文件,比如联系人导出到SD 卡时会导入到此文件夹
12、baidu 顾名思义,掌上百度、百度输入法之类程序的缓存文件夹。
13、bugtogo 系统出现问题的时候会形成一些报告文件,存放于此文件夹。"
14、cmp 个人初步判断是音乐的缓存文件夹。
15、data 同样是缓存数据的文件夹,与Android 性质类似。
16、DCIM 相机的缓存文件夹,里面是你照的照片。
17、documents Documents To Go 的相关文件夹。
18、etouch 易行的缓存文件夹。
19、extracted androzip 等解压缩软件默认的解压目录。20、gameloft 顾名思义,gameloft 游戏数据包存放的文件夹。
21、handcent 顾名思义handcent(超级短信)数据文件夹。*
22、handyCurrency 货币汇率相关的文件夹,装了handycalc(科学计算器)之后才会有。
23、ireader 顾名思义,ireader 的缓存文件夹。
24、KingReader 顾名思义,开卷有益的缓存文件夹。
25、LazyList Applanet(黑市场)的缓存目录,也许和其他序也有关,暂时不太清楚。
26、LOST.DIR 卡上丢失或出错的文件会跑这里,此目录无用,删了会自动生成。
27、moji 顾名思义,墨迹天气的缓存目录。
28、MusicFolders poweramp 产生的缓存文件夹。
29、openfeint 顾名思义,openfeint 的缓存文件夹。30、Picstore 图片浏览软件建立的一个目录。
31、Playlists 播放列表的缓存文件夹。
32、renren 顾名思义,人人网客户端的缓存文件夹。
33、screenshot 貌似是截屏图片保存的目录,34、ShootMe 顾名思义,shootme 截屏后图片文件保存的目录。
35、SmartpixGames Smartpix Games 出品游戏的缓存文件夹,比如Jewellust。
36、sogou 顾名思义,搜狗拼音的缓存文件夹。
37、SpeedSoftware RE 文件管理器的缓存文件夹。
38、SystemAppBackup SystemApp remove(深度卸载)备份系统文件后,备份文件保存的目 录。
39、TalkingFriends talking tom(会说话的tom 猫)录制的视频文件所保存的目录。40、Tencent 顾名思义,腾讯软件的缓存目录,比如QQ。(与上面的.QQ 文件夹并不相同)
41、TitaniumBackup 顾名思义,钛备份备份程序锁保存的目录。'
42、TunnyBrowser 感觉是海豚浏览器的缓存目录,但不知道为什么叫这个名字,金枪鱼浏 览器.....43、UCDLFiles UC 迅雷下载文件的保存目录。
44、UCDownloads UC 浏览器下载文件的保存目录。
45、VIE Vignette(晕影相机)的缓存目录。
46、科学上网 顾名思义,科学上网 数据的缓存目录。
47、yd_historys 有道词典搜索历史的缓存目录。
48、yd_speech 有道词典单词发音的缓存目录。
49、youmicache 删掉后还会自动生成,悠米广告的缓存目录,广告程序内嵌在其他程序中。补: 50、Glu Glu 系列游戏的资料包存放地。如3D 猎鹿人等。
51、DunDef 地牢守护者的数据包。
52、KuwoMusic 顾名思义,酷我音乐相关文件夹。
53、MxBrowser 遨游的缓存目录。
54、Camera360 顾名思义,camera360 的缓存目录。
55、TTPod 顾名思义,天天动听的缓存目录。
56、apadqq-images QQ for pad 的缓存目录。
57、My documents 自己手机启用各种程序任务记录文档 定期清除 时间长了会积累 很多 占用SD 卡内存。6 w& J2 g2 H9 H5 y, y
58、.nomedia 手机中隐藏的音频 图片文件夹 可以自设在相关文件夹中。
59、media(媒体文档)使用电话通话录音软件 或在线浏览视频等媒体 产生的音频文件60、带有navi 的是导航软体,一般是地图包 61、.BlueFTP_thumbnails 蓝牙助手的缓存 62、.FileExpert 是文件大师的缓存)63、.quickoffice 是quickoffice 的缓存文件。64、.zdclock 正点闹钟的缓存与记忆 65、365riliDownload 顾名思义就是365 日历的缓存,下载的插件也在里面 66、appmonster2 备份精灵的缓存 67、bcr 名片全能王缓存 68、Camera360 这不用解释了,大家都知道 69、CamScanner 扫描全能王的缓存 70、GOLauncherEX 这大家应该也知道,就是GO 桌面的缓存
71、GOSMS GO 短信 72、Goweather GO 天气 73、MTXX 美图秀秀,制作后的图片缓存 74、ndcommplatform,PandaSpace 这两者都是91 助手生成的缓存 75、notegallery 文本全能王的缓存 76、Photaf 3D 全景拍照的缓存 77、photowonder 魔图精灵生成的缓存 78、soundhound 猎曲奇兵的缓存 79、WhatsApp 这...中文是什么,呵呵,大家都知道吧WhatsApp 的缓存 80、Youdao 有道词典是这文件夹名称,yd_historys,yd_speech 共五个集成在一起 ricwang36(81、SystemAppBackup SystemApp remove(深度卸载)备份系统文件后,备份档桉保存的 目录 82、SpeedSoftware RE 管理器产生的 83、rosie_scroll 坦白说,我一直不知道这个是什么,删了没事,但是还会自动生成,应 该是手机自带哪个软体生成缓存 84、alarms Alarms 闹钟铃声 85、Music MP3 音乐,部分手机才会有 86、notifications 讯息铃声,部分手机才会有 87、ringtones 来电铃声,部分手机才会有 88、.bookmark_thumb1 是手机浏览器可视化我的最爱图片的存放资料夹。
89、.footprints 用于记录手机照片的真实地理位置 90、albumthumbs 照片小图的缓存,为了加快小图的显示速度
第五篇:如何学习安卓
如何学习安卓
想学编程开发,那要先会一门编程语言,现在可以试着去学学C语言,虽然这个安卓沾不上边,但是,C语言的编程思想还是很重要的,学完了C语言之后,他的语法基本上和所有的编程语言都很相像,能影响你的思维,帮助你理解其他的编程语言的。之后呢,在好好看看《数据结构》,这很重要。然后再去学学Java语言,因为Android的应用的开发语言用的是Java,所以一定要好好学习。
最后了解下数据库,我们在学习数据库之前都先学了《数据库原理》《离散数学》《关系代数》,有了这些基础之后再去学数据库,数据库也有很多可以选择的,推荐mysql。
加油!