看雪里有人问到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的控制台能看到