是否可以从USB驱动器启动Android手机?


17

是否可以通过总线供电的USB驱动器**来启动Android手机*?如果是这样,有哪些步骤可以实现?

*例如,具有USB OTG功能。

**例如闪存驱动器。

Answers:


23

请说明预期目标是什么,为什么?

Android手机具有自己的引导加载程序,无法通过其他方式覆盖。

它与PC的BIOS不同,您可以在其中将引导的顺序切换为从某些设备(例如Network PXE,USB,主/辅助HDD)引导。

编辑:

在下面的评论之后,以及关于OP的问题

是否可以通过总线供电的USB驱动器来启动Android手机(例如具有USB OTG功能的手机)。

通用引导加载程序(*驻留在芯片组上)不具备USB等知识,因为lk(小内核)更关注陷阱击键,以便将其链式加载到恢复中或直接引导到Android环境中(在这种情况下,当按住Vol + Down键时)-用伪代码(这是从lk的上下文/方面来的,而且,关于如何读取分区的内存地址被硬编码到该lk中,因此它将知道如何处理逻辑!

lk内核是高通公司针对MSM芯片组(Snapdragon)的事实上的标准,并被Sony,Motorola,LG,Samsung等制造商采用,可以在AOSP来源下找到bootable/bootloader

如果是音量键按下?然后

  • 将内核从/recovery分区链式加载到内存中的特定地址,然后跳转到该地址并开始执行,以恢复环境

其他

  • 将内核从/system分区链式加载到内存中的特定地址,然后跳转到该地址并在执行Android环境时开始执行。

万一。

由于lk中的内核非常有限,请考虑将内核的二进制映像刻录到芯片中,因此无法对其进行修改。而且还应该提到的是LK包含fastboot了闪烁的准备方案/boot/recovery/system/data分区。有两个引导顺序,即主要引导和辅助引导:

  • 主引导-> lk(取决于逻辑结果)
  • 进入辅助启动-> /boot/recovery

旁注:在改装时,Samsung很喜欢PBL / SBL(分别是Primary Boot Loader和Secondary Boot Loader)。关于三星的事情是,在某些手机中,PBL和SBL可能是加密的(三星Wave GT-S8500就是这样的一个例子,由于引导加载程序中的DRM简直是一场噩梦,将Android移植到它几乎是不可能的。进行处理并使其变得极为困难,但这是通过FOTA代码中的漏洞进行的工作!)

这就是为什么没有多余的功能(如OTG功能)或其他任何功能(如串行通信,从SDCard读取,图形等)的原因,因为这会使lk内核超出预期。换句话说,指定发生上述伪代码的是最小可能的内核大小。

另外,看它的另一种方式是这样的,这是依赖于Android的版本- USB OTG功能完全带到熟悉的主屏幕出现,当Android的环境中时,即 OTG的功能被启用。不幸的是,从lk的角度来看并非如此。

如果您很好奇,这是上面lk上的Qualcomm条目,它是小型C源代码的一部分,该源代码包含并在JellyBean的AOSP源代码中找到了ARM程序集。bootable/bootloader/legacy/usbloader/main.c

int boot_linux_from_flash(void)
{
    boot_img_hdr *hdr = (void*) raw_header;
    unsigned n;
    ptentry *p;
    unsigned offset = 0;
    const char *cmdline;

    if((p = flash_find_ptn("boot")) == 0) {
        cprintf("NO BOOT PARTITION\n");
        return -1;
    }

    if(flash_read(p, offset, raw_header, 2048)) {
        cprintf("CANNOT READ BOOT IMAGE HEADER\n");
        return -1;
    }
    offset += 2048;

    if(memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
        cprintf("INVALID BOOT IMAGE HEADER\n");
        return -1;
    }

    n = (hdr->kernel_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1));
    if(flash_read(p, offset, (void*) hdr->kernel_addr, n)) {
        cprintf("CANNOT READ KERNEL IMAGE\n");
        return -1;
    }
    offset += n;

    n = (hdr->ramdisk_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1));
    if(flash_read(p, offset, (void*) hdr->ramdisk_addr, n)) {
        cprintf("CANNOT READ RAMDISK IMAGE\n");
        return -1;
    }
    offset += n;

    dprintf("\nkernel  @ %x (%d bytes)\n", hdr->kernel_addr, hdr->kernel_size);
    dprintf("ramdisk @ %x (%d bytes)\n\n\n", hdr->ramdisk_addr, hdr->ramdisk_size);

    if(hdr->cmdline[0]) {
        cmdline = (char*) hdr->cmdline;
    } else {
        cmdline = board_cmdline();
        if(cmdline == 0) {
            cmdline = "mem=50M console=null";
        }
    }
    cprintf("cmdline = '%s'\n", cmdline);

    cprintf("\nBooting Linux\n");

    create_atags(ADDR_TAGS, cmdline,
                 hdr->ramdisk_addr, hdr->ramdisk_size);

    boot_linux(hdr->kernel_addr);
    return 0;
}

这里的鸡肉/鸡蛋问题:想回答我的问题,以便根据可行性来缩小用例范围。是要我先给出用例:)所以,我现在只能模糊地阐明我的目标。一种可能是通过从硬件加密的USB驱动器(Lok-It / dataShur / etc)启动来实现诸如全盘加密之类的功能,这样在驱动器上输入密码就无需在Android设备上输入解密密码。理想情况下,可以这样做,以便一旦启动手机,就可以卸下驱动器,使手机仍然可以正常运行,直到下次重启为止。
sampablokuper 2013年

对...有趣-从没听说过这样的情况-为何-为什么?值得深思,您将在哪里输入这样的密码?Android ICS向上具有加密整个IIRC的能力-您是否未对此进行研究?
t0mm13b 2013年

密码将使用驱动器内置的键盘输入。(如果您不明白我的意思,请查找我提到的驱动器。)是的,我已经研究了Android的内置加密,但是(a)并非没有缺点(例如,参见安全性)。 stackexchange.com/q/10529 ; v.gd/6hOcmd),(二)它不工作在所有的手机,即使是那些已经从厂商处得到ICS + ROM的(例如,某些型号的Xperia),以及(c)有其他可能需要能够从USB大容量存储设备启动电话/平板电脑的潜在用例。
sampablokuper 2013年

坦率地说,这是无法实现的,一开始,没有这样的智能手机引导程序会从高级的角度简单地“暂停”直到输入密码!您所要的是这个论坛之外的内容,并且需要专门的自定义引导加载程序(如果没有)的专业领域来实现这一目标!首先-通用引导程序lk(它在AOSP中位于bootable / bootloader下)被高通公司事实上用作芯片组,索尼,LG,摩托罗拉等公司使用了该芯片组,仅举几例...只是说,这个问题不是建设性的!
t0mm13b 2013年

2
简而言之- 这样做的方式为零,您似乎忘记了我对与引导程序有关的评论的强调,以及智能手机也没有BIOS的事实……。
t0mm13b

7

从某种意义上说,这是可能的。考虑到@ t0mm13b的答案中提到的限制,有理由认为所提到的引导加载程序(lk)无法执行此操作。因此,我们从启动fastboot(用于测试)启动自定义内核,该内核将启动,启用OTG功能,并且一旦在已连接的OTG设备上找到有效内核,就将其链式加载到内存中并进行控制。甚至可以将其集成到TWRP等现代自定义恢复中,该恢复同时具有OTG和(在某些情况下)MultiROM支持。

实际上,已使用以下方法在Nexus 9平板电脑上引导Ubuntu:

  1. fastboot boot <otg_chainloader_kernel>
  2. <otg_chainloader_kernel> 引导并启用OTG,并等待OTG设备连接。
  3. 设备已从PC断开连接,并且具有可启动Ubuntu映像的USB闪存驱动器通过OTG连接到了该设备。
  4. <otg_chainloader_kernel> 在OTG设备上检测到有效的Linux内核,并将其链式加载到内存后将控制权交给该内核。

现在,如果您愿意,可以以类似的方式启动兼容的Android ROM映像,但是请记住,在决定返回本机OS之前,必须保持OTG驱动器与设备的连接(因为将加载所有应用程序)除非所有Android ROM都可以配置为ramdisk(听说过Puppy Linux吗?),否则,所有数据都将被写入USB闪存驱动器,这要考虑到常见Android设备的当前内存容量和ROM本身目前不切实际)。在大多数具有统一数据/充电器端口的设备上,这也排除了在引导至OTG OS时进行充电的情况。

资料来源:XDA-Developers Nexus 9子论坛


是否有可能针对Android执行此操作,以便我无需安装即可启动N预览
Suici Doga

@SuiciDoga,我猜TWRP MultiROM支持OTG引导吗?它使用上述技术AFAIK,而没有所有fastboots。该kexec-hardboot由TWRP MultiROM使用的内核补丁基本上是OTG-Chainloader-Kernel我谈。
塔莫格纳·乔杜里

现在,这还取决于您可能要尝试使用哪种设备。Nexus 9和Nexus Player确实具有TWRP,但是MultiROM无法正常工作(x64 / ARM64问题?)。IDK也了解当前的Nexii。
Tamoghna Chowdhury

0

它的可能性,我在我的宏cer iconia平板电脑上做到了!

将闪存驱动器连接到PC并格式化为fat32,使用rufus将iso / dd移植到闪存驱动器

将其连接到otg并插入手机/平板电脑。.按住电源键并调低音量(如果无法启动,请尝试按住电源键并调高音量)

然后使用音量键移至UDisk(您的闪存驱动器品牌)或SATA;UDISK(不一定是您的USB品牌,它可以说是USB存储设备),然后单击电源键进行确认

好吧,我在启动菜单时遇到了麻烦,所以我设法避免了内核启动,并因此停止了android的启动

我认为是这样的:我已连接到PC,然后从平板电脑上删除了所有组件,但复制了Android文件夹

内核被删除,启动后使用USB集线器连接回PC

希望我能帮到我:)


那一定是某些出色的SoC,可能支持UEFI。如今,在Android设备中使用的SoC并不多,因此您可以配置启动顺序。
Irfan Latif
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.