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

第一步新建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

转载于:https://www.cnblogs.com/Tesi1a/p/7624088.html

更多相关文章

  1. Android应用程序执行流程
  2. Android adb 命令总结_持续更新
  3. 【Android优化】去掉屏幕上方应用程序的名称或标题栏
  4. Android基础之应用程序组件
  5. ZZ android am命令
  6. Android中framework层下添加aidl编译说程序包不存在
  7. sdk 命令
  8. 通过终端命令生成并在手机上运行dex文件
  9. Android系列之利用SharedPreferences是否是第一次进入安装程序

随机推荐

  1. UI_Layout 屬性”@+id”、”@id”和”@an
  2. Android(安卓)selector(背景选择器) , sh
  3. 【Android】Android(安卓)开机广播的使用
  4. Android(安卓)5.1 open data flow 数据开
  5. Android里merge和include标签的使用
  6. Android修改自己程序字体
  7. Android(安卓)Studio下添加assets目录
  8. Android菜单详解
  9. android 获取路径目录方法
  10. 跟大家分享下Android布局文件layout.xml