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
转载于:https://www.cnblogs.com/Tesi1a/p/7624088.html
更多相关文章
- Android应用程序执行流程
- Android adb 命令总结_持续更新
- 【Android优化】去掉屏幕上方应用程序的名称或标题栏
- Android基础之应用程序组件
- ZZ android am命令
- Android中framework层下添加aidl编译说程序包不存在
- sdk 命令
- 通过终端命令生成并在手机上运行dex文件
- Android系列之利用SharedPreferences是否是第一次进入安装程序