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 做的事情完全一样,除了先分叉,父进程等待子进程完成。

execsystem 相比,反引号不给您返回值,而是给您收集的 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,因为如果找到该命令,它就永远不会返回。 返回STDOUTSTDERR 或命令的退出状态也没有任何意义。 您可以在perlfunc 中找到有关它的文档, 因为它是一个函数。

系统

执行命令并在命令完成后继续执行您的 Perl 脚本。

返回值是命令的退出状态。 您可以在 perlfunc 找到有关它的文档。

反引号

like system 执行一个命令,命令完成后你的 perl 脚本继续运行。

system相反,该命令的返回值为STDOUTqx// 相当于反引号。 您可以在 perlop 中找到有关它的文档,因为与 systemexec 不同,它是一个运算符。


其他方式

上面缺少的是一种异步执行命令的方法。 这意味着您的 perl 脚本和您的命令同时运行。 这可以通过open 完成。 它允许您读取STDOUT/STDERR 并写入您的命令的STDIN。 但它取决于平台。

还有几个模块可以简化这些任务。 有IPC::Open2IPC::Open3IPC::Run,还有 Win32::Process::Create 如果你在 Windows 上。

【讨论】:

我认为你的意思是 s/perlcunc/perlfunc/ ... perlipc 文档也深入探讨了打开管道。 perlcunc,也许这将是我的新昵称;-) 为了记录,反引号和 qx[] 也填充 $? (操作系统返回值)。 在列表上下文中,反引号返回作为命令输出的行列表。在标量上下文中,它将它们作为与换行符连接的单个字符串返回。 Re "因为不像systemexec 它是一个运算符" 这三个都是运算符。 systemexec 是命名列表运算符,这就是为什么它们与其他命名列表运算符、命名一元运算符和命名 nuary 运算符一起记录在 perlfunc 中。【参考方案4】:

一般来说,我使用systemopenIPC::Open2IPC::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:用另一个进程替换当前进程。

当你想运行一个命令时使用execfork,不关心它的输出,也不想等待它返回。 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

您可能还想阅读waitpidperlipc 手册。

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 的反引号 (`)、systemexec 有什么区别?

exec -> exec "command"; ,
system -> system("command"); and 
backticks -> print `command`;

exec

exec 执行命令并且从不恢复 Perl 脚本。它对于脚本就像 return 语句对于函数一样。

如果未找到该命令,exec 将返回 false。它永远不会返回 true,因为如果找到该命令,它就永远不会返回。返回STDOUTSTDERR 或命令的退出状态也没有任何意义。您可以在 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,返回值是命令的STDOUTqx// 相当于反引号。您可以在 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

预制到system/app下面开机却没有

Flutter:build/app/outputs下的apk/release目录和flutter-apk目录有啥区别?

system和pause有啥区别?

app引导页和启动页有啥区别

从 priv-app 应用程序运行 shell 命令