Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android apk獲取root權限執行相應的操作

android apk獲取root權限執行相應的操作

編輯:關於Android編程

在apk中,有時候需要root權限,例如通過apk更新系統庫等system的文件等,避免升級固件,或者在apk中需要直接訪問某些設備等。下面是在apk中獲取root權限的方法,前提是設備已經root過了。
關鍵點在於下面這句,通過執行su產生一個具有root權限的進程:
Process p = Runtime.getRuntime().exec(“su”);
然後,在向這個進程的寫入要執行的命令,即可達到以root權限執行命令:
dos = new DataOutputStream(p.getOutputStream());
dos.writeBytes(cmd + “\n”);
dos.flush();
或者用下面的方式:
Runtime.getRuntime().exec(new String[]{“/system/bin/su”,”-c”, cmd});

經過測試,以root權限執行命令,只在真機上測試成功,在模擬器上沒有成功過。

第一次運行時,會出現請求root權限的界面,選中記住,並允許:

這裡寫圖片描述

測試程序界面,如果已經root,界面中可以顯示出/system分區對應的設備節點:
這裡寫圖片描述

主要文件:RootCmd.java

[java]

package org.ckl.root; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 

import android.util.Log; 

public final class RootCmd { 

    private static final String TAG = "RootCmd"; 
    private static boolean mHaveRoot = false; 

    // 判斷機器Android是否已經root,即是否獲取root權限 
    public static boolean haveRoot() { 
        if (!mHaveRoot) { 
            int ret = execRootCmdSilent("echo test"); // 通過執行測試命令來檢測 
            if (ret != -1) { 
                Log.i(TAG, "have root!"); 
                mHaveRoot = true; 
            } else { 
                Log.i(TAG, "not root!"); 
            } 
        } else { 
            Log.i(TAG, "mHaveRoot = true, have root!"); 
        } 
        return mHaveRoot; 
    } 

    // 執行命令並且輸出結果 
    public static String execRootCmd(String cmd) { 
        String result = ""; 
        DataOutputStream dos = null; 
        DataInputStream dis = null; 

        try { 
            Process p = Runtime.getRuntime().exec("su");// 經過Root處理的android系統即有su命令 
            dos = new DataOutputStream(p.getOutputStream()); 
            dis = new DataInputStream(p.getInputStream()); 

            Log.i(TAG, cmd); 
            dos.writeBytes(cmd + "\n"); 
            dos.flush(); 
            dos.writeBytes("exit\n"); 
            dos.flush(); 
            String line = null; 
            while ((line = dis.readLine()) != null) { 
                Log.d("result", line); 
                result += line; 
            } 
            p.waitFor(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } finally { 
            if (dos != null) { 
                try { 
                    dos.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
            if (dis != null) { 
                try { 
                    dis.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 
        return result; 
    } 

    // 執行命令但不關注結果輸出 
    public static int execRootCmdSilent(String cmd) { 
        int result = -1; 
        DataOutputStream dos = null; 

        try { 
            Process p = Runtime.getRuntime().exec("su"); 
            dos = new DataOutputStream(p.getOutputStream()); 

            Log.i(TAG, cmd); 
            dos.writeBytes(cmd + "\n"); 
            dos.flush(); 
            dos.writeBytes("exit\n"); 
            dos.flush(); 
            p.waitFor(); 
            result = p.exitValue(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } finally { 
            if (dos != null) { 
                try { 
                    dos.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 
        return result; 
    } 
} 

相關文件:SystemPartition.java,獲取/system分區設備節點,並支持重新mount /system為可讀寫:
[java] 
package org.ckl.root; 

import java.io.DataInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 

import android.util.Log; 

public class SystemPartition { 
    private static final String TAG = "SystemMount"; 
    private static String TMP_PATH = "/sdcard/mount.txt"; 
    private static String mMountPiont = null; 
    private static boolean mWriteable = false; 

    private SystemPartition() { 
        Log.i(TAG, "new SystemMount()"); 
    } 

    private static class SystemPartitionHolder { 
        private static SystemPartition instance = new SystemPartition(); 
    } 

    public SystemPartition getInstance() { 
        return SystemPartitionHolder.instance; 
    } 

    public static String getSystemMountPiont() { 
        DataInputStream dis = null; 
        if (mMountPiont == null) {  
            try { 
                RootCmd.execRootCmd("mount > " + TMP_PATH); 
//              Runtime.getRuntime().exec("mount > " + TMP_PATH); 

                dis = new DataInputStream(new FileInputStream(TMP_PATH)); 

                String line = null; 
                int index = -1; 
                while ( (line = dis.readLine()) != null ) { 
                    index = line.indexOf(" /system "); 
                    if (index > 0) { 
                        mMountPiont = line.substring(0, index); 
                        if (line.indexOf(" rw") > 0) { 
                            mWriteable = true; 
                            Log.i(TAG, "/system is writeable !"); 
                        } else { 
                            mWriteable = false; 
                            Log.i(TAG, "/system is readonly !"); 
                        } 
                        break; 
                    } 
                } 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } finally { 
                if (dis != null) { 
                    try { 
                        dis.close(); 
                    } catch (IOException e1) { 
                        e1.printStackTrace(); 
                    } 
                    dis = null; 
                } 

                File f = new File(TMP_PATH); 
                if (f.exists()) { 
                    f.delete(); 
                } 
            } 
        } 

        if (mMountPiont != null) { 
            Log.i(TAG, "/system mount piont: " + mMountPiont); 
        } else { 
            Log.i(TAG, "get /system mount piont failed !!!"); 
        } 

        return mMountPiont; 
    } 

    public static boolean isWriteable() { 
        mMountPiont = null; 
        getSystemMountPiont(); 
        return mWriteable; 
    } 

    public static void remountSystem(boolean writeable) { 
        String cmd = null; 
        getSystemMountPiont(); 
        if (mMountPiont != null && RootCmd.haveRoot()) { 
            if (writeable) { 
                cmd = "mount -o remount,rw " + mMountPiont + " /system"; 
            } else { 
                cmd = "mount -o remount,ro " + mMountPiont + " /system"; 
            } 
            RootCmd.execRootCmdSilent(cmd); 

            isWriteable(); 
        } 
    } 
} 

權限列表:

在Android的設計中,資源的訪問或者網絡連接,要得到這些服務都需要聲明其訪問權限,否則將無法正常工作。在Android中這樣的權限有很多種,這裡將各類訪問權限一一羅列出來,供大家使用時參考之用。

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.ACCESS_CHECKIN_PROPERTIES允許讀寫訪問“properties”表在checkin數據庫中,改值可以修改上傳。

android.permission.ACCESS_COARSE_LOCATION允許一個程序訪問CellID或WiFi熱點來獲取粗略的位置

android.permission.ACCESS_FINE_LOCATION允許一個程序訪問精良位置(如GPS)

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.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.BROADCAST_PACKAGE_REMOVED允許程序廣播一個提示消息在一個應用程序包已經移除後

android.permission.BROADCAST_STICKY允許一個程序廣播常用intents

android.permission.CALL_PHONE允許一個程序初始化一個電話撥號不需通過撥號用戶界面需要用戶確認

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.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.REBOOT請求能夠重新啟動設備

android.permission.RECEIVE_BOOT_COMPLETED允許一個程序接收到ACTION_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.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.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 toopen, 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,顯示在其他所有程序的頂層

android.permission.VIBRATE允許訪問振動設備

android.permission.WAKE_LOCK允許使用PowerManager的 WakeLocks保持進程在休眠時從屏幕消失

android.permission.WRITE_APN_SETTINGS允許程序寫入API設置

android.permission.WRITE_CALENDAR允許一個程序寫入但不讀取用戶日歷數據

可以看出Android中對資源以及服務的訪問都非常嚴格,另外,在程序打包成APK的時候也需要對軟件進行簽名。

獲取精確位置 android.permission.ACCESS_FINE_LOCATION,通過GPS芯片接收衛星的定位信息,定位精度達10米以內

訪問定位額外命令 android.permission.ACCESS_LOCATION_EXTRA_COMMANDS,允許程序訪問額外的定位提供者指令

獲取模擬定位信息 android.permission.ACCESS_MOCK_LOCATION,獲取模擬定位信息,一般用於幫助開發者調試應用

獲取網絡狀態 android.permission.ACCESS_NETWORK_STATE,獲取網絡信息狀態,如當前的網絡連接是否有效

訪問Surface Flinger android.permission.ACCESS_SURFACE_FLINGER,Android平台上底層的圖形顯示支持,一般用於游戲或照相機預覽界面和底層模式的屏幕截圖

獲取WiFi狀態 android.permission.ACCESS_WIFI_STATE,獲取當前WiFi接入的狀態以及WLAN熱點的信息

賬戶管理 android.permission.ACCOUNT_MANAGER,獲取賬戶驗證信息,主要為GMail賬戶信息,只有系統級進程才能訪問的權限

驗證賬戶 android.permission.AUTHENTICATE_ACCOUNTS,允許一個程序通過賬戶驗證方式訪問賬戶管理ACCOUNT_MANAGER相關信息

電量統計 android.permission.BATTERY_STATS,獲取電池電量統計信息

綁定小插件 android.permission.BIND_APPWIDGET,允許一個程序告訴appWidget服務需要訪問小插件的數據庫,只有非常少的應用才用到此權限

綁定設備管理 android.permission.BIND_DEVICE_ADMIN,請求系統管理員接收者receiver,只有系統才能使用

綁定輸入法 android.permission.BIND_INPUT_METHOD,請求InputMethodService服務,只有系統才能使用

綁定RemoteView android.permission.BIND_REMOTEVIEWS,必須通過RemoteViewsService服務來請求,只有系統才能用

綁定壁紙 android.permission.BIND_WALLPAPER,必須通過WallpaperService服務來請求,只有系統才能用

使用藍牙 android.permission.BLUETOOTH,允許程序連接配對過的藍牙設備

藍牙管理 android.permission.BLUETOOTH_ADMIN,允許程序進行發現和配對新的藍牙設備

變成磚頭 android.permission.BRICK,能夠禁用手機,非常危險,顧名思義就是讓手機變成磚頭

應用刪除時廣播 android.permission.BROADCAST_PACKAGE_REMOVED,當一個應用在刪除時觸發一個廣播

收到短信時廣播 android.permission.BROADCAST_SMS,當收到短信時觸發一個廣播

連續廣播 android.permission.BROADCAST_STICKY,允許一個程序收到廣播後快速收到下一個廣播

WAP PUSH廣播 android.permission.BROADCAST_WAP_PUSH,WAPPUSH服務收到後觸發一個廣播

撥打電話 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,改變網絡狀態如是否能聯網

改變WiFi多播狀態 android.permission.CHANGE_WIFI_MULTICAST_STATE,改變WiFi多播狀態

改變WiFi狀態 android.permission.CHANGE_WIFI_STATE,改變WiFi狀態

清除應用緩存 android.permission.CLEAR_APP_CACHE,清除應用緩存

清除用戶數據 android.permission.CLEAR_APP_USER_DATA,清除應用的用戶數據

底層訪問權限 android.permission.CWJ_GROUP,允許CWJ賬戶組訪問底層信息

手機優化大師擴展權限 android.permission.CELL_PHONE_MASTER_EX,手機優化大師擴展權限

控制定位更新 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,允許程序獲取系統dump信息從系統服務

狀態欄控制 android.permission.EXPAND_STATUS_BAR,允許程序擴展或收縮狀態欄

工廠測試模式 android.permission.FACTORY_TEST,允許程序運行工廠測試模式

使用閃光燈 android.permission.FLASHLIGHT,允許訪問閃光燈

強制後退 android.permission.FORCE_BACK,允許程序強制使用back後退按鍵,無論Activity是否在頂層

訪問賬戶Gmail列表 android.permission.GET_ACCOUNTS,訪問GMail賬戶列表

獲取應用大小 android.permission.GET_PACKAGE_SIZE,獲取應用的文件大小

獲取任務信息 android.permission.GET_TASKS,允許程序獲取當前或最近運行的應用

允許全局搜索 android.permission.GLOBAL_SEARCH,允許程序使用全局搜索功能

硬件測試 android.permission.HARDWARE_TEST,訪問硬件輔助設備,用於硬件測試

注射事件 android.permission.INJECT_EVENTS,允許訪問本程序的底層事件,獲取按鍵、軌跡球的事件流

安裝定位提供 android.permission.INSTALL_LOCATION_PROVIDER,安裝定位提供

安裝應用程序 android.permission.INSTALL_PACKAGES,允許程序安裝應用

內部系統窗口 android.permission.INTERNAL_SYSTEM_WINDOW,允許程序打開內部窗口,不對第三方應用程序開放此權限

訪問網絡 android.permission.INTERNET,訪問網絡連接,可能產生GPRS流量

結束後台進程 android.permission.KILL_BACKGROUND_PROCESSES,允許程序調用killBackgroundProcesses(String).方法結束後台進程

管理賬戶 android.permission.MANAGE_ACCOUNTS,允許程序管理AccountManager中的賬戶列表


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved