【问题标题】:How do I install APK using Android updater script如何使用 Android 更新程序脚本安装 APK
【发布时间】:2013-02-01 19:05:33
【问题描述】:

我正在尝试使用 Android 的更新程序脚本语言(Edify?)通过无线方式将 APK 安装到我可以控制的嵌入式设备上。 Here's 描述语言的链接。

我的第一次尝试如下:

package_extract_file("added_files/data/app/test.apk", "/data/app/test.apk");

这导致test.apk 被自动安装在/data/data/com.acme.test 中,但是目录/data/data/com.acme.test/lib 是空的,而它应该包含test.so,这是一个包含在test.apk 中的共享库。 (如果我使用adb install test.apk手动安装,库被解压。)

然后我尝试将 APK 提取到 /data 而不是 /data/app,这样操作系统就不会自动将其安装到 /data/data,我可以尝试使用脚本安装:

package_extract_file("added_files/data/app/test.apk", "/data/test.apk");
run_program("/system/bin/pm", "install", "/data/test.apk");

这导致了以下错误:

about to run program [/system/bin/pm] with 3 args
run_program: execv failed: Exec format error
run_program: child exited with status 1

我不确定为什么会发生上述错误。

有没有办法安装 APK 并自动提取其共享库?我可以手动安装这些库,但我希望避免这种情况。

【问题讨论】:

    标签: android android-install-apk edify


    【解决方案1】:

    我不熟悉 Edify,但通过查看文档,package_extract_file() 只是将 APK 提取为存档文件。为什么数据最终在/data/data 中很奇怪;你确定这不是以前安装留下的吗?我建议完全卸载该应用并重试。

    在我看来,该特定功能不适合安装应用程序。您可能想尝试通过命令安装它:

    run_program("adb", "install", "-r", "added_files/data/app/test.apk");
    

    【讨论】:

    • 我有干净的 /data/data,但在我解压到 /data/app 并重新启动后,它以某种方式被填充。至于使用 adb,它在设备本身上不可用,它通过 USB 或 TCP/IP 工作,并在 Linux 或 Windows 等单独的主机上运行。如果有安卓原生版本的 adb,请告诉我。
    • 顺便说一句,我相信 adb 在设备本身上运行,因为关系是客户端/服务器。但是如果设备的调试设置被禁用,守护进程将不会运行。
    • 我尝试在我的问题中的 pm install 示例中添加“-r”,但这也不起作用。
    • 执行脚本命令的应用程序似乎没有required permissions for installing packages。不过,我不确定。您有什么方法可以捕获该命令的标准错误吗?
    • 呵呵,文档说明“返回一个字符串,我假设它是执行程序的标准输出的缓冲区,需要测试。”我想这对我们没有帮助!
    【解决方案2】:

    Edify 脚本在恢复模式下运行,根据您的设备,默认情况下并非所有分区都可用。您的问题很可能是您尝试使用的分区尚未挂载。

    【讨论】:

    • 我没有显示完整的脚本,但是 /system 已安装,因为我能够将二进制文件提取到它。由于某种原因,我无法运行 pm。你说得对,有些分区在恢复中不可用,比如引导加载程序和内核。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 2019-05-07
    • 2015-01-09
    • 2017-10-19
    相关资源
    最近更新 更多