免Root实现Android静默安装(非无障碍) 您所在的位置:网站首页 adb静默安装应用 免Root实现Android静默安装(非无障碍)

免Root实现Android静默安装(非无障碍)

2023-02-19 00:25| 来源: 网络整理| 查看: 265

好耶!是 app_process

那么如何具体用 shell 运行 Java 程序呢?肯定不是「java xxx.jar」啦,Android 能运行的格式是 dex 。没错,就是apk 里那个 dex 。然后我们可以通过「app_process」来启动 Java 。app_process 的参数如下:

app_process [vm-options] cmd-dir [options] start-class-name[main-options]

这个诡异又可怕的东西是没有 -help 的。我们要么看源码,要么看别人分析好的。本人水平有限,这里选择看别人分析好的:

vm-options – VM 选项

cmd-dir –父目录 (/system/bin)

options –运行的参数 :

–zygote

–start-system-server

–application (api>=14)

–nice-name=nice_proc_name (api>=14)

start-class-name–包含main方法的主类 (com.android.commands.am.Am)

main-options–启动时候传递到main方法中的参数

实践

因为是 dex 我们就直接在 as 里写吧,提取 dex 也方便。新建个空白项目,初始结构是这样:

我们新建个包,存放我们要在 shell 下运行的 Java 代码:

这里我们补全 Main 方法,因为我们这个不是个 Android 程序,只是编译成 dex 的纯 Java 程序,所以我们这个的入口是 Main :

packageshellService;

publicclassMain{

publicstaticvoidmain(String[] args){

System.out.println("我是在 shell 里运行的!!!");

}

}

我们在代码里只是打印一行「我是在 shell 里运行的!!!」,因为这里是纯 Java 所以也用的 println。现在编译 apk:

因为 apk 就是 zip 所以我们直接解压出 apk 文件里的classes.dex,然后执行 :

adb push classes.dex /data/local/tmp

cd /data/local/tmp

app_process -Djava.class.path=/data/local/tmp/classes.dex /system/bin shellService.Main

这时就能看到已经成功运行啦:

这里因为 utf8 在 Windows shell 里有问题,所以乱码了,但是还是说明我们成功了。

具有实用性

只能输出肯定是不行的,不具有实用性。我们之前说过,我们应该建立个本地 socket 服务器来接受命令并执行,这里的「Service」类实现了这个功能,因为如何建立 socket 不是文章的重点,所以大家只要知道这个类内部实现了一个「ServiceGetText」接口,在收到命令之后会把命令内容作为参数回掉 getText 方法,然后我们执行 shell 命令之后,吧结果作为字符串返回即可,具体实现可以看查看源码Service。

https://github.com/gtf35/app_process-shell-use/blob/master/app/src/main/java/shellService/Service.java

https://github.com/gtf35/app_process-shell-use/blob/master/app/src/main/java/shellService/Service.java

我们新建一个「ServiceThread」

https://github.com/gtf35/app_process-shell-use/blob/master/app/src/main/java/shellService/ServiceThread.java

https://github.com/gtf35/app_process-shell-use/blob/master/app/src/main/java/shellService/ServiceThread.java

来运行「Service」服务和执行设立了命令:

publicclassServiceThreadextendsThread{

privatestaticintShellPORT = 4521;

@Override

publicvoidrun(){

System.out.println(">>>>>>Shell服务端程序被调用



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有