The build-up to Sunday’s meeting at the Etihad Stadium was dominated by news of the Premier League accusing Manchester City of breaking over 100 financial regulations between 2009 and 2018.
Pep Guardiola, managing his 250th Premier League game, delivered an impassioned defence of his club and his players performed as they returned to winning ways following their loss at Tottenham last week.
Rodri’s header, Ilkay Gundogan’s tap-in and Riyad Mahrez’s penalty had City 3-0 up by the break, and though Ollie Watkins pulled one back for Villa, the champions comfortably closed the gap on Arsenal to three points ahead of Wednesday’s crunch meeting between the top two.
Having jeered the Premier League anthem, City’s fans had something to cheer inside four minutes, when Rodri headed in from Mahrez’s corner.
Only a fine save from Emiliano Martinez prevented Gundogan – City’s hero in the title-clinching comeback in last season’s corresponding fixture – making it 2-0.
Martinez was fortunate to be awarded a free-kick after a collision with Erling Haaland allowed Gundogan to arrow home.
A glut of City chances went begging but their win was still all but ensured by half-time.
Gundogan got his goal after brilliant work from Haaland, with Mahrez slamming in from the spot after Jacob Ramsey fouled Grealish.
Having replaced Haaland at half-time, Julian Alvarez teed up City’s first second-half opening – Martinez denying Rodri a second.
Watkins marked his 100th Villa appearance by scoring in three consecutive Premier League games for the first time, capitalising on Manuel Akanji’s error.
It would prove nothing more than a consolation, with Manchester City unfortunate not to restore their three-goal cushion through Alvarez and Mahrez – who blasted over from close range late on – as they clinched a 13th straight home league win over Villa.