The current code always installs the latest build. For Android builds, we generate a SHA1 of the .apk, and there's code in flutter tools that checks if the installed SHA1 matches that of the latest build. At one point in time, this was used to skip the install step if the SHA1's matched, but this has been broken for a while.
We should fix that. See description/discussion on #8290.
For extra credit, implement/verify the same behavior for iOS devices.