feilongproject / BAAssetsDownloader

unOfficial BlueArchive Asset Downloader
GNU Affero General Public License v3.0
90 stars 7 forks source link

[开发帮助/个人见解]关于国际服资源文件下载 #4

Closed ghitori closed 4 months ago

ghitori commented 9 months ago

大佬好!昨天收到大佬在b站的回复后,本人尝试去解析了下ba国际服的资源文件下载流程,得到了一些拙见。因本人无缘java/kotlin,无法提出pr,所以把我的结论分享出来,希望能对大佬起到一定帮助

游戏启动后会向Nexon的资源获取api https://api-patch.nexon.com/patch/v1.1/version-check 发送post请求,请求body如下 {"market_game_id":"com.nexon.bluearchive","language":"zh","advertising_id":"553ab7e8-1501-4359-bc93-406f8d24e8c9","market_code":"playstore","country":"CN","sdk_version":"228","curr_build_version":"1.53.225706","curr_build_number":225706,"curr_patch_version":789} 经本人缩短尝试后,发现必要body内容为 {"market_game_id":"com.nexon.bluearchive","market_code":"playstore","curr_build_version":"1.53.225706","curr_build_number":225706} 该部分内的所有数据目前均可获取,且该请求无任何headers要求 请求发送后服务器会返回当前资源版本的完整patch包以及多个不同版本的升级包,其中的patch-resource_path对应的url为完整的数据文件列表,https://ba.dn.nexoncdn.co.kr/com.nexon.bluearchive/95f28e63ed93477c/resource-data.json 是当前版本所对应的url,其中包含了当前版本所需的所有资源文件 Screenshot_2023-09-12-00-44-59-432_mark via gp 其中的resources-resource_path既是文件在服务器的路径 https://ba.dn.nexoncdn.co.kr/com.nexon.bluearchive/{数据列表目录(上文的95f28e63ed93477c)}/{resource_path} ,也是文件在安卓内的路径/storage/emulated/0/Android/data/com.nexon.bluearchive/files/PUB/Resource/{resource_path} 经本人验证,清除全部数据后仅还原该部分数据(无需还原其他任何东西),便可触发游戏验证文件并顺利通过

希望以上内容能对大佬产生帮助,完善程序!

顺便一提,国际服有的时候下载特别慢的罪魁祸首貌似是 ba.dn.nexoncdn.co.kr 这个域名解析到了一些奇奇怪怪的ip上,如果这部分能做出优选,下载速度会快很多(曾通过改hosts把速度从200k/s提到了10m/s)

feilongproject commented 9 months ago

关于url拼接的话我这边已经做好了,现在的问题是在于客户端进行资源校验的时候,需要有多个已经被序列化后的校验文件与一些不知道有什么作用的diff文件(日服于此不同,只需要json+无内容的dat文件),这个文件在每次资源更新时会被刷新,并且内部还从libil2cpp.so引入了依赖,目前正在通过逆向来获取

ghitori commented 9 months ago

资源的版本检测应该可以通过./files/PUB/Patch/patch.version.map这个序列化文件读取,最新版本使用java反序列化后其中的基本内容为 {default=789, Catalog=789} 也有可能为如下内容: {default=789, GameData=789, Preload=789, Catalog=789} 这里的版本789与issue最开始向Nexon的资源获取api发送data中的curr_patch_version一致,返回的信息也存在最新的789patch文件和一些版本比较小的diff patch文件 合理推测不同 diff 及所带的版本号 是用于已有资源的 较低版本 增量至 最新的版本 所需要的增量 (different) 文件 关于增量部分可能是依赖开源项目 xdelta(.xd3) 目前仅为推断,因为手头没有旧版数据用来测试逻辑

至于大佬提到的 客户端进行资源校验的时候,需要有多个已经被序列化后的校验文件与一些不知道有什么作用的diff文件 我这边目前并没有特别准备,只是在新安装游戏后把下载的内容全部移动过去,开始游戏后便直接开始校验(个人推测校验的信息会通过最新资源下载地址获取,每个文件都有对应MD5)