爲什麼 Android8.1 使用f2fs文件系統的預置app到data/app不行?

最近使用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以後能支持

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章