Android权限分析

Android权限分析
Android权限分析

Android权限分析

一.Linux 权限介绍

Linux 系统同 Unix 系统一样,通过信任状(credential)把进程与一个特定的用户或用户组捆绑在一起。信任状决定了每个进程能做什么,不能做什么,从而保证整个系统的数据完整性和整体稳定性。

1.文件类型

Linux 中的文件共有如下几种类型,由于 Android 中不同类型的文件会通过不同的方式来设置权限位,故简单介绍 Linux 中的文件类型如下:

1).普通文件。对应 system.img 和 ramdisk.img 中的所有文件。

2).目录文件。对应 system.img 和 ramdisk.img 中的所有目录。

3).块特殊文件。基本存在于 /sys、/proc 和 /dev 三个目录中。

4).字符特殊文件。基本存在于 /sys、/proc 和 /dev 三个目录中。

5).FIFO。用于进程间通信,也叫命名管道,只能由相关进程使用。

6).套接字。用于网络间进程通信,也可用于本机的非网络通信。一般都在

/dev/socket 下。

7).符号链接。指向另一个文件。

注:查看文件详细信息时,文件类型显示在文件权限位的前面。命令:

ls -l 或 ll 命令

2.文件访问权限位

文件访问权限位的组成:

u(owner) | g(group) | o(other)

r w x r w x r w x

4 2 1 4 2 1 4 2 1

注:修改文件权限时使用 chmod 命令,格式如下:

chmod path 644

chmod path 777

二.Android 权限管理概述

Android 是一个多进程系统,每一个应用程序(不论是 C 或 C++ 编译而成的二进制程序,还是运行在 dalvik 虚拟机中的 APK 包格式的 Java 程序)都运行在自己的进程中。

Android 使用标准的 Linux 功能集实现了大多数应用程序和系统之间的安全性,例如通过被分配给应用程序的用户和用户组 ID,但该权限粒度较大,一般用于控制进程可访问的具体资源和设备。Android 中更细粒度的安全特性则通过“许可”机制来提供,该机制能够对一个指定进程可实现的特定操作进行约束。

1.文件系统中的权限设定

Android 系统编译完成后会生成三个后缀为img 的文件,ramdisk.img、system.img、userdata.img,各自包含许多目录和文件。Android 系统编译时会使用两个 Android 命令 mkbootfs 和 mkyaffs2image 来生成这些 img文件,这两个命令都会调用文件 android_filesystem_config.h 中预制的权限,来写入这些目录和文件资源初始的访问权限。

下面列出该文件内容,并给出了相应的修改实例(红色字体标出):

文件: system/core/include/private/android_filesystem_config.h

/*

* Copyright (C) 2007 The Android Open Source Project

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* https://www.360docs.net/doc/407166499.html,/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/

/* This file is used to define the properties of the filesystem

** images generated by build tools (mkbootfs and mkyaffs2image) and

** by the device side of adb.

*/

#ifndef _ANDROID_FILESYSTEM_CONFIG_H_

#define _ANDROID_FILESYSTEM_CONFIG_H_

#include

#include

#include

/* This is the master Users and Groups config for the platform.

** DO NOT EVER RENUMBER.

*/

#define AID_ROOT 0 /* traditional unix root user */

#define AID_SYSTEM 1000 /* system server */

#define AID_RADIO 1001 /* telephony subsystem, RIL */

#define AID_BLUETOOTH 1002 /* bluetooth subsystem */

#define AID_GRAPHICS 1003 /* graphics devices */

#define AID_INPUT 1004 /* input devices */

#define AID_AUDIO 1005 /* audio devices */

#define AID_CAMERA 1006 /* camera devices */

#define AID_LOG 1007 /* log devices */

#define AID_COMPASS 1008 /* compass device */

#define AID_MOUNT 1009 /* mountd socket */

#define AID_WIFI 1010 /* wifi subsystem */

#define AID_ADB 1011 /* android debug bridge (adbd) */

#define AID_INSTALL 1012 /* group for installing packages */

#define AID_MEDIA 1013 /* mediaserver process */

#define AID_DHCP 1014 /* dhcp client */

#define AID_SDCARD_RW 1015 /* external storage write access */

#define AID_VPN 1016 /* vpn system */

#define AID_KEYSTORE 1017 /* keystore subsystem */

#define AID_SHELL 2000 /* adb and debug shell user */

#define AID_CACHE 2001 /* cache access */

#define AID_DIAG 2002 /* access to diagnostic resources */

/* The 3000 series are intended for use as supplemental group id's only.

* They indicate special Android capabilities that the kernel is aware of. */ #define AID_NET_BT_ADMIN 3001 /* bluetooth: create any socket */

#define AID_NET_BT 3002 /* bluetooth: create sco, rfcomm or l2cap sockets */

#define AID_INET 3003 /* can create AF_INET and AF_INET6 sockets */ #define AID_NET_RAW 3004 /* can create raw INET sockets */

#define AID_NET_ADMIN 3005 /* can configure interfaces and routing tables. */

#define AID_MISC 9998 /* access to misc storage */

#define AID_NOBODY 9999

#define AID_APP 10000 /* first app user */

#if !defined(EXCLUDE_FS_CONFIG_STRUCTURES)

struct android_id_info {

const char *name;

unsigned aid;

};

static struct android_id_info android_ids[] = {

{ "root", AID_ROOT, },

{ "system", AID_SYSTEM, },

{ "radio", AID_RADIO, },

{ "bluetooth", AID_BLUETOOTH, },

{ "graphics", AID_GRAPHICS, },

{ "input", AID_INPUT, },

{ "audio", AID_AUDIO, },

{ "camera", AID_CAMERA, },

{ "log", AID_LOG, },

{ "compass", AID_COMPASS, },

{ "mount", AID_MOUNT, },

{ "wifi", AID_WIFI, },

{ "dhcp", AID_DHCP, },

{ "adb", AID_ADB, },

{ "install", AID_INSTALL, },

{ "media", AID_MEDIA, },

{ "shell", AID_SHELL, },

{ "cache", AID_CACHE, },

{ "diag", AID_DIAG, },

{ "net_bt_admin", AID_NET_BT_ADMIN, },

{ "net_bt", AID_NET_BT, },

{ "sdcard_rw", AID_SDCARD_RW, },

{ "vpn", AID_VPN, },

{ "keystore", AID_KEYSTORE, },

{ "inet", AID_INET, },

{ "net_raw", AID_NET_RAW, },

{ "net_admin", AID_NET_ADMIN, },

{ "misc", AID_MISC, },

{ "nobody", AID_NOBODY, },

};

#define android_id_count \

(sizeof(android_ids) / sizeof(android_ids[0]))

struct fs_path_config {

unsigned mode;

unsigned uid;

unsigned gid;

const char *prefix;

};

/* Rules for directories.

** These rules are applied based on "first match", so they

** should start with the most specific path and work their

** way up to the root.

*/

static struct fs_path_config android_dirs[] = {

{ 00770, AID_SYSTEM, AID_CACHE, "cache" },

{ 00771, AID_SYSTEM, AID_SYSTEM, "data/app" },

{ 00771, AID_SYSTEM, AID_SYSTEM, "data/app-private" },

{ 00771, AID_SYSTEM, AID_SYSTEM, "data/dalvik-cache" },

{ 00771, AID_SYSTEM, AID_SYSTEM, "data/data" },

{ 00771, AID_SHELL, AID_SHELL, "data/local/tmp" },

{ 00771, AID_SHELL, AID_SHELL, "data/local" },

{ 01771, AID_SYSTEM, AID_MISC, "data/misc" },

{ 00770, AID_DHCP, AID_DHCP, "data/misc/dhcp" },

{ 00771, AID_SYSTEM, AID_SYSTEM, "data" },

{ 00750, AID_ROOT, AID_SHELL, "sbin" },

{ 00755, AID_ROOT, AID_SHELL, "system/bin" },

{ 00755, AID_ROOT, AID_SHELL, "system/xbin" },

{ 00755, AID_ROOT, AID_ROOT, "system/etc/ppp" },

{ 00777, AID_ROOT, AID_ROOT, "sdcard" },

/* 新增目录的权限在此处添加 */

{ 00755, AID_ROOT, AID_ROOT, 0 },

};

/* Rules for files.

** These rules are applied based on "first match", so they

** should start with the most specific path and work their

** way up to the root. Prefixes ending in * denotes wildcard

** and will allow partial matches.

*/

static struct fs_path_config android_files[] = {

{ 00440, AID_ROOT, AID_SHELL, "system/etc/init.goldfish.rc" },

{ 00550, AID_ROOT, AID_SHELL, "system/etc/init.goldfish.sh" },

{ 00440, AID_ROOT, AID_SHELL, "system/etc/init.trout.rc" },

{ 00550, AID_ROOT, AID_SHELL, "system/etc/init.ril" },

{ 00550, AID_ROOT, AID_SHELL, "system/etc/init.testmenu" },

{ 00550, AID_DHCP, AID_SHELL, "system/etc/dhcpcd/dhcpcd-run-hooks" },

{ 00440, AID_BLUETOOTH, AID_BLUETOOTH, "system/etc/dbus.conf" },

{ 00440, AID_BLUETOOTH, AID_BLUETOOTH, "system/etc/bluetooth/main.conf" },

{ 00440, AID_BLUETOOTH, AID_BLUETOOTH, "system/etc/bluetooth/input.conf" },

{ 00440, AID_BLUETOOTH, AID_BLUETOOTH, "system/etc/bluetooth/audio.conf" },

{ 00444, AID_NET_BT, AID_NET_BT, "system/etc/bluetooth/blacklist.conf" },

{ 00640, AID_SYSTEM, AID_SYSTEM, "system/etc/bluetooth/auto_pairing.conf" },

{ 00444, AID_RADIO, AID_AUDIO, "system/etc/AudioPara4.csv" },

{ 00555, AID_ROOT, AID_ROOT, "system/etc/ppp/*" },

{ 00644, AID_SYSTEM, AID_SYSTEM, "data/app/*" },

{ 00644, AID_SYSTEM, AID_SYSTEM, "data/app-private/*" },

{ 00644, AID_APP, AID_APP, "data/data/*" },

/* the following two files are INTENTIONALLY set-gid and not set-uid.

* Do not change. */

{ 02755, AID_ROOT, AID_NET_RAW, "system/bin/ping" },

{ 02750, AID_ROOT, AID_INET, "system/bin/netcfg" },

/* the following five files are INTENTIONALLY set-uid, but they * are NOT included on user builds. */

{ 06755, AID_ROOT, AID_ROOT, "system/xbin/su" },

{ 06755, AID_ROOT, AID_ROOT, "system/xbin/librank" },

{ 06755, AID_ROOT, AID_ROOT, "system/xbin/procrank" },

{ 06755, AID_ROOT, AID_ROOT, "system/xbin/procmem" },

{ 06755, AID_ROOT, AID_ROOT, "system/xbin/tcpdump" },

{ 04770, AID_ROOT, AID_RADIO, "system/bin/pppd-ril" },

/* the following file is INTENTIONALLY set-uid, and IS included

* in user builds. */

{ 06750, AID_ROOT, AID_SHELL, "system/bin/run-as" },

{ 00755, AID_ROOT, AID_SHELL, "system/bin/*" },

{ 00755, AID_ROOT, AID_SHELL, "system/xbin/*" },

{ 00750, AID_ROOT, AID_SHELL, "sbin/*" },

{ 00755, AID_ROOT, AID_ROOT, "bin/*" },

{ 00750, AID_ROOT, AID_SHELL, "init*" },

/* BEGIN Helgan added.

/* 新增文件的权限在此处添加 */

/* END Helgan added */

{ 00644, AID_ROOT, AID_ROOT, 0 },

};

static inline void fs_config(const char *path, int dir,

unsigned *uid, unsigned *gid, unsigned *mode)

{

struct fs_path_config *pc;

int plen;

pc = dir ? android_dirs : android_files;

plen = strlen(path);

for(; pc->prefix; pc++){

int len = strlen(pc->prefix);

if (dir) {

if(plen < len) continue;

if(!strncmp(pc->prefix, path, len)) break;

continue;

}

/* If name ends in * then allow partial matches. */

if (pc->prefix[len -1] == '*') {

if(!strncmp(pc->prefix, path, len - 1)) break;

} else if (plen == len){

if(!strncmp(pc->prefix, path, len)) break;

}

}

*uid = pc->uid;

*gid = pc->gid;

*mode = (*mode & (~07777)) | pc->mode;

#if 0

fprintf(stderr,"< '%s' '%s' %d %d %o >\n",

path, pc->prefix ? pc->prefix : "", *uid, *gid, *mode);

#endif

}

#endif

#endif

2.设备类文件的权限

1) .设备文件

Android 系统中,kernel 启动后启动的第一个上层进程为 init 进程,init 进程会打开定义为NETLINK_KOBJECT_UEVENT 15的 socket,来接收内核发送的添

加和删除设备的 uevnet消息。并根据 devices.c 文件中定义的数组 devperms 中的权限给相应的设备节点设置权限位。新增设备文件或修改设备文件的权限和所

有者时,可通过修改该数组实现。

该数组定义和相应的修改位置如下:

文件 system/core/init/devices.c

static struct perms_ devperms[] = {

{ "/dev/null", 0666, AID_ROOT, AID_ROOT, 0 },

{ "/dev/zero", 0666, AID_ROOT, AID_ROOT, 0 },

{ "/dev/full", 0666, AID_ROOT, AID_ROOT, 0 },

{ "/dev/ptmx", 0666, AID_ROOT, AID_ROOT, 0 },

{ "/dev/tty", 0666, AID_ROOT, AID_ROOT, 0 },

{ "/dev/random", 0666, AID_ROOT, AID_ROOT, 0 },

{ "/dev/urandom", 0666, AID_ROOT, AID_ROOT, 0 },

{ "/dev/ashmem", 0666, AID_ROOT, AID_ROOT, 0 },

{ "/dev/binder", 0666, AID_ROOT, AID_ROOT, 0 },

/* logger should be world writable (for logging) but not readable */

{ "/dev/log/", 0662, AID_ROOT, AID_LOG, 1 },

/* the msm hw3d client device node is world writable/readable. */

{ "/dev/msm_hw3dc", 0666, AID_ROOT, AID_ROOT, 0 },

/* gpu driver for adreno200 is globally accessible */

{ "/dev/kgsl", 0666, AID_ROOT, AID_ROOT, 0 },

/* these should not be world writable */

{ "/dev/diag", 0660, AID_RADIO, AID_RADIO, 0 },

{ "/dev/diag_arm9", 0660, AID_RADIO, AID_RADIO, 0 },

{ "/dev/android_adb", 0660, AID_ADB, AID_ADB, 0 },

{ "/dev/android_adb_enable", 0660, AID_ADB, AID_ADB, 0 }, { "/dev/ttyMSM0", 0600, AID_BLUETOOTH, AID_BLUETOOTH, 0 },

{ "/dev/ttyHS0", 0600, AID_BLUETOOTH, AID_BLUETOOTH, 0 },

{ "/dev/uinput", 0660, AID_SYSTEM, AID_BLUETOOTH, 0 },

{ "/dev/alarm", 0664, AID_SYSTEM, AID_RADIO, 0 },

{ "/dev/tty0", 0660, AID_ROOT, AID_SYSTEM, 0 },

{ "/dev/graphics/", 0660, AID_ROOT, AID_GRAPHICS, 1 },

{ "/dev/msm_hw3dm", 0660, AID_SYSTEM, AID_GRAPHICS, 0 },

{ "/dev/input/", 0660, AID_ROOT, AID_INPUT, 1 },

{ "/dev/eac", 0660, AID_ROOT, AID_AUDIO, 0 },

{ "/dev/cam", 0660, AID_ROOT, AID_CAMERA, 0 },

{ "/dev/pmem", 0660, AID_SYSTEM, AID_GRAPHICS, 0 },

{ "/dev/pmem_adsp", 0660, AID_SYSTEM, AID_AUDIO, 1 },

{ "/dev/pmem_camera", 0660, AID_SYSTEM, AID_CAMERA, 1 },

{ "/dev/oncrpc/", 0660, AID_ROOT, AID_SYSTEM, 1 },

{ "/dev/adsp/", 0660, AID_SYSTEM, AID_AUDIO, 1 },

{ "/dev/snd/", 0660, AID_SYSTEM, AID_AUDIO, 1 },

{ "/dev/mt9t013", 0660, AID_SYSTEM, AID_SYSTEM, 0 },

{ "/dev/msm_camera/", 0660, AID_SYSTEM, AID_SYSTEM, 1 },

{ "/dev/akm8976_daemon",0640, AID_COMPASS, AID_SYSTEM, 0 },

{ "/dev/akm8976_aot", 0640, AID_COMPASS, AID_SYSTEM, 0 },

{ "/dev/akm8973_daemon",0640, AID_COMPASS, AID_SYSTEM, 0 },

{ "/dev/akm8973_aot", 0640, AID_COMPASS, AID_SYSTEM, 0 },

{ "/dev/bma150", 0640, AID_COMPASS, AID_SYSTEM, 0 },

{ "/dev/cm3602", 0640, AID_COMPASS, AID_SYSTEM, 0 },

{ "/dev/akm8976_pffd", 0640, AID_COMPASS, AID_SYSTEM, 0 },

{ "/dev/lightsensor", 0640, AID_SYSTEM, AID_SYSTEM, 0 },

{ "/dev/msm_pcm_out", 0660, AID_SYSTEM, AID_AUDIO, 1 },

{ "/dev/msm_pcm_in", 0660, AID_SYSTEM, AID_AUDIO, 1 },

{ "/dev/msm_pcm_ctl", 0660, AID_SYSTEM, AID_AUDIO, 1 },

{ "/dev/msm_snd", 0660, AID_SYSTEM, AID_AUDIO, 1 },

{ "/dev/msm_mp3", 0660, AID_SYSTEM, AID_AUDIO, 1 },

{ "/dev/audience_a1026", 0660, AID_SYSTEM, AID_AUDIO, 1 },

{ "/dev/tpa2018d1", 0660, AID_SYSTEM, AID_AUDIO, 1 },

{ "/dev/msm_audpre", 0660, AID_SYSTEM, AID_AUDIO, 0 },

{ "/dev/msm_audio_ctl", 0660, AID_SYSTEM, AID_AUDIO, 0 },

{ "/dev/htc-acoustic", 0660, AID_SYSTEM, AID_AUDIO, 0 },

{ "/dev/vdec", 0660, AID_SYSTEM, AID_AUDIO, 0 },

{ "/dev/q6venc", 0660, AID_SYSTEM, AID_AUDIO, 0 },

{ "/dev/snd/dsp", 0660, AID_SYSTEM, AID_AUDIO, 0 },

{ "/dev/snd/dsp1", 0660, AID_SYSTEM, AID_AUDIO, 0 },

{ "/dev/snd/mixer", 0660, AID_SYSTEM, AID_AUDIO, 0 },

{ "/dev/smd0", 0640, AID_RADIO, AID_RADIO, 0 },

{ "/dev/qemu_trace", 0666, AID_SYSTEM, AID_SYSTEM, 0 },

{ "/dev/qmi", 0640, AID_RADIO, AID_RADIO, 0 },

{ "/dev/qmi0", 0640, AID_RADIO, AID_RADIO, 0 },

{ "/dev/qmi1", 0640, AID_RADIO, AID_RADIO, 0 },

{ "/dev/qmi2", 0640, AID_RADIO, AID_RADIO, 0 },

/* CDMA radio interface MUX */

{ "/dev/ts0710mux", 0640, AID_RADIO, AID_RADIO, 1 },

{ "/dev/ppp", 0660, AID_RADIO, AID_VPN, 0 }, { "/dev/tun", 0640, AID_VPN, AID_VPN, 0 },

/* BEGIN Helgan added */

/* 新增设备时添加到此处 */

/* END Helgan added */

{ NULL, 0, 0, 0, 0 },

};

2).其他文件

其他由 kernel 或 init及其脚本创建的文件,如果需要修改访问权限,可以通过通过 init 程序使用的脚本文件控制,但不建议直接修改 init.rc 文件,而

应该集中在和硬件相关的或新增的 init.vendore.rc 脚本文件中修改,这样做的

好处是集中管理,便于移植和版本升级。

原始的 init.c 文件中会解析加载两个 init 脚本文件,代码如下:文件 system/core/init/init.c

……

open_devnull_stdio();

log_init();

INFO("reading config file\n");

parse_config_file("/init.rc"); /* 加载标准的 init 脚本文件 */

/* pull the kernel commandline and ramdisk properties file in */

qemu_init();

import_kernel_cmdline(0);

get_hardware_name();

snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware); /* 硬件相关 init 脚本 */ parse_config_file(tmp);

action_for_each_trigger("early-init", action_add_queue_tail);

drain_action_queue();

INFO("device init\n");

device_fd = device_init();

property_init();

……

其中和硬件相关的脚本文件名称由从 kernel 中传入的 /proc/cmdline 节点解析组合而来。

如在高通平台为 init.qcom.rc,修改在脚本文件的相应位置添加如下代码即可:

# BEGIN Helgan added.

chown system system /proc/driver/audiocontrolproc/pointercal

chmod 644 /proc/driver/audiocontrolproc/pointercal

# END Helgan added.

3.Android 上层应用即 APK 权限的实现

Android 上层使用的细粒度权限控制不是本文讨论的重点,下面给出 SDK 中的一段标准说明,已翻译。如有不明请参考最新的 SDK 文档。

Android的安全与权限

Android是一个多进程系统,每一个应用程序(和系统的组成部分)都运行在自己的进程中。在应用程序和系统间的安全通过标准的Linux设备在进程级被执行,例如被分配给应用程序的用户和组ID。额外的细粒度安全特性通过“许可”

机制来提供,该机制能够对一个指定进程可实现的特定操作进行约束。

安全结构

应用程序签名

用户标识和文件访问

权限命名

权限的声明和支持

在AndroidManifest.xml文件中支持权限

发送广播时支持权限

其它权限的支持

URI权限

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文件中包含一个或更多的

标签来声明此权限。

例如:需要监听来自SMS消息的应用程序将要指定如下内容:

在安装应用程序时,通过包安装器应用程序要通过权限请求的许可,使建立在与应用程序签名的核对下声明对于用户的那些权限和影响。在应用运行期间对用户不做检查:它要么在安装时被授予特定的许可,并且使用想用的特性;要么不被授予许可,并且使得一切使用特性的尝试失败而不提示用户。

例如,sendBroadcast(Intent)方法就是当数据被发送给到每个接收器时检查许可的,在方法调用返回之后,因此当许可失败时你不会收到一个异常。然而,几乎在所有例子中,许可失败都会被打印到系统日志中。通常,多次的许可错误会产生抛回至应用程序的SecurityException异常。

Android系统提供的许可可以在Manifest.permission中找到。每个引用也可以定义和Enforce它自己的许可,因此这不是全面的所有可能的列表。

在程序操作期间,个别权限在一些地方可能被强制:

?在系统接到呼叫的时候,预防一个应用程序去执行特定的函数。

?在启动Activity时,防止一个应用启动其它应用程序的Activities。

?发送和接收Intent广播时,控制谁能接收你的广播或者谁能发送广播给你。

?在一个内容提供器上访问和操作时。

?绑定或开始一个服务时。

为了执行你自己的权限,你必须首先在你的AndroidManifest.xml中使用一

个或多个标签声明它们。

例如,一个应用程序想用控制谁能启动一个activities,它可以为声明一个做这个操作的许可,如下:

属性是必需的,告诉系统用户应如何处理应用程序接到请求此权限的通知,或者在这个文档中对这个权限的许可的描述。

属性是可选的,仅仅用于帮助系统为用户显示权限。通常,你要设置这些,向一个标准的系统组(列在android.Manifest.permission_group中),或者在更多的情况下要自定义。它更偏向于使用一个已经存在的组,做为简化的权限用户界面显示给用户。

注意:应该为每个权限提供标签(label) 和描述(description)。当用户浏览权限列表时,它们可以为用户展示字符资源,如(android:label) 或者一个许可的详细信息( android:description) 。标签(label)比较短,用几个词来描述该权限保护的关键功能。描述(description)应该是一组句子,用于描述获得权限的用户可以做什么。我们写描述的习惯是两句话,第一句声明权限,第二句警告用户如果应用许可该权限时,会发生什么不好的事情。

下面是一个CALL_PHONE权限的标签和描述的例子:

你可以在系统中通过shell命令adb shell pm list permissions查看权限当前定义。特别,'-s' 操作以简单粗略的方式为使用者显示权限:

在AndroidManifest.xml文件中支持权限

通过AndroidManifest.xml文件可以设置高级权限,以限制访问系统的所有组件或者使用应用程序。所有的这些请求都包含在你所需要的组件中的android:permission属性,命名这个权限可以控制访问此组件。

Activity 权限(使用标签) 限制能够启动与Activity 权限相关联的组件或应用程序。此权限在Context.startActivity()和Activity.startActivityForResult()期间要经过检查;如果调用者没有请求权限,那么会为调用抛出一个安全异常

( SecurityException )。

Service权限(应用标签)限制启动、绑定或启动和绑定关联服务的组件或应用程序。此权限在Context.startService(), Context.stopService()和

Context.bindService()期间要经过检查;如果调用者没有请求权限,那么会为调用抛出一个安全异常( SecurityException )。

BroadcastReceiver权限(应用标签)限制能够为相关联的接收者发送

广播的组件或应用程序。在Context.sendBroadcast()返回后此权限将被检查,同时系统设法将广播递送至相关接收者。因此,权限失败将会导致抛回给调用者一个异常;它将不能递送到目的地。在相同方式下,可以使Context.registerReceiver()支持一个权限,使其控制能够递送广播至已登记节目接收者的组件或应用程序。其它的,当调用Context.sendBroadcast()以限制能够被允许接收广播的广播接收者对象一个权限(见下文)。

ContentProvider权限(使用标签)用于限制能够访问ContentProvider

中的数据的组件或应用程序。(Content providers 有一个重要的附加安全设施可用于它们调用被描述后的URI权限。) 不同于其它组件,它有两个不相连系的权限属性要设置:android:readPermission用于限制能够读取提供器的组件或应用程序, android:writePermission用于限制能够写入提供器的组件或应用程序。注意,如果一个提供者的读写权限受保护,意思是你只能从提供器中读,而没有写权限。当你首次收回提供者(如果你没有任何权限,将会抛出一个SecurityException 异常),那么权限要被检查,并且做为你在这个提供者上的执行操作。使用ContentResolver.query()请求获取读权限; 使用ContentResolver.insert(), ContentResolver.update()和ContentResolver.delete()请求获取写权限。在所有这些情况下,一个SecurityException异常从一个调用者那里抛出时不会存储请求权限结果。

发送广播时支持权限

当发送一个广播时你能总指定一个请求权限,此权限除了权限执行外,其它能发送Intent到一个已注册的BroadcastReceiver的权限均可以。通过调用

Context.sendBroadcast()及一些权限字符串, 为了接收你的广播,你请求一个接收器应用程序必须持有那个权限。

注意,接收者和广播者都能够请求一个权限。当这样的事发生了,对于Intent

来说,这两个权限检查都必须通过,为了交付到共同的目的地。

其它权限支持

任意一个好的粒度权限都能够在一些调用者的一个服务中被执行。和Context.checkCallingPermission() method. 方法一起被完成。调用并产生一个需要的权限字符串,它将返回一个整型,以确定当前调用进程是否被许可。注意,仅仅当你执行的调用进入到其它进程的时候这些才会被使用,通常,通过IDL接口从一个服务发布,或从一些其它方式通知其它进程。

这有许多其它有益的方式去检查权限。如果你有一个其它进程的PID,你可以使用上下文的方法Context.checkPermission(String, int, int)检查权限违反PID。如果你有一个其它应用程序的包名, 你可以使用直接的包管理器方法PackageManager.checkPermission(String, String)去查看特定的包是否被指定的权

限所许可。

迄今为止,在与内容提供器共同使用时,标准权限系统描述通常是不充分的。一个内容提供器要保护它自己及读和写权限,当为了它们产生作用,它的直接客户端总是需要手动的对其它应用程序指定URI。一个典型的例子是邮件应用程序中的附件。访问邮件的权限应该被保护,因为这是敏感用户数据。可以,如果一个网址图片附件提供给一个图片查看器,那个图片查看器将没有权限打开这个附件,因为它没有原因去拥有一个权限从而不能访问所有的电子邮件。

对于这个问题的解决是通过网址权限:当开始一个活动或对一个活动返回一个结果,调用者可通过设置Intent.FLAG_GRANT_READ_URI_PERMISSION和

Intent.FLAG_GRANT_WRITE_URI_PERMISSION中的一个或者两个。允许接收活动权限访问在Intent中特定的数据地址,不论它有权限访问数据在内容提供器相应的Intent中。

这种机制允许一个公用的功能性模型使用户相互交互(打开一个附件,从一个列表中选择一个联系人,等等)驱动ad-hoc在优粒度权限的许可下。这可能是一个主要设备,应用程序为了减少这个权限而需要,仅仅直接关系到它们的行为。这优粒度URI权限的许可工作,然而,请求一些协作和内容提供者保持那些URI。强烈推荐内容提供者实现这种设备,并且通过android:grantUriPermissions属性或者标签声明支持它。

更多信息可以在Context.grantUriPermission(), Context.revokeUriPermission(), 和Context.checkUriPermission()方法中找到。

权限说明大全

程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 各种权限说明如下: android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问”properties”表在checkin数据库中,改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get upload ed) android.permission.ACCESS_COARSE_LOCATION 允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location) android.permission.ACCESS_FINE_LOCATION 允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location) android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands) android.permission.ACCESS_MOCK_LOCA TION 允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing) android.permission.ACCESS_NETWORK_STA TE 允许程序访问有关GSM网络信息(Allows applications to access information about networks) android.permission.ACCESS_SURFACE_FLINGER 允许程序使用SurfaceFlinger底层特性(Allows an application to use SurfaceF linger’s low level features) android.permission.ACCESS_WIFI_STATE 允许程序访问Wi-Fi网络状态信息(Allows applications to access information about Wi-Fi networks) android.permission.ADD_SYSTEM_SERVICE 允许程序发布系统级服务(Allows an application to publish system-level services). android.permission.BA TTERY_STATS 允许程序更新手机电池统计信息(Allows an application to update the collected battery statistics) android.permission.BLUETOOTH 允许程序连接到已配对的蓝牙设备(Allows applications to connect to paired bluetooth devices) android.permission.BLUETOOTH_ADMIN 允许程序发现和配对蓝牙设备(Allows applications to discover and pair bluetooth devices) android.permission.BRICK 请求能够禁用设备(非常危险)(Required to be able to disable the device (very *erous!).) android.permission.BROADCAST_PACKAGE_REMOVED 允许程序广播一个提示消息在一个应用程序包已经移除后(Allows an application to broadcast a notification that an application package has been removed) android.permission.BROADCAST_STICKY 允许一个程序广播常用intents(Allows an application to broadcast sticky intents) android.permission.CALL_PHONE

Android权限清单

允许读写访问"properties"表在checkin数据库中,改值可以修改上传 允许一个程序访问CellID或WiFi热点来获取粗略的位置 允许一个程序访问精良位置(如GPS) < uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" > 允许应用程序访问额外的位置提供命令 允许程序创建模拟位置提供用于测试 允许程序访问有关GSM网络信息 允许程序使用SurfaceFlinger底层特性 允许程序访问Wi-Fi网络状态信息 允许程序发布系统级服务 允许程序更新手机电池统计信息 允许程序连接到已配对的蓝牙设备 允许程序发现和配对蓝牙设备 请求能够禁用设备 允许程序广播一个提示消息在一个应用程序包已经移除后 允许一个程序广播常用intents

Android用户权限列表

我们在安装Android软件的时候,系统会提示该软件所需要的权限,相对于其他系统,android的权限非常多。我们在开发软件的时候,也需要声明相应的权限,比如希望软件能发短信,需要声明软件调用短信的权限,否则软件运行的时候就会报错。 Android的权限在AndroidManifest.xml文件里配置。AndroidManifest文件中有四个标签与permission有关,它们分别是 。其中最常用的是 ,当我们需要获取某个权限的时候就必须在我们的manifest文件中声明 。 [html]view plain copy 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... 11. 12. 的作用相似,两者之间的不同之处, 是android预定义的权限,是自己定义的权 限。 用的相对较少, 这两个标签就更少见了,简单说 就是声明一个标签,该标签代 表了一组permissions,而是为一组permissions声明了一个namespace。后面三个标签具体使用方法见后续文章。 定义方法如下:

Android permission 访问权限说明手册

Android permission 访问权限说明手册 tech.er 2011年2月12日 android平台上的权限许可分得很细,如果软件无法正常执行时,首先要检查是不是缺少相关的permission声明,以下就把permission 访问权限列举出来供大家参考。 程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问”properties”表在checkin数据库中,改值可以修改上传( Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded) android.permission.ACCESS_COARSE_LOCATION 允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location) android.permission.ACCESS_FINE_LOCATION 允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location) android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands) android.permission.ACCESS_MOCK_LOCATION 允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing) android.permission.ACCESS_NETWORK_STATE 允许程序访问有关GSM网络信息(Allows applications to access information about networks) android.permission.ACCESS_SURFACE_FLINGER 允许程序使用SurfaceFlinger底层特性(Allows an application to use SurfaceFlinger’s low level features) android.permission.ACCESS_WIFI_STATE 允许程序访问Wi-Fi网络状态信息(Allows applications to access information about Wi-Fi networks) android.permission.ADD_SYSTEM_SERVICE 允许程序发布系统级服务(Allows an application to publish system-level services). android.permission.BATTERY_STATS 允许程序更新手机电池统计信息(Allows an application to update the collected battery statistics) android.permission.BLUETOOTH

Android权限大全

Android权限大全 允许程序写入外部存储,如SD卡上写文件 录音 允许编写短信 允许读写系统设置项 允许程序读写系统安全敏感的设置项 允许程序写入Google Map服务数据 写入联系人,但不可读取 写入日程,但不可读取 写入网络GPRS接入点设置 允许程序在手机屏幕关闭后后台进程仍然运行 允许振动 允许程序使用SIP视频服务 允许程序请求验证从AccountManager 更新设备状态 显示系统窗口 入或修改订阅内容的数据库 访问订阅信息的数据库

安卓平板电脑ROOT权限说明

安卓平板电脑ROOT权限说明 就在我前面一节中就给大家提到过ROOT相关问题,此篇将给大家详细讲解ROOT权限,如果你以前经常去各大论坛一定也会接触到“ROOT”,他的出现频率很高,在各个论坛上,网友的字里行间经常会出现,那么ROOT权限是什么呢?可以给我们带来怎样的好处呢? 什么是root,我需要它做什么? root就是平板电脑的神经中枢,它可以访问和修改你平板电脑几乎所有的文件,这些东西可能是生产平板电脑的公司不愿意你修改和触碰的东西,因为他们有可能影响到平板电脑的稳定,还容易被一些黑客入侵(Root是Linux等类UNIX系统中的超级管理员用户帐户,该帐户拥有整个系统至高无上的权利,所有对象他都有可以操作的权利,所以很多黑客在入侵系统时,都要把权限提升到Root权限,就是将自己的非法帐户添加到Root用户组。类比于Administrator是Windows NT内核系统中的超级管理员用户帐户,也拥有最高的权限。但不同的是,在WINDOWS下Administrator的资源和别的用户资源是共享的,简单的说,别的用户可以访问Administrator的文件。而Linux中,别的用户是不能访问Root用户的家目录(/root)下文件的。因此,Linux比Windows更安全) 既然root权限这么重要,我们为什么还要去获取它? 其实用root的权限主要是因为我们很多东西是受限制的,我们只能利用这些权限来做我们被限制的去做的事情,比如Google禁止我们看到市场里很多免费或付费软件,我们可以用Marketenabler进去看;很多朋友只能看不能下,不能绑定gmail,我们可以修改hosts 来搞定他们,但这些都需要root权限(由于Root权限对于系统具有最高的统治权,便可方便的对于系统的部件进行删除或更改。对于玩家而言,最大的诱惑是在于“刷机”,只有获得Root权限,我们便可随心所欲地对自己的爱机进行“重新包装”,感受新版本软件的优点) 取得root的好处? 1 可以备份系统 2 使用高级的程序例如资源管理器 3 修改系统的程序 4 把程序安装在SD卡上(默认是不支持的) 绝大多数自制的rom都已经获取了root,如果你的rom没有的话,就要自己取得。 很重要的提示:如果你的平板电脑是行货,在保修之内,获取root就会丧失保修的权利。不知道通过以上内容,你是否对root权限有了更为透彻的了解了呢?当然ROOT也应该根据我们所需,如果你是个爱玩,爱研究平板电脑的机友,那么root权限就会对你很重要,但是如果你只是用平板电脑看看网页,看看电影,上上QQ,那么root显然和你没什么关系

安卓开发手机权限大全

android.permission.ACCESS_NETWORK_STATE允许程序访问有关GSM网络信息(Allowsapplications to access information about networks) android.permission.ACCESS_WIFI_STATE允许程序访问Wi-Fi网络状态信息(Allowsapplications to access information about Wi-Fi networks) android.permission.BLUETOOTH允许程序连接到已配对的蓝牙设备(Allowsapplications to connect to paired bluetooth devices) android.permission.BLUETOOTH_ADMIN允许程序发现和配对蓝牙设备(Allowsapplicationsto discover and pair bluetooth devices) android.permission.CHANGE_WIFI_STATE允许程序改变Wi-Fi连接状态(Allowsapplications to change Wi-Fi connectivity state) android.permission.DEVICE_POWER允许访问底层电源管理(Allowslow-level access to power management)

android.permission.DISABLE_KEYGUARD允许程序禁用键盘锁(Allowsapplications to disable the keyguard ) android.permission.EXPAND_STATUS_BAR允许一个程序扩展收缩在状态栏,Android开发网提示应该是一个类似WindowsMobile中的托盘程序(Allows an application to expand or collapse the status bar.) android.permission.GET_DETAILED_TASKS 检索正在运行的应用的详细信息,恶意程序可借此获得其他应用的私密信息 android.permission.GET_TASKS 检索正在运行的应用,可用于了解当前设备上使用了哪些应用 android.permission.INJECT_EVENTS 将自身的输入事件(例如按键)提供给其他应用,恶意程序可坚持控制手机 android.permission.INTERNAL_SYSTEM_WINDOW 允许创建未授权的内部系统窗口,普通应用绝不应该使用此权限

AndroidManifest.xml配置文件详解

AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅。下面是一个标准的AndroidManifest.xml文件样例。 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. . . . 33. 34. 35. 36. 37. 38. . . . 39. 40.

Android权限说明

Android权限分的很细,但命名比较人性化,Android permission比SymbianCapabilities有了不少改进,下面就来看看权限许可都有哪些定义吧,发现还是比较繁多的,如果发现你的程序某个地方调试错误很可能是Androidpermission 的访问控制在作怪,这也是为了安全防止手机成为病毒的场所。Android开发网获取到的消息来看不用购买高昂的数字签名证书,权限许可权由用户决定而不是手机制造商和平台提供商,这一点不得不说明为Android开发人员着想,下面的信息都是需要添加在androidmanifest.xml文件中。 程序执行需要读取到安全敏感项必需在androidmanifest.xml 中声明相关权限请求,Android开发网已经翻译并使用中英文对照 android.permission.ACCESS_CHECKIN_PROPERTIES允许读写访问"properties"表在checkin数据库中,改值可以修改上传( Allows read/write access to the "properties" table inthe checkin database, to change values that get uploaded) android.permission.ACCESS_COARSE_LOCATION允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi)location) android.permission.ACCESS_FINE_LOCATION允许一个程序访问精良位置(如GPS) (Allows an application to access fine(e.g., GPS) location)

android的用户权限

android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问”properties”表在checkin数据库中,改值可以修改上传( Allows read/write access to the “properties”table in the checkin database, to change values that get uploaded) android.permission.ACCESS_COARSE_LOCA TION 允许一个程序访问CellID或WiFi热点来获取粗略的位置(Allows an application to access coarse (e.g., Cell-ID, WiFi) location) android.permission.ACCESS_FINE_LOCA TION 允许一个程序访问精良位置(如GPS) (Allows an application to access fine (e.g., GPS) location) android.permission.ACCESS_LOCA TION_EXTRA_COMMANDS 允许应用程序访问额外的位置提供命令(Allows an application to access extra location provider commands) android.permission.ACCESS_MOCK_LOCA TION 允许程序创建模拟位置提供用于测试(Allows an application to create mock location providers for testing) android.permission.ACCESS_NETWORK_STA TE 允许程序访问有关GSM网络信息(Allows applications to access information about networks) android.permission.ACCESS_SURFACE_FLINGER 允许程序使用SurfaceFlinger底层特性(Allows an application to use SurfaceFlinger’s low level features) android.permission.ACCESS_WIFI_STA TE 允许程序访问Wi-Fi网络状态信息(Allows applications to access information about Wi-Fi networks) android.permission.ADD_SYSTEM_SERVICE 允许程序发布系统级服务(Allows an application to publish system-level services). android.permission.BA TTERY_STA TS 允许程序更新手机电池统计信息(Allows an application to update the collected battery statistics) android.permission.BLUETOOTH 允许程序连接到已配对的蓝牙设备(Allows applications to connect to paired bluetooth devices) android.permission.BLUETOOTH_ADMIN 允许程序发现和配对蓝牙设备(Allows applications to discover and pair bluetooth devices) android.permission.BRICK 请求能够禁用设备(非常危险)(Required to be able to disable the device (very *erous!).)

Android开发之- API包类最全面说明

android-->包含应用平台和在定义应用程序所用到android系统功能的应用权限的资料文件类, android.accessibilityservice-->这个包中的类用于为无障碍服务的开发提供替代或增强的反馈给用户 android.accounts--> android.animation-->这些类提供动画系统的功能特性,它允许使用任何类型的动画对象属性,int,float和16进制颜色值都是默认支持的,也可以通过自定义一个动画让告诉应用按你的设置去运行 android.app-->封装好的Andorid全部应用程序模型类 android.app.admin-->提供系统级的设备管理功能,允许您创建安全感知的应用程序用于android系统企业级别的设置,如可以让你的应用程序也能执行屏幕锁定,屏幕亮度调节、出厂设置等功能 android.app.backup-->此包下的类包含了备份和修复应用程度功能的,如果用户清除设备上的数据或升级到一个新的系统,当应用程序在重新安装时可通过已启用的备份用于修复用户之前的数据 android.appwidget-->此包下的类包含在创建一个应用小部件时所必需要组件,用户可将它嵌入在其他应用程序(如主屏幕),无需启动一个新的活动就可快速访问自身应用程序的数据和服务, android.bluetooth-->此包下的类提供手机蓝牙管理功能,例如搜索设备,连接设备,管理设备之间的数据的传输, android.content-->设备上的数据访问和发布。 android.content.pm-->此包下的类提供访问一个应用包的相应信息,信息内容包括:活动,权限,服务,应用签名,提供者, android.content.res-->此包下的类用于访问应用程序的资源,例如:原文件,颜色,图片,多媒体等,和一些可影响设备运行的重要配置的详细信息 android.database-->此包下类的用于探索通过内容提供者返回的数据 android.database.sqlite-->此包下类的包含SQLITE数据库管理类,用于一个应用程序去管理的它所拥有的私有的数据库 android.drm-->此包下的用于管理DRM系统机制和控件DRM机制的插件的功能,DRM解释:DRM提供一套机制对用户使用手机上的媒体内容(如ringtong, mp3等)进行限制,如限制拷贝给第三方,限制使用次数或时限等,从而保护内容提供商的权利, android.gesture-->此包下的类用于创建,识别,加载,保存一个手势 android.graphics-->此包下的类提供一些低级的绘图功具,例如:画布,颜色过滤,顶点坐标,和长方形以便于发开者的绘图直接处理在设备屏幕上, android.graphics.drawable.shapes-->此包下的类用于几何绘图 android.hardware-->提供支持硬件功能的类,例如:照像机和其它传感器 android.hardware.input--> https://www.360docs.net/doc/407166499.html,b-->提供支持android系统设备的USB接口与外围设备的相连 android.inputmethodservice-->输入法的基类 android.location-->包括的类用于定义android地理位置和与此关系的服务 android.media-->提供管理各种各样音频和视频接口的类 android.media.audiofx-->提供管理多媒体框架中实现的音频效果的 android.media.effect-->提供允许你运用各种图像和视频的视觉效果的类 android.mtp-->提供的API让你直接连接照像机和其它设备与之互动,

Android权限控制权限监控

Android权限管理机制 1.Android权限管理。 Android权限来限制一些有限制的特性在应用程序之间以及应用组件访问功能的访问。在Android的发展,我们将满足网络的需要,我们需要添加所需的网络权限: 在开发中如果我们使用了某个权限,如果没有在AndroidManifest.xml文件中相应申明,那么程序会运行有错误且提示:https://www.360docs.net/doc/407166499.html,ng.SecurityException: Permission Denial ... 我们可以根据这个错误提示,一般情况下,在AndroidManifest.xml中通过增加相应的uses-permission Android权限列表: 在Android官方文档中查寻我们需要使用的权限。 https://www.360docs.net/doc/407166499.html,/reference/android/Manifest.permission.html 不同的api有着不同的权限,会出现兼容性问题。 2.Android自定义权限: 在有些场合我们或许会碰到如下的场景:用户在应用程序中进行操作时候,要启动另外一个应用程序的时候,我们一般是打开一个应用程序。并且进入Activity。有些情况,程序处于安全需要,这些操作就需要加上访问权限。Android提供了自定义权限功能。 有时候,我们可能遇到如下需求场景:当用户在一个应用程序中进行某项操作时,会启动另假设应用程序。在A中有MainActivity,应用程序B中有AActivity和BActivity。现在想通过A中的MainActivity直接打开B中的BActivity。 那么,如果不考虑权限,A中的MainActivity如何直接打开B中的BActivity呢?一般,可以通过如下方式: 1 public class MainActivity extends Activity { 2 3 private Button button; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(https://www.360docs.net/doc/407166499.html,yout.activity_main); 9 10 button = (Button)findViewById(R.id.button); 11 button.setOnClickListener(new View.OnClickListener() {

基于权限分类的Android静态检测

基于权限分类的Android应用程序的静态分析 吴俊昌1,骆培杰1,程绍银1,王嘉捷2,蒋凡1 (1. 中国科学技术大学信息安全测评中心,合肥230027;2. 中国信息安全测评中心,北京100085) 摘要:Android系统有着严格的权限管理机制,应用程序需要获得相应的权限才可以在Android系统上运行。本文提出了一种基于Android权限分类的静态分析方法,用于检测Android应用程序的恶意代码。为了便于处理Android中的大量权限,将其权限划分成四个等级,并将能与外界进行信息交互的权限视为锚点,引入灰函数来描述其他权限所对应的函数,然后利用块与函数变量关联表生成引擎构建块和函数变量关联表,采用静态污点传播和其他静态分析技术相结合的方法对变量关联表进行分析。实验结果表明该方法在分析Android应用程序时是有效的,能够大大减少人为的分析难度和强度。 关键字:恶意应用;软件分析;静态分析;Android 中图分类号:TP302.1 文献标识码:A Static Analysis of Android Apps Based on Permission classification WU Junchang1, LUO Peijie1, CHENG Shaoyin1, WANG Jiajie2, JIANG Fan1 (1. Information Technology Security Evaluation Center, University of Science and Technology of China, Hefei 230027, China; 2. China Information Technology Security Evaluation Center, Beijing 100085, China) Abstract: Android has a strict management mechanism of permissions. If an application wants to run on Android, it must have some suitable permissions. In this paper, a permission-based algorithm of static analysis is presented, which is applied to detect malcode of Android apps. In order to deal with so many permissions, these permissions are divided into four groups. And set the permissions, which can interact with internet or smartphones, as sink function. Use grey function to describe other permissions. Then use block and function analyzer to construct variables’ associating table of block and function. At last use static taint propagation and other static methods to analyze the variables’ associating table. The result of experiment proves that the algorithm is efficient, also can help analyst-programmer reduce the difficulty and intensity of work. Keywords: malware; software analysis; static analysis; Android 随着科学技术的进步和生产力水平的不断提高以智能手机为代表的便携式智能终端便在时下流行起来。与以前的个人计算机的发展所面临的问题一样,智能手机上的安全问题日益凸显出来。智能手机不但有丰富的功能,而且还可以添加各种扩充功能的软件,这就为恶意软件提供生存环境,且智能手机可以保存用户各种帐号及密码等涉及用户隐私的信息,从而给智能手机用户带来巨大经济损失和精神上伤害。 恶意软件虽然是在智能手机上运行的,但是其在各种特征上与在计算机上运行的软件并无很大差异,所以完全可以借鉴传统的软件分析技术对其进行分析。随着软件业的发展,计算机软件分析技术也得到了迅速的发展[1]。静态分析是一种不需运行软件就可以对软件进行分析的过程,常见的有:数据流分析、控制流分析、类型分析等;符号执行[2,3]也 收稿日期: 2011-05-31 基金项目:中央高校基本科研业务费专项资金资助(WK0110000007) 作者简介:吴俊昌(1986-),男(汉),安徽,硕士研究生 通讯作者: 程绍银,讲师,E-mail: sycheng@https://www.360docs.net/doc/407166499.html, 是常用的分析技术,是一种路径敏感的分析策略,需综合考虑路径调度、约束求解等问题。 Android系统有着严格的权限管理机制,应用软件如果想在系统中运行就必须要有相应的运行权

教你完全弄懂Android系统的权限

安卓学堂第一课,教你完全弄懂Android系统的权限来源:dospy智能手机网作者:白鸽男孩 24375次点击发表于:2011-11-15 13:00:11 白鸽曾经在塞班上办过系列学堂,反响还不错,现在打算在安卓上也开设系列课程,希望大家喜欢。白鸽安卓学堂第一课,给大家讲讲手机上最常见的权限知识。 以大家最熟悉的Root Explorer文件管理器为例,我们经常需要用到菜单里的“Permissions”选项来给文件或文件夹设置权限,而这个权限的设置界面就像是一个九宫格一样,我们只需要在里面勾选或者取消勾选就完成了权限的设置。 九宫格的三列分别为Read、Write、Execute,分别对应读取、写入和执行三种权限,三行则是Owner、Group和Others,分别对应所有者、用户组和其它三组账户。 如果我们把电脑上的文件复制到手机的存储卡里,则该文件的默认权限总是如下表所示:

▲左为Windows上的文件在Android系统里的默认权限,右为文件列表里显示的权限 不过细心的朋友可能会发现,我们所勾选的权限,在文件列表中却是另外一种显示模式,比如上述九宫格默认权限显示在列表里却是---rwxr-x,这样的表述方法又是怎么来的呢? 理解起来其实很简单,---rwxr-x总共是九个字符,而九宫格也一共有九个勾选选项,首先没有勾选的选项我们一律用字符-表示,而对于勾选了的选项,只需结合其所对应的列来看就能同样轻松写出对应的字符:如果对应的列是Read,那么就写作r,如果对应的列是Write,那么就写作w,如果对应的列是Execute,那么就写作x,其实都是这三个单词的缩写,非常容易记忆。 好吧,现在让我们按照从左到右、从上到下的顺序来看,那么这个九宫格的写法就很容易推导出是---rwxr-x了。

相关文档
最新文档