The 30-year-old winger was named player of the season in his first year at The Valley, which included 13 goals.
"It was a no-brainer for me to sign a new contract," Holmes said. "Hopefully we can get promoted this season."
Holmes also produced six assists in his 38 appearances after joining on an initial two-year deal from Northampton Town in June 2016.

Stroud also remains a Conservative minority, while in Cheltenham the Liberal Democrats kept a majority rule.
The leader of Cheltenham's Conservatives, Rob Garnham, narrowly lost his seat to the Liberal Democrats, in a result that required a recount.
One of the country's youngest councillors was elected in Stroud.
In Gloucester, voters were deciding on 15 seats in the city.
Deputy council leader Jennie Dallimore held her Podsmead seat for the Conservatives, where she doubled her majority.
Stroud continues to be run by a Labour, Green and Liberal Democrat alliance.
Conservative Paul James, leader of Gloucester City Council, said it was a "big achievement" to defend the group's eight seats from the 15 being contested.
Overall the council is made up of 18 Conservative, nine Labour and nine Liberal Democrat seats.
The leader of the Liberal Democrat group in the city, Jeremy Hilton, said the council was balanced but it would require "a lot of close co-operation between the three groups" to do the best for Gloucester.
In Stroud, where a third of seats were up for election, the council is now made up of 22 Conservative, 20 Labour, six Green Party and three Liberal Democrat seats.
It meant an overall gain of one Conservative seat, three Labour seats and one Green seat and a loss of two Liberal Democrat.
Two seats on the council were vacant and one Independent candidate defected to the Conservatives.
One of the country's youngest councillors was elected in the Stroud district, when 20-year-old Tory Tim Williams won the seat for Bisley.
He said he would continue to work on his parents' farm while carrying out his duties.
In Cheltenham, the leader of the Conservatives, Rob Garnham, narrowly lost the Park ward seat to Max Wilkinson of the Liberal Democrats, in a result which needed a recount.
Overall the Liberal Democrats gained one seat and now have 24.
The Conservatives remain with 12 seats, People Against Bureaucracy remain with four seats, and one Independent seat was lost.
Turnout in Cheltenham was 37%.

20 July 2016 Last updated at 17:05 BST
The special drone can search for objects 100m under the surface of the water.
It's been exploring an old steam ship at the bottom of a lake in Nevada, America.
Ricky has been finding out more...
Charlton midfielder Ricky Holmes has signed a new three-year deal with the League One side.
[NEXT_CONCEPT]
Gloucester remains a Conservative minority administration after every party held their seats in the local elections.
[NEXT_CONCEPT]
Scientists in America are working with a new type of drone - but instead of flying high up into the sky, this one goes deep underwater.