为什么 Android8.1 使用f2fs文件系统的预置app到data/app不行?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lb5761311/article/details/83617744

最近使用mtk6739平台开发。有一个需求是想预置系统中,恢复出厂设置后把app删除。
再8.1 的流程是

在 package/apps/3rd-party 下面以需要预置的apk名字新建文件夹,以预置 facebook 为例。
将 facebook.apk 放到 package/apps/3rd-party/facebook 中。
在 package/apps/3rd-party/facebook 下面创建文件 Android.mk,文件内容如下
在 build/make/target/product/core.mk或device/mediatek/common/device.mk中添加PRODUCT_PACKAGES += facebook

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := facebook
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED

include $(BUILD_PREBUILT)

然后再下面文件添加facebook的包名
vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_system_list.txt
就可以完成卸载apk,但是这个做法有一个问题,恢复出厂设置facebook这个app有返回到桌面了。而我们设计需求是不能回到桌面。
这个方法不行。
第二种方法
需要预置apk,卸载以后,恢复出厂设置以后,apk不存在。这种需要预置apk到/data/app目录下。但是android o 版本以后google 加入了patch,不允许预置apk到data/app目录下,只允许使用adb install 的方式来安装apk到data/app目录下,需要将其roll back 回以前的版本,然后用下列方法可以完成预置。

  1. diff --git a/services/core/java/com/android/server/pm/PackageManagerService.javab/services/core/java/com/android/server/pm/PackageManagerService.javaindex bafcad4…71d3d9a 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -11394,6 +11394,10 @@
                                     + " but expected at " + known.codePathString
                                     + "; ignoring.");
                         }
+                    } else {
+                        throw new PackageManagerException(INSTALL_FAILED_INVALID_INSTALL_LOCATION,
+                                "Application package " + pkg.packageName
+                                + " not found; ignoring.");
                     }
                 }
             }

在PMS中将其中增加的代码删除。
2.在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例
3.将 Test.apk 放到 packages/apps/Test
4. 在 packages/apps/Test 下面创建文件 Android.mk,文件内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

 

# Module name should match apk name to be installed

LOCAL_MODULE := Test

LOCAL_MODULE_TAGS := optional

 

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

# LOCAL_PRIVILEGED_MODULE := true

LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)

 

LOCAL_CERTIFICATE := platform

include $(BUILD_PREBUILT)

5.打开文件 device\mediatek\common\device.mk

将 Test 添加到 PRODUCT_PACKAGES 里面。

PRODUCT_PACKAGES += Test
6.重新 build 整个工程
但是测试后发现 data/app 根本没有打包到userdata.img中。整个userdata.img大小 64K。
只能自己分析原因。
执行 生成userdata.img的命令 make userdataimage-nodeps

.PHONY: userdataimage-nodeps
userdataimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
	$(build-userdataimage-target)

INTERNAL_USERIMAGES_DEPS 依赖 ,表示执行 生成userdata.img 需要哪些条件
这个命令 最终执行 build-userdataimage-target
内容如下:

define build-userdataimage-target
  $(call pretty,"Target userdata fs image: $(INSTALLED_USERDATAIMAGE_TARGET)")
  @mkdir -p $(TARGET_OUT_DATA)
  @mkdir -p $(userdataimage_intermediates) && rm -rf $(userdataimage_intermediates)/userdata_image_info.txt
  $(call generate-userimage-prop-dictionary, $(userdataimage_intermediates)/userdata_image_info.txt, skip_fsck=true)
  $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
      ./build/tools/releasetools/build_image.py \
      $(TARGET_OUT_DATA) $(userdataimage_intermediates)/userdata_image_info.txt $(INSTALLED_USERDATAIMAGE_TARGET) $(TARGET_OUT)
  $(hide) $(call assert-max-image-size,$(INSTALLED_USERDATAIMAGE_TARGET),$(BOARD_USERDATAIMAGE_PARTITION_SIZE))
endef

$(TARGET_OUT_DATA) = out/target/product/k39tv1_bsp_1g/data
$(userdataimage_intermediates) = out/target/product/k39tv1_bsp_1g/obj/PACKAGING/userdata_intermediates
make userdata 的log

PRODUCT_COPY_FILES device/mediatek/common/fstab.enableswap:root/fstab.enableswap ignored.
No private recovery resources for TARGET_DEVICE k39tv1_bsp_1g
[100% 1/1] Target userdata fs image: out/target/product/k39tv1_bsp_1g/userdata.img
Target userdata fs image: out/target/product/k39tv1_bsp_1g/data
Running:  mkf2fsuserimg.sh out/target/product/k39tv1_bsp_1g/userdata.img 3221225472
in mkf2fsuserimg.sh PATH=out/host/linux-x86/bin/:/usr/lib/jvm/java-8-openjdk-amd64/bin:/home/stonecom/mtk6739/out/soong/host/linux-x86/bin:/home/stonecom/mtk6739/out/host/linux-x86/bin:/home/stonecom/mtk6739/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin::/home/stonecom/mtk6739/development/scripts:/home/stonecom/mtk6739/prebuilts/devtools/tools:/home/stonecom/mtk6739/external/selinux/prebuilts/bin:/home/stonecom/mtk6739/prebuilts/misc/linux-x86/dtc:/home/stonecom/mtk6739/prebuilts/misc/linux-x86/libufdt:/home/stonecom/mtk6739/prebuilts/android-emulator/linux-x86_64:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/stonecom/bin
make_f2fs -S 3221225472 out/target/product/k39tv1_bsp_1g/userdata.img

        F2FS-tools: mkfs.f2fs Ver: 1.8.0 (2017-02-03)

Info: Disable heap-based policy
Info: Debug level = 0
Info: Label = 
Info: Trim is disabled
Info: Segments per section = 1
Info: Sections per zone = 1
Info: sector size = 512
Info: total sectors = 6291456 (3072 MB)
Info: zone aligned segment0 blkaddr: 512
Info: format version with
  ""
Info: Overprovision ratio = 3.640%
Info: Overprovision segments = 115 (GC reserved = 62)
Info: format successful
out/target/product/k39tv1_bsp_1g/userdata.img maxsize=3288667008 blocksize=4224 total=57624 reserve=33221760

mkf2fsuserimg.sh 是生成 img脚本,地址在out/host/linux-x86/bin
内容:

#!/bin/bash
#
# To call this script, make sure make_f2fs is somewhere in PATH

function usage() {
cat<<EOT
Usage:
${0##*/} OUTPUT_FILE SIZE
EOT
}

echo "in mkf2fsuserimg.sh PATH=$PATH"

if [ $# -lt 2 ]; then
  usage
  exit 1
fi

OUTPUT_FILE=$1
SIZE=$2
shift; shift


if [ -z $SIZE ]; then
  echo "Need size of filesystem"
  exit 2
fi

MAKE_F2FS_CMD="make_f2fs -S $SIZE $OUTPUT_FILE"
echo $MAKE_F2FS_CMD
$MAKE_F2FS_CMD
if [ $? -ne 0 ]; then
  exit 4
fi

里面最重要的内容就是这句话,
MAKE_F2FS_CMD=“make_f2fs -S $SIZE $OUTPUT_FILE”
$SIZE $OUTPUT_FILE = out/target/product/k39tv1_bsp_1g/userdata.img
make_f2fs 实际使用的命令是mkfs.f2fs ,这是f2fs文件系统的命令
mkfs.f2fs指令使用指南
-s只是指定了段大小。整个命令是生成一个空的userdata.img并指定img段大小。
所以只要使用了 f2fs无法预置data/app到userdata.img,可以修改userdata img 为ext4支持,希望以后f2fs以后能支持

猜你喜欢

转载自blog.csdn.net/lb5761311/article/details/83617744