生活随笔
收集整理的這篇文章主要介紹了
修改安卓系统应用,将自己的app变成系统应用(需要root)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在安卓系統的機制里面 ,只要是將app復制到系統的system文件/system/app 文件夾中的app,都是系統應用(不可刪除同時獲取了系統的最高權限).在做開發的時候,有的情況需要獲取到系統權限但是拿不到系統的簽名(廠商編譯源碼時輸出的),就會想到搞一下這個系統應用.
當然,要做這個操作,就必須得先root,不然是不可能做到的.
root的具體教程還請自行查詢,畢竟機型以及刷機包版本種類太多了
以下操作為root成功以后
準備工作
- adb環境 打開命令行終端
adb version 查看 配置好環境變量直接使用
- 連接電腦進入手機root模式
這個操作也可以使用adb來完成
adb push demo.apk /sdcard/
進入手機的shell 命令行:
adb shell
然后切換root 用戶
su root
這個"#"就是獲得root權限的標志 - 解鎖system分區
mount -o rw,remount,rw /system - 復制apk到system分區
cat /sdcard/demo.apk > /system/app/demo.apk
這里要羅嗦一下,有的手機廠商會修改這個system分區位置,我們可以在su root 命令后使用ls命令逐級查看
- 還原分區屬性,只讀
mount -o remount,ro -t remount,rw /system
關機重啟, 這樣自己的app就設置為系統app了.
[注]以上操作并不能保證app可以正常運行,需要對libs里文件進行copy
操作如下:
1.將app解壓到一個文件夾如圖
打開這個文件夾,里面會有三個文件夾,分別對應不同的 系統架構生成的 so文件 ,需要找到合適系統架構的的so文件,復制到 系統分區的lib 目錄中去(/system/lib/)
重復以上步驟–>copy到/sdcard/ -->system分區解鎖–>copy到目標文件 -->鎖system分區
參考命令如下:
cat /sdcard/libsqlcipher.so > /system/lib/libsqlcipher.so
以上操作也可以使用代碼實現如下:
public void setSysApp() {final Runnable runnable = new Runnable() {@Overridepublic void run() {// 解鎖系統分區String s = "mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system";CMDUtils.upgradeRootPermission(s);//s="cat /sdcard/demo.apk > /system/app/demo.apk";CMDUtils.upgradeRootPermission(s);s="cat /sdcard/libsqlcipher.so > /system/lib/libsqlcipher.so";CMDUtils.upgradeRootPermission(s);s="mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system ";CMDUtils.upgradeRootPermission(s);}};new ExecutorUtil(runnable).execute();
}public class ExecutorUtil extends Thread{final static ExecutorService cachedThreadPool = Executors.newCachedThreadPool();private Runnable runnable;public ExecutorUtil(Runnable runnable){this.runnable=runnable;}@Overridepublic void run() {try{Looper.prepare();new Handler().post(runnable);//在子線程中直接去new 一個handlerLooper.loop();//這種情況下,Runnable對象是運行在子線程中的,可以進行聯網操作,但是不能更新UI}catch (Exception e){e.printStackTrace();}}public void execute() {cachedThreadPool.execute(this);}
}
// 獲取系統權限的方式執行public static String upgradeRootPermission(String cmd) {Log.i(TAG, "執行開始");//String pkgCodePath = "/sdcard";Process process = null;DataOutputStream os = null;try {process = Runtime.getRuntime().exec("su"); //切換到root帳號os = new DataOutputStream(process.getOutputStream());os.writeBytes(cmd + "\n");os.writeBytes("exit\n");os.flush();process.waitFor();StringBuilder successMsg = new StringBuilder();StringBuilder errorMsg = new StringBuilder();BufferedReader successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));BufferedReader errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));String s;while ((s = successResult.readLine()) != null) {successMsg.append(s);}while ((s = errorResult.readLine()) != null) {errorMsg.append(s);}
// cmdRsult = new CMD_Result(result, errorMsg.toString(),
// successMsg.toString());Log.i(TAG, successMsg.toString() + "執行完成" + errorMsg.toString());return successMsg.toString();} catch (Exception e) {Log.e(TAG, "異常 upgradeRootPermission: ", e);} finally {Log.i(TAG, "執行完成finally");try {if (os != null) {os.close();}process.destroy();} catch (Exception e) {}}return null;}
參考病毒先生文章
總結
以上是生活随笔為你收集整理的修改安卓系统应用,将自己的app变成系统应用(需要root)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。