I would like to push a text document from the apk into the /system directory (Yes its a app for rooted users) and was wondering how i would do this :) My txt file is in the
You can try this function (found here):
public String runSystemCommand(String cmd)
{
try {
// Executes the command.
Process process = Runtime.getRuntime().exec(cmd);
// Reads stdout.
// NOTE: You can write to stdin of the command using
// process.getOutputStream().
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
int read;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((read = reader.read(buffer)) > 0) {
output.append(buffer, 0, read);
}
reader.close();
// Waits for the command to finish.
process.waitFor();
return output.toString();
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
I've tryed it myself in this way:
String cmdoutput = this.runSystemCommand("/system/bin/ls .");
Log.d("SampleAndroidInterfaceActivity", "runSystemCommand() returned: " + cmdoutput);
and works well. This is my output:
05-16 17:50:10.423: runSystemCommand() returned: acct
05-16 17:50:10.423: cache
05-16 17:50:10.423: config
05-16 17:50:10.423: d
05-16 17:50:10.423: data
05-16 17:50:10.423: default.prop
05-16 17:50:10.423: dev
05-16 17:50:10.423: etc
05-16 17:50:10.423: init
05-16 17:50:10.423: init.goldfish.rc
05-16 17:50:10.423: init.rc
05-16 17:50:10.423: mnt
05-16 17:50:10.423: proc
05-16 17:50:10.423: root
05-16 17:50:10.423: sbin
05-16 17:50:10.423: sdcard
05-16 17:50:10.423: sys
05-16 17:50:10.423: system
05-16 17:50:10.423: ueventd.goldfish.rc
05-16 17:50:10.423: ueventd.rc
05-16 17:50:10.423: vendor
If you know the absolute path of your txt file, you can easily copy it with a cp
.
Place the text file in your project's assets directory and then extract it to the filesystem with code like the one in the following thread: How to copy files from 'assets' folder to sdcard?
EDIT: Here is some code that I use. For sourceFileName, pass in the name of the assets file relative to the assets folder (e.g. if you have myFile.txt in the assets folder, pass myFile.txt). For the destination file, pass a full path (e.g. /data/data/com.mycompany/mypackage/myFile.txt). context is the current activity (e.g. MyActivity.this).
private boolean copyFile(Context context, String sourceFileName, String destFileName)
{
AssetManager assetManager = context.getAssets();
File destFile = new File(destFileName);
File destParentDir = destFile.getParentFile();
destParentDir.mkdir();
InputStream in = null;
OutputStream out = null;
try
{
in = assetManager.open(sourceFileName);
out = new FileOutputStream(destFile);
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1)
{
out.write(buffer, 0, read);
}
in.close();
in = null;
out.flush();
out.close();
out = null;
return true;
}
catch (Exception e)
{
e.printStackTrace();
}
return false;
}
EDIT2: Turns out that the /system partition is mounted as read-only, even on rooted devices. This may help: Android: how to mount filesystem in RW from within my APK? (rooted, of course)