就是本来loadLibrary的是apk里的libUnreal.so,现在下载(这个没问题,用java写)校验及设置so权限都没问题,放到指定地址后,还需要改什么。有哪些注意点。只考虑在每次启动的时候做下载更新检查,libUnreal.so已经启动后就不用管了。
我们将loadLibrary改为load,然后目标文件地址指向本地私有目录。然后崩溃在native代码里,通过代码可以看到android是在取安装目录的地址去获取so,并没有到我们只想的本地私有目录。
<br/>
crash截图附上。
20260812-180620.jpg(171 KB)
重现步骤
就是本来loadLibrary的是apk里的libUnreal.so,现在下载(这个没问题,用java写)校验及设置so权限都没问题,放到指定地址后,还需要改什么。有哪些注意点。只考虑在每次启动的时候做下载更新检查,libUnreal.so已经启动后就不用管了。
tuo.chen
(tuo.chen)
3
您好,我们有个一个bDontBundleLibrariesInAPK选项,勾选之后,打包的时候不要选 archive。可以push so来替换
可以先试一下参考这个流程自己改造。
热更so 在google play上是不允许的,但是内部开发、私有渠道分发的apk是可以的
ChenDong
(ChenDong)
4
楼上说的 bDontBundleLibrariesInAPK 是更接近引擎自己的做法:打包时勾上,不要走 Archive,再用 adb push 把 so 推到引擎约定的目录。你现在这个崩溃,和“自己 System.load 一个私有目录”对得上。
勾不勾那个选项,UE 拼 so 路径时用的都是安装目录 ApplicationInfo.nativeLibraryDir(/data/app/…/lib/arm64),不是你传给 System.load 的私有路径。loadLibrary 改成 load(私有目录) 只覆盖你改到的那一次。GameActivity 里通常还有一处静态初始化,或者 native 里直接按 nativeLibraryDir 去 dlopen,所以栈上看到的仍是安装目录。
如果还是要在每次启动时下载再加载,这几件事要同时做:
- 在 GameActivity.java 里搜所有 loadLibrary(“Unreal”) 和 nativeLibraryDir。常见有两处(静态块和 onCreate)。两处都改成同一个绝对路径,只改一处时另一处还会读安装目录。
- libc++_shared.so 这类依赖先用原来的 loadLibrary 从 APK 加载,然后再 System.load 你下载的 libUnreal.so。不要把依赖也指到一个不存在的私有路径。
- so 放 context.getCodeCacheDir() 或 getFilesDir(),不要放外部存储,外部存储在新系统上是 noexec。ABI 必须和当前包一致(arm64 对 arm64)。
- 这份 so 必须和当前 apk 里的 pak、Java 是同一次构建。路径对了但版本不一致,会在 JNI_OnLoad 之后崩,那是另一个问题。
- Google Play 不允许热更 so。内部包或私有渠道可以,这点和楼上一致。
先让崩溃栈里拼路径的那一层改掉,确认日志里的路径已经不是 nativeLibraryDir,再判断是不是 so 和 pak 不匹配。