How to patch an application in emulator/device similar to how Google Play is doing with "Smart app updates"?
Asked Answered
T

1

0

Is it possible to achieve locally (using adb or other ways) what Google Play is doing in "Smart app updates" ?

What I want to do is to create a binary diff on the PC (using some command line tools) and then deploy the diff to simulator/device using Android tools (adb, shell, etc).

I am aware of https://android.stackexchange.com/questions/36421/what-is-the-applypatch-tool-and-how-does-one-use-it which doesn't provide any info about HOW to actually create and apply patches, just WHAT adb shell applypatch is.

I tried to take a quick look at the C++ Android implementation code here which does the patching: https://android.googlesource.com/platform/bootable/recovery/+/master/applypatch/main.cpp#167

So far I created a binary diff using bsdiff, which apparently uses same algorithm with what Google Play and Android is using. But I don't know how to actually apply the patch.

EDIT: To clarify, here's a good example:

  • I have com.appv1.apk on my PC and also installed on the device/emulator.
  • I have com.appv2.apk on my PC.
  • Using bsdiff I create the binary diff between com.appv1.apk and com.appv2.apk called let's say diff.bin

Now, what is the actual adb command I need to run to deploy diff.binon the device/emulator such that after deploying the diff, com.appv1.apk on the device/emulator becomes com.appv2.apk ?

Terni answered 15/9, 2016 at 13:59 Comment(10)
you found the source code for applypatch/main.cpp already. besides the usage print out code it contains a more detailed description of all optional parameters in the comments. what is your exact problem?Seiber
@Alex.P I edited with exampleTerni
google servers send the delta to the GooglePlay.apk on the device and the GooglePlay.apk finish the build. It's all automatically done by google and we developers don't need to worry about it. GooglePlay.apk has special permissions, you will need a rooted phone I would assume, to do it yourself. Have you considered using external DEX files ?Dahlgren
@JonGoodwin my intention is to do the patching myself using adb or some other way on the PC. it's not about worrying about it. what are "DEX files" ?Terni
Dalvik Executables (DEX), basically .jar files which you can run. see #39175669Dahlgren
@JonGoodwin I don't understand what does DEX files have to do with the example I gaveTerni
It's a way of updating your apk, without re-installing the whole thing, incremental updates, like "Smart app updates", it means if you have limited bandwidth for example, you don't have to send over so much data. This is "another way" to do that. Plus you don't have to be root, or figure out how to do it.Dahlgren
@JonGoodwin I read your answer there but I don't understand it. Could you please give an answer here with steps I have to do(what exact command I have to run) for my example above with com.appv1.apk and com.appv2.apkTerni
check out github.com/Tencent/tinkerSeiber
@Alex.P nice, thank you. !Terni
S
1

I would say that between the usage print out:

usage: applypatch [-b <bonus-file>] <src-file> <tgt-file> <tgt-sha1> <tgt-size> [<src-sha1>:<patch> ...]
   or  applypatch -c <file> [<sha1> ...]
   or  applypatch -s <bytes>
   or  applypatch -l

Filenames may be of the form
  MTD:<partition>:<len_1>:<sha1_1>:<len_2>:<sha1_2>:...
to specify reading from or writing to an MTD partition.

and the comments below:

// This program applies binary patches to files in a way that is safe
// (the original file is not touched until we have the desired
// replacement for it) and idempotent (it's okay to run this program
// multiple times).
//
// - if the sha1 hash of <tgt-file> is <tgt-sha1>, does nothing and exits
//   successfully.
//
// - otherwise, if no <src-sha1>:<patch> is provided, flashes <tgt-file> with
//   <src-file>. <tgt-file> must be a partition name, while <src-file> must
//   be a regular image file. <src-file> will not be deleted on success.
//
// - otherwise, if the sha1 hash of <src-file> is <src-sha1>, applies the
//   bsdiff <patch> to <src-file> to produce a new file (the type of patch
//   is automatically detected from the file header).  If that new
//   file has sha1 hash <tgt-sha1>, moves it to replace <tgt-file>, and
//   exits successfully.  Note that if <src-file> and <tgt-file> are
//   not the same, <src-file> is NOT deleted on success.  <tgt-file>
//   may be the string "-" to mean "the same as src-file".
//
// - otherwise, or if any error is encountered, exits with non-zero
//   status.
//
// <src-file> (or <file> in check mode) may refer to an EMMC partition
// to read the source data.  See the comments for the
// LoadPartitionContents() function for the format of such a filename.

it is pretty straight-forward.

So the basic command to patch com.appv1.apk with diff.bin and save the result to the com.appv2.apk would be:

applypatch com.appv1.apk com.appv2.apk <com.appv2.apk SHA1> <com.appv2.apk size> <com.appv1.apk SHA1>:diff.bin
Seiber answered 15/9, 2016 at 14:35 Comment(9)
applypatch is a command run by adb shell. what's old_file and new file ? are these file paths? is new_file the local file path on my PC to the binary diff (created by bsdiff)?Terni
@Alex.P please see the exampleTerni
@Alex.P hi, looking forward for your thoughts, thanksTerni
@Alex.P I tried this: adb.exe shell applypatch D:\Test\v1.apk D:\Test\v2.apk af92847783c124bc354a085f05cf60ab15a96153 18874337 19d12d6c2ba0a1c7bf1ae060c5dad38345e11b9b:D:\Test\diff.bin but it gives me an error saying failed to stat "D:Testdiff.bin": No such file or directory failed to parse patch argsTerni
I don't think it expects a path there for the diff fileTerni
I explained in the comments to my answer to your previous question that all files need to be pushed to the device first. you need to remember those things - I don't like repeating myself. Or you could have just applied some minimal logic - an application running on the device only has access to the local file system - so all file paths should be local (to the device)Seiber
arghhh, sorry! I missed that dude! Patience with the noobs please :) and many thanks again for taking time to respond! you rockTerni
The proper way to say you rock is by accepting and upvoting the helpful answerSeiber
I kind of gave up on this. I haven't been able to check all the stuff. But here you go.Terni

© 2022 - 2024 — McMap. All rights reserved.