1.version.manifest
版本配置主要是用於快速確定是否需要更新,如果project.manifest很大的話這個是很有必要的。
{
// assets manager從這裏下載所有的assets
"packageUrl" : "http://example.com/assets_manager/TestScene/",
// version.manifest
"remoteVersionUrl" : "http://example.com/assets_manager/TestScene/version.manifest",
// project.manifest
"remoteManifestUrl" : "http://example.com/assets_manager/TestScene/project.manifest",
// 本mani文件的版本
"version" : "1.0.0",
// 組版本
"groupVersions": {
"1" : "1.0.22"
}
"engineVersion" : "Cocos2d-JS v3.0 RC0"
}
比較版本的方式是:version字段必須相等,然後比較groupVersions的所有字段(字段總數及對應的值)必須等。具體代碼是:
bool Manifest::versionEquals(const Manifest *b) const
{
// Check manifest version
if (_version != b->getVersion())
{
return false;
}
// Check group versions
else
{
std::vector<std::string> bGroups = b->getGroups();
std::unordered_map<std::string, std::string> bGroupVer = b->getGroupVerions();
// Check group size
if (bGroups.size() != _groups.size())
return false;
// Check groups version
for (int i = 0; i < _groups.size(); ++i) {
std::string gid =_groups[i];
// Check group name
if (gid != bGroups[i])
return false;
// Check group version
if (_groupVer.at(gid) != bGroupVer.at(gid))
return false;
}
}
return true;
}
2.project.manifest
apk裏的project.manifest會和下載的project.manifest(如果更新過的話會cache在下載目錄的)比較version,選擇version大的版本。所以這裏介紹服務器的project.manifest配置。
其他的和上面的一樣,只是新加了assets和searchPaths字段,用於配置更新的文件及要設置的搜索目錄。
{
"packageUrl" : "http://192.168.1.103/bw",
"remoteManifestUrl" : "http://192.168.1.103/bw/project.manifest",
"remoteVersionUrl" : "http://192.168.1.103/bw/version.manifest",
"version" : "1.0.22",
"groupVersions" : {
"1" : "1.0.22"
},
"engineVersion" : "3.0 rc0",
"assets" : {
"app.zip" : {
"md5" : "69361FEDE857D55A627B997828D63A0E",
"compressed" : true,
"group" : "1"
}
},
"searchPaths" : [
]
}
md5表示asset的版本信息,compressed可選,如果壓縮了則下載後會被解壓。group值在現在的cocos2dx 3.3裏也沒有用到(可能後邊會用吧),所以暫且可以不配置。
而客戶端更新文件的方式是,比較本地(或cache過的)和從服務器下載的project.manifest文件的差值,然後進行更新。具體算法是比較assets的所有值,減少的就刪除,
新增了就添加,md5變了就修改。所以目前沒有用到group字段,當然你可以用來自己配置的時候區分各個組。具體比較代碼:
std::unordered_map<std::string, Manifest::AssetDiff> Manifest::genDiff(const Manifest *b) const
{
std::unordered_map<std::string, AssetDiff> diff_map;
std::unordered_map<std::string, Asset> bAssets = b->getAssets();
std::string key;
Asset valueA;
Asset valueB;
std::unordered_map<std::string, Asset>::const_iterator valueIt, it;
for (it = _assets.begin(); it != _assets.end(); ++it)
{
key = it->first;
valueA = it->second;
// Deleted
valueIt = bAssets.find(key);
if (valueIt == bAssets.cend()) {
AssetDiff diff;
diff.asset = valueA;
diff.type = DiffType::DELETED;
diff_map.emplace(key, diff);
continue;
}
// Modified
valueB = valueIt->second;
if (valueA.md5 != valueB.md5) {
AssetDiff diff;
diff.asset = valueB;
diff.type = DiffType::MODIFIED;
diff_map.emplace(key, diff);
}
}
for (it = bAssets.begin(); it != bAssets.end(); ++it)
{
key = it->first;
valueB = it->second;
// Added
valueIt = _assets.find(key);
if (valueIt == _assets.cend()) {
AssetDiff diff;
diff.asset = valueB;
diff.type = DiffType::ADDED;
diff_map.emplace(key, diff);
}
}
return diff_map;
}