【Android】权限篇

怎样使android apk 获取system权限

1.一般权限的添加

一般情况下,设定apk的权限,可在AndroidManifest.xml中添加android:sharedUserId="android.uid.xxx>

例如: 给apk添加system权限

<manifest xmlns:android=“http://schemas.android.com/apk/res/android”
… …
android:sharedUserId=“android.uid.system”>

android.permission.ACCESS_CHECKIN_PROPERTIES
//允许读写访问”properties”表在checkin数据库中,改值可以修改上传
android.permission.ACCESS_COARSE_LOCATION
//允许一个程序访问CellID或WiFi热点来获取粗略的位置
android.permission.ACCESS_FINE_LOCATION
//允许一个程序访问精良位置(如GPS)
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
//允许应用程序访问额外的位置提供命令
android.permission.ACCESS_MOCK_LOCATION
//允许程序创建模拟位置提供用于测试
android.permission.ACCESS_NETWORK_STATE
//允许程序访问有关GSM网络信息
android.permission.ACCESS_SURFACE_FLINGER
//允许程序使用SurfaceFlinger底层特性
android.permission.ACCESS_WIFI_STATE
//允许程序访问Wi-Fi网络状态信息
android.permission.ADD_SYSTEM_SERVICE
//允许程序发布系统级服务
android.permission.BATTERY_STATS
//允许程序更新手机电池统计信息
android.permission.BLUETOOTH
//允许程序连接到已配对的蓝牙设备
android.permission.BLUETOOTH_ADMIN
//允许程序发现和配对蓝牙设备
android.permission.BRICK
//请求能够禁用设备(非常危险
android.permission.BROADCAST_PACKAGE_REMOVED
//允许程序广播一个提示消息在一个应用程序包已经移除后
android.permission.BROADCAST_STICKY
//允许一个程序广播常用intents
android.permission.CALL_PHONE
//允许一个程序初始化一个电话拨号不需通过拨号用户界面需要用户确认
android.permission.CALL_PRIVILEGED
//允许一个程序拨打任何号码,包含紧急号码无需通过拨号用户界面需要用户确认
android.permission.CAMERA
//请求访问使用照相设备
android.permission.CHANGE_COMPONENT_ENABLED_STATE
//允许一个程序是否改变一个组件或其他的启用或禁用
android.permission.CHANGE_CONFIGURATION
//允许一个程序修改当前设置,如本地化
android.permission.CHANGE_NETWORK_STATE
//允许程序改变网络连接状态
android.permission.CHANGE_WIFI_STATE
//允许程序改变Wi-Fi连接状态
android.permission.CLEAR_APP_CACHE
//允许一个程序清楚缓存从所有安装的程序在设备中
android.permission.CLEAR_APP_USER_DATA
//允许一个程序清除用户设置
android.permission.CONTROL_LOCATION_UPDATES
//允许启用禁止位置更新提示从无线模块
android.permission.DELETE_CACHE_FILES
//允许程序删除缓存文件
android.permission.DELETE_PACKAGES
//允许一个程序删除包
android.permission.DEVICE_POWER
//允许访问底层电源管理
android.permission.DIAGNOSTIC
//允许程序RW诊断资源
android.permission.DISABLE_KEYGUARD
//允许程序禁用键盘锁
android.permission.DUMP
//允许程序返回状态抓取信息从系统服务
android.permission.EXPAND_STATUS_BAR
//允许一个程序扩展收缩在状态栏,android开发网提示应该是一个类似Windows Mobile中的托盘程序
android.permission.FACTORY_TEST
//作为一个工厂测试程序,运行在root用户
android.permission.FLASHLIGHT
//访问闪光灯,android开发网提示HTC Dream不包含闪光灯
android.permission.FORCE_BACK
//允许程序强行一个后退操作是否在顶层activities
android.permission.FOTA_UPDATE
//暂时不了解这是做什么使用的,android开发网分析可能是一个预留权限.
android.permission.GET_ACCOUNTS
//访问一个帐户列表在Accounts Service中
android.permission.GET_PACKAGE_SIZE
//允许一个程序获取任何package占用空间容量
android.permission.GET_TASKS
//允许一个程序获取信息有关当前或最近运行的任务,一个缩略的任务状态,是否活动等等
android.permission.HARDWARE_TEST
//允许访问硬件
android.permission.INJECT_EVENTS
//允许一个程序截获用户事件如按键、触摸、轨迹球等等到一个时间流,android开发网提醒算是hook技术吧
android.permission.INSTALL_PACKAGES
//允许一个程序安装packages
android.permission.INTERNAL_SYSTEM_WINDOW
//允许打开窗口使用系统用户界面
android.permission.INTERNET
//允许程序打开网络套接字
android.permission.MANAGE_APP_TOKENS
//允许程序管理(创建、催后、 z- order默认向z轴推移)程序引用在窗口管理器中
android.permission.MASTER_CLEAR
//目前还没有明确的解释,android开发网分析可能是清除一切数据,类似硬格机
android.permission.MODIFY_AUDIO_SETTINGS
//允许程序修改全局音频设置
android.permission.MODIFY_PHONE_STATE
//允许修改话机状态,如电源,人机接口等
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
//允许挂载和反挂载文件系统可移动存储
android.permission.PERSISTENT_ACTIVITY
//允许一个程序设置他的activities显示
android.permission.PROCESS_OUTGOING_CALLS
//允许程序监视、修改有关播出电话
android.permission.READ_CALENDAR
//允许程序读取用户日历数据
android.permission.READ_CONTACTS
//允许程序读取用户联系人数据
android.permission.READ_FRAME_BUFFER
//允许程序屏幕波或和更多常规的访问帧缓冲数据
android.permission.READ_INPUT_STATE
//允许程序返回当前按键状态
android.permission.READ_LOGS
//允许程序读取底层系统日志文件
android.permission.READ_OWNER_DATA
//允许程序读取所有者数据
android.permission.READ_SMS
//允许程序读取短信息
android.permission.READ_SYNC_SETTINGS
//允许程序读取同步设置
android.permission.READ_SYNC_STATS
//允许程序读取同步状态
android.permission.REBOOT
//请求能够重新启动设备
android.permission.RECEIVE_BOOT_COMPLETED
//允许一个程序接收到
android.permission.RECEIVE_MMS
//允许一个程序监控将收到MMS彩信,记录或处理
android.permission.RECEIVE_SMS
//允许程序监控一个将收到短信息,记录或处理
android.permission.RECEIVE_WAP_PUSH
//允许程序监控将收到WAP PUSH信息
android.permission.RECORD_AUDIO
//允许程序录制音频
android.permission.REORDER_TASKS
//允许程序改变Z轴排列任务
android.permission.RESTART_PACKAGES
//允许程序重新启动其他程序
android.permission.SEND_SMS
//允许程序发送SMS短信
android.permission.SET_ACTIVITY_WATCHER
//允许程序监控或控制activities已经启动全局系统中
android.permission.SET_ALWAYS_FINISH
//允许程序控制是否活动间接完成在处于后台时
android.permission.SET_ANIMATION_SCALE
//修改全局信息比例
android.permission.SET_DEBUG_APP
//配置一个程序用于调试
android.permission.SET_ORIENTATION
//允许底层访问设置屏幕方向和实际旋转
android.permission.SET_PREFERRED_APPLICATIONS
//允许一个程序修改列表参数PackageManager.addPackageToPreferred()和PackageManager.removePackageFromPreferred()方法
android.permission.SET_PROCESS_FOREGROUND
//允许程序当前运行程序强行到前台
android.permission.SET_PROCESS_LIMIT
//允许设置最大的运行进程数量
android.permission.SET_TIME_ZONE
//允许程序设置时间区域
android.permission.SET_WALLPAPER
//允许程序设置壁纸
android.permission.SET_WALLPAPER_HINTS
//允许程序设置壁纸hits
android.permission.SIGNAL_PERSISTENT_PROCESSES
//允许程序请求发送信号到所有显示的进程中
android.permission.STATUS_BAR
//允许程序打开、关闭或禁用状态栏及图标Allows an application to open, close, or disable the status bar and its icons.
android.permission.SUBSCRIBED_FEEDS_READ
//允许一个程序访问订阅RSS Feed内容提供
android.permission.SUBSCRIBED_FEEDS_WRITE
//系统暂时保留改设置,android开发网认为未来版本会加入该功能。
android.permission.SYSTEM_ALERT_WINDOW
//允许一个程序打开窗口使用 TYPE_SYSTEM_ALERT,显示在其他所有程序的顶层(Allows an application to open windows using the type TYPE_SYSTEM_ALERT, shown on top of all other applications. )
android.permission.VIBRATE
//允许访问振动设备
android.permission.WAKE_LOCK
//允许使用PowerManager的 WakeLocks保持进程在休眠时从屏幕消失
android.permission.WRITE_APN_SETTINGS
//允许程序写入APN设置
android.permission.WRITE_CALENDAR
//允许一个程序写入但不读取用户日历数据
android.permission.WRITE_CONTACTS
//允许程序写入但不读取用户联系人数据
android.permission.WRITE_GSERVICES
//允许程序修改Google服务地图
android.permission.WRITE_OWNER_DATA
//允许一个程序写入但不读取所有者数据
android.permission.WRITE_SETTINGS
//允许程序读取或写入系统设置
android.permission.WRITE_SMS
//允许程序写短信
android.permission.WRITE_SYNC_SETTINGS
//允许程序写入同步设置

同时还需要在对应的Android.mk中添加LOCAL_CERTIFICATE := platform这一项。即用系统的签名,通过这种方式只能使apk的权限升级到system级别,系统中要求root权限才能访问的文件,apk还是不能访问。

比如在android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,这个函数需要root权限或者运行与系统进程中才可以用。
第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:

    1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。

    2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行

    3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。



    第二个方法是直接把eclipse编出来的apk用系统的签名文件签名

    1. 加入android:sharedUserId="android.uid.system"这个属性。

    2. 使用eclipse编译出apk文件。

    3. 使用目标系统的platform密钥来重新给apk文件签名。首先找到密钥文件,在我ndroid源码目录中的位置是"build/target/product/security",下面的platform.pk8和platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在"build/tools/signapk"下,编译后在out/host/linux-x86/framework下,用法为java -jar signapk.jar  platform.x509.pem platform.pk8 input.apk output.apk"。

加入android:sharedUserId="android.uid.system"这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就有权限来修改系统时间了。

只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。

这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key来签名,程序在模拟器上运行OK,不过放到G3上安装直接提示"Package … has no signatures that match those in shared user android.uid.system",这样也是保护了系统的安全。

怎样使android apk 获取root权限

一般linux 获取root权限是通过执行su命令,那能不能在apk程序中也同样执行一下该命令呢,我们知道在linux编程中,有exec函数族:

int execl(cONst char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle(const char *path, const char *arg, ..., char *const envp[]);

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

int execve(const char *path, char *const argv[], char *const envp[]);

在java中我们可以借助 Runtime.getRuntime().exec(String command)访问底层Linux下的程序或脚本,这样就能执行su命令,使apk具有root权限,能够访问系统中需要root权限才能执行的程序或脚本了,具体例子:

package com.visit.dialoglog;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class VisitRootfileActivity extends Activity {
    private static final String TAG = "VisitRootfileActivity";
    Process process = null;
    Process process1 = null;   
    DataOutputStream os = null;
    DataInputStream is = null;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        try {
            process = Runtime.getRuntime().exec("/system/xbin/su"); /*这里可能需要修改su

   的源代码 (注掉  if (myuid != AID_ROOT && myuid != AID_SHELL) {*/

            os = new DataOutputStream(process.getOutputStream());
            is = new DataInputStream(process.getInputStream());
           os.writeBytes("/system/bin/ls" + " \n");  //这里可以执行具有root 权限的程序了  
            os.writeBytes(" exit \n");
            os.flush();
            process.waitFor();
        } catch (Exception e) {            
            Log.e(TAG, "Unexpected error - Here is what I know:" + e.getMessage());
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
                if (is != null) {
                    is.close();
                }
                process.destroy();
            } catch (Exception e) {
            }
        }// get the root privileges
    }
}

在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am.启动的方法为

$ adb shell
$ su
am start -n {包(package)名}/{包名}.{活动(activity)名称}

程序的入口类可以从每个应用的AndroidManifest.xml的文件中得到,以计算器(calculator)为例,它的

<manifest xmlns:android=“http://schemas.android.com/apk/res/android” …

package=“com.android.calculator2” …>…

由此计算器(calculator)的启动方法为:

am start -n com.android.calculator2/com.android.calculator2.Calculator

一般情况希望,一个Android应用对应一个工程。值得注意的是,有一些工程具有多个活动(activity),而有一些应用使用一个工程。例如:在Android界面中,Music和Video是两个应用,但是它们使用的都是packages/apps/Music这一个工程。而在这个工程的AndroidManifest.xml文件中,有包含了不同的活动(activity)。

Music 和 Video(音乐和视频)的启动方法为:

am start -n com.android.music/com.android.music.MusicBrowserActivity
am start -n com.android.music/com.android.music.VideoBrowserActivity
am start -n com.android.music/com.android.music.MediaPlaybackActivity

启动浏览器 :

am start -a android.intent.action.VIEW -d  http://www.google.cn/

拨打电话 :

am start -a android.intent.action.CALL -d tel:10086

启动 google map直接定位到北京 :

am start -a android.intent.action.VIEW geo:0,0?q=beijing

usage: am [subcommand] [options]

start an Activity: am start [-D] [-W] <INTENT>
    -D: enable debugging
    -W: wait for launch to complete

start a Service: am startservice <INTENT>

send a broadcast Intent: am broadcast <INTENT>

start an Instrumentation: am instrument [flags] <COMPONENT>
    -r: print raw results (otherwise decode REPORT_KEY_STREAMRESULT)
    -e <NAME> <VALUE>: set argument <NAME> to <VALUE>
    -p <FILE>: write profiling data to <FILE>
    -w: wait for instrumentation to finish before returning

start profiling: am profile <PROCESS> start <FILE>
stop profiling: am profile <PROCESS> stop

<INTENT> specifications include these flags:
    [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
    [-c <CATEGORY> [-c <CATEGORY>] ...]
    [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
    [--esn <EXTRA_KEY> ...]
    [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
    [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
    [-n <COMPONENT>] [-f <FLAGS>]
    [--grant-read-uri-permission] [--grant-write-uri-permission]
    [--debug-log-resolution]
    [--activity-brought-to-front] [--activity-clear-top]
    [--activity-clear-when-task-reset] [--activity-exclude-from-recents]
    [--activity-launched-from-history] [--activity-multiple-task]
    [--activity-no-animation] [--activity-no-history]
    [--activity-no-user-action] [--activity-previous-is-top]
    [--activity-reorder-to-front] [--activity-reset-task-if-needed]
    [--activity-single-top]
    [--receiver-registered-only] [--receiver-replace-pending]
    [<URI>]

还有个疑点,就是su怎么知道用户是允许root权限还是反对那?原来是上面提到的白名单起来作用,superuser把用户的选择放入 :
/data/data/com.koushikdutta.superuser/databases/superuser.sqlite 数据库中,然后su进程再去读该数据库来判断是否允许。

static int checkWhitelist()
{
 sqlite3 *db;
 int rc = sqlite3_open_v2(DBPATH, &db, SQLITE_OPEN_READWRITE, NULL);
 if (!rc)
 {
  char *errorMessage;
  char query[1024];
  sprintf(query, "select * from whitelist where _id=%d limit 1;", g_puid);
  struct whitelistCallInfo callInfo;
  callInfo.count = 0;
  callInfo.db = db;
  rc = sqlite3_exec(db, query, whitelistCallback, &callInfo, &errorMessage);
  if (rc != SQLITE_OK)
  {
   sqlite3_close(db);
   return 0;
  }
  sqlite3_close(db);
  return callInfo.count;
 }
 sqlite3_close(db);
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值