|
|
|
|
@ -85,10 +85,49 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 解析资源所属 Bundle。 |
|
|
|
|
* 顺序:asset 上的 bundle 字段 → nativeUrl 路径 → bundle.getAssetInfo → cache.has |
|
|
|
|
* 按构建「依赖打入分包」扩展归属: |
|
|
|
|
* 包内资源引用到的、且尚未被其它包显式声明的资源,打入同一包。 |
|
|
|
|
* 使用 assetManager.dependUtil.getDependsRecursively。 |
|
|
|
|
*/ |
|
|
|
|
function resolveBundleName(uuid, asset, bundleObjs, uuidMap) { |
|
|
|
|
function expandOwnershipByDeps(cc, bi) { |
|
|
|
|
var depUtil = cc.assetManager && cc.assetManager.dependUtil; |
|
|
|
|
if (!depUtil || typeof depUtil.getDependsRecursively !== 'function') return; |
|
|
|
|
|
|
|
|
|
var uuidMap = bi.uuidMap || {}; |
|
|
|
|
var depPacked = bi.depPacked || (bi.depPacked = {}); |
|
|
|
|
var roots = []; |
|
|
|
|
for (var u in uuidMap) { |
|
|
|
|
if (Object.prototype.hasOwnProperty.call(uuidMap, u)) roots.push(u); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (var i = 0; i < roots.length; i++) { |
|
|
|
|
var root = roots[i]; |
|
|
|
|
var bname = uuidMap[root]; |
|
|
|
|
if (!bname) continue; |
|
|
|
|
var deps = null; |
|
|
|
|
try { |
|
|
|
|
deps = depUtil.getDependsRecursively(root); |
|
|
|
|
} catch (e) { |
|
|
|
|
try { |
|
|
|
|
deps = depUtil.getDeps(root); |
|
|
|
|
} catch (e2) { |
|
|
|
|
deps = null; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (!deps || !deps.length) continue; |
|
|
|
|
for (var j = 0; j < deps.length; j++) { |
|
|
|
|
var d = String(deps[j]); |
|
|
|
|
if (!d || d === root) continue; |
|
|
|
|
// 已被其它包显式占有则不抢(跨包引用)
|
|
|
|
|
if (uuidMap[d] && uuidMap[d] !== bname) continue; |
|
|
|
|
if (!uuidMap[d]) { |
|
|
|
|
uuidMap[d] = bname; |
|
|
|
|
depPacked[d] = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
function resolveBundleName(uuid, asset, bi) { |
|
|
|
|
try { |
|
|
|
|
if (asset) { |
|
|
|
|
if (asset.bundle && asset.bundle.name) return asset.bundle.name; |
|
|
|
|
@ -96,54 +135,52 @@ |
|
|
|
|
if (asset.__bundleName) return asset.__bundleName; |
|
|
|
|
} |
|
|
|
|
} catch (e) { /* */ } |
|
|
|
|
|
|
|
|
|
if (uuidMap && uuid && uuidMap[uuid]) return uuidMap[uuid]; |
|
|
|
|
if (bi && bi.uuidMap && uuid && bi.uuidMap[uuid]) return bi.uuidMap[uuid]; |
|
|
|
|
|
|
|
|
|
var url = (asset && (asset.nativeUrl || asset._nativeUrl)) || ''; |
|
|
|
|
var m = String(url).match(/\/([A-Za-z0-9_\-]+)\/(?:import|native|js|ohm|chunks)\//i); |
|
|
|
|
if (m && m[1]) return m[1]; |
|
|
|
|
|
|
|
|
|
if (bundleObjs && bundleObjs.length) { |
|
|
|
|
for (var i = 0; i < bundleObjs.length; i++) { |
|
|
|
|
var b = bundleObjs[i]; |
|
|
|
|
var objs = (bi && bi.bundleObjs) || []; |
|
|
|
|
for (var i = 0; i < objs.length; i++) { |
|
|
|
|
var b = objs[i]; |
|
|
|
|
if (!b) continue; |
|
|
|
|
var bname = b.__pwName || b.name || ''; |
|
|
|
|
try { |
|
|
|
|
if (typeof b.getAssetInfo === 'function' && uuid) { |
|
|
|
|
var info = b.getAssetInfo(uuid); |
|
|
|
|
if (info && (info.uuid || info.redirect || info.path != null || info.ext)) { |
|
|
|
|
return bname; |
|
|
|
|
} |
|
|
|
|
if (info && (info.uuid || info.redirect || info.path != null || info.ext)) return bname; |
|
|
|
|
} |
|
|
|
|
} catch (e2) { /* */ } |
|
|
|
|
try { |
|
|
|
|
if (b.cache && typeof b.cache.has === 'function' && uuid && b.cache.has(uuid)) { |
|
|
|
|
return bname; |
|
|
|
|
} |
|
|
|
|
if (b.cache && b.cache.has && uuid && b.cache.has(uuid)) return bname; |
|
|
|
|
} catch (e3) { /* */ } |
|
|
|
|
try { |
|
|
|
|
if (b.cache && b.cache.get && uuid && b.cache.get(uuid)) { |
|
|
|
|
return bname; |
|
|
|
|
} |
|
|
|
|
} catch (e4) { /* */ } |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return ''; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** 遍历已加载 bundles,收集对象与 cache uuid 索引 */ |
|
|
|
|
/** |
|
|
|
|
* 构建索引:uuid→bundle、uuid→path、pack(自动图集)成员。 |
|
|
|
|
* 数据来自 bundle._config(paths / packs)与 cache。 |
|
|
|
|
*/ |
|
|
|
|
function indexBundles(cc) { |
|
|
|
|
var list = []; |
|
|
|
|
var uuidMap = {}; |
|
|
|
|
var pathMap = {}; |
|
|
|
|
var packOf = {}; // uuid -> packId
|
|
|
|
|
var packMembers = {}; // packId -> [uuid]
|
|
|
|
|
var bundleObjs = []; |
|
|
|
|
|
|
|
|
|
var addU = function (u, bname) { |
|
|
|
|
if (u != null && bname) uuidMap[String(u)] = bname; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
cc.assetManager.bundles.forEach(function (bundle, name) { |
|
|
|
|
var n = name || (bundle && bundle.name) || ''; |
|
|
|
|
if (!n) return; |
|
|
|
|
if (bundle) { |
|
|
|
|
if (!n || !bundle) return; |
|
|
|
|
bundle.__pwName = n; |
|
|
|
|
bundleObjs.push(bundle); |
|
|
|
|
} |
|
|
|
|
list.push({ |
|
|
|
|
name: n, |
|
|
|
|
assetCount: 0, |
|
|
|
|
@ -152,46 +189,108 @@ |
|
|
|
|
audioMB: 0, |
|
|
|
|
otherMB: 0, |
|
|
|
|
status: 'loaded', |
|
|
|
|
packCount: 0, |
|
|
|
|
}); |
|
|
|
|
var add = function (u) { |
|
|
|
|
if (u) uuidMap[String(u)] = n; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
var cfg = bundle._config; |
|
|
|
|
|
|
|
|
|
// 1) paths: 路径 → [uuid, type, ...] 或 {uuid}
|
|
|
|
|
try { |
|
|
|
|
var paths = cfg && (cfg.paths || cfg._paths); |
|
|
|
|
if (paths && typeof paths === 'object') { |
|
|
|
|
for (var p in paths) { |
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(paths, p)) continue; |
|
|
|
|
var val = paths[p]; |
|
|
|
|
if (Array.isArray(val)) { |
|
|
|
|
for (var i = 0; i < val.length; i++) { |
|
|
|
|
var u1 = val[i]; |
|
|
|
|
if (typeof u1 === 'string' && /^[0-9a-fA-F-]{8,}/.test(u1)) { |
|
|
|
|
addU(u1, n); |
|
|
|
|
if (!pathMap[u1]) pathMap[u1] = p; |
|
|
|
|
} else if (u1 && u1.uuid) { |
|
|
|
|
addU(u1.uuid, n); |
|
|
|
|
if (!pathMap[u1.uuid]) pathMap[u1.uuid] = p; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else if (val && val.uuid) { |
|
|
|
|
addU(val.uuid, n); |
|
|
|
|
if (!pathMap[val.uuid]) pathMap[val.uuid] = p; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (e) { /* */ } |
|
|
|
|
|
|
|
|
|
// 2) packs: 自动图集 / 合包
|
|
|
|
|
try { |
|
|
|
|
var packs = cfg && (cfg.packs || cfg._packs); |
|
|
|
|
if (packs && typeof packs === 'object') { |
|
|
|
|
var packCount = 0; |
|
|
|
|
for (var packId in packs) { |
|
|
|
|
if (!Object.prototype.hasOwnProperty.call(packs, packId)) continue; |
|
|
|
|
var members = packs[packId]; |
|
|
|
|
if (!members) continue; |
|
|
|
|
packCount += 1; |
|
|
|
|
packMembers[packId] = packMembers[packId] || []; |
|
|
|
|
var arr = Array.isArray(members) ? members : [members]; |
|
|
|
|
for (var j = 0; j < arr.length; j++) { |
|
|
|
|
var um = arr[j]; |
|
|
|
|
if (um && typeof um === 'object') um = um.uuid; |
|
|
|
|
if (!um) continue; |
|
|
|
|
addU(um, n); |
|
|
|
|
packOf[String(um)] = packId; |
|
|
|
|
packMembers[packId].push(String(um)); |
|
|
|
|
if (!pathMap[String(um)]) pathMap[String(um)] = packId; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for (var q = 0; q < list.length; q++) { |
|
|
|
|
if (list[q].name === n) list[q].packCount = packCount; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (e2) { /* */ } |
|
|
|
|
|
|
|
|
|
// 3) cache
|
|
|
|
|
try { |
|
|
|
|
var cache = bundle.cache || bundle._cache; |
|
|
|
|
if (cache && typeof cache.forEach === 'function') { |
|
|
|
|
cache.forEach(function (asset, uuid) { |
|
|
|
|
add(uuid); |
|
|
|
|
if (asset) add(asset._uuid); |
|
|
|
|
addU(uuid, n); |
|
|
|
|
if (asset) addU(asset._uuid, n); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
if (cache && cache._map) { |
|
|
|
|
for (var k in cache._map) { |
|
|
|
|
if (Object.prototype.hasOwnProperty.call(cache._map, k)) add(k); |
|
|
|
|
if (Object.prototype.hasOwnProperty.call(cache._map, k)) addU(k, n); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (e) { /* */ } |
|
|
|
|
} catch (e3) { /* */ } |
|
|
|
|
|
|
|
|
|
// config.uuids / paths
|
|
|
|
|
// 4) getAssetInfo 扫一遍 config 里的 uuid
|
|
|
|
|
try { |
|
|
|
|
var cfg = bundle._config; |
|
|
|
|
if (cfg) { |
|
|
|
|
var lists = [cfg.uuids, cfg.uuidList, cfg._uuidList]; |
|
|
|
|
for (var li = 0; li < lists.length; li++) { |
|
|
|
|
var arr = lists[li]; |
|
|
|
|
if (!arr) continue; |
|
|
|
|
if (Array.isArray(arr)) { |
|
|
|
|
for (var i = 0; i < arr.length; i++) add(arr[i]); |
|
|
|
|
} else if (typeof arr === 'object') { |
|
|
|
|
for (var kk in arr) { |
|
|
|
|
if (Object.prototype.hasOwnProperty.call(arr, kk)) add(kk); |
|
|
|
|
} |
|
|
|
|
if (typeof bundle.getAssetInfo === 'function') { |
|
|
|
|
var keys = Object.keys(uuidMap); |
|
|
|
|
for (var s = 0; s < keys.length; s++) { |
|
|
|
|
if (uuidMap[keys[s]] === n) continue; |
|
|
|
|
try { |
|
|
|
|
var inf = bundle.getAssetInfo(keys[s]); |
|
|
|
|
if (inf && (inf.path != null || inf.redirect)) { |
|
|
|
|
addU(keys[s], n); |
|
|
|
|
if (!pathMap[keys[s]] && inf.path) pathMap[keys[s]] = inf.path; |
|
|
|
|
} |
|
|
|
|
} catch (e4) { /* */ } |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (e2) { /* */ } |
|
|
|
|
} catch (e5) { /* */ } |
|
|
|
|
}); |
|
|
|
|
} catch (e3) { /* */ } |
|
|
|
|
return { list: list, uuidMap: uuidMap, bundleObjs: bundleObjs }; |
|
|
|
|
} catch (e6) { /* */ } |
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
list: list, |
|
|
|
|
uuidMap: uuidMap, |
|
|
|
|
pathMap: pathMap, |
|
|
|
|
packOf: packOf, |
|
|
|
|
packMembers: packMembers, |
|
|
|
|
bundleObjs: bundleObjs, |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -220,11 +319,8 @@ |
|
|
|
|
var type = fmtType(asset); |
|
|
|
|
var mem = assetMem(asset, type, seenTex); |
|
|
|
|
|
|
|
|
|
var bname = resolveBundleName(id, asset, bi.bundleObjs, bi.uuidMap); |
|
|
|
|
if (!bname) { |
|
|
|
|
var isDefault = /default_|splash|empty|builtin/i.test(String(asset.name || '')); |
|
|
|
|
bname = isDefault ? 'internal' : 'internal'; |
|
|
|
|
} |
|
|
|
|
var bname = resolveBundleName(id, asset, bi); |
|
|
|
|
if (!bname) bname = 'internal'; |
|
|
|
|
var agg = bundleByName[bname]; |
|
|
|
|
if (!agg) { |
|
|
|
|
agg = { |
|
|
|
|
@ -235,6 +331,7 @@ |
|
|
|
|
audioMB: 0, |
|
|
|
|
otherMB: 0, |
|
|
|
|
status: 'loaded', |
|
|
|
|
packCount: 0, |
|
|
|
|
}; |
|
|
|
|
bundleByName[bname] = agg; |
|
|
|
|
bi.list.push(agg); |
|
|
|
|
@ -255,22 +352,38 @@ |
|
|
|
|
h = asset.height | 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 自动图集 / 合包:packId;SpriteFrame 挂到纹理 uuid
|
|
|
|
|
var packId = bi.packOf[id] || ''; |
|
|
|
|
var texUuid = ''; |
|
|
|
|
if (type === 'SpriteFrame') { |
|
|
|
|
var tex = asset.texture || (asset.getTexture && asset.getTexture()); |
|
|
|
|
texUuid = String((tex && (tex._uuid || tex.uuid)) || ''); |
|
|
|
|
} else if (type === 'Texture2D' || type === 'Texture') { |
|
|
|
|
texUuid = id; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var display = asset.name || ''; |
|
|
|
|
var pathStr = bi.pathMap[id] || ''; |
|
|
|
|
if (!display || /^[0-9a-f-]{8,}$/i.test(display)) { |
|
|
|
|
// 可读名:优先 getAssetInfo.path 最后一段
|
|
|
|
|
if (pathStr) { |
|
|
|
|
var segs = String(pathStr).split('/'); |
|
|
|
|
display = segs[segs.length - 1] || pathStr; |
|
|
|
|
} |
|
|
|
|
if (!display) { |
|
|
|
|
try { |
|
|
|
|
for (var bi2 = 0; bi2 < bi.bundleObjs.length; bi2++) { |
|
|
|
|
var bb = bi2.bundleObjs[bi2]; |
|
|
|
|
var bb = bi.bundleObjs[bi2]; |
|
|
|
|
if (bb && typeof bb.getAssetInfo === 'function') { |
|
|
|
|
var inf = bb.getAssetInfo(id); |
|
|
|
|
if (inf && inf.path) { |
|
|
|
|
var segs = String(inf.path).split('/'); |
|
|
|
|
display = segs[segs.length - 1] || inf.path; |
|
|
|
|
var ps = String(inf.path).split('/'); |
|
|
|
|
display = ps[ps.length - 1] || inf.path; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (eName) { /* */ } |
|
|
|
|
} |
|
|
|
|
if (!display) display = id.slice(0, 8) + '…'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -284,6 +397,9 @@ |
|
|
|
|
w: w, |
|
|
|
|
h: h, |
|
|
|
|
kind: kind, |
|
|
|
|
pack: packId, |
|
|
|
|
texUuid: texUuid, |
|
|
|
|
path: pathStr, |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
agg.assetCount += 1; |
|
|
|
|
@ -322,7 +438,14 @@ |
|
|
|
|
} |
|
|
|
|
totals.assetCount = rows.length; |
|
|
|
|
totals.bundleCount = bundles.length; |
|
|
|
|
return { bundles: bundles, rows: rows, totals: totals }; |
|
|
|
|
totals.packCount = Object.keys(bi.packMembers || {}).length; |
|
|
|
|
return { |
|
|
|
|
bundles: bundles, |
|
|
|
|
rows: rows, |
|
|
|
|
totals: totals, |
|
|
|
|
packs: bi.packMembers || {}, |
|
|
|
|
packOf: bi.packOf || {}, |
|
|
|
|
}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function buildPreview(asset, type) { |
|
|
|
|
|