在安卓系統的機制里面 ,只要是將app復制到系統的system文件/system/app 文件夾中的app,都是系統應用,如果你把系統內置的應用從里面刪除了,也就是徹底移除了作為系統應用的條件 .這就是很多軟件可以刪除 操控系統應用的一個實際干的事情…
當然,要做這個操作,就必須得先root,不然是不可能做到的.
首先 : 可以用adb 命令 ,adb 命令是需要在電腦端完成的.
(不明白adb命令的,可以去看我的博客里面的說明(https://blog.csdn.net/u012930316/article/details/90314634)
可以先把你要設置的app ,復制到sd卡的目錄下面,也就是 /sdcard/
這個操作也可以使用adb來完成
adb push demo.apk /sdcard/
進入手機的shell 命令行:
adb shell
然后切換root 用戶
su root
如圖:
然后解鎖系統分區,就鎖這個分區后,就可以往里面復制我們的app安裝包了 :
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
5.再復制我們第一步時的app 至 系統分區下面的app目錄下面
cat /sdcard/demo.apk > /system/app/demo.apk // 這一步可以用 cp 實現,但一般設備中沒有包含該命令。如果使用 mv 會出現錯誤:
6. mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system // 還原分區屬性,只讀。
然后,關機重啟, 將自己的app設置為系統app就完成了.但是,弄完這一步,并不能保證我們的app能正常運行,還需要進行下面的操作 .
在我們的app中,可能會有 lib 相關的關聯包,你通過這樣的方式引用的,需要手動去復制過去,那么需要進行這樣的操作
首先,在電腦端,用解壓縮工具,將我們的app解壓到某個文件夾下面,在剛才解壓的文件夾下面有個文件夾lib
打開這個文件夾,里面會有三個文件夾,分別對應不同的 系統架構生成的 so文件 ,需要找到合適系統架構的的so文件,復制到 系統分區的lib 目錄中去(/system/lib/) 我這里是小米5的手機,我復制的是 armeabi 這個目錄下面的 so文件.
那么執行步驟 ,
先執行剛才的第一步,把這個so文件,全部復制到 /sdcard/ 就是文件的根目錄下面
再 執行上面的解鎖系統分區 將系統分區解鎖,然后把這個文件 復制到 對應的目錄
如:
cat /sdcard/libsqlcipher.so > /system/lib/libsqlcipher.so
再把系統分區鎖回去,然后,就可以試試app,看會不會崩了.
另外還有一個通過代碼的方式去將自己的app 設定為系統應用 …原理和上面也是一樣的.
代碼貼上… 可以通過按鈕觸發 setSysApp();這個方法即可
/*** 設置為系統應用*/
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变成系统应用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。