4.14 Blueprint Patching Mobile


I am trying to patch a very basic game using the Project Launcher profiles and the newly introduced blueprint patching libraries. The app is just a set of cubes with an emissive material. Here is the main level BP logic I’m using (also attached):

Here is the full log: Dropbox - File Deleted
Also here are some relevant lines from the latest log:

[2016.12.19-14.33.50:211]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] loading
[2016.12.19-14.33.51:493]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] suceeded
[2016.12.19-14.33.51:493]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] suceeded
[2016.12.19-14.33.51:493]-8602160]LogMobilePatchingUtils: Download size = 20.03 MB
[2016.12.19-14.33.51:493]-8602160]LogMobilePatchingUtils: Required disk space = 49.78 MB
[2016.12.19-14.33.51:494]-8602160]LogMobilePatchingUtils: Disk free space = 0.00 MB
[2016.12.19-14.33.51:495]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] -1.0
[2016.12.19-14.33.51:503]-8602160]BuildPatchServices: Starting Installation
[2016.12.19-14.33.51:503]-8602160]BuildPatchServices: Requiring 3 files
[2016.12.19-14.33.51:504]-8602160]BuildPatchServices: Starting file contruction worker
[2016.12.19-14.33.51:505]-8602160]BuildPatchResumeData file found 0
[2016.12.19-14.33.51:674]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.0
[2016.12.19-14.33.51:887]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.0
[2016.12.19-14.33.52:097]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.0
[2016.12.19-14.33.52:308]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.000525
[2016.12.19-14.33.52:509]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.002806
[2016.12.19-14.33.52:719]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.004035
[2016.12.19-14.33.52:921]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.00995

//skipping a bunch of these

[2016.12.19-14.34.03:821]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.856589
[2016.12.19-14.34.04:026]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.859582
[2016.12.19-14.34.04:226]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.864629
[2016.12.19-14.34.04:245]-8602160]BuildPatchServices: File construction complete
[2016.12.19-14.34.04:384]-8602160]BuildPatchServices: Staged install complete
[2016.12.19-14.34.04:385]-8602160]BuildPatchServices: Running backup and stage relocation
[2016.12.19-14.34.04:385]-8602160]BuildPatchServices: Create MM
[2016.12.19-14.34.04:385]-8602160]BuildPatchServices: Relocation complete 1
[2016.12.19-14.34.04:385]-8602160]BuildPatchServices: Verifying install
[2016.12.19-14.34.04:428]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.90393
[2016.12.19-14.34.04:638]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.95797
[2016.12.19-14.34.04:782]-8602160]BuildPatchServices: Verify stage complete 1
[2016.12.19-14.34.04:782]-8602160]BuildPatchServices: Deleting staging area
[2016.12.19-14.34.04:782]-8602160]BuildPatchServices: Reset MM
[2016.12.19-14.34.04:782]-8602160]BuildPatchServices: Build Stat: AppName: Game_Game
[2016.12.19-14.34.04:782]-8602160]BuildPatchServices: Build Stat: AppInstalledVersion: NONE
[2016.12.19-14.34.04:783]-8602160]BuildPatchServices: Build Stat: AppPatchVersion: DLC1.0
[2016.12.19-14.34.04:783]-8602160]BuildPatchServices: Build Stat: CloudDirectory:
[2016.12.19-14.34.04:783]-8602160]BuildPatchServices: Build Stat: NumFilesInBuild: 3
[2016.12.19-14.34.04:783]-8602160]BuildPatchServices: Build Stat: NumFilesOutdated: 3
[2016.12.19-14.34.04:783]-8602160]BuildPatchServices: Build Stat: NumFilesToRemove: 0
[2016.12.19-14.34.04:783]-8602160]BuildPatchServices: Build Stat: NumChunksRequired: 50
[2016.12.19-14.34.04:784]-8602160]BuildPatchServices: Build Stat: ChunksQueuedForDownload: 50
[2016.12.19-14.34.04:784]-8602160]BuildPatchServices: Build Stat: ChunksLocallyAvailable: 0
[2016.12.19-14.34.04:784]-8602160]BuildPatchServices: Build Stat: NumChunksDownloaded: 50
[2016.12.19-14.34.04:784]-8602160]BuildPatchServices: Build Stat: NumChunksRecycled: 0
[2016.12.19-14.34.04:784]-8602160]BuildPatchServices: Build Stat: NumChunksCacheBooted: 0
[2016.12.19-14.34.04:784]-8602160]BuildPatchServices: Build Stat: NumDriveCacheChunkLoads: 0
[2016.12.19-14.34.04:785]-8602160]BuildPatchServices: Build Stat: NumFailedDownloads: 0
[2016.12.19-14.34.04:785]-8602160]BuildPatchServices: Build Stat: NumBadDownloads: 0
[2016.12.19-14.34.04:785]-8602160]BuildPatchServices: Build Stat: NumRecycleFailures: 0
[2016.12.19-14.34.04:785]-8602160]BuildPatchServices: Build Stat: NumDriveCacheLoadFailures: 0
[2016.12.19-14.34.04:785]-8602160]BuildPatchServices: Build Stat: TotalDownloadedData: 20999437
[2016.12.19-14.34.04:785]-8602160]BuildPatchServices: Build Stat: AverageDownloadSpeed: 1.606 MB/sec
[2016.12.19-14.34.04:786]-8602160]BuildPatchServices: Build Stat: TheoreticalDownloadTime: 12.4 sec
[2016.12.19-14.34.04:786]-8602160]BuildPatchServices: Build Stat: VerifyTime: 402 ms
[2016.12.19-14.34.04:786]-8602160]BuildPatchServices: Build Stat: CleanUpTime: 1 ms
[2016.12.19-14.34.04:786]-8602160]BuildPatchServices: Build Stat: PrereqTime: 0 ms
[2016.12.19-14.34.04:786]-8602160]BuildPatchServices: Build Stat: ProcessExecuteTime: 13.2 sec
[2016.12.19-14.34.04:786]-8602160]BuildPatchServices: Build Stat: ProcessPausedTime: 0.0 sec
[2016.12.19-14.34.04:786]-8602160]BuildPatchServices: Build Stat: ProcessSuccess: TRUE
[2016.12.19-14.34.04:787]-8602160]BuildPatchServices: Build Stat: ErrorCode: OK
[2016.12.19-14.34.04:801]-8602160]BuildPatchServices: Build Stat: FailureReasonText: 
[2016.12.19-14.34.04:801]-8602160]BuildPatchServices: Build Stat: FailureType SUCCESS
[2016.12.19-14.34.04:802]-8602160]BuildPatchServices: Build Stat: NumInstallRetries: 0
[2016.12.19-14.34.04:802]-8602160]BuildPatchServices: Build Stat: FinalProgressValue: 1.000000
[2016.12.19-14.34.04:802]-8602160]BuildPatchServices: Build Stat: OverallRequestSuccessRate: 1.000000
[2016.12.19-14.34.04:802]-8602160]BuildPatchServices: Build Stat: ExcellentDownloadHealthTime: 12.736714
[2016.12.19-14.34.04:802]-8602160]BuildPatchServices: Build Stat: GoodDownloadHealthTime: 0.000000
[2016.12.19-14.34.04:802]-8602160]BuildPatchServices: Build Stat: OkDownloadHealthTime: 0.000000
[2016.12.19-14.34.04:802]-8602160]BuildPatchServices: Build Stat: PoorDownloadHealthTime: 0.000000
[2016.12.19-14.34.04:802]-8602160]BuildPatchServices: Build Stat: DisconnectedDownloadHealthTime: 0.000000
[2016.12.19-14.34.04:803]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] suceeded Intalling
[2016.12.19-14.34.04:856]-8602160]LogPackageName: SearchForPackageOnDisk took   0.053s, but failed to resolve Loaded.
[2016.12.19-14.34.04:856]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 49.777584_Size/Engine/Transient.MobilePendingContent_0_Path
[2016.12.19-14.34.04:863]-8602160]LogMobilePatchingUtils: Mounted = /storage/emulated/0/Android/data/com.CGGame.Game/files/visrez/Game-Android_ASTC.pak, Order = 1, MountPoint = (null)
[2016.12.19-14.34.04:864]-8602160]LogMobilePatchingUtils: Mounted = /storage/emulated/0/Android/data/com.CGGame.Game/files/visrez/Game-Android_ASTC_P.pak, Order = 1, MountPoint = (null)
[2016.12.19-14.34.04:864]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] true_mounted return value
[2016.12.19-14.34.04:864]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.0
[2016.12.19-14.34.05:075]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.0
[2016.12.19-14.34.05:285]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.0
[2016.12.19-14.34.05:494]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.0
[2016.12.19-14.34.05:704]-8602160]LogBlueprintUserMessages: [MasterMap_C_1] 0.0

Everything seems to be in order, the files are found on the server, they are installed, but everytime, and I’ve tried various combinations of changes, I see absolutely no change to the game visuals. I’ve changed level content and also changed materials, there is no update happening.

The one line of .log that looks suspicious is the one saying “Disk free space = 0.00 MB”.
I certainly have free space on my phone and I don’t have an sd card, so the .apk is installed on the phone directly. The thing is that the .pak files are visible on the “Android/data/com.CGGame.Game/files/visrez” folder that the BP logic creates. I’m not sure what the mounting does, but it outputs true.

I’ve tried patching a game on Windows(offline) and everything worked as expected. I’m not sure what it is but it looks like I’m missing some step perhaps.
Any support would be very welcomed. Patching is very important for the Gear VR app I’m developing.

I appreciate any help,

Could you remove MountPoint string (make it empty) from a Mount function call and see if it helps?

Thanks for checking in on this. I’ve removed the MountPoint string and the output is basically the same. But please note that the output is positive, meaning that on my BP logic from above, when I read the Bool from the mount node it says true. I also see the app installed, I also get success on the install progress. Everything seems to be in order. The only suspicious log is where the free disk space check turns out ‘0’ - zero.

At this point I’m more concerned that I might be doing something wrong with generating the .pak file, although I follow the documentation steps. One strange thing that I’ve noticed is that in the release Launch Profile, the first one, which has a save archive .apk file by default, if I compare that .apk file with one that’s generated through the File>Package>Android method, their size differs, the Launch one being a bit smaller. I’ve tried installing both versions and running the app on the phone with no success.

So to better describe the pak generation process that I’m doing. I first use File>Package>Android_ASTC, then I use the Project Launcher drop down option and create two profiles with the “Minimal Android APK + DLC” option. I run the first profile. Then I make a change to the game level and the game assets. Then I save and run the second profile. I then upload the DLC content in the proper folder on my server. Again, when I run the app on my phone everything seems to be working and the mount operation outputs a true response, pretty much no matter what I write in the mount point, which makes me think that the mount procedure is done by default as the .pak gets downloaded.

I could zip up the project if anyone wants to test this.

So as I understood you have 2 versions of same content installed. One in APK and second in DLC. In general “Minimal Android APK + DLC” is intended to package application where APK holds only executable and one minimal level that has a logic to download and install rest of the content that sits in DLC. So you always have one version of you main content.
What happens in your case when app is loaded and downloaded pak is mounted and engine trying to use some assets it will search assets according to pak mount order. So assets in apk will be found first since you mount downloaded pak with Order = 1 and APK pak is mounted at Order = 0.

Try changing PakOrder to 0 when you mounting downloaded content. But I would recommend changing you packaging to be Minimal APK + DLC.

This should not be a problem, it looks like this function is not implemented for android platform at the moment.

Thanks for following through with this.

I’ve tried switching the mount PackOrder to 0 with no change on the way the app works.

Basically what I’m doing now is testing the patching system on a very simple project, so yes, I have two versions of the same content. The changes happen in the same level and on a few basic materials. In the end, the goal is to get to where you’re pointing at, with big files on the DLC.
When you describe the way the engine “thinks” it makes me wonder whether there’s an issue with me trying to mount the pack after the install procedure which is after a delay of a few seconds. Shouldn’t the engine mount the content by default if it’s in a local folder? When I run the game on the phone the second/third/etc time the download times get much shorter, suggesting to me that only the manifest gets downloaded.

Also my packing is currently Minimal Android APK + DLC, as in that’s the option I chose from the Launch profiles drop down menu (wizard). So I’m not sure what you mean by your last suggestion.

Is your game map already loaded when you try to patch content in it? If yes, patching the game map will not “hot-reload” it with updated content. What I’m suggesting is: make you app to always open a blank simple map by default. That blank simple map should have a patching logic, as on your picture. Once your patching logic is executed and downloaded content is mounted you will need to load an actual game map. Basically after Mount function call you do OpenLevel(“MyGameMap”) in BP. Engine will start to search for the MyGameMap and will find it in a mounted pak you just downloaded. And yes, patching stores manifest file of latest downloaded content and will not download it again unless manifest file on the server is changed. So next runs of you application patching will download nothing (except manifest file to compare it with locally stored one) and just mount previously downloaded pak.

Hello,Do you solve this problem? I have the same problem of Mobile Patch.
My step is :
1.Follow the Mobile Packaging Wizard,create two profile.
2.In the release profile,Select all maps(one empty map,used to download DLC,one is test scene map),and run it. Install this game apk.
3.Modify some material in test scene map,and save it.
4.In the DLC profile,select test scene map,and run it.Copy the Httpchunks folder to server.
5.Run the game in mobile, the download, install, mount process all successed,but the scene is not changed. I set the DLC pakorder to 105,but nothing changed.