http://blog.csdn.net/iefreer/archive/2009/09/10/4537371.aspx
Android 是一个多进程系统,每个应用程序(以及系统的部分)运行在它自己的进程里。大多数程序和系统之间的安全性通过基础的 Linux 机制在进程级别进行支持,如分配给应用程序的用户和群组 IDs 。更多细化的安全特性通过“许可”机制来提供,它实施对一个进程能够执行的特定操作方面的限制,和对于每个 URI 的特定数据段的特许访问的授权。
Android 安全架构中的一个设计要点是在默认情况下应用程序没有权限执行对其它应用程序、操作系统或用户有害的操作。这些操作包括读 / 写用户的隐私数据(例如联系方式或 e-mail ),读 / 写其它应用程序的文件,执行网络访问,保持设备激活,等等。
每一个 Android 应用程序( .apk 文件)都会在安装时就分配一个独有的 Linux 用户 ID ,这就为它建立了一个沙盒,使其不能与其他应用程序进行接触(也不会让其它应用程序接触它)。这个用户 ID 会在安装时分配给它,并在该设备上一直保持同一个数值。
由于安全性限制措施是发生进程级,所以两个 package 中的代码不会运行在同一个进程当中,他们要作为不同的 Linux 用户出现。我们可以通过使用 AndroidManifest.xml 文件中的 manifest 标签中的 sharedUserId 属性,来使不同的 package 共用同一个用户 ID 。通过这种方式,这两个 package 就会被认为是同一个应用程序,拥有同一个用户 ID (实际不一定),并且拥有同样的文件存取权限。注意:为了保持安全,只有当两个应用程序被同一个签名签署的时候(并且请求了同一个 sharedUserId )才会被分配同样的用户 ID.
所有存储在应用程序中的数据都会赋予一个属性 - 该应用程序的用户 ID, 这使得其他 package 无法访问这些数据。当通过这些方法 getSharedPreferences(String, int) , openFileOutput(String, int) , 或者 openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory) 来创建一个新文件时,你可以通过使用 MODE_WORLD_READABLE 与 / 或 MODE_WORLD_WRITEABLE 标志位来设置是否允许其他 package 来访问读写这个文件。当设置这些标志位时,该文件仍然属于该应用程序,但是它的全局读写权限已经被设置,使得它对于其他任何应用程序都是可见的。
当我们需要获取某个权限的时候就必须在我们的manifest文件中声明
<uses-permission>
通常情况下我们不需要为自己的应用程序声明某个权限,除非你提供了供其他应用程序调用的代码或者数据。这个时候你才需要使用
<permission>
这个标签。很显然这个标签可以让我们声明自己的权限。
<permission
android:name="com.android.launcher.permission.WRITE_SETTINGS"
android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
android:protectionLevel="normal"
android:label="@string/permlab_write_settings"
android:description="@string/permdesc_write_settings"/>
创建了一个权限。
<provider
android:name="LauncherProvider"
android:authorities="com.android.launcher.settings"
android:writePermission="com.android.launcher.permission.WRITE_SETTINGS"
android:readPermission="com.android.launcher.permission.READ_SETTINGS" />
在PROVIDER里增加这个权限,表明谁想用这个权限旧的声明
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />