system下的app和priv-app有啥区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了system下的app和priv-app有啥区别相关的知识,希望对你有一定的参考价值。
在 android 中,如果要使用系统限制的权限(比如 android.permission.WRITE_SECURE_SETTINGS),我们需要把程序安装到 /system/app/ 下。下面以 SecureSetting.apk 为例,演示这个操作。需要准备一台已经获得 Root 权限的手机。
1、通过 USB 连接手机和电脑。
2、使用 adb 控制手机。
源码打印?
1. $ adb push SecureSetting.apk /sdcard/ // 上传要安装的文件,为安装做准备。
2. $ adb shell
3. $ su // 切换到 root 用户。如果没有获得 Root 权限,这一步不会成功。
4. # mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system // 让分区可写。
5. # cat /sdcard/SecureSetting.apk > /system/app/SecureSetting.apk // 这一步可以用 cp 实现,但一般设备中没有包含该命令。如果使用 mv 会出现错误:failed on '/sdcard/NetWork.apk' - Cross-device link。
6. # mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system // 还原分区属性,只读。
7. # exit
8. $ exit
$ adb push SecureSetting.apk /sdcard/ // 上传要安装的文件,为安装做准备。
$ adb shell
$ su // 切换到 root 用户。如果没有获得 Root 权限,这一步不会成功。
# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system // 让分区可写。
# cat /sdcard/SecureSetting.apk > /system/app/SecureSetting.apk // 这一步可以用 cp 实现,但一般设备中没有包含该命令。如果使用 mv 会出现错误:failed on '/sdcard/NetWork.apk' - Cross-device link。
# mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system // 还原分区属性,只读。
# exit
$ exit 参考技术A system/app是系统软件存放的文件,不可删除,可以对里面的部分不必要的删除,如果删错,系统就会不正常,data/app目录是刷入系统时,用于安装的软件,可删除,这部分软件可通过应用程序进行卸载,可以增加手机rom空间,不过卸载时应当小心,有些软件不能卸载
Perl 的反引号、system 和 exec 有啥区别?
【中文标题】Perl 的反引号、system 和 exec 有啥区别?【英文标题】:What's the difference between Perl's backticks, system, and exec?Perl 的反引号、system 和 exec 有什么区别? 【发布时间】:2010-10-22 10:44:05 【问题描述】:有人可以帮帮我吗?在 Perl 中,有什么区别:
exec "command";
和
system("command");
和
print `command`;
还有其他方法可以运行 shell 命令吗?
【问题讨论】:
几乎与***.com/questions/797127/… 完全相同,只是这个有 exec 而另一个有管道。 【参考方案1】:让我先引用手册:
perldoc exec():
exec 函数执行系统命令并且从不返回--如果您希望它返回,请使用 system 而不是 exec
perldoc system():
和 exec LIST 做的事情完全一样,除了先分叉,父进程等待子进程完成。
与 exec 和 system 相比,反引号不给您返回值,而是给您收集的 STDOUT。
perldoc `String`:
一个字符串,它(可能)被插值,然后作为系统命令使用 /bin/sh 或其等效命令执行。将接受 Shell 通配符、管道和重定向。返回收集到的命令的标准输出;标准误差不受影响。
替代方案:
在更复杂的场景中,您想要获取 STDOUT、STDERR 或返回码,您可以使用众所周知的标准模块,例如 IPC::Open2 和 IPC::Open3。
例子:
use IPC::Open2;
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'some', 'cmd', 'and', 'args');
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
最后,来自 CPAN 的IPC::Run 也值得一看……
【讨论】:
这是一个粗鲁的回应。你应该试着在没有愤怒的情况下提供帮助。 我认为他只是在参考 ol' RTFM :P 实际上并不意味着粗鲁;)尽管删除了 f-word,以避免任何误解...... 我当然没有将其解释为粗鲁。也许是粗鲁的,但这不是一个需要深思熟虑的答案的高度智能问题。【参考方案2】:'exec' 和 'system' 之间的区别在于 exec 用 'command' 替换您当前的程序,并且永远不会返回您的程序。另一方面,系统分叉并运行“命令”,并在完成运行时返回“命令”的退出状态。反勾号运行“命令”,然后返回一个表示其标准输出的字符串(无论它会打印到屏幕上的什么)
你也可以使用 popen 来运行 shell 命令,我认为有一个 shell 模块 - 'use shell' 可以让你透明地访问典型的 shell 命令。
希望能为您澄清。
【讨论】:
也许你的意思是use Shell;
(search.cpan.org/dist/Shell/Shell.pm)?它没有被广泛安装,也不适用于这个问题,我认为......
他问题的最后一部分是“还有其他方法可以运行 shell 命令吗?” - Shell 是运行 shell 命令的另一种方式。
文档特别声明“这个包是作为一个展示案例包含的,说明了一些 Perl 功能。它不应该用于生产程序。虽然它确实提供了一个简单的接口来获取标准输出任意命令,可能有更好的方法来实现你所需要的。”
再次,它回答了他的问题'还有其他方法'
糟糕的、不受支持的方式不应在没有警告它们不好且不受支持的情况下提供。【参考方案3】:
执行
执行一个命令并且从不返回。
这就像函数中的return
语句。
如果找不到该命令exec
返回false。
它永远不会返回 true,因为如果找到该命令,它就永远不会返回。
返回STDOUT
、STDERR
或命令的退出状态也没有任何意义。
您可以在perlfunc
中找到有关它的文档,
因为它是一个函数。
系统
执行命令并在命令完成后继续执行您的 Perl 脚本。
返回值是命令的退出状态。
您可以在 perlfunc
找到有关它的文档。
反引号
like system
执行一个命令,命令完成后你的 perl 脚本继续运行。
与system
相反,该命令的返回值为STDOUT
。
qx//
相当于反引号。
您可以在 perlop
中找到有关它的文档,因为与 system
和 exec
不同,它是一个运算符。
其他方式
上面缺少的是一种异步执行命令的方法。
这意味着您的 perl 脚本和您的命令同时运行。
这可以通过open
完成。
它允许您读取STDOUT
/STDERR
并写入您的命令的STDIN
。
但它取决于平台。
还有几个模块可以简化这些任务。
有IPC::Open2
和IPC::Open3
和IPC::Run
,还有
Win32::Process::Create
如果你在 Windows 上。
【讨论】:
我认为你的意思是 s/perlcunc/perlfunc/ ... perlipc 文档也深入探讨了打开管道。 perlcunc,也许这将是我的新昵称;-) 为了记录,反引号和 qx[] 也填充 $? (操作系统返回值)。 在列表上下文中,反引号返回作为命令输出的行列表。在标量上下文中,它将它们作为与换行符连接的单个字符串返回。 Re "因为不像system
和exec
它是一个运算符" 这三个都是运算符。 system
和 exec
是命名列表运算符,这就是为什么它们与其他命名列表运算符、命名一元运算符和命名 nuary 运算符一起记录在 perlfunc 中。【参考方案4】:
一般来说,我使用system
、open
、IPC::Open2
或IPC::Open3
,这取决于我想要做什么。 qx//
运算符虽然简单,但其功能过于受限,无法在快速破解之外非常有用。我发现open
更方便。
system
:运行一个命令,等待它返回
当您想运行命令时使用system
,不关心其输出,并且不希望 Perl 脚本在命令完成之前执行任何操作。
#doesn't spawn a shell, arguments are passed as they are
system("command", "arg1", "arg2", "arg3");
或
#spawns a shell, arguments are interpreted by the shell, use only if you
#want the shell to do globbing (e.g. *.txt) for you or you want to redirect
#output
system("command arg1 arg2 arg3");
qx//
or ``:运行命令并捕获其 STDOUT
当您想要运行命令、捕获它写入 STDOUT 的内容并且不希望 Perl 脚本在命令完成之前执行任何操作时,请使用 qx//
。
#arguments are always processed by the shell
#in list context it returns the output as a list of lines
my @lines = qx/command arg1 arg2 arg3/;
#in scalar context it returns the output as one string
my $output = qx/command arg1 arg2 arg3/;
exec
:用另一个进程替换当前进程。
当你想运行一个命令时使用exec
和fork
,不关心它的输出,也不想等待它返回。 system
真的只是
sub my_system
die "could not fork\n" unless defined(my $pid = fork);
return waitpid $pid, 0 if $pid; #parent waits for child
exec @_; #replace child with new process
您可能还想阅读waitpid
和perlipc
手册。
open
: 运行一个进程并创建一个到它的 STDIN 或 STDERR 的管道
当您想将数据写入进程的 STDIN 或从进程的 STDOUT 读取数据(但不能同时)时,请使用 open
。
#read from a gzip file as if it were a normal file
open my $read_fh, "-|", "gzip", "-d", $filename
or die "could not open $filename: $!";
#write to a gzip compressed file as if were a normal file
open my $write_fh, "|-", "gzip", $filename
or die "could not open $filename: $!";
IPC::Open2:运行一个进程并创建一个到 STDIN 和 STDOUT 的管道
当您需要读取和写入进程的 STDIN 和 STDOUT 时,请使用 IPC::Open2
。
use IPC::Open2;
open2 my $out, my $in, "/usr/bin/bc"
or die "could not run bc";
print $in "5+6\n";
my $answer = <$out>;
IPC::Open3:运行一个进程并创建一个到 STDIN、STDOUT 和 STDERR 的管道
当您需要捕获进程的所有三个标准文件句柄时,请使用IPC::Open3
。我会写一个例子,但它的工作方式与 IPC::Open2 的工作方式基本相同,但参数和第三个文件句柄的顺序略有不同。
【讨论】:
非常翔实和最新的答案。谢谢@chas-owens IPC::Open3 对于大多数用途来说太低级了。 IPC::Run3 和 IPC::Run 通常更合适。【参考方案5】:Perl 的反引号 (`
)、system
和 exec
有什么区别?
exec -> exec "command"; ,
system -> system("command"); and
backticks -> print `command`;
exec
exec
执行命令并且从不恢复 Perl 脚本。它对于脚本就像 return
语句对于函数一样。
如果未找到该命令,exec
将返回 false。它永远不会返回 true,因为如果找到该命令,它就永远不会返回。返回STDOUT
、STDERR
或命令的退出状态也没有任何意义。您可以在 perlfunc 中找到有关它的文档,因为它是一个函数。
例如:
#!/usr/bin/perl
print "Need to start exec command";
my $data2 = exec('ls');
print "Now END exec command";
print "Hello $data2\n\n";
在上面的代码中,有三个print
语句,但是由于exec
离开了脚本,所以只执行了第一个打印语句。此外,exec
命令输出未分配给任何变量。
在这里,只有您只获得第一个 print
语句的输出以及在标准输出上执行 ls
命令的输出。
system
system
执行命令,并且在命令完成后恢复您的 Perl 脚本。返回值是命令的退出状态。您可以在 perlfunc 中找到有关它的文档。
例如:
#!/usr/bin/perl
print "Need to start system command";
my $data2 = system('ls');
print "Now END system command";
print "Hello $data2\n\n";
在上面的代码中,有三个print
语句。由于脚本在system
命令之后恢复,所有三个打印语句都被执行。
另外,运行system
的结果是分配给data2
,但分配的值是0
(来自ls
的退出代码)。
在这里,您将获得第一个 print
语句的输出,然后是 ls
命令的输出,然后是标准输出上最后两个 print
语句的输出。
反引号 (`
)
像system
一样,将命令括在反引号中会执行该命令,并且您的 Perl 脚本会在命令完成后恢复。相对于system
,返回值是命令的STDOUT
。 qx//
相当于反引号。您可以在 perlop 中找到有关它的文档,因为与 system 和 exec
不同,它是一个运算符。
例如:
#!/usr/bin/perl
print "Need to start backticks command";
my $data2 = `ls`;
print "Now END system command";
print "Hello $data2\n\n";
在上面的代码中,有三个print
语句,三个都在执行。 ls
的输出不会直接标准输出,而是赋值给变量data2
,然后由最终的print语句打印出来。
【讨论】:
最好的例子解释。非常感谢。以上是关于system下的app和priv-app有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
小米三的system/priv-app在哪里呀?找不到这个文件夹,找到system,却找不到pri