HDiffPatch icon indicating copy to clipboard operation
HDiffPatch copied to clipboard

安卓合并文件夹的patch包报错 “is hdiff file? get diffInfo ERROR!”

Open tclock opened this issue 1 year ago • 7 comments

作者你好,我在安卓端用你提供的so合并文件级别的patch包是成功的,合并文件夹级别的patch包报这个错:“is hdiff file? get diffInfo ERROR!”,patch包在Mac上都是能合并成功的。这个可能是什么原因呢,或者是你提供的so不支持文件夹级别的合并吗?

tclock avatar May 23 '24 02:05 tclock

是的,手机上默认没有开启 文件夹 支持,需要 重新设置和编译

sisong avatar May 23 '24 02:05 sisong

是的,手机上默认没有开启 文件夹 支持,需要 重新设置和编译

好的,要支持 文件夹 需要修改哪些配置能告知下不,对c不是很熟悉,谢谢了

tclock avatar May 23 '24 03:05 tclock

#define _IS_NEED_DIR_DIFF_PATCH 0 将0改为1,然后还需要添加几个代码文件到安卓mk文件中。

sisong avatar May 23 '24 03:05 sisong

#define _IS_NEED_DIR_DIFF_PATCH 0 将0改为1,然后还需要添加几个代码文件到安卓mk文件中。

具体还有哪几个文件呢,我现在就加了这个文件 2024-05-23 at 3 45 PM

另外jni里调用的hpatchz方法需要改吗,还是这个方法已经兼容了文件夹的合并了,麻烦了!

tclock avatar May 23 '24 07:05 tclock

补丁如果是文件夹类型的补丁需要调用hpatch_dir()来完成打补丁。
(另外getDirDiffInfoByFile()可以获知一个补丁是否是一个文件夹补丁)
HDiffPatch\dirDiffPatch\dir_patch 目录中的.c文件都需要包含

sisong avatar May 24 '24 00:05 sisong

补丁如果是文件夹类型的补丁需要调用hpatch_dir()来完成打补丁。 (另外getDirDiffInfoByFile()可以获知一个补丁是否是一个文件夹补丁) HDiffPatch\dirDiffPatch\dir_patch 目录中的.c文件都需要包含

你好,我按你说的改完编译后调用报这个错:“dir_patch check oldPathType==kPathType_file error!”。我调用getIsDirDiffFile()方法返回的是true,请问下可能是什么原因呢?

编译包含的文件有这些: 2024-05-24 at 5 02 PM

hpatchz()方法实现我改成这样了: 2024-05-24 at 5 13 PM

tclock avatar May 24 '24 09:05 tclock

(源代码中搜索“oldPathType==kPathType_file” 可以找到该报错出现位置)

“dir_patch check oldPathType==kPathType_file error!” 这个错误,说明的是:
用系统文件API函数stat获取old目录中的某个具体子文件的时候,没有找到该文件。

sisong avatar May 24 '24 13:05 sisong

(源代码中搜索“oldPathType==kPathType_file” 可以找到该报错出现位置)

“dir_patch check oldPathType==kPathType_file error!” 这个错误,说明的是: 用系统文件API函数stat获取old目录中的某个具体子文件的时候,没有找到该文件。

好的,谢谢,我重新走了一遍diff、patch流程现在已经可以了

tclock avatar May 25 '24 10:05 tclock

#define _IS_NEED_DIR_DIFF_PATCH 0 将0改为1,然后还需要添加几个代码文件到安卓mk文件中。

具体还有哪几个文件呢,我现在就加了这个文件 2024-05-23 at 3 45 PM

另外jni里调用的hpatchz方法需要改吗,还是这个方法已经兼容了文件夹的合并了,麻烦了!

完整的改动代码有么?我们也需要对文件夹patch

mrsquhuainan avatar Mar 05 '25 01:03 mrsquhuainan

没有。 需要自己天添加 相关文件名称

sisong avatar Mar 05 '25 02:03 sisong

没有。 需要自己天添加 相关文件名称

您好,代码按照上面修改以后。

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---

mrsquhuainan avatar Mar 05 '25 07:03 mrsquhuainan

没有。 需要自己天添加 相关文件名称

问题已经定位到了。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); }

mrsquhuainan avatar Mar 05 '25 08:03 mrsquhuainan