Android系统启动执行jar程序

看雪里有人问到android是不是只能执行apk程序?
除了原生程序和脚本外,android是可以启动执行封装java程序的jar包的。
实现流程如下:
流程

第一步新建java程序

public class Main {
public static void main(String[] args) {
    for(int i=1;i<10;i++){
        System.out.println("this is the test index"+i);
    }
}
}

并将程序导出为jar命令为test.jar包。

第二步,将javajar包转为androidjar包。

1.首先,找到dx工具所在文件夹,如android-sdk/build-tools/20.0.0,并将该文件夹加入到环境变量PATH中;

2.其次,执行编译命令dx –dex –output=classes123.dex test.jar
3.再将dex文件打包成android版本的jar,aapt add testandroid.jar classes123.dex
4.将该jar包push到手机的/system/framework目录下
5.修改jar包的权限为777

2.编写一个linux shell脚本

2.1.新建一个文本,命名为run_bktools.sh

base=/system
export CLASSPATH=$base/framework/testandroid.jar

exec app_process base/bincom.jaytang.linux.Main"@”

CLASSPATH为jar包的路径,com.larack.bktools.BKMain为jar包的main函数所在的类,”$@”表示把当前参数传入到main中。
2.2.将该sh文件run_bktools.sh push到手机/system/bin目录下,并且修改权限为777

2.3.最后测试利用sh脚本启动jar包
./run_bktools.sh

实现root shell命令的android程序如下:

package com.example.androidshell;

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

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import android.os.Build;

public class MainActivity extends Activity {
    private static final String TAG = "shell";
    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);
        //查看返回值 如果是-1就fail
        if (result == -1) {
            Toast.makeText(getApplicationContext(), "fail", 0).show();
        } else {
            Toast.makeText(getApplicationContext(), "sucess", 0).show();
        }
    }
//执行shell命令的方法
    private int execRootCmdsilent(String cmd) {
        int result =-1;
        DataOutputStream dos=null;
        try {
            //申请su权限
            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) {
            // TODO: handle exception
            Log.i(TAG,"fail execRootCmdSilent("+cmd+")"+result);
        }finally{
            if(dos!=null)
            {
                try {
                    dos.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

        }

        return result;
    }

}

最后在eclispe的控制台能看到

这里写图片描述

参考:http://www.cnblogs.com/larack/p/4139766.html

posted @ 2016-08-17 14:31  Tesi1a  阅读(323)  评论(0编辑  收藏  举报