【问题标题】:Is it possible to add a prebuilt APK to an AOSP build as an user app?是否可以将预构建的 APK 作为用户应用程序添加到 AOSP 构建中?
【发布时间】:2018-04-09 21:02:52
【问题描述】:

我希望将预构建的 APK 添加到我的 AOSP 构建中。我已经可以通过执行以下操作来做到这一点:

  1. 将 APK 添加到 $root_of_my_source_tree/packages/apps 文件夹。
  2. 创建一个 Android.mk 文件。该文件有以下内容:

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE_TAGS := optional
    
    LOCAL_MODULE := <name of APK>
    
    LOCAL_SRC_FILES := <Name of APK>.apk
    
    LOCAL_MODULE_CLASS := APPS
    
    LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
    
    LOCAL_CERTIFICATE := platform
    
    include $(BUILD_PREBUILT)
    
  3. 添加:

    PRODUCT_PACKAGES += \ <name of APK>
    

    到由 AOSP 构建系统获取的 make 文件。

这会将 APK 添加到 /system/app 文件夹,该文件夹是只读的,因此用户将无法更新 APK。我希望将 APK 放置在 /data/app 文件夹中,以便用户实际更新预构建的 APK。

我尝试了this 问题中的建议,但没有奏效。我尝试了this 问题中的建议,虽然它确实将 APK 输出到了完成构建的 /data/app 文件夹,但一旦我将图像刷到我的设备上,应用程序就不存在了。该问题的第二个答案确实为此提供了可能的解释,但没有其他建议。

最终,我需要在我的构建中预加载一个可以更新的 APK,所以如果这不起作用或者是一个不好的方法,我愿意接受建议。

【问题讨论】:

  • “一旦我将图像刷到我的设备上,应用程序就不存在了”——这是什么意思?您的意思是/data/app 中缺少该文件吗?您的意思是该应用位于/data/app 但未显示在“设置”中?您的意思是该应用位于/data/app,出现在“设置”中,但没有出现在主屏幕启动器中?你还有别的意思吗?
  • 1.当我为我的 AOSP 映像运行构建脚本时,我得到两种类型的输出:一个 system.img 文件和 out/target/product// 中的一堆文件 文件夹。文件夹中的文件通常代表系统映像完成闪烁后将加载到设备的内容。例如,如果我的应用位于 out/target/product//system/app 文件夹中,我有 99.99% 的把握一旦系统映像被加载到设备上闪烁,它将位于 /system/app 文件夹下。
  • 2.我的问题是我需要在 /data/app 下加载我的应用程序,以便可以根据需要删除或更新它。下面的答案确实在 out/target/product//data/app/ 而不是 out/target/product//system/app/ 中生成应用程序i> 但是一旦我完成了系统映像的闪烁,应用程序就不存在了。
  • “但是一旦我完成了系统映像的闪烁,应用程序就不存在了”——没有冒犯,但最后你的两个 cmets 重复我在原始评论中询问的相同段落.请用精确的技术术语解释“应用不存在”是什么意思。
  • data/app 中缺少 APK。该应用程序不在设置下,也不在启动器中。话虽如此,我已经找到了足够的信息来回答我自己的问题。我在下面发布一个答案。

标签: android makefile apk android-source


【解决方案1】:

我发现 PackageManager 类的标准行为对于我的用例来说已经足够好了。所以这里有一些值得解释的花絮:

  • Lavakush 的回答确实有效,它确实将 APK 输出到源树中的 out/target/product/vendor/data/app 文件夹,但 APK 没有显示在 / 下数据/应用程序 闪存到设备后,系统映像中的数据/应用程序。根据this 的回答,Android 构建系统不会在 /data/ 中构建任何内容,因此可以解释这一点。但是,我仍然觉得它确实在 out/target/product/vendor/data/app 文件夹中显示为输出,这让我感到困惑。
  • 在我的用例中,我需要将 APK 预加载到构建中,然后根据需要进行更新。由于 /system/app 文件夹的只读性质,我认为我无法更新我的应用程序,这就是为什么我想将其预加载到 /data/app。事实证明,根据this 回答和我的测试,PackageInstaller 类的标准行为是将更新的 APK 安装到 data/app 文件夹并开始运行此 APK 而不是预加载的 /system/app APK。答案还说,settings->apps 屏幕将为您提供卸载更新的 APK 的选项,然后您将留下原始的 system/app APK。我确实观察到了这种行为,这对我的用例来说很好。

【讨论】:

  • Daniel,我还想安装一个apk文件作为用户应用程序,以便用户可以卸载。你能分享更多细节吗?
【解决方案2】:

在您的 Android.mk 文件中使用 LOCAL_MODULE_PATH 到 TARGET_OUT_DATA 或 TARGET_OUT_DATA_APPS

LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)
------
include $(BUILD_PREBUILT)

【讨论】:

  • 两者都使用 data/app 文件夹中的 APK 生成了一个系统映像,但是一旦我刷新了映像,应用程序就没有加载。你知道为什么会这样吗?或者您知道将 APK 作为用户应用预加载的任何其他方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多