4.1安卓模拟器无法检测到SD卡

4
我曾经使用一个带有SD卡的4.1 KitKat x86安卓模拟器进行测试。在将Android Studio升级到2.3后,我无法再访问模拟器中提供的SD卡,这使得我的测试变得不可能。 谷歌并没有找到解决方法,模拟器或ADB日志中也没有任何线索。AVD已被重新创建(为了防止问题出现,我删除了旧的AVD文件夹)。 现在它干脆就是无法运行了。
以下是在Kubuntu 14.04 AMD64上启动模拟器时的输出结果:
    $ LD_LIBRARY_PATH=/data1/usr/local/android-sdk/emulator/lib64/qt/lib:/data1/usr/local/android-sdk/emulator/lib64/libstdc++:/data1/usr/local/android-sdk/emulator/lib64:/data1/usr/local/android-studio/bin: /data1/usr/local/android-sdk/emulator/qemu/linux-x86_64/qemu-system-i386 -netdelay none -netspeed full -verbose -avd and4.1
emulator: Android virtual device file at: /data1/home2/mario/.android/avd/and4.1.ini
emulator: virtual device content at /data1/home2/mario/.android/avd/and4.1.avd
emulator: virtual device config file: /data1/home2/mario/.android/avd/and4.1.avd/config.ini
emulator: using core hw config path: /data1/home2/mario/.android/avd/and4.1.avd/hardware-qemu.ini
emulator: Found AVD target API level: 16
emulator: Read property file at /usr/local/android-sdk/system-images/android-16/google_apis/x86//build.prop
emulator: No boot.prop property file found.
emulator: Warning: config.ini contains invalid skin.path entry: _no_skin
emulator: autoconfig: -skin 480x800
emulator: autoconfig: -skindir (null)
emulator: autoconfig: -kernel /usr/local/android-sdk/system-images/android-16/google_apis/x86//kernel-ranchu
emulator: Target arch = 'x86'
emulator: Auto-config: -qemu -cpu qemu32
emulator: Auto-detect: Kernel image requires new device naming scheme.
emulator: Auto-detect: Kernel does support YAFFS2 partitions.
emulator: autoconfig: -ramdisk /usr/local/android-sdk/system-images/android-16/google_apis/x86//ramdisk.img
emulator: Using initial system image: /usr/local/android-sdk/system-images/android-16/google_apis/x86//system.img
emulator: autoconfig: -data /data1/home2/mario/.android/avd/and4.1.avd/userdata-qemu.img
emulator: autoconfig: -initdata /data1/home2/mario/.android/avd/and4.1.avd/userdata.img
emulator: autoconfig: -cache /data1/home2/mario/.android/avd/and4.1.avd/cache.img
emulator: autoconfig: -sdcard /data1/home2/mario/.android/avd/and4.1.avd/sdcard.img
emulator: Physical RAM size: 1024MB

emulator: System image is read only
emulator: GPU emulation enabled using 'mesa' mode
emulator: Found 1 DNS servers: 127.0.0.1
emulator: found magic skin width=480 height=800 bpp=16

emulator: WARNING: encryption is off
emulator: CPU Acceleration: working
emulator: CPU Acceleration status: KVM (version 12) is installed and usable.
emulator: Using default value for kernel Contiguous Memory Allocation.
sh: 1: glxinfo: not found
emulator: Found 1 DNS servers: 127.0.0.1
Content of hardware configuration file:
hw.cpu.arch = x86
hw.cpu.model = qemu32
hw.cpu.ncore = 1
hw.ramSize = 1024
hw.screen = multi-touch
hw.mainKeys = true
hw.trackBall = true
hw.keyboard = true
hw.keyboard.lid = false
hw.keyboard.charmap = qwerty2
hw.dPad = false
hw.gsmModem = true
hw.gps = true
hw.battery = true
hw.accelerometer = true
hw.audioInput = true
hw.audioOutput = true
hw.sdCard = true
hw.sdCard.path = /data1/home2/mario/.android/avd/and4.1.avd/sdcard.img
disk.cachePartition = true
disk.cachePartition.path = /data1/home2/mario/.android/avd/and4.1.avd/cache.img
disk.cachePartition.size = 66m
hw.lcd.width = 480
hw.lcd.height = 800
hw.lcd.depth = 16
hw.lcd.density = 240
hw.lcd.backlight = true
hw.gpu.enabled = true
hw.gpu.mode = mesa
hw.gpu.blacklisted = no
hw.initialOrientation = Portrait
hw.camera.back = none
hw.camera.front = emulated
vm.heapSize = 256
hw.sensors.light = true
hw.sensors.pressure = true
hw.sensors.humidity = true
hw.sensors.proximity = true
hw.sensors.magnetic_field = true
hw.sensors.orientation = false
hw.sensors.temperature = true
hw.useext4 = true
kernel.path = /usr/local/android-sdk/system-images/android-16/google_apis/x86//kernel-ranchu
kernel.newDeviceNaming = yes
kernel.supportsYaffs2 = yes
disk.ramdisk.path = /usr/local/android-sdk/system-images/android-16/google_apis/x86//ramdisk.img
disk.systemPartition.initPath = /usr/local/android-sdk/system-images/android-16/google_apis/x86//system.img
disk.systemPartition.size = 550m
disk.dataPartition.path = /data1/home2/mario/.android/avd/and4.1.avd/userdata-qemu.img
disk.dataPartition.size = 2g
avd.name = and4.1
.
QEMU options list:
emulator: argv[00] = "/data1/usr/local/android-sdk/emulator/qemu/linux-x86_64/qemu-system-i386"
emulator: argv[01] = "-dns-server"
emulator: argv[02] = "127.0.0.1"
emulator: argv[03] = "-serial"
emulator: argv[04] = "null"
emulator: argv[05] = "-cpu"
emulator: argv[06] = "android32"
emulator: argv[07] = "-enable-kvm"
emulator: argv[08] = "-m"
emulator: argv[09] = "1024"
emulator: argv[10] = "-lcd-density"
emulator: argv[11] = "240"
emulator: argv[12] = "-kernel"
emulator: argv[13] = "/usr/local/android-sdk/system-images/android-16/google_apis/x86//kernel-ranchu"
emulator: argv[14] = "-initrd"
emulator: argv[15] = "/usr/local/android-sdk/system-images/android-16/google_apis/x86//ramdisk.img"
emulator: argv[16] = "-object"
emulator: argv[17] = "iothread,id=disk-iothread"
emulator: argv[18] = "-drive"
emulator: argv[19] = "if=none,overlap-check=none,cache=unsafe,index=0,id=system,file=/data1/home2/mario/.android/avd/and4.1.avd/system.img.qcow2,read-only"
emulator: argv[20] = "-device"
emulator: argv[21] = "virtio-blk-pci,drive=system,iothread=disk-iothread,modern-pio-notify"
emulator: argv[22] = "-drive"
emulator: argv[23] = "if=none,overlap-check=none,cache=unsafe,index=1,id=cache,file=/data1/home2/mario/.android/avd/and4.1.avd/cache.img.qcow2,l2-cache-size=1048576"
emulator: argv[24] = "-device"
emulator: argv[25] = "virtio-blk-pci,drive=cache,iothread=disk-iothread,modern-pio-notify"
emulator: argv[26] = "-drive"
emulator: argv[27] = "if=none,overlap-check=none,cache=unsafe,index=2,id=userdata,file=/data1/home2/mario/.android/avd/and4.1.avd/userdata-qemu.img.qcow2,l2-cache-size=1048576"
emulator: argv[28] = "-device"
emulator: argv[29] = "virtio-blk-pci,drive=userdata,iothread=disk-iothread,modern-pio-notify"
emulator: argv[30] = "-drive"
emulator: argv[31] = "if=none,overlap-check=none,cache=unsafe,index=3,id=sdcard,file=/data1/home2/mario/.android/avd/and4.1.avd/sdcard.img.qcow2,l2-cache-size=1048576"
emulator: argv[32] = "-device"
emulator: argv[33] = "virtio-blk-pci,drive=sdcard,iothread=disk-iothread,modern-pio-notify"
emulator: argv[34] = "-netdev"
emulator: argv[35] = "user,id=mynet"
emulator: argv[36] = "-device"
emulator: argv[37] = "virtio-net-pci,netdev=mynet"
emulator: argv[38] = "-netdev"
emulator: argv[39] = "user,id=mynet2,net=10.0.3.0/24"
emulator: argv[40] = "-device"
emulator: argv[41] = "virtio-net-pci,netdev=mynet2"
emulator: argv[42] = "-show-cursor"
emulator: argv[43] = "-L"
emulator: argv[44] = "/data1/usr/local/android-sdk/emulator/lib/pc-bios"
emulator: argv[45] = "-soundhw"
emulator: argv[46] = "hda"
emulator: argv[47] = "-vga"
emulator: argv[48] = "none"
emulator: argv[49] = "-append"
emulator: argv[50] = "qemu=1 androidboot.hardware=ranchu clocksource=pit android.qemud=1 console=0 console=0 android.checkjni=1 qemu.gles=1"
emulator: argv[51] = "-android-hw"
emulator: argv[52] = "/data1/home2/mario/.android/avd/and4.1.avd/hardware-qemu.ini"
Concatenated QEMU options:
/data1/usr/local/android-sdk/emulator/qemu/linux-x86_64/qemu-system-i386 -dns-server 127.0.0.1 -serial null -cpu android32 -enable-kvm -m 1024 -lcd-density 240 -kernel /usr/local/android-sdk/system-images/android-16/google_apis/x86//kernel-ranchu -initrd /usr/local/android-sdk/system-images/android-16/google_apis/x86//ramdisk.img -object iothread,id=disk-iothread -drive if=none,overlap-check=none,cache=unsafe,index=0,id=system,file=/data1/home2/mario/.android/avd/and4.1.avd/system.img.qcow2,read-only -device virtio-blk-pci,drive=system,iothread=disk-iothread,modern-pio-notify -drive if=none,overlap-check=none,cache=unsafe,index=1,id=cache,file=/data1/home2/mario/.android/avd/and4.1.avd/cache.img.qcow2,l2-cache-size=1048576 -device virtio-blk-pci,drive=cache,iothread=disk-iothread,modern-pio-notify -drive if=none,overlap-check=none,cache=unsafe,index=2,id=userdata,file=/data1/home2/mario/.android/avd/and4.1.avd/userdata-qemu.img.qcow2,l2-cache-size=1048576 -device virtio-blk-pci,drive=userdata,iothread=disk-iothread,modern-pio-notify -drive if=none,overlap-check=none,cache=unsafe,index=3,id=sdcard,file=/data1/home2/mario/.android/avd/and4.1.avd/sdcard.img.qcow2,l2-cache-size=1048576 -device virtio-blk-pci,drive=sdcard,iothread=disk-iothread,modern-pio-notify -netdev user,id=mynet -device virtio-net-pci,netdev=mynet -netdev user,id=mynet2,net=10.0.3.0/24 -device virtio-net-pci,netdev=mynet2 -show-cursor -L /data1/usr/local/android-sdk/emulator/lib/pc-bios -soundhw hda -vga none -append 'qemu=1 androidboot.hardware=ranchu clocksource=pit android.qemud=1 console=0 console=0 android.checkjni=1 qemu.gles=1' -android-hw /data1/home2/mario/.android/avd/and4.1.avd/hardware-qemu.ini
emulator: Starting QEMU main loop
emulator: registered 'boot-properties' qemud service
emulator: Adding boot property: 'qemu.sf.fake_camera' = 'front'
emulator: Initializing hardware OpenGLES emulation support
emulator: Adding boot property: 'ro.opengles.version' = '131072'
emulator: Adding boot property: 'dalvik.vm.heapsize' = '256m'
emulator: Adding boot property: 'qemu.hw.mainkeys' = '1'
emulator: Adding boot property: 'qemu.sf.lcd_density' = '240'
emulator: goldfish_events.have-dpad: false
emulator: goldfish_events.have-trackball: true
emulator: goldfish_events.have-camera: true
emulator: goldfish_events.have-keyboard: true
emulator: goldfish_events.have-lidswitch: false
emulator: goldfish_events.have-touch: false
emulator: goldfish_events.have-multitouch: true
emulator: control console listening on port 5554, ADB on port 5555
Not using any http proxy
emulator: android_hw_fingerprint_init: fingerprint qemud listen service initialized

emulator: OpenGL Vendor=[Google (Intel Open Source Technology Center)]
emulator: OpenGL Renderer=[Android Emulator OpenGL ES Translator (Mesa DRI Mobile Intel® GM45 Express Chipset )]
emulator: OpenGL Version=[OpenGL ES 2.0 (2.1 Mesa 10.1.3)]
emulator: onGuestSendCommand: [0x7f72fc224f20] Adb connected, start proxing data

任何线索都将不胜感激,因为这已经成为了一个真正的停滞点。

这是使用 android-emulator-26.0.0sdk-tools-26.0.1platform-tools-25.0.4。我已经通过降级到 sdk-tools-25.2.5 解决了另一个 gradle 构建问题,并想知道是否降级模拟器也会产生同样的效果。但我找不到旧的 zip 文件,所以今晚我必须查看我的备份。这次升级已经耗费了 2 天时间。 - Mario Theodoridis
只是进一步澄清,“在Android上访问提供的sdcard”意味着从代码中创建输出流并将文件写入其中,是吗? - Gero
从来没有达到那个程度。Android 简单地无法识别 SD 卡。 - Mario Theodoridis
嗯,那么我的问题不完全相同,因为我得到了sdcard目录的路径,但是我的应用程序无法写入它(尽管权限和一切都正确)。 - Gero
我验证了它至少是相关的。所以对于其他遇到这个问题的人:使用API 15运行的26.0.0模拟器无法正确地给予您的应用程序对SD卡的写访问权限,而25er版本可以。这是一个令人讨厌的错误。 :/ - Gero
1个回答

4
我猜首席出血的前额现在可以回答自己的问题了。
降级模拟器确实解决了问题。不确定这是答案,但在有人提供替代方案之前,它将不得不这样做。
我没有找到旧版本的模拟器,因为它已经从sdk-tools包中移出。由于我已经将sdk-tools降级至25.2.5,所以我只需要删除模拟器包即可。自从Android-Studio更新后,我一直是手动启动模拟器的方式:
LD_LIBRARY_PATH=/usr/local/android-sdk/tools/lib64/qt/lib:/usr/local/android-sdk/tools/lib64/libstdc++:/usr/local/android-sdk/tools/lib64:/usr/local/android-studio/bin: /usr/local/android-sdk/tools/qemu/linux-x86_64/qemu-system-i386 -netdelay none -netspeed full -avd and4.1

我的kitkat镜像去哪了,它是and4.1版本的。

LD_LIBRARY_PATH可以避免以下错误:

/usr/local/android-sdk/tools/qemu/linux-x86_64/qemu-system-i386: error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file: No such file or directory

如果有其他人因此浪费时间,可以添加这个信息。

顺便说一下,在降级之前,路径是:

/usr/local/android-sdk/emulator/qemu/linux-x86_64/qemu-system-i386

而不是:

/usr/local/android-sdk/tools/qemu/linux-x86_64/qemu-system-i386


我希望我能给这个点赞两次。虽然我无法像这样降级模拟器(因为macOS,所以包含库的方式显然不同),最终也没有投入时间去找到一种方法来做到这一点,但整个问答过程向我展示了,我的代码可能没问题,而26.0.0模拟器可能是问题所在(当使用旧版Android版本时,例如我的情况下使用的是Icecream Sandwich)。现在我要找一个旧平板电脑,看看设备上的行为是否正常... - Gero
我刚刚升级了我的模拟器,以解决另一个问题!! - Hossein Shahdoost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接