是否可以将预构建的 APK 作为用户应用程序添加到 AOSP 构建中?
Is it possible to add a prebuilt APK to an AOSP build as an user app?
我希望将预构建的 APK 添加到我的 AOSP 构建中。我已经可以通过执行以下操作来做到这一点:
- 将 APK 添加到 $root_of_my_source_tree/packages/apps 文件夹。
创建一个 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)
添加:
PRODUCT_PACKAGES += \ <name of APK>
AOSP 构建系统获取的 make 文件。
这会将 APK 添加到 /system/app 文件夹,该文件夹为只读,因此用户将无法更新 APK。我希望将 APK 放置在 /data/app 文件夹中,以便用户实际更新预构建的 APK。
我已经尝试了 this question and they did not work. I tried the suggestion in this 问题中的建议,虽然它确实将 APK 输出到完成构建的 /data/app 文件夹,但一旦我闪现图像到我的设备上,应用程序不存在。该问题的第二个答案确实对此提供了可能的解释,但没有其他建议。
最终,我需要在我的构建中预加载一个可以更新的 APK,所以如果这不起作用或者是一个不好的方法,我愿意接受建议。
在您的 Android.mk 文件中使用 LOCAL_MODULE_PATH 到 TARGET_OUT_DATA 或 TARGET_OUT_DATA_APPS
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)
------
include $(BUILD_PREBUILT)
我发现 PackageManager class 的标准行为足以满足我的用例。所以这里有一些值得解释的花絮:
- Lavakush 的答案确实有效,它确实将 APK 输出到源代码树中的 out/target/product/vendor/data/app 文件夹,但 APK 没有显示在 下/data/app 在系统映像中闪烁到设备上后。根据 this 的回答,Android 构建系统不会将任何内容构建到 /data/ 中,因此可以解释这一点。我仍然感到困惑,它确实显示为 out/target/product/vendor/data/app 文件夹中的输出。
- 在我的用例中,我需要将 APK 预加载到构建中,然后根据需要更新它们。由于 /system/app 文件夹的只读性质,我假设我无法更新我的应用程序,这就是为什么我想将它预加载到 /data/app。事实证明,根据 this 回答和我的测试,PackageInstaller class' 的标准行为是将更新后的 APK 安装到 data/app 文件夹并启动 运行 这个 APK 而不是预加载的 /system/app APK。答案还说 settings->apps 屏幕会给你卸载更新后的 APK 的选项,然后你会留下原来的 system/app APK。我确实观察到了这种行为,这对我的用例来说很好。
我希望将预构建的 APK 添加到我的 AOSP 构建中。我已经可以通过执行以下操作来做到这一点:
- 将 APK 添加到 $root_of_my_source_tree/packages/apps 文件夹。
创建一个 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)
添加:
PRODUCT_PACKAGES += \ <name of APK>
AOSP 构建系统获取的 make 文件。
这会将 APK 添加到 /system/app 文件夹,该文件夹为只读,因此用户将无法更新 APK。我希望将 APK 放置在 /data/app 文件夹中,以便用户实际更新预构建的 APK。
我已经尝试了 this question and they did not work. I tried the suggestion in this 问题中的建议,虽然它确实将 APK 输出到完成构建的 /data/app 文件夹,但一旦我闪现图像到我的设备上,应用程序不存在。该问题的第二个答案确实对此提供了可能的解释,但没有其他建议。
最终,我需要在我的构建中预加载一个可以更新的 APK,所以如果这不起作用或者是一个不好的方法,我愿意接受建议。
在您的 Android.mk 文件中使用 LOCAL_MODULE_PATH 到 TARGET_OUT_DATA 或 TARGET_OUT_DATA_APPS
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)
------
include $(BUILD_PREBUILT)
我发现 PackageManager class 的标准行为足以满足我的用例。所以这里有一些值得解释的花絮:
- Lavakush 的答案确实有效,它确实将 APK 输出到源代码树中的 out/target/product/vendor/data/app 文件夹,但 APK 没有显示在 下/data/app 在系统映像中闪烁到设备上后。根据 this 的回答,Android 构建系统不会将任何内容构建到 /data/ 中,因此可以解释这一点。我仍然感到困惑,它确实显示为 out/target/product/vendor/data/app 文件夹中的输出。
- 在我的用例中,我需要将 APK 预加载到构建中,然后根据需要更新它们。由于 /system/app 文件夹的只读性质,我假设我无法更新我的应用程序,这就是为什么我想将它预加载到 /data/app。事实证明,根据 this 回答和我的测试,PackageInstaller class' 的标准行为是将更新后的 APK 安装到 data/app 文件夹并启动 运行 这个 APK 而不是预加载的 /system/app APK。答案还说 settings->apps 屏幕会给你卸载更新后的 APK 的选项,然后你会留下原来的 system/app APK。我确实观察到了这种行为,这对我的用例来说很好。