author : Wan Jing, the absolute dust
Reprint Please famous source : http://blog.csdn.net/shulianghan/article/details/36438365
Sample code Download :
-- CSDN : http://download.csdn.net/detail/han1202012/7639253;
-- GitHub : https://github.com/han1202012/TracerouteAndBusybox;
1. Principles and Ideas
file permission modification cannot be implemented : If No root privileges , you cannot change the file permissions of a binary file;
-- push BusyBox to Android : use adb push command to pass BusyBox to SD card, note that uploading to memory is not possible;
-- upload to SD card success : Use the file full path name command in the ADB push file name phone ;
[Email protected]:~/csdn$ adb push busybox-armv7l/sdcard/octopus/busybox3256 kb/s (1109128 bytes in 0.332s)
--
failed to upload to memory: Failed to upload to memory using ADB push because ADB uses the system user and only the root user has permission to write data to memory;
[Email protected]:~/csdn$ adb push busybox-armv7l/data/busyboxfailed to copy ' busybox-armv7l ' to '/data/busybox ': Permis Sion denied
--
failed to view and modify BusyBox permissions: System user does not have permission to modify SD card file mode;
[Email Protected]:/sdcard/octopus $ ll-rw-rw-r--root sdcard_rw 1109128 2014-07-08 19:49 busybox[email Protected]:/sdcard/octopus $ chmod 755 busybox Unable to chmod busybox:operation not permitted
Application Solutions :
-- application-specific user : The Android operating system will set up a user for each application, which has full access to the files under its installation directory (/data/data/package name/);
-- Copy the executable binaries to the installation directory : The cross-compiled busybox is placed in the res/assets/directory under the project directory;
2. Implementation Strategy
File Initial placement : The cross-compiled BusyBox file is placed in the/res/assets/directory of the project directory;
file copy : Copy the binary file to the files directory of the app's installation directory, i.e. under the/data/data/package name/files/;
Modify file Permissions : Use the command to directly modify the permissions in the directory, note that this operation can be performed;
Execute BusyBox : Execute in code./data/data/Package Name/files/busybox;
Get execution Results:
3. The API used to parse
(1) get the input stream of the assets directory file
InputStream is = Context.getassets (). open (source);
--
Get Assetsmanager: the Context.getassets () of the context object is called to get the Assetsmanager object;
-- Get input stream : Call Assetsmanager's open (String filename) to get the input stream of the corresponding file name;
(2) file stream related operations
gets the file size according to the input stream : invokes the Inputstream.available () method of the input stream;
int size = is.available ();
to read a file into a buffer: Creates a byte array buffer that is the same size as the file, and the input stream stores the data in the buffer;
byte[] buffer = new Byte[size];is.read (buffer); Is.close ();
write the file into memory : Invoke the Openfileoutput (absolute pathname, permission) of the context object to create an output stream of the file;
FileOutputStream output = context.openfileoutput (destination, context.mode_private); output.write (buffer); O Utput.close ();
(3) Get the absolute path to the file
get the App absolute installation path : Call the Context object's Getfilesdir (). GetAbsolutePath () method;
String Filespath = Context.getfilesdir (). GetAbsolutePath ();
(4) Executing binary files
Create the Process object and use the process to execute the shell script command :
get command-line results for execution:
InputStream is = Process.getinputstream (); BufferedReader br = new BufferedReader (new InputStreamReader (IS)); String line = null; while (line = Br.readline ())! = null) { processlist.add (line); }
4. Code Examples
mainactivity Main program code :
Package Cn.org.octopus.tracerouteandbusybox;import Java.io.bufferedreader;import java.io.FileNotFoundException; Import Java.io.fileoutputstream;import Java.io.ioexception;import Java.io.inputstream;import Java.io.inputstreamreader;import Java.util.arraylist;import Java.util.list;import Android.content.Context;import Android.os.bundle;import Android.support.v7.app.actionbaractivity;import Android.view.view;import Android.widget.edittext;import android.widget.textview;/** can not understand the annotation I eat half a kilo of dog food:-) */public class Mainactivity extends actionbaractivity {private EditText et_cmd;private String app_path;private TextView tv_result; @Overrideprotected void OnCreate (Bundle savedinstancestate) {super.oncreate (savedinstancestate); Setcontentview (r.layout.home_activity); * Initialize Control */et_cmd = (EditText) Findviewbyid (r.id.et_cmd); tv_result = (TextView) Findviewbyid (R.id.tv_result);/* Get the app installation path */app_path = Getapplicationcontext (). Getfilesdir (). GetAbsolutePath (); /** button click event */public void OnClick (view view) {int id =View.getid (); switch (ID) {case r.id.copy_busybox:/* Copy busybox executable file */varifyfile (Getapplicationcontext (), "BusyBox"); Break;case r.id.copy_traceroute:/* Copy traceroute executable file */varifyfile (Getapplicationcontext (), "traceroute"); Case r.id.exe_busybox:/* adds the BusyBox command to editext */string cmd = "." + App_path + "/busybox"; System.out.println (Et_cmd); Et_cmd.settext (cmd); break;case r.id.exe_traceroute:/* add traceroute command to Editext */cmd = " . "+ App_path +"/traceroute 8.8.8.8 "; et_cmd.settext (cmd); Break;case r.id.exe:/* Execute editext command */cmd = Et_cmd.gettext (). ToString ();/* Execute script command */list<string> results = exe (CMD); string result = "";/* Convert the results to a string, output to TextView */for (string line:results) {result + = line + "\ n";} Tv_result.settext (result); break;default:break;}} /** Verify that the file exists, and if it does not exist, copy */private void Varifyfile (context context, String FileName) {try {* * * to see if the file exists, if not The code in the exception will go */context.openfileinput (fileName); } catch (FileNotFoundException Notfounde) {try {/* Copy file to the files directory of the app installation directory */copyfromassets (context, filename, filename); /* Modify File Permissions script */String script = "chmod" + App_path + "/" + fileName; /* Execute script */exe (script); } catch (Exception e) {e.printstacktrace (); }}}/** copy the file from the assets directory to the files directory of the app installation directory */private void Copyfromassets (context context, String source,string de Stination) throws IOException {/* Gets the input stream of the file under the assets directory */inputstream is = Context.getassets (). open (source);/* Get file size */int s ize = Is.available ();/* buffer to create file */byte[] buffer = new byte[size];/* read file into buffer */is.read (buffer);/* Close input stream */is.close ();/* Open the output stream of the app installation directory file */fileoutputstream output = Context.openfileoutput (destination,context.mode_private);/* Writes the file out of the buffer to the in-memory */output.write (buffer);/* Closes the output stream */output.close ();} /** Execute Shell script command */private list<string> exe (String cmd) {/* Gets the execution tool */process Process = null;/* Holds script execution results */ list<string> list = new arraylist<string> (); try {/* Get runtime Environment */Runtime runtime = Runtime.getruntime (); /* Execute script */process = runtime.exec (cmd); /* Get input stream for script results */InputStream is = Process.getinputstream (); BufferedReader br = new BufferedReader (new InputStreamReader (IS)); String line = null; /* Read the script execution results line by row */while (lines = Br.readline ())! = null) {List.add]; } br.close (); } catch (IOException e) {e.printstacktrace (); } return list;}}
home_activity.xml Layout file code :
<?xml version= "1.0" encoding= "Utf-8"? ><linearlayout xmlns:android= "http://schemas.android.com/apk/res/ Android "Android:layout_width=" Match_parent "android:layout_height=" match_parent "android:orientation=" vertical " > <linearlayout android:layout_width= "match_parent" android:layout_height= "Wrap_content" and roid:gravity= "center" android:orientation= "Horizontal" > <button android:id= "@+id/copy_busy Box "android:layout_width=" Wrap_content "android:layout_height=" Wrap_content "Android:onc lick= "OnClick" android:text= "copy BusyBox" android:textsize= "7DP" android:textstyle= "bold"/ > <button android:id= "@+id/copy_traceroute" android:layout_width= "Wrap_content" android:layout_height= "Wrap_content" android:onclick= "OnClick" android:text= "Copy traceroute" Android:textsize= "7DP" android:textstyle= "Bold"/> <button android:id= "@+id/exe_busybox" Android:layout_w Idth= "Wrap_content" android:layout_height= "wrap_content" android:onclick= "OnClick" Androi d:text= "Perform busybox" android:textsize= "7DP" android:textstyle= "bold"/> <button Android:id= "@+id/exe_traceroute" android:layout_width= "wrap_content" android:layout_height= "Wrap_c Ontent "android:onclick=" OnClick "android:text=" execution traceroute "android:textsize=" 7DP " android:textstyle= "Bold"/> </LinearLayout> <linearlayout android:layout_width= "Match_pare NT "android:layout_height=" wrap_content "android:orientation=" Horizontal "> <edittext Android:id= "@+id/et_cmd" android:layout_width= "0DP" android:layout_height= "Wrap_content" android:layout_weight="4" android:hint= "Enter the command to execute" android:textstyle= "bold"/> <button android:id= " @+id/exe "android:layout_width=" 0DP "android:layout_height=" Wrap_content "Android:layout_ weight= "1" android:onclick= "OnClick" android:text= "Execute" android:textsize= "10DP" android:textstyle= "Bold"/> </LinearLayout> <textview android:id= "@+id/tv_result" Android : layout_width= "match_parent" android:layout_height= "match_parent" android:background= "#000000" Androi D:textcolor= "#FFF" android:textsize= "10DP" android:textstyle= "bold"/></linearlayout>
5. Implementation results
Execute the BusyBox program :
Execute the traceroute program :
Sample code Download :
-- CSDN : http://download.csdn.net/detail/han1202012/7639253;
-- GitHub : https://github.com/han1202012/TracerouteAndBusybox;
author : Wan Jing, the absolute dust
Reprint Please famous source : http://blog.csdn.net/shulianghan/article/details/36438365