GNSS receivers do not actually have an "altimeter". They compute a
position, which includes "height above ellipsoid", often written h.
Then, they convert this, using a "geoid model", to "height above geoid",
often written H. Generally, H corresonds to what people mean when they
say "altitude above mean sea level". (I say "what they mean" because
really understanding height is tremendously complicated.)
In OsmAnd, there is a data file "World Altitude Corrections", that if
you download, you should see heights/elevations displayed as H. If you
don't have that, you get h. For reasons that are unclear to me, this is
marked Android only.
India has pretty high geoid separations -- the difference between geoid
and ellipsoid, written N. It looks like -68m at Mumbai from a quick
look. So this could explain your displayed height values.
If anyone understands what happens on iOS, please share. It's
possible that a model built in to iOS is used.
GNSS receivers typically have builtin models, but also typically they
are extremely poor. For example around me the real value is roughly
-29m and the models say -33m. Most programs that use GNSS output (on
android or normal computers) will back out the receivers model. NMEA
reports H and N, and then one can compute h, which avoids the terrible
model. You can then apply a better model. Really - it's that messy.