Potentially relevant is Java’s binary compatibility guide/reference. I suspect this level of documentation might be unattainable (Sun had technical writers), but all the info in here is relevant.
Regarding inlining, Lukas Rytz quoted Scalac 2.12 release notes (https://github.com/scala/scala/pull/6088#issuecomment-330532820):
When inlining code from the classpath, you must ensure that all dependencies have exactly the same versions at compile time and run time.
If you are building a library to publish on Maven Central, you should not inline code from dependencies. Users of your library might have different versions of those dependencies on the classpath, which breaks binary compatibility.
From same thread:
When the inliner is enabled, the default heuristics may (and does) pick methods for inlining that don’t have the @inline annotation. This means that you cannot control the ABI with the optimizer enabled (except for
Guidelines on how to use
-opt-inline-from would help. I guess you can at least inline from the same library, but that might make more code affect the ABI.
EDIT: forgot to say, thanks @jatcwang for working on this!