Closed lixingmao closed 4 years ago
异常类型:数据异常,从而引发的后续问题 手机型号:Pixel3 (经测试, 与手机无关) 手机系统版本:Android10 (经测试, 与系统版本无关) tinker版本:1.9.14.5 gradle版本:4.6 是否使用热更新SDK: 否 系统:Mac
影响范围:patch 包设计资源(assets,res,AndroidManifest)的变更,就会引发此问题; 问题描述: 合成 patch 后,通过 AssetsManager.openFd() 获取到的AssetFileDescriptor.getStartOffset(发生变更, Native 层无法通过对应的资源文件; 理论上来说,合成 patch 前后,对应的原始 apk 文件是固定不变的,而资源文件也位于原始 apk 中,因此应该维持固定不变才对。
AssetsManager.openFd()
AssetFileDescriptor.getStartOffset
其中获取某个 assets 中固定资源日志记录如下图:
对应代码:
//get apk file path ApplicationInfo info = getApplicationContext().getPackageManager().getPackageInfo( getApplicationContext().getPackageName(), 0).applicationInfo; Log.d(TAG, "asset file: " + info.sourceDir); Log.d(TAG, "asset file: " + info.publicSourceDir); Log.d(TAG, "asset file: " + Arrays.toString(info.splitNames)); Log.d(TAG, "asset file: " + Arrays.toString(info.splitSourceDirs)); // get someone assets AssetFileDescriptor AssetManager am = getAssets(); try { AssetFileDescriptor fd = am.openFd("waypoint.png"); Log.d(TAG, "asset " + fd.toString()); } catch (Exception e) { e.printStackTrace(); }
调研 patch 生成原理以及合成过程了解到,tinker 是合并原始 apk 所有资源文件及patch 中的资源文件合成汇总 resources.apk, 所有资源均通过此汇总资源包获取,因此 openFd()获取到的文件描述符也是相对此文件的。
异常类型:数据异常,从而引发的后续问题 手机型号:Pixel3 (经测试, 与手机无关) 手机系统版本:Android10 (经测试, 与系统版本无关) tinker版本:1.9.14.5 gradle版本:4.6 是否使用热更新SDK: 否 系统:Mac
影响范围:patch 包设计资源(assets,res,AndroidManifest)的变更,就会引发此问题; 问题描述: 合成 patch 后,通过
AssetsManager.openFd()
获取到的AssetFileDescriptor.getStartOffset
(发生变更, Native 层无法通过对应的资源文件; 理论上来说,合成 patch 前后,对应的原始 apk 文件是固定不变的,而资源文件也位于原始 apk 中,因此应该维持固定不变才对。其中获取某个 assets 中固定资源日志记录如下图:
对应代码: