安卓合并文件夹的patch包报错 “is hdiff file? get diffInfo ERROR!”
作者你好,我在安卓端用你提供的so合并文件级别的patch包是成功的,合并文件夹级别的patch包报这个错:“is hdiff file? get diffInfo ERROR!”,patch包在Mac上都是能合并成功的。这个可能是什么原因呢,或者是你提供的so不支持文件夹级别的合并吗?
是的,手机上默认没有开启 文件夹 支持,需要 重新设置和编译
是的,手机上默认没有开启 文件夹 支持,需要 重新设置和编译
好的,要支持 文件夹 需要修改哪些配置能告知下不,对c不是很熟悉,谢谢了
#define _IS_NEED_DIR_DIFF_PATCH 0 将0改为1,然后还需要添加几个代码文件到安卓mk文件中。
#define _IS_NEED_DIR_DIFF_PATCH 0将0改为1,然后还需要添加几个代码文件到安卓mk文件中。
具体还有哪几个文件呢,我现在就加了这个文件
另外jni里调用的hpatchz方法需要改吗,还是这个方法已经兼容了文件夹的合并了,麻烦了!
补丁如果是文件夹类型的补丁需要调用hpatch_dir()来完成打补丁。
(另外getDirDiffInfoByFile()可以获知一个补丁是否是一个文件夹补丁)
HDiffPatch\dirDiffPatch\dir_patch 目录中的.c文件都需要包含
补丁如果是文件夹类型的补丁需要调用hpatch_dir()来完成打补丁。 (另外getDirDiffInfoByFile()可以获知一个补丁是否是一个文件夹补丁)
HDiffPatch\dirDiffPatch\dir_patch目录中的.c文件都需要包含
你好,我按你说的改完编译后调用报这个错:“dir_patch check oldPathType==kPathType_file error!”。我调用getIsDirDiffFile()方法返回的是true,请问下可能是什么原因呢?
编译包含的文件有这些:
hpatchz()方法实现我改成这样了:
(源代码中搜索“oldPathType==kPathType_file” 可以找到该报错出现位置)
“dir_patch check oldPathType==kPathType_file error!” 这个错误,说明的是:
用系统文件API函数stat获取old目录中的某个具体子文件的时候,没有找到该文件。
(源代码中搜索“oldPathType==kPathType_file” 可以找到该报错出现位置)
“dir_patch check oldPathType==kPathType_file error!” 这个错误,说明的是: 用系统文件API函数stat获取old目录中的某个具体子文件的时候,没有找到该文件。
好的,谢谢,我重新走了一遍diff、patch流程现在已经可以了
#define _IS_NEED_DIR_DIFF_PATCH 0将0改为1,然后还需要添加几个代码文件到安卓mk文件中。具体还有哪几个文件呢,我现在就加了这个文件
另外jni里调用的hpatchz方法需要改吗,还是这个方法已经兼容了文件夹的合并了,麻烦了!
完整的改动代码有么?我们也需要对文件夹patch
没有。 需要自己天添加 相关文件名称
没有。 需要自己天添加 相关文件名称
您好,代码按照上面修改以后。
patch的时候也报了这个错误 oldFileName: /data/user/0/com.xtapp.xtransfer.debug/cache/base 2025-03-05 15:05:27.765 24761-24761 hpatch com.xtapp.xtransfer.debug E dir_patch check oldPathType==kPathType_file error! 2025-03-05 15:05:27.765 24761-24761 hpatch com.xtapp.xtransfer.debug E open oldFile ERROR! 2025 请问是什么原因呀?我看oldFileName也是存在的 权限drwx--S---
没有。 需要自己天添加 相关文件名称
问题已经定位到了。oldPathType==kPathType_file 是因为缓存问题。 后面又遇到了Operation not permitted 问题。看源码是 因为patch 方法的最后一个参数应该是个目录而不是一个文件。这个错误提示能够提示更明显一些就好了。
Android 实现dir patch完整代码如下
- 修改Android.mk文件
Src_Files := $(HDP_PATH)/builds/android_ndk_jni_mk/hpatch_jni.c \ $(HDP_PATH)/builds/android_ndk_jni_mk/hpatch.c \ $(HDP_PATH)/file_for_patch.c \ $(HDP_PATH)/libHDiffPatch/HPatch/patch.c \ $(HDP_PATH)/libHDiffPatch/HDiff/private_diff/limit_mem_diff/adler_roll.c \ $(HDP_PATH)/dirDiffPatch/dir_patch/dir_patch.c \ $(HDP_PATH)/dirDiffPatch/dir_patch/dir_patch_tools.c \ $(HDP_PATH)/dirDiffPatch/dir_patch/new_dir_output.c \ $(HDP_PATH)/dirDiffPatch/dir_patch/new_stream.c \ $(HDP_PATH)/dirDiffPatch/dir_patch/ref_stream.c \ $(HDP_PATH)/dirDiffPatch/dir_patch/res_handle_limit.c
- 修改hpatch.c文件
修改
#define _IS_NEED_DIR_DIFF_PATCH 1添加 导入#include "../../hpatch_dir_listener.h" #include "../../dirDiffPatch/dir_patch/dir_patch.h"修改hpatchz方法int hpatchz(const char *oldFileName,const char *diffFileName, const char *outNewFileName,int64_t cacheMemory){ TDirPatchChecksumSet checksumSet = {0,hpatch_FALSE,hpatch_TRUE,hpatch_TRUE,hpatch_TRUE}; hpatch_BOOL dirDiff = getIsDirDiffFile(diffFileName); if(dirDiff){ return hpatch_dir(oldFileName,diffFileName,outNewFileName, hpatch_FALSE,getCacheMemory(cacheMemory),24,&checksumSet, &defaultPatchDirlistener,0,0); } return hpatch(oldFileName,diffFileName,outNewFileName, hpatch_FALSE,getCacheMemory(cacheMemory),0,0,1,1); }