sdk-adb-qemu

SDK

emulator

${ANDROID_SDK_HOME}/emulator

这个qemu是avd模拟器简化的**${ANDROID_SDK_HOME}/emulator/qemu/darwin-x86_64//qemu-system-x86_64** 不使用

1
2
emulator -list-avds
emulator -avd Pixel_3_API_29 -writable-system -no-snapstorage

avd$HOME/.android/avd

adb

${ANDROID_SDK_HOME}/platform-tools/adb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$adb start-server //启动adb
$adb kill-server
#-l 锁定该程序
#-r 重新安装该程序,保存数据
#-s 安装在SD卡内,而不是设备内部存储
$adb install -r [apk文件]
#日志
$adb logcat | grep "jc"
#radio 输出通信系统的log
#system 输出系统组件的log
#events 输出event的log
#main 输出java层的log
$adb logcat -b radio
#强杀
$adb shell am force-stop <packagename>
#获取设备的ID和序列号
$adb get-product
$adb root
$adb disable-verity
$adb shell getprop ro.product.cpu.abi
$adb shell 'mount -o rw,remount -t auto /system'
$adb forward tcp:23496 tcp:23496
$adb reboot bootloader
#通过adb启动应用程序页面
$adb shell am start -D -n com.example.how_debug/com.example.how_debug.MainActivity
$adb push "C:\Program Files\IDA 7.0\dbgsrv\android_x64_server" /data/local/ax64
$adb shell 'chmod +x /data/local/*'
$adb shell 'cd /data/local/ && ./ax64'

fastboot

1
fastboot oem unlock

other

mount

1
mount -o rw,remount -t auto /system

Jeb条件

1
2
android:debuggable="true" 
ro.debuggable=1

install MagiskHide Props Config and then:

1
2
3
4
adb shell //adb进入命令行模式
su //切换至超级用户
magisk resetprop ro.debuggable 1 //设置debuggable
stop;start; //一定要通过该方式重启

Android手机系统的 ro.debuggable 这一配置位于 /default.prop 文件中,而 /default.prop 又来源于手机每次启动时 boot.img 中 ramdisk 的挂载,所以想要直接通过修改 /default.prop 是不可行的,但是系统文件是只读的,改了也没用。网上流传较广的是改 boot.img

qemu

https://www.cnblogs.com/yinzhengjie/p/7846595.html

1
2
3
brew install qemu
brew install libvirt
brew services start libvirt

1.创建磁盘映像

1
$qemu-img create -f qcow2 ~/qemu/images/ubuntu-desktop-18.04.qcow2 10G

2.启动附加了Ubuntu ISO的QEMU

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# -accel hvf 
qemu-system-x86_64 \
-cpu host -smp 3 -enable-kvm -machine accel=hvf -m 2048 \
-net user,hostfwd=tcp::2222-:22 -net nic \
-usb -device usb-tablet \
-display default,show-cursor=on \
-vga virtio \
-cdrom ~/Parallels/Parallels\ iso/ubuntu-18.04.4-desktop-amd64.iso \
-drive file=/Users/notify/qemu/images/ubuntu-desktop-18.04.qcow2,if=virtio,index=0,format=qcow2,media=disk \
-boot order=dc



#-net user,hostfwd=tcp::4444-:5555

选项解释:
# cpu 内存
-enable-kvm 是使用kvm内核,不用qemu的内核,开启虚拟机加速;
-accel hvf
-m 1024是给客户机分配1024MB内存;
-smp 1 是给客户机分配1个CPU;
# 磁盘
-boot order=dc是指定系统的启动顺序为光驱(d: CD-ROM)、硬盘(c: hard Disk);
-hda 是分配给客户机的IDE硬盘(即前面准备的镜像文件);
-boot order=dc
-fda : (file) ;
-fdb : (file) ; 使用指定文件(file)作为软盘镜像,
-hda :(file);
-hdb :(file);
-hdc :(file);
-hdd :(file); 使用指定file作为镜像硬盘镜像;file为/dev/fd0表示使用物理;
-cdrom (默认占用hdc接口)是分配客户机的光驱。将file指定为/dev/cdrom可以直接使用物理光驱
-drive:( option[,option[,option[,.....]]])定义一个新的硬盘设备,可用子选项有很多。
  file=/path/to/somefile:定义映像文件路径;
  if=interface:指定硬盘设备所连接接口类型,即控制器类型,如
  ide,scsi,sd,mtd,floppy,pflash及virtio等;
  index=index:设定同一种控制器类型中不同设备的索引号,即标识号;
  media=media:定义截止类型为硬(disk)盘还是光盘(cdrom);
  snapshot=snapshot:指定当前硬盘设备是否支持快照功能,on或off;
  cache=cache:定义如何使用物理机缓存来访问块数据,其可用值有
  none,writeback,unsafe和writethrough四个;
  format=format:指定映像文件格式,具体格式可参见qemu-img命令;
-boot:([order=drives][,once=drives][,menu=on|off])定义启动设备的引导次序,每种设备使用一个字符表示,不同的架构所支持的设备及其表示字符不尽相同,在x86PC架构上,a,b表示软驱,c表示第一块硬盘,d表示第一个光驱设备,n-p表示网络适配器,默认为硬盘设备。(案例:-boot order=dc,once=d,其中order表示启动顺序,意思是先找第一个光驱设备,再去找第一块硬盘启动,而once则表示第一次启动时需要找光驱设备。)
# 其他硬件
# 显示
-nographic : 默认情况下,qemu使用SDL来显示VGA输出;而此新选项用于禁止图形接口,此时,qemu类似一个简单的命令行程序,其仿真串口设备将被重定向到控制台;
ctrl a h :
C-a h print this help
C-a x exit emulator
C-a s save disk data back to file (if -snapshot)
C-a t toggle console timestamps
C-a b send break (magic sysrq)
C-a c switch between console and monitor
C-a C-a sends C-a

-monitor stdio:表示在标准输入输出显示monitor界面(-nographic)
  Ctrl-a,c:在console和monitor之间切换
  Ctrl-a,h:显示帮助信息。
-curses:禁止图形接口,并使用curses/ncurses作为交互接口;
-alt-grab:使用Ctrl+Alt+Shift组合键释放鼠标;
-ctrl-grab:使用右Ctrl键释放鼠标;
-sdl:启用SDL(Simple Directmedia Layer)它是用C语言编写的开源免费的多媒体程序库,它提供了一个简单的接口用于实现操作系统硬件平台的图形显示,声音,输入设备等等。目前来讲,SDL库已经被广泛应用于各个操作系统。换句话说,SDL是是能够让你的虚拟机直接在启动时在当前主机上就直接打开一个图形界面。他要求你操作系统本身要支持SDL。
-spice:(option[,option[,......]])启用splice远程桌面协议,其有许多子选项,具体请参考qemu-kvm的手册;
-vga type : 指定要仿真的VGA接口类型,常见的有:
cirrus : Cirrus Logic GD5446显示卡;
std:带有Bochs VBI扩展的标准VGA显示卡;
vmware:VMWare SVGA-II兼容的显示适配器;
qxl:QXL半虚拟化显示卡,于VGA兼容,在Guest中安装qxl驱动后能以很好的方式工作,在使用spice协议时推荐使用此类型;
none:禁用VGA卡;
-vnc:(display[,option][,option[,......]])默认情况下,qemu使用SDL显示VGA输出,使用VNC选项,可以让qemu监听在VNC上,并将VGA输出重定向至VNC会话,使用此选项时,必须使用-k选项指定键盘布局类型,其有许多子选项,具体请参考qemu-kvm的手册。VNC(Virtual Network Computing,应用层协议)基于RFB(远程帧缓冲)协议,来控制另外一台计算机系统,它是图像化的桌面分享系统,VNC克服了SDL只能在图形界面中运行的功能。
[options]:
    password:连接是需要验证密码,设置密码通过monitor接口使用change;
    reverse:“反向”连接至某出于监听状态的vncview上;
    
example vnc的display指定方法:
-vnc [ip]:[port],password # :1 表示是监听在主机的2500+N端口上!换句话说,就是监听在5901端口。
> help change
> change vnc password
-vnc unix:[/path/to/socket_file] # 这是基于套接字进行连接,这种方式只能局限于在本机工作,无法向第一种基于IP的方式进行连接可以让其他主机来连接本地的服务。
-vnc none # 表示在启动虚拟机时不启动VNC功能,将来在需要时可以在手动启动起来。
> change vnc :2


# usb
-usb :开启USB总线
-device usb-tablet GuestOS为Windows时,tablet用于实现鼠标定位。

# internet
-net:(tap[,valn=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile])通过物理机的TAP网络接口连接至VLAN n中,使用script=file指定的脚本(默认为/etc/qemu-ifup)来配置当前网络接口,并使用downscript=file指定的脚本(默认为/etc/qemu-ifdown)来撤销接口配置,使用script=no和downscript=no可分别用来禁止直行脚本;
-net:(user[,option][,option][,....])在用户模式配置网络栈,其不依赖于管理权限,有效选项有:
vlan=n :连接至vlan n,默认n=0;
name=name:指定接口的显示名称,常用于监控模式中;
net=addr[/mask]:设定GuestOS可见的IP网络,掩码可选,默认为10.0.2.0/8;
host=addr:指定GuestOS中看到的物理机的IP地址,默认为指定网络中的第二个,即x.x.x.2;
dhcpstart=addr:指定DHCP服务地址池中16个地址的起始IP,默认为第16个至第31个,即x.x.x.16-x.x.x.31;
dns=addr:指定GuestOS可见的dns服务器地址,默认为GuestOS网络中的第三个地址,即x.x.x.3;
tftp=dir:激活内置的tftp服务器,并使用指定的dir作为tftp服务器的默认根目录;
bootfile=file:BOOTP文件名称,用于实现网络引导GuestOS,如:"qemu -hda yinzhengjie_linux.img -boot n -net user,tftp=/tftpserver/pub,bootfile=/pxelinux.0"


扩展小知识:KVM的虚拟网络模型

1
2
3
4
I386平台专用选项;
  -no-acpi:禁用ACPI功能,GuestOS与ACPI出现兼容问题时使用此选项;
  -balloon none:禁用balloon设备;
  -balloon virtio[,addr=addr]:启用virti balloon设备;

3启动系统

1
删掉cdrom

qemu配置网卡方法:

不使用sdk的qemu(命令不适用)

Brew install qemu

如需要使用

1
2
$export PATH=$ANDROID_SDK_HOME/emulator/qemu/darwin-x86_64:$PATH
$export DYLD_LIBRARY_PATH=$ANDROID_SDK_HOME/emulator/lib64/qt/lib:$DYLD_LIBRARY_PATH

我之前进行过相关的测试,qemu这一块的网络连接的相关方法分享一下,配置起来稍微麻烦一点,需要创建虚拟网卡;
如果在本地测试可以通端口映射的方式进行;方法如下:

方法一:创建虚拟网卡

(注意本地机器上创建的虚拟网卡和qemu上的配置的地址网段的关系)

一、需要安装的工具软件:

1
2
$apt-get install bridge-utils        # 虚拟网桥工具
$apt-get install uml-utilities # UML(User-mode linux)工具

二、配置虚拟网卡的命令:

1
2
3
4
$sudo ifconfig tap0 down
$sudo tunctl -d tap0
$sudo tunctl -b -u $USER -t tap0
$sudo ifconfig tap0 192.168.10.1 promisc up

三、qemu启动时需要添加相关参数,启动命令如下:

1
2
3
4
5

$sudo qemu-system-x86_64 -enable-kvm -m 1024 -smp 2 -hda qemu-test/vdisk.img -cdrom android-x86.iso -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=no,downscript=no
#【note 起来之后在qemu中通过命令行设置ip地址】
#然后在宿主机上使用adb connect x.x.x.x 连接qemu中的android系统进行相关的操作;

方法二、在启动qemu的时候直接进行端口映射:

1
2
$sudo qemu-system-x86_64 -enable-kvm -m 1024 -smp 2  -hda ./vdisk.img -cdrom $android_x86_64.iso -redir tcp:5555::5555
$adb shell

libvirt

1
2
3
brew install qemu
brew install libvirt
brew services start libvirt
1
2
3
4
#只是创建
virsh define ~/qemu/images/ubuntu.xml
#创建后,虚拟机立即执行,成为活动主机
virsh creat ~/qemu/images/ubuntu.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<name>ubuntu</name>
<uuid>2005CB24-522A-4485-9B9A-E60A61D9F8CF</uuid>
<memory unit='GB'>2</memory>
<cpu mode='custom'>
<model>Westmere</model>
</cpu>
<vcpu>2</vcpu>
<features>
<acpi/>
<apic/>
</features>
<os>
<type arch='x86_64' machine='q35'>hvm</type>
<bootmenu enable='yes'/>
</os>
<clock offset='localtime'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/local/bin/qemu-system-x86_64</emulator>
<controller type='usb' model='ehci'/>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/Users/notify/qemu/images/ubuntu-desktop-18.04.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
<disk type='file' device='cdrom'>
<source file='/Users/notify/Parallels/Parallels iso/ubuntu-18.04.4-desktop-amd64.iso'/>
<target dev='sdb' bus='sata'/>
</disk>
<console type='pty'>
<target type='serial'/>
</console>
<input type='tablet' bus='usb'/>
<input type='keyboard' bus='usb'/>
<graphics type='vnc' port='5900' listen='127.0.0.1' passwd='10010' keymap='en-us'/>
<video>
<model type='virtio' vram='16384'/>
</video>
</devices>
<seclabel type='none'/>
<qemu:commandline>
<qemu:arg value='-machine'/>
<qemu:arg value='type=q35,accel=hvf'/>
<qemu:arg value='-netdev'/>
<qemu:arg value='user,id=n1,hostfwd=tcp::2222-:22'/>
<qemu:arg value='-device'/>
<qemu:arg value='virtio-net-pci,netdev=n1,bus=pcie.0,addr=0x19'/>
</qemu:commandline>
</domain>

Ctrl+Alt+Del按钮重新启动计算机,然后快速按Esc进入启动菜单。

c m d Mean
virsh list 列表
virsh start ubuntu 启动虚拟机
virsh suspend x 暂停虚拟机
virsh resume x 启动暂停的虚拟机
virsh shutdown x 正常关闭虚拟机
virsh destroy x 强制关闭虚拟机
virsh dominfo x 显示虚拟机的基本信息
virsh vncdisplay controller 查看该虚拟机的端口地址
virsh domname 2 显示id号为2的虚拟机名
virsh domid x 显示虚拟机id号
virsh domuuid x 显示虚拟机的uuid
virsh domstate x 显示虚拟机的当前状态
virsh dumpxml x 显示虚拟机的当前配置文件
virsh setmem x 512000 给不活动虚拟机设置内存大小
virsh edit x 编辑配置文件(一般是在刚定义完虚拟机之后

(可能和定义虚拟机时的配置不同,因为当虚拟机启动时,需要给虚拟机分配id号、uuid、vnc端口号等等)