package
com.sfer.install;
import
java.io.DataInputStream;
import
java.io.DataOutputStream;
import
java.io.InputStream;
import
java.io.OutputStream;
public
final
class
RootCmd {
// 执行linux命令并且输出结果
protected
static
String execRootCmd(String paramString) {
String result =
"result : "
;
try
{
Process localProcess = Runtime.getRuntime().exec(
"su "
);
// 经过Root处理的android系统即有su命令
OutputStream localOutputStream = localProcess.getOutputStream();
DataOutputStream localDataOutputStream =
new
DataOutputStream(
localOutputStream);
InputStream localInputStream = localProcess.getInputStream();
DataInputStream localDataInputStream =
new
DataInputStream(
localInputStream);
String str1 = String.valueOf(paramString);
String str2 = str1 +
"\n"
;
localDataOutputStream.writeBytes(str2);
localDataOutputStream.flush();
String str3 =
null
;
// while ((str3 = localDataInputStream.readLine()) != null) {
// Log.d("result", str3);
// }
localDataOutputStream.writeBytes(
"exit\n"
);
localDataOutputStream.flush();
localProcess.waitFor();
return
result;
}
catch
(Exception localException) {
localException.printStackTrace();
return
result;
}
}
// 执行linux命令但不关注结果输出
protected
static
int
execRootCmdSilent(String paramString) {
try
{
Process localProcess = Runtime.getRuntime().exec(
"su"
);
Object localObject = localProcess.getOutputStream();
DataOutputStream localDataOutputStream =
new
DataOutputStream(
(OutputStream) localObject);
String str = String.valueOf(paramString);
localObject = str +
"\n"
;
localDataOutputStream.writeBytes((String) localObject);
localDataOutputStream.flush();
localDataOutputStream.writeBytes(
"exit\n"
);
localDataOutputStream.flush();
localProcess.waitFor();
int
result = localProcess.exitValue();
return
(Integer) result;
}
catch
(Exception localException) {
localException.printStackTrace();
return
-
1
;
}
}
// 判断机器Android是否已经root,即是否获取root权限
protected
static
boolean
haveRoot() {
int
i = execRootCmdSilent(
"echo test"
);
// 通过执行测试命令来检测
if
(i != -
1
) {
return
true
;
}
return
false
;
}
}
package
com.sfer.install;
import
android.app.Activity;
import
android.os.Bundle;
import
android.widget.Toast;
public
class
InstallActivity
extends
Activity {
/** Called when the activity is first created. */
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
String paramString=
"$ adb push MySMS.apk /sdcard/"
+
"\n"
+
"$ adb shell"
+
"\n"
+
"$ su"
+
"\n"
+
"# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system"
+
"\n"
+
"# cat /sdcard/MySMS.apk > /system/app/MySMS.apk"
+
"\n"
+
"# mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system"
+
"\n"
+
"# exit"
+
"\n"
+
"$ exit"
;
if
(RootCmd.haveRoot()){
if
(RootCmd.execRootCmdSilent(paramString)==-
1
){
Toast.makeText(
this
,
"安装不成功"
, Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(
this
,
"安装成功"
, Toast.LENGTH_LONG).show();
}
}
else
{
Toast.makeText(
this
,
"没有root权限"
, Toast.LENGTH_LONG).show();
}
}
}
找到原因了 在代码里执行把那个字符串改成这样就行了
1
2
3
4
5
6
7
8
|
String paramString=
"adb push MySMS.apk /system/app"
+
"\n"
+
"adb shell"
+
"\n"
+
"su"
+
"\n"
+
"mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system"
+
"\n"
+
"cat /sdcard/MySMS.apk > /system/app/MySMS.apk"
+
"\n"
+
"mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system"
+
"\n"
+
"exit"
+
"\n"
+
"exit"
;
|
但是,不管是系统应用还是用户应用,安卓会建立缓存以加速应用的启动,该缓存是在/data/dalvik-cache下面。注意了,是在data分区上的,所以应用安装的越多,data分区可用的空间就越少。
一般ROOT之后,我们会删除/卸载部分系统的应用,从而system分区就空出了部分的空间,尤其是定制机,删了系统应用之后,会空出多达60M的空间。假如本身机器的ROM比较小,data分区不够用的话,就最好把部分的app移动到system空间,当然一旦移动到了system分区,就是系统应用了!
好,下面介绍哪些应用是可以移动到system分区的:
1) 开机就要启动的程序,比如权限管理啊,Widget啊。
2) 常常用到的程序,比如文件管理器。
3) 一些不会有内存驻留的小程序,比如autostarts,SD Maid啊。
有一些应用是不适合移动到system空间的:
1) 退出仍然会驻留内存的程序(比如数米基金宝),因为这些程序一旦变成了system应用,杀进程的软件就拿他们没办法了。
2) 应用程序内含lib库的,这个可以用压缩工具(windows下的zip工具、安卓下的ES文件管理器、RootExplorer)查看该apk,假如内部有lib文件夹的,里面有*.so文件的,那就说明他用到了这些lib。当然,若硬要移动到system空间也是可以的,只要把lib/*.so拷贝到system/lib下即可,但是本人觉得一是会造成重复,二是将来维护起来比较麻烦。不过有一法,可以在system/app下面建立文件夹,把*.so拷贝到该文件夹下,然后通过链接文件的方式将其拷贝到lib下。(这个我没试过)
移动方法:
1) 将该apk先卸载,然后将apk文件拷贝到system/app下,修改权限,有必要的话,重启一下。这样做的好处是,该软件的缓存会在卸载是自动删除。
2) 为防止有些应用卸载后数据丢失,可以不卸载,方法是:将apk拷贝到system/app下,然后删除data/app的apk,最后手动把/data/dalvik-cache/下该程序的缓存清除。
3) 假如要移动的应用太多,可以进入recovery,清除一下dalvik-cache,让启动的时候自动再生成cache。
附:
1. 查看各个分区的使用情况:http://blog.csdn.net/puncha/article/details/7670727
其他资料:
在 Android 中,如果要使用系统限制的权限(比如 android.permission.WRITE_SECURE_SETTINGS),我们需要把程序安装到 /system/app/ 下。
一般手机/system目录是mount成只读的,所以我们需要重新mount成读写的
下面以 SecureSetting.apk 为例,演示这个操作。需要准备一台已经获得 Root 权限的手机。
1、通过 USB 连接手机和电脑。
2、使用 adb 控制手机。