Android中的PID,TID和UID

pid 是process进程id , uid 是user 用户id;
如果 是root,那么你的uid就是0,0为最高权限;

可以通过pid找到这个进程的uid,没有试过通过Uid找到所有Pid,大家可以试一下;
每一个不同的程序都能有一个UId,但是一个应用里面可以有多个PId;
一个用户可以打开多个进程(Pid),并且这些进程的uid是一样的;
一个pid对应一个进程,每次打开时系统都会赋予不同的pid,但是uid是当你安装Apk时,系统赋予的,是不变的,除非你卸载了重装,又会赋予一个Uid;

Tid(thead id)可以理解为线程的Id,这个更容易理解


比如下面两句话:android.os.Process.killProcess(android.os.Process.myPid());拿到当前进程,杀死。不走生命周期方法。强制杀死进程

可以在Application中拿到主线程的Tid。android.os.Process.myTid();

运行下面代码是出现问题,代码如下:import subprocess import os import time import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') # 核心配置参数 LD_PATH = r"E:\LenovoSoftstore\Install\LD\leidian\LDPlayer9\dnplayer.exe" # 您的自定义路径 ADB_PORT = "emulator-5554" # 默认第一个实例端口 adb_path = r'E:\LenovoSoftstore\Install\LD\leidian\LDPlayer9\adb.exe' # 步骤1:启动雷电模拟器 def launch_emulator(): try: # 注意:不要添加引号,subprocess会处理路径空格 subprocess.Popen([LD_PATH, "--start"]) print("⚡ 模拟器启动命令已发送") except FileNotFoundError: print(f"❌ 路径错误:{LD_PATH}\n请检查:\n1. 路径是否存在\n2. 是否安装了雷电9") def get_installed_apps(): # 使用pm list packages命令获取所有包名 cmd = [adb_path, 'shell', 'pm', 'list', 'packages'] result = subprocess.run(cmd, capture_output=True, text=True) return result.stdout def get_third_party_apps(): cmd = [adb_path, 'shell', 'pm', 'list', 'packages', '-3'] result = subprocess.run(cmd, capture_output=True, text=True) return result.stdout # 执行并打印结果 print("已安装应用包名列表:") print(get_third_party_apps()) subprocess.run(["adb", "shell", "am", "start", "-n", "com.mojian.fmz.UnityPlayerActivity"]) # 执行主流程 if __name__ == "__main__": launch_emulator() 错误如下:已安装应用包名列表: package:com.mojian.fmz.neice package:com.mojian.fmz Traceback (most recent call last): File "E:\PYthonterm\C!.py", line 35, in <module> subprocess.run(["adb", "shell", "am", "start", "-n", "com.mojian.fmz.UnityPlayerActivity"]) ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Software\python\Lib\subprocess.py", line 554, in run with Popen(*popenargs, **kwargs) as process: ~~~~~^^^^^^^^^^^^^^^^^^^^^^ File "D:\Software\python\Lib\subprocess.py", line 1036, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\Software\python\Lib\subprocess.py", line 1548, in _execute_child hp, ht, pid, tid = _winapi.CreateProcess(executable, args, ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^ # no special security ^^^^^^^^^^^^^^^^^^^^^ ...<4 lines>... cwd, ^^^^ startupinfo) ^^^^^^^^^^^^ FileNotFoundError: [WinError 2] 系统找不到指定的文件。
最新发布
03-17
<think>好的,用户遇到了运行Python脚本时的FileNotFoundError错误,具体是在执行adb命令的时候。我需要仔细分析错误信息和代码,找出问题所在。 首先看错误信息,错误发生在调用subprocess.run(["adb", ...])时,系统找不到指定的文件。这说明Python在尝试运行adb命令时,无法找到adb.exe的位置。可能的原因有几个: 1. adb不在系统的环境变量PATH,导致直接使用"adb"命令无法识别。 2. 代码虽然定义了adb_path变量,但在调用subprocess时没有使用这个变量,而是直接用了"adb",导致路径错误。 3. 雷电模拟器的adb.exe可能没有被正确配置,或者路径存在空格或特殊字符,导致subprocess无法正确解析。 查看用户的代码,发现用户确实定义了adb_path变量,指向了E盘下的adb.exe。但是在执行subprocess.run时,用的是["adb", ...],而没有使用adb_path。这应该是问题的关键所在。用户可能在之前的函数如get_installed_apps正确使用了adb_path,但在最后的subprocess.run调用遗漏了,直接用了"adb",导致系统找不到这个命令。 另外,用户可能没有正确连接模拟器,或者adb服务没有启动,但根据错误信息是文件未找到,应该更倾向于路径问题。此外,检查雷电模拟器的adb端口是否正确,是否有多个实例导致端口冲突,但错误信息是文件找不到,所以暂时先不考虑端口问题。 解决方案应该是将最后一行subprocess.run的"adb"替换为adb_path变量,即使用绝对路径来调用adb.exe。这样Python就能正确找到可执行文件的位置,避免依赖系统环境变量。 另外,用户可能需要确保雷电模拟器的ADB端口正确,并且模拟器已经启动完成后再执行adb命令,可能需要添加等待时间。但当前错误是文件找不到,所以优先解决路径问题,之后如果还有连接问题,再处理端口和连接部分。 总结,主要问题在于subprocess调用adb时未使用绝对路径,导致系统找不到文件。修改代码的adb命令,使用定义的adb_path即可解决。</think>让我们逐步分析并解决代码的问题: 问题定位:`FileNotFoundError`出现在`subprocess.run(["adb", "shell"...])`这一行,说明系统找不到`adb`命令。 原因分析: 1. 在之前的代码你正确使用了自定义`adb_path`,但最后的`adb`命令没有使用该路径 2. 系统环境变量没有配置ADB路径,导致直接使用`adb`命令失效 解决方案: ```python # 修改最后一行代码(原错误行) # 原错误代码: # subprocess.run(["adb", "shell", "am", "start", "-n", "com.mojian.fmz.UnityPlayerActivity"]) # 修正后的代码: subprocess.run([adb_path, "shell", "am", "start", "-n", "com.mojian.fmz.UnityPlayerActivity"]) ``` 改进建议(增强代码健壮性): ```python # 建议在启动模拟器后增加等待时间 import time if __name__ == "__main__": launch_emulator() time.sleep(15) # 等待模拟器完全启动 # 添加adb连接确认 connect_cmd = [adb_path, "connect", ADB_PORT] subprocess.run(connect_cmd, timeout=10) # 再执行后续操作 ``` 常见问题排查清单: 1. ✅ 已解决路径问题:确保所有`adb`调用都使用绝对路径 2. 🔍 检查雷电多开:如果使用多开模拟器,确认`ADB_PORT`对应正确的实例端口 3. 🔌 ADB连接验证:在CMD手动执行: ```bash E:\LenovoSoftstore\Install\LD\leidian\LDPlayer9\adb.exe connect emulator-5554 ``` 4. ⏱️ 时序问题:模拟器启动需要时间,建议添加`time.sleep()` 5. 🔄 端口冲突:如果同时运行多个模拟器,尝试重启adb服务: ```python subprocess.run([adb_path, "kill-server"]) subprocess.run([adb_path, "start-server"]) ``` 补充说明: 当使用雷电模拟器时,建议使用其自带的adb版本(如你代码配置的路径),避免与Android SDK的adb产生版本冲突。如果需要批量操作多个模拟器实例,可以通过修改端口号实现: ```python # 多开实例示例 INSTANCE_PORTS = ["emulator-5554", "emulator-5556", "emulator-5558"] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值