Terms were not announced, but FanRag Sports reported the deal was for $3.5 million.
Duda's arm was challenged by Hosmer, who made a delayed dash home on a high throw to score the tying run in the ninth inning of what turned out to be the finale of the Royals' five-game win over the New York Mets in the 2015 World Series.
"It's funny how baseball works out,'' Duda said Wednesday after agreeing to the contract with the Royals. "You definitely learn from failure. It makes you strong as a person, as a player. For the Kansas City fans out there that don't think maybe I'm the right fit or whatever it may be, I'm out to prove them wrong.''
Royals manager Ned Yost said he will not mention the play to Duda.
"It's not an elephant in the room,'' Yost said. "It's a one-time play. If we make the play again, he might have thrown Hos out by 10 feet. You don't know. It's just something that happened.''
Duda, 32, batted just .217 last season but matched a career high with 30 home runs in 127 combined games with the Mets and Tampa Bay Rays.
The Rays acquired Duda from the Mets in a three-way midseason trade that involved a bundle of four players and draft choices. In 52 games for Tampa Bay, Duda blasted 13 home runs and drove in 27 runs with just a .175 batting average.
To make room for Duda on the roster, the Royals designated outfielder Billy Burns for assignment.
Duda is coming off a one-year, $7.25 million deal in 2017.
From 2014 to '15, he hit 57 home runs -- including a career-high 30 during his best season in 2014. But he missed four months in 2016 and was limited to 47 games because of a stress fracture in his lower back. He returned in late September of that season as a part-time player and finished with a .229 batting average, seven homers and 23 RBIs in 153 at-bats.
Over eight major league seasons, Duda is hitting .242 with 138 homers and 405 RBIs in 812 games.
The Associated Press contributed to this report.