android apk獲取root許可權執行相應的操作 demo除錯
阿新 • • 發佈:2019-01-05
在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中的賬戶列表