It is correct SDK 4.x of Android and IOS both rely on contextData to send data to Adobe Analytics, there is no evar or props variables in the SDK
ContextData won't populate any report unless you set processing rules to map the contextData to a specific evar, prop or event etc...
As processing rules are post processing, it only populates post_column.
I would advise you to always use post_column in your data feed. To see when a post_evar was set check post_event_list and check if the id for the evar is present on the hit. If it is then it means it was set on this specific hit and did not persist.
In case of mobile apps the variables are mostly populated using processing rules using the values in Context Data Variables. Hence, in your scenario, in the hit there will be no value passed in eVar1. But, as per the processing rule, a value will be passed which will directly populate the post column.
The same processing concept applies for VISTA rules.
Your details match my understanding and it is really good to get validation. Thank you. I am afraid that may question is still outstanding though. At least in the case of a data feed, I am seeing no "xyz" at all for evar1. Does that make sense? In other words, I am seeing cases in which there is a post_evar value and not an evar value. This is data collected via mobile app but I cannot imagine the processing is different. We are simply grabbing the data and pivoting it in PowerBI.
Imagine a evar with settings as : Expire After: Visit, Allocation: Most recent
Now in tag management/page source code, it is coded as evar1= "xyz" on Home page and that's it! (keeping it simple)
Here is user journey in a visit for may be e-commerce site, visited Home Page-->> Offers Page -->> CheckOut Page--> Cart Page.
Now over here, evar 1 for Home Page would be "xyz" and post_evar1 would also be "xyz" (The coded value)
Next page, offers page , evar1= "" (no value was set from code) thus blank but post_evar="xyz" (Persisted value as expiration if evar was visit). Similar case goes for checkout and Cart page where evar1 would be blank but post_evar1 would have persisted value.
The post_evar would also have values in case of processing rules/VISTA rules changing data.
As a thumb rule, always consider post values from clickstream whenever applying alogorithms for data validation, exporting data to SAS/R/DB, etc