mtk 平台增加一个新分区test,修改文件列表如下

 modified:   device/mediatek/mt6765/init.mt6765.rcmodified:   device/mediatek/mt6765/sepolicy/basic/device.temodified:   device/mediatek/mt6765/sepolicy/basic/file_contextsmodified:   device/mediatek/mt6765/ueventd.mt6765.emmc.rcmodified:   device/mediatek/sepolicy/basic/non_plat/fsck.temodified:   device/mediatek/sepolicy/basic/non_plat/init.temodified:   vendor/mediatek/proprietary/hardware/fstab/mt6765/fstab.in.mt6765modified:   vendor/mediatek/proprietary/tools/ptgen/MT6765/partition_table_emmc_ab.csv

1、分区表中添加分区参数(配置分区文件格式、大小、对应img名称等)

配置表格式后缀为.csv,通过在 device 目录下搜索,找到目标平台文件夹下的配置表

vendor/mediatek/proprietary/tools/ptgen/MT6765/partition_table_emmc_ab.csv

2、修改 fstab 文件添加分区的挂载和系统启动时挂载权限

device/mediatek/mt6765/init.mt6765.rc

     mkdir /mnt/cd-rom 0000 system system+# Create test mount pointer
+    mkdir /test 0711 system system
+# change lk_env permissionchown root system /proc/lk_envchmod 0660 /proc/lk_env

vendor/mediatek/proprietary/hardware/fstab/mt6765/fstab.in.mt6765

 DEVPATH(nvdata)     /mnt/vendor/nvdata      ext4   FS_FLAG_COMMIT   FSMGR_FLAG_FMTDEVPATH(nvcfg)      /mnt/vendor/nvcfg       ext4   FS_FLAG_COMMIT   FSMGR_FLAG_FMT+DEVPATH(test)      /test         ext4   FS_FLAG_DISCARD   FSMGR_FLAG_FMT

3、添加分区权限规则

device/mediatek/mt6765/ueventd.mt6765.emmc.rc

 /dev/block/platform/bootdevice/by-name/md1img_a  0640    root    system/dev/block/platform/bootdevice/by-name/md1img_b  0640    root    system/dev/block/platform/bootdevice/by-name/md1dsp    0660    root    system
+/dev/block/platform/bootdevice/by-name/test             0640    root    system

4、添加挂载分区的selinux权限

device/mediatek/mt6765/sepolicy/basic/device.te

 type gps_emi_device, dev_type;
+type test_block_device, dev_type;

device/mediatek/mt6765/sepolicy/basic/file_contexts

 /dev/gps_emi(/.*)? u:object_r:gps_emi_device:s0
+/dev/block/platform/mtk-msdc\.0/[0-9]+\.msdc0/by-name/test u:object_r:test_block_device:s0

device/mediatek/sepolicy/basic/non_plat/init.te

 allow init para_block_device:blk_file w_file_perms;
+allow init test_block_device:blk_file rw_file_perms;

device/mediatek/sepolicy/basic/non_plat/fsck.te

 allow fsck oem_block_device:blk_file rw_file_perms;
+allow fsck test_block_device:blk_file rw_file_perms;

5、其它

本来弄完这些步骤后就能看到 /dev/block/by-name/test 分区节点了

后来又尝试了下和 Q 版本一样增加编译 test.img 规则代码,最终不成功

一直卡在最后一步生成 system.img 报错信息如下


FAILED: out/target/product/65gt/test.img
/bin/bash -c "(mkdir -p out/target/product/65gt/test ) && (mkdir -p out/target/product/65gt/obj/PACKAGING/test_intermediates && rm -rf out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"test_fs_type=ext4\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"test_size=8388608\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"test_selinux_fc=out/target/product/65gt/obj/ETC/file_contexts.bin_intermediates/file_contexts.bin\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"ext_mkuserimg=mkuserimg_mke2fs\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"fs_type=ext4\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"extfs_sparse_flag=-s\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"squashfs_sparse_flag=-s\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"f2fs_sparse_flag=-S\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"system_verity_block_device=/dev/block/by-name/system\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"vendor_verity_block_device=/dev/block/by-name/vendor\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_avbtool=avbtool\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_system_hashtree_enable=true\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_system_add_hashtree_footer_args=--hash_algorithm sha256 --prop com.android.build.system.fingerprint:\$(cat out/target/product/65gt/build_fingerprint.txt) --prop com.android.build.system.os_version:11 --prop com.android.build.system.security_patch:2021-07-05\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_system_other_hashtree_enable=true\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_system_other_add_hashtree_footer_args=--rollback_index 1625443200\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_system_other_key_path=device/mediatek/system/common/oem_prvk.pem\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_system_other_algorithm=SHA256_RSA2048\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_vendor_hashtree_enable=true\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_vendor_add_hashtree_footer_args=--hash_algorithm sha256 --prop com.android.build.vendor.fingerprint:\$(cat out/target/product/65gt/build_fingerprint.txt) --prop com.android.build.vendor.os_version:11 --prop com.android.build.vendor.security_patch:2021-07-05\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_product_hashtree_enable=true\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_product_add_hashtree_footer_args=--hash_algorithm sha256 --prop com.android.build.product.fingerprint:\$(cat out/target/product/65gt/build_fingerprint.txt) --prop com.android.build.product.os_version:11 --prop com.android.build.product.security_patch:2021-07-05\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_system_ext_hashtree_enable=true\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_system_ext_add_hashtree_footer_args=--prop com.android.build.system_ext.fingerprint:\$(cat out/target/product/65gt/build_fingerprint.txt) --prop com.android.build.system_ext.os_version:11 --prop com.android.build.system_ext.security_patch:2021-07-05\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_odm_hashtree_enable=true\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"avb_odm_add_hashtree_footer_args=--hash_algorithm sha256 --prop com.android.build.odm.fingerprint:\$(cat out/target/product/65gt/build_fingerprint.txt) --prop com.android.build.odm.os_version:11\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"recovery_as_boot=true\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"root_dir=out/target/product/65gt/root\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"use_dynamic_partition_size=true\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (echo \"skip_fsck=true\" >>  out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt ) && (PATH=out/host/linux-x86/bin/:system/extras/ext4_utils/:\$PATH out/host/linux-x86/bin/build_image out/target/product/65gt/test out/target/product/65gt/obj/PACKAGING/test_intermediates/test_image_info.txt out/target/product/65gt/test.img out/target/product/65gt/system ) && (size=\$(for i in out/target/product/65gt/test.img; do stat -c \"%s\" \"\$i\" | tr -d '\\n'; echo +; done; echo 0); total=\$(( \$( echo \"\$size\" ) )); printname=\$(echo -n \"out/target/product/65gt/test.img\" | tr \" \" +); maxsize=\$((8388608)); if [ \"\$total\" -gt \"\$maxsize\" ]; then echo \"error: \$printname too large (\$total > \$maxsize)\"; false; elif [ \"\$total\" -gt \$((maxsize - 32768)) ]; then echo \"WARNING: \$printname approaching size limit (\$total now; limit \$maxsize)\"; fi )"
2020-08-14 09:56:25 - build_image.py - ERROR   : Failed to build out/target/product/65gt/test.img from out/target/product/65gt/test
Out of space? Out of inodes? The tree size of out/target/product/65gt/test is 4096 bytes (0 MB), with reserved space of 0 bytes (0 MB).
The max image size for filesystem files is 8388608 bytes (8 MB), out of a total partition size of 8388608 bytes (8 MB).
Traceback (most recent call last):File "/linux/alps/out/host/linux-x86/bin/build_image/internal/stdlib/runpy.py", line 174, in _run_module_as_mainFile "/linux/alps/out/host/linux-x86/bin/build_image/internal/stdlib/runpy.py", line 72, in _run_codeFile "/linux/alps/out/host/linux-x86/bin/build_image/__main__.py", line 12, in <module>File "/linux/alps/out/host/linux-x86/bin/build_image/internal/stdlib/runpy.py", line 174, in _run_module_as_mainFile "/linux/alps/out/host/linux-x86/bin/build_image/internal/stdlib/runpy.py", line 72, in _run_codeFile "/linux/alps/out/host/linux-x86/bin/build_image/build_image.py", line 821, in <module>File "/linux/alps/out/host/linux-x86/bin/build_image/build_image.py", line 813, in mainFile "/linux/alps/out/host/linux-x86/bin/build_image/build_image.py", line 488, in BuildImageFile "/linux/alps/out/host/linux-x86/bin/build_image/build_image.py", line 345, in BuildImageMkfsFile "/linux/alps/out/host/linux-x86/bin/build_image/common.py", line 281, in RunAndCheckOutput
common.ExternalError: Failed to run command '['mkuserimg_mke2fs', '-s', 'out/target/product/65gt/test', 'out/target/product/65gt/test.img', 'ext4', 'test', '8388608', '-D', 'out/target/product/65gt/system', '-L', 'test', '--inode_size', '256', 'out/target/product/65gt/obj/ETC/file_contexts.bin_intermediates/file_contexts.bin']' (exit code 4):
09:56:21 mkuserimg_mke2fs.py INFO: Env: {'MKE2FS_CONFIG': '/linux/alps/out/soong/.temp/tmpCm0ao_'}
09:56:21 mkuserimg_mke2fs.py INFO: Running: mke2fs -L test -I 256 -M /test -E android_sparse -t ext4 -b 4096 out/target/product/65gt/test.img 2048
09:56:23 mkuserimg_mke2fs.py INFO: Env: {}
09:56:23 mkuserimg_mke2fs.py INFO: Running: e2fsdroid -p out/target/product/65gt/system -S out/target/product/65gt/obj/ETC/file_contexts.bin_intermediates/file_contexts.bin -f out/target/product/65gt/test -a /test out/target/product/65gt/test.img
09:56:25 mkuserimg_mke2fs.py ERROR: Failed to run e2fsdroid_cmd: set_selinux_xattr: No such file or directory searching for label "/test"
e2fsdroid: No such file or directory while configuring the file systemmke2fs 1.45.4 (23-Sep-2019)
Creating filesystem with 2048 4k blocks and 2048 inodesAllocating group tables: 0/1   done
Writing inode tables: 0/1   done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: 0/1   doneset_selinux_xattr: No such file or directory searching for label "/test"
e2fsdroid: No such file or directory while configuring the file system

应该是和 R 版本启用了 V-AB 分区有关系

最终烧写后 adb shell 查看新加 test 分区如图

6、更新一波

咳咳,此更新来自遥远的2089年,先整个图证明下

test.img 成功编译,并且烧录后根节点存在 /test

此次修改文件列表如下

 modified:   build/make/core/Makefilemodified:   build/make/core/board_config.mkmodified:   build/make/core/config.mkmodified:   build/make/core/envsetup.mkmodified:   build/make/core/main.mkmodified:   build/make/tools/releasetools/build_image.pymodified:   build/make/tools/releasetools/common.pymodified:   device/mediatek/mt6765/sepolicy/basic/device.temodified:   device/mediatek/mt6765/sepolicy/basic/file_contextsmodified:   device/mediateksample/k65v1_64_bsp/BoardConfig.mkmodified:   system/core/rootdir/Android.mkmodified:   vendor/mediatek/proprietary/tools/ptgen/MT6765/partition_table_emmc_ab.csv

6.1、增加 test.img 对应编译代码

build/make/core/Makefile

$(hide) echo "ext_mkuserimg=$(notdir $(MKEXTUSERIMG))" >> $(1)$(if $(BOARD_TESTIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "test_fs_type=$(BOARD_TESTIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
$(if $(BOARD_TESTIMAGE_PARTITION_SIZE),$(hide) echo "test_size=$(BOARD_TESTIMAGE_PARTITION_SIZE)" >> $(1))
$(hide) echo "test_selinux_fc=$(SELINUX_FC)" >> $(1)$(if $(INTERNAL_USERIMAGES_EXT_VARIANT),$(hide) echo "fs_type=$(INTERNAL_USERIMAGES_EXT_VARIANT)" >> $(1))..............# test image ------------------------------------------------------
#INTERNAL_TESTIMAGE_FILES := \$(filter $(TARGET_OUT_TEST)/%,$(ALL_DEFAULT_INSTALLED_MODULES))testimage_intermediates := \$(call intermediates-dir-for,PACKAGING,test)
BUILT_TESTIMAGE_TARGET := $(PRODUCT_OUT)/test.imgdefine build-testimage-target$(call pretty,"Target test fs image: $(INSTALLED_TESTIMAGE_TARGET)")@mkdir -p $(TARGET_OUT_TEST)@mkdir -p $(testimage_intermediates) && rm -rf $(testimage_intermediates)/test_image_info.txt$(call generate-userimage-prop-dictionary, $(testimage_intermediates)/test_image_info.txt,skip_fsck=true)$(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \./build/tools/releasetools/build_image.py \$(TARGET_OUT_TEST) $(testimage_intermediates)/test_image_info.txt $(INSTALLED_TESTIMAGE_TARGET) $(TARGET_OUT)$(hide) $(call assert-max-image-size,$(INSTALLED_TESTIMAGE_TARGET),$(BOARD_TESTIMAGE_PARTITION_SIZE))
endef# We just build this directly to the install location.
INSTALLED_TESTIMAGE_TARGET := $(BUILT_TESTIMAGE_TARGET)
$(INSTALLED_TESTIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_TESTIMAGE_FILES)$(build-testimage-target).PHONY: testimage-nodeps
testimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)$(build-testimage-target)# -----------------------------------------------------------------
# data partition image
INTERNAL_USERDATAIMAGE_FILES := \$(filter $(TARGET_OUT_DATA)/%,$(ALL_DEFAULT_INSTALLED_MODULES))

build/make/core/board_config.mk

@@ -72,6 +72,7 @@ _board_strip_readonly_list += \BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE \BOARD_ODMIMAGE_PARTITION_SIZE \BOARD_ODMIMAGE_FILE_SYSTEM_TYPE \
+  BOARD_TESTIMAGE_PARTITION_SIZE \

build/make/core/config.mk

@@ -1213,6 +1213,7 @@ dont_bother_goals := out \snod systemimage-nodeps \userdataimage-nodeps \cacheimage-nodeps \
+    testimage-nodeps \bptimage-nodeps \vnod vendorimage-nodeps \pnod productimage-nodeps \

build/make/core/envsetup.mk

@@ -580,6 +580,7 @@ $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_METRIC_TESTS := $(TARGET_OUT_DATA$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_METRIC_TESTS \TARGET_OUT_CACHE := $(PRODUCT_OUT)/cache
+TARGET_OUT_TEST := $(PRODUCT_OUT)/test.KATI_READONLY := TARGET_OUT_CACHE

build/make/core/main.mk

 @@ -1394,6 +1394,9 @@ endif.PHONY: cacheimagecacheimage: $(INSTALLED_CACHEIMAGE_TARGET)+.PHONY: testimage
+testimage: $(INSTALLED_TESTIMAGE_TARGET)
+.PHONY: bptimagebptimage: $(INSTALLED_BPTIMAGE_TARGET)@@ -1449,6 +1452,7 @@ droidcore: $(filter $(HOST_OUT_ROOT)/%,$(modules_to_install)) \$(INSTALLED_VBMETAIMAGE_TARGET) \$(INSTALLED_USERDATAIMAGE_TARGET) \$(INSTALLED_CACHEIMAGE_TARGET) \
+    $(INSTALLED_TESTIMAGE_TARGET) \$(INSTALLED_BPTIMAGE_TARGET) \$(INSTALLED_VENDORIMAGE_TARGET) \$(INSTALLED_VENDOR_BOOTIMAGE_TARGET) \

build/make/tools/releasetools/build_image.py

@@ -614,6 +614,10 @@ def ImagePropFromGlobalDict(glob_dict, mount_point):copy_prop("cache_fs_type", "fs_type")copy_prop("cache_size", "partition_size")copy_prop("cache_selinux_fc", "selinux_fc")
+  elif mount_point == "test":
+    copy_prop("test_fs_type", "fs_type")
+    copy_prop("test_size", "partition_size")
+    copy_prop("test_selinux_fc", "selinux_fc")elif mount_point == "vendor":copy_prop("avb_vendor_hashtree_enable", "avb_hashtree_enable")copy_prop("avb_vendor_add_hashtree_footer_args",
@@ -787,6 +791,8 @@ def main(argv):mount_point = "data"elif image_filename == "cache.img":mount_point = "cache"
+    elif image_filename == "test.img":
+      mount_point = "test"elif image_filename == "vendor.img":mount_point = "vendor"elif image_filename == "odm.img":

build/make/tools/releasetools/common.py

   makeint("vendor_size")makeint("userdata_size")makeint("cache_size")
+  makeint("test_size")makeint("recovery_size")makeint("fstab_version")

device/mediateksample/k65v1_64_bsp/BoardConfig.mk

 BOARD_VENDOR_RAMDISK_KERNEL_MODULES +=# For WifiBOARD_VENDOR_RAMDISK_KERNEL_MODULES +=
+
+BOARD_TESTIMAGE_FILE_SYSTEM_TYPE := ext4
+# BOARD_TESTIMAGE_PARTITION_SIZE := 0

system/core/rootdir/Android.mk

@@ -125,6 +125,7 @@ ifdef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPEelseLOCAL_POST_INSTALL_CMD += ; ln -sf /data/cache $(TARGET_ROOT_OUT)/cacheendif
+LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/testifdef BOARD_ROOT_EXTRA_SYMLINKS

device/mediatek/mt6765/sepolicy/basic/device.te

 type gps_emi_device, dev_type;
+type test_file, dev_type;

device/mediatek/mt6765/sepolicy/basic/file_contexts

/dev/gps_emi(/.*)? u:object_r:gps_emi_device:s0
+# Label
+/test(/.*)? u:object_r:test_file:s0

6.2、test.img 编译排错分析

错误一、 Not enough space to build proposed filesystem while setting up superblock

ERROR : Failed to build out/target/product/65gt/test.img from out/target/product/65gt/test
Out of space? Out of inodes? The tree size of out/target/product/65gt/test is 8192 bytes (0 MB), with reserved space of 0 bytes (0 MB).
The max image size for filesystem files is 20480 bytes (0 MB), out of a total partition size of 20480 bytes (0 MB)

这个问题我一直是以为分区大小太小,每次我修改 BOARD_TESTIMAGE_PARTITION_SIZE 的值,对应报错 log 中 bytes 就是其对应值

后来我研究了下流程,看了 odm 发现仅仅只是定义 BOARD_ODMIMAGE_PARTITION_SIZE,并未赋值

那就在同样的地方定义 BOARD_TESTIMAGE_PARTITION_SIZE ,再次编译未在报错

错误二、 ERROR: Failed to run e2fsdroid_cmd: set_selinux_xattr: No such file or directory searching for label “/test”

这个问题也是最一早就发现的,一开始没解决。后来找了找根据这篇

https://forum.xda-developers.com/t/android-los17-build-on-gcloud.4088065/

中提到解决办法增加 /test 规则最终解决。

6.3、烧写工具加载指定 img 文件路径

还是回到最初的 partition_table_emmc_ab.csv

一开始没注意这里面需要直接指定是否 DownLoad 和 对应 img,对照了 usedata.img 照抄就行

编译成功后,烧写工具中就自动加载 test.img

这个文件也挺有迷惑性,vendor\mediatek\proprietary\tools\ptgen\MT6765\emmc.yaml

里面配置和烧写对应规则及其相似。

android LOS17 build on gCloud
Android 新增一个分区

Android11.0(R) MTK平台添加新分区相关推荐

  1. AndroidQ(10.0) MTK平台添加新分区

    65 平台增加一个新分区,用于保存特殊数据,修改文件列表如下 modified: build/make/core/Makefilemodified: build/make/core/config.mk ...

  2. Android11.0(R) MTK 预置可卸载app恢复出厂不恢复(仿RK方案)

    常规的预置可卸载 apk 并且恢复出厂不恢复,都是放到 data 目录下,也就是打包到 userdata.img 中. 这里列举几个缺点, 1.从 Q 开始谷歌默认不建议这样做了,所以在不修改源码情况 ...

  3. Ubuntu下添加新分区并设置挂载点

    Ubuntu下添加新分区并设置挂载点 最近在做Android项目,可是解压根文件系统以后,就报警说硬盘不够.当初设置使用的大小为15G.不过扩展分区还是很方便的.当然首先你得设置添加使用的硬盘大小,这 ...

  4. oracle无法分区,oracle已存在的表添加新分区的方法

    现在有一张表如下: create table WRITE_USER ( area_code              VARCHAR2(8), user_no                VARCH ...

  5. Android系统之路(初识MTK) ------Android11.0给系统相机添加闪光灯低电Toast提醒

    Android11.0给相机添加低电Toast提醒 修改前的效果:当电量小于等于15%时,可以点击按钮进行操作但没有实际去打开闪光灯,因为底层添加了判断,当系统电量小于等于15%时,是不会去执行打开闪 ...

  6. android11.0(R) data分区节点加密控制分析

    前情提要 androidQ(10.0) 预装集成apk到data分区 Android O.P.Q 版本如何预装 APK 遇到问题 当然是和之前一样啦,开机并不能正常启动,而是 自动进入了 recove ...

  7. Android11.0(R) framework 新增类 lint 编码检查问题

    从 10.0 移植了几个类过来,没想到一编译出来几十个 errors,这就很离谱,明明是现成的代码. 后来仔细看了错误 log 提示,Your API changes are triggering A ...

  8. linux新建挂载目录命令,告诉你Ubuntu添加新分区并设置挂载点的方法及命令

    最近在Ubuntu下做Android项目,可是解压根文件系统以后,就报警说硬盘不够.当初设置使用的大小为15G.不过扩展分区还是很方便的.当然首先你得设置添加使用的硬盘大小,这次我一下提高到了30G, ...

  9. Android8.0 修改默认铃声 添加新铃声

    1.修改默认铃声 build/make/target/product/full_base.mk # Additional settings used in all AOSP builds PRODUC ...

最新文章

  1. Python:数据导入、爬虫:csv,excel,sql,html,txt
  2. gnuradio 使用eclipse 编辑器记录
  3. python抢票代码_教你用Python动刷新抢12306火车票,附源码!
  4. 我们在大学图书馆发现了三本有毒的书
  5. matlab软件imag函数_「复变函数与积分变换」基本计算代码
  6. 真格量化-隐含波动率购买
  7. 2018年软考网络规划设计师考试通过经验分享
  8. EIP-712 (一个对结构化数据的哈希标准)
  9. Function.prototype.bind相关知识点
  10. pytorch 构造读取数据的工具类 Dataset 与 DataLoader (pytorch Data学习一)
  11. H3C设备之 EASY NAT
  12. mmh学长的实验器材
  13. [Other] Inno Setup 使用心德-一个完整的项目 包括.NET组建捆绑 去空格等
  14. 机器学习-推荐系统中基于深度学习的混合协同过滤模型
  15. 北、上、广、深数据分析职位分析
  16. 简单的手机html页面源代码,手机页面h5的简单demo
  17. html5视频制作,iH5最专业的H5制作工具
  18. 微信公众号开发之生成并扫描带参数的二维码(无需改动)
  19. 进度管理PV,AC,EV
  20. rails 构建高性能web

热门文章

  1. 使用nodejs(ipp和html-pdf-node)实现连接打印机后端静默打印html文件
  2. html字大小自适应,html字体大小自适应 怎样让HTML字体自适应到移动端?
  3. 打包时出现No matching provisioning profile found错误的解决方法
  4. 编写优质嵌入式C程序(转)
  5. 无穷小带来什微积分么大礼包
  6. 帧中继网络与NBMA/P2MA
  7. 计算机学业水平考试的选择题,信息技术学业水平考试选择题带答案.doc
  8. 读书笔记:杨绛《我们仨》
  9. 生信分析之R语言常用R包一步下载
  10. ISTQB基础级考试心得