中国移动互联网研发培训专家Android是一个多进程系统,每一个应用程序(和系统的组成部分)都运行在自己的进程中。在应用程序和系统间的安全通过标准的Linux设备在进程级被执行,例如被分配给应用程序的用户和组ID。额外的细粒度安全特性通过“许可”机制来提供,该机制能够对一个指定进程可实现的特定操作进行约束。中国移动互联网研发培训专家Android安全学中的一个重要的设计点是在默认情况下应用程序没有权限执行对其它应用程序、操作系统或用户有害的操作。这些操作包括读/写用户的隐私数据(例如联系方式或e-mail),读/写其它应用程序的文件,执行网络访问,保持设备活动,等等。应用程序的进程是一个安全的沙箱。它不能干扰其它应用程序,除非在它需要添加原有沙箱不能提供的功能时明确声明权限。这些权限请求能够被不同方式的操作所处理,特别的要基于证书和用户的提示被自动的允许或禁止。权限的请求在那个应用程序中通过一个应用程序被声明为静态的,所以在此之后在安装时或没有改变时它们会预先知道。中国移动互联网研发培训专家所有的Android应用程序(.apk文件)必须通过一个证书的签名,此证书的私钥必须被开发者所掌握。这个证书的标识是应用程序的作者。这个证书不需要通过证书组织的签署:Android应用程序对于使用自签署的证书是完全允许的和特别的。这个证书仅仅被用于与应用程序建立信任关系,不是为了大规模的控制应用程序可否被安装。最重要的方面是通过确定能够访问原始签名权限和能够共享用户ID的签名来影响安全。中国移动互联网研发培训专家安装在设备中的每一个Android包文件(.apk)都会被分配给一个属于自己的统一的Linux用户ID,并且为它创建一个沙箱以防止影响其它应用程序(或者其它应用程序影响它)。用户ID在应用程序安装到设备中时被分配,并且在这个设备中保持它的永久性。因为安全执行发生在进程级,所以一些不同包中的代码在相同进程中不能正常的运行,自从他们需要以不同Linux用户身份运行时。你可以使用每一个包中的AndroidManifest.xml文件中的manifest标签属性sharedUserId拥有它们分配的相同用户ID。通过这样做,两个包被视为相同的应用程序的安全问题被解决了,注意为了保持安全,仅有相同签名(和请求相同sharedUserId标签)的两个应用程序签名将会给相同的用户ID。应用创建的任何文件都会被赋予应用的用户标识,并且,正常情况下不能被其它包访问。当你通过getSharedPreferences(String,int),openFileOutput(String,int)或者openOrCreateDatabase(String,int,SQLiteDatabase.CursorFactory)创建一个新文件时,你可以同时或分别使用MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE标志允许其它包读/写此文件。当设置了这些标志时,这个文件仍然属于你的应用程序,但是它的全局读、写和读写权限已经设置所以其它任何应用程序可以看到它。中国移动互联网研发培训专家一个基本的Android应用程序没有与其相关联的权限,意味着它不能做任何影响用户体验或设备中的数据的有害操作。要利用这个设备的保护特性,在你的应用程序需要时,你必须在AndroidManifest.xml文件中包含一个或更多的uses-permission标签来声明此权限。例如:需要监听来自SMS消息的应用程序将要指定如下内容:manifestxmlns:android=package=com.android.app.myappuses-permissionandroid:name=android.permission.RECEIVE_SMS//manifest中国移动互联网研发培训专家在安装应用程序时,通过包安装器应用程序要通过权限请求的许可,使建立在与应用程序签名的核对下声明对于用户的那些权限和影响。在应用运行期间对用户不做检查:它要么在安装时被授予特定的许可,并且使用想用的特性;要么不被授予许可,并且使得一切使用特性的尝试失败而不提示用户。例如,sendBroadcast(Intent)方法就是当数据被发送给到每个接收器时检查许可的,在方法调用返回之后,因此当许可失败时你不会收到一个异常。然而,几乎在所有例子中,许可失败都会被打印到系统日志中。通常,多次的许可错误会产生抛回至应用程序的SecurityException异常。Android系统提供的许可可以在Manifest.permission中找到。每个引用也可以定义和Enforce它自己的许可,因此这不是全面的所有可能的列表。在程序操作期间,个别权限在一些地方可能被强制:在系统接到呼叫的时候,预防一个应用程序去执行特定的函数。在启动Activity时,防止一个应用启动其它应用程序的Activities。发送和接收Intent广播时,控制谁能接收你的广播或者谁能发送广播给你。在一个内容提供器上访问和操作时。绑定或开始一个服务时。中国移动互联网研发培训专家为了执行你自己的权限,你必须首先在你的AndroidManifest.xml中使用一个或多个permission标签声明它们。例如,一个应用程序想用控制谁能启动一个activities,它可以为声明一个做这个操作的许可,如下:manifestxmlns:android=package=com.me.app.myapppermissionandroid:name=com.me.app.myapp.permission.DEADLY_ACTIVITYandroid:label=@string/permlab_deadlyActivityandroid:description=@string/permdesc_deadlyActivityandroid:permissionGroup=android.permission-group.COST_MONEYandroid:protectionLevel=dangerous//manifest中国移动互联网研发培训专家protectionLevel属性是必需的,告诉系统用户应如何处理应用程序接到请求此权限的通知,或者在这个文档中对这个权限的许可的描述。permissionGroup属性是可选的,仅仅用于帮助系统为用户显示权限。通常,你要设置这些,向一个标准的系统组(列在android.Manifest.permission_group中),或者在更多的情况下要自定义。它更偏向于使用一个已经存在的组,做为简化的权限用户界面显示给用户。注意:应该为每个权限提供标签(label)和描述(description)。当用户浏览权限列表时,它们可以为用户展示字符资源,如(android:label)或者一个许可的详细信息(android:description)。标签(label)比较短,用几个词来描述该权限保护的关键功能。描述(description)应该是一组句子,用于描述获得权限的用户可以做什么。我们写描述的习惯是两句话,第一句声明权限,第二句警告用户如果应用许可该权限时,会发生什么不好的事情。下面是一个CALL_PHONE权限的标签和描述的例子:stringname=permlab_callPhonedirectlycallphonenumbers/stringstringname=permdesc_callPhoneAllowstheapplicationtocallphonenumberswithoutyourintervention.Maliciousapplicationsmay中国移动互联网研发培训专家causeunexpectedcallsonyourphonebill.Notethatthisdoesnotallowtheapplicationtocallemergencynumbers./string你可以在系统中通过shell命令adbshellpmlistpermissions查看权限当前定义。特别,'-s'操作以简单粗略的方式为使用者显示权限:$adbshellpmlistpermissions-sAllPermissions:Networkcommunication:viewWi-Fistate,createBluetoothconnections,fullInternetaccess,viewnetworkstateYourlocation:accessextralocationprovidercommands,fine(GPS)location,mocklocationsourcesfortesting,coarse(network-based)locationServicesthatcostyoumoney:sendSMSmessages,directlycallphonenumbers...中国移动互联网研发培训专家通过AndroidManifest.xml文件可以设置高级权限,以限制访问系统的所有组件或者使用应用程序。所有的这些请求都包含在你所需要的组件中的android:permission属性,命名这个权限可以控制访问此组件。Activity权限(使用activity标签)限制能够启动与Activity权限相关联的组件或应用程序。此权限在Context.startActivity()和Activity.startActivityForResult()期间要经过检查;如果调用者没有请求权限,那么会为调用抛出一个安全异常(SecurityException)。Service权限(应用service标签)限制启动、绑定或启动和绑定关联服务的组件或应用程序。此权限在Context.startService(),Context.stopService()和Context.bindService()期间要经过检查;如果调用者没有请求权限,那么会为调用抛出一个安全异常(SecurityException)。中国移动互联网研发培训专家BroadcastReceiver权限(应用receiver标签)限制能够为相关联的接收者发送广播的组件或应用程序。在Context.se