Android以root起一個process[shell腳本的方法]

有時候咱們寫的app要用uid=0的方式啓動一個process,framework層和app層是作不到的,只有經過寫腳本,利用am來實現。下面是具體步驟:java

1.建立一個包含Main()方法Java project

1.1.建立一個Java projectlinux

1.2.添加Main()方法android

1.3.導出爲jar包shell

1.4.將java 版本的jar變成android 版本的jarapp

首先,找到dx工具所在文件夾,如android-sdk/build-tools/20.0.0,並將該文件夾加入到環境變量PATH中;ide

其次,執行編譯命令dx --dex --output=classes.dex  BKTools.jar函數

最後,將dex文件打包成android版本的jar,aapt add BKTools.jar classes.dex工具

1.5.將該jar包push到手機的/system/framework目錄下測試

1.6.修改jar包的權限爲777ui

2.編寫一個linux shell腳本

2.1.新建一個文本,命名爲run_bktools.sh

輸入如下代碼:

# Script to start "am" on the device, which has a very rudimentary
# shell.
#
base=/system export CLASSPATH=$base/framework/BKTools.jar exec app_process $base/bin com.larack.bktools.BKMain "$@"
CLASSPATH爲jar包的路徑,com.larack.bktools.BKMain爲jar包的main函數所在的類,"$@"表示把當前參數傳入到main中。

2.2.將該sh文件run_bktools.sh push到手機/system/bin目錄下,而且修改權限爲777

2.3.測試利用sh腳本啓動jar包

OK,啓動成功啦。

3.在android app中啓動shell腳本

3.1.建立一個android project

3.2.用root起shell腳本

package com.larackbkapp;

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

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends Activity {

    private static final String TAG = "AAA";

    private static final String CMD = "run_bktools.sh";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        int result = -1;
        result = execRootCmdSilent(CMD);
        if (-1 == result)
            Toast.makeText(this, "start fail.", Toast.LENGTH_LONG).show();
        else
            Toast.makeText(this, "start success.", Toast.LENGTH_LONG).show();
    }

    public 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();
            Log.i(TAG, "Success execRootCmdSilent(" + cmd + ")=" + result);
        } catch (Exception e) {
            e.printStackTrace();
            Log.e(TAG,
                    "execRootCmdSilent(" + cmd + "),Exception:"
                            + e.getMessage());
        } finally {
            if (dos != null) {
                try {
                    dos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

3.3.檢驗shell是否成功叫起

將手機連上電腦,編譯執行bkapp,用adb logcat檢查是否打有「Success execRootCmdSilent.."字樣,觀察手機上是否顯示「start success.」

檢驗OK,我就再也不截圖了。

此時後臺也在執行咱們在Jar包中寫的代碼了,若是,咱們在Jar包中寫一個本身的 ActivityManagerSerive,PowerManagerSerive或者,其餘,都將是以root運行的。

相關文章
相關標籤/搜索