Faits :
A.
A._ a travaillé en dernier lieu en qualité d'opératrice de production à plein temps auprès de B._ SA. En raison de hernies ombilicales et inguinales, son employeur l'a annoncée à l'assurance-invalidité le 12 juillet 2012; une demande formelle de prestations a été déposée le 9 août 2012. Le contrat de travail a pris fin au 28 février 2013. L'assurée a bénéficié de diverses mesures professionnelles de l'assurance-invalidité.
Dans une expertise bidisciplinaire rhumatologique et psychiatrique mise en oeuvre par l'Office de l'assurance-invalidité du canton de Fribourg (ci-après: l'office AI), la doctoresse C._, spécialiste en rhumatologie, médecine physique et réadaptation (rapport daté du 17 août 2015) et le docteur D._, spécialiste en psychiatrie et psychothérapie (rapport daté du 1er octobre 2015) ont attesté consensuellement, le 14 septembre 2015, une capacité de travail de 80% à partir du 15 octobre 2012 en raison de cervicalgies et de lombalgies, sans perte de rendement dans une activité adaptée. Comparant le revenu sans invalidité de 63'084 fr. avec un revenu d'invalide de 41'770 fr. (établi sur la base des statistiques de l'Enquête suisse sur la structure des salaires), l'office AI a obtenu un taux d'invalidité de 34%, ce qui l'a conduit à refuser l'octroi d'une rente d'invalidité par décision du 4 août 2017.
B.
A._ a déféré cette décision au Tribunal cantonal du canton de Fribourg, Cour des assurances sociales, qui l'a déboutée par jugement du 1er octobre 2018.
C.
A._ interjette un recours en matière de droit public contre ce jugement dont elle demande l'annulation. A titre principal, elle conclut au versement d'un quart de rente d'invalidité dès le 1er août 2013, puis d'une rente entière dès le 1er avril 2016. A titre subsidiaire, elle conclut au paiement d'un quart de rente du 1er août 2013 au 31 mars 2016, ainsi qu'au renvoi de la cause à l'office AI pour mise en oeuvre d'une nouvelle expertise médicale bidisciplinaire (rhumatologique et psychiatrique) afin de déterminer son droit aux prestations de l'AI à partir du 1er avril 2016.

Considérant en droit :
1.
Le Tribunal fédéral statue en principe sur la base des faits établis par l'autorité précédente (<ref-law>), sous réserve des cas prévus à l'<ref-law>. Le recourant ne peut critiquer la constatation de faits importants pour le jugement de la cause que si ceux-ci ont été établis en violation du droit au sens de l'<ref-law> ou de manière manifestement inexacte (<ref-law>), c'est-à-dire arbitraire et si la correction du vice est susceptible d'influer sur le sort de la cause (<ref-ruling> consid. 4.3 p. 62 et les références). Il appartient au recourant de démontrer le caractère arbitraire par une argumentation répondant aux exigences de l'<ref-law>, respectivement de l'<ref-law> (<ref-ruling> consid. 1.4.3 p. 254 s.).
2.
Au regard des motifs et des conclusions du recours (cf. <ref-law>), le litige porte sur le droit de la recourante à un quart de rente d'invalidité du 1er août 2013 au 31 mars 2016 et à une rente entière pour la période postérieure à cette date. Il s'agit singulièrement d'examiner si un abattement doit être appliqué dans le cas particulier sur le revenu d'invalide et, le cas échéant, à quel taux. Est en outre contestée l'étendue de la capacité de travail à partir de l'année 2016.
Le jugement entrepris expose de manière complète les règles légales (art. 4 al. 1 et 28 LAI, 6, 8 et 16 LPGA) ainsi que la jurisprudence sur l'évaluation de l'invalidité, la méthode de la comparaison des revenus et l'abattement sur le revenu d'invalide (cf. <ref-ruling>), si bien qu'il suffit de renvoyer à ses consid. 2 et 3. A cet égard, on rappellera que lorsqu'un assuré est capable de travailler à plein temps mais avec une diminution de rendement, celle-ci est prise en considération dans la fixation de la capacité de travail et qu'il n'y a pas lieu, en sus, d'effectuer un abattement à ce titre (arrêt 9C_122/2017 du 20 décembre 2017 consid. 4.1 et les références; consid. 3.2 in fine du jugement attaqué).
3.
3.1. En l'espèce, la juridiction cantonale a considéré que les experts, mandatés selon la procédure prévue à l'<ref-law>, avaient expliqué que le taux d'incapacité de travail de 20% était dû en raison des troubles dégénératifs cervicaux et lombaires associés, marqués pour l'âge, et du status post intervention sur la colonne cervicale, cela aussi pour éviter des décompensations algiques susceptibles d'entraîner une incapacité de travail à long terme. Les premiers juges en ont déduit que les experts avaient ainsi déjà tenu compte en partie de l'incidence des limitations fonctionnelles dans ce 20%. En outre, pour fixer le revenu d'invalide, ils ont relevé que l'office intimé s'était fondé, conformément à la jurisprudence, sur les données économiques statistiques, singulièrement sur le revenu auquel peuvent prétendre les femmes effectuant des activités simples et répétitives (niveau 1 de qualification). Ils ont ajouté que cette valeur statistique s'applique en principe à tous les assurés qui ne peuvent plus accomplir leur ancienne activité parce qu'elle est physiquement trop astreignante pour leur état de santé, mais conservent néanmoins une capacité de travail importante dans des travaux légers. Les premiers juges ont aussi rappelé que pour ces assurés, ce salaire statistique est suffisamment représentatif de ce qu'ils seraient en mesure de réaliser en tant qu'invalides dès lors qu'il recouvre un large éventail d'activités variées et non qualifiées, n'impliquant pas de formation particulière et compatibles avec des limitations fonctionnelles peu contraignantes. L'absence d'abattement sur le salaire d'invalide n'était donc pas arbitraire.
3.2. La recourante rappelle qu'il est vrai que, lorsque les facultés réduites de rendement ont déjà été prises en considération lors de l'appréciation de la capacité de travail, elles ne sauraient l'être une seconde fois dans le cadre de l'évaluation du revenu d'invalide en tant que réduction du salaire statistique. Ainsi, lorsqu'un assuré est capable de travailler à plein temps mais avec une diminution de rendement, celle-ci est prise en considération dans la fixation de la capacité de travail et il n'y a pas lieu d'effectuer en sus un abattement sur le salaire statistique.
Pour la recourante, l'absence d'abattement sur le salaire statistique procède toutefois d'une violation du droit (<ref-ruling>, 132 V 393 consid. 3.3 p. 399). Elle soutient que la juridiction cantonale a confondu les notions de taux d'occupation et de rendement. Les principes qu'elle a rappelés ne sauraient s'appliquer lorsque les limitations fonctionnelles engendrent, comme en l'espèce, non pas une diminution de rendement mais une réduction du taux horaire. A son avis, ce n'est pas parce que les limitations fonctionnelles entraînent une réduction du taux d'activité exigible qu'un employeur potentiel acceptera de lui verser une rémunération correspondant au plein salaire statistique. Dans son cas, les limitations fonctionnelles relevées par la doctoresse C._ (nécessité de changements fréquents de positions, absence de mouvements itératifs contraignants pour le rachis cervical ou lombaire, de travaux impliquant de lever les bras au-dessus de l'horizontal, de ports de charges de plus de 2,5 à 5kg, d'activités sur des échelles ou des échafaudages, de tâches en position agenouillée) ont de considérables incidences même dans le cadre d'une activité légère à 80%. Elle en déduit qu'aucun employeur n'acceptera de lui verser le même salaire qu'à une personne valide travaillant à 80%. Compte tenu de ces limitations fonctionnelles, un abattement de 15% sur le revenu statistique lui paraît justifié, de sorte que le taux d'invalidité doit être fixé à 44%.
3.3. Ce raisonnement ne peut être suivi. En effet, l'administration ou le tribunal ne sauraient introduire, par le biais de la déduction sur le salaire d'invalide, une diminution de rendement de l'assuré dans le cadre de la capacité résiduelle de travail, alors que les médecins appelés à se prononcer sur celle-ci n'ont pas fait état d'une limitation du rendement de travail. A cet égard, les limitations d'ordre somatique dont les premiers juges ont fait état sur la base du rapport de la doctoresse C._ du 17 août 2015 ont justifié une réduction de la capacité de travail de 20%, laquelle a été prise en compte pour la fixation du revenu d'invalide. Une diminution du rendement dans les 80% restants a été explicitement exclue par l'experte (rapport précité, p. 17, ch. 3.3 et 3.4). Par conséquent, si les premiers juges avaient pris les limitations somatiques en considération dans le cadre de l'abattement, comme la recourante le soutient, ils auraient usé d'un critère inapproprié et excédé leur pouvoir d'appréciation.
Pour le surplus, le jugement attaqué ne prête nullement le flanc à la critique, dans la mesure où la juridiction cantonale n'a pas tenu compte d'un abattement pour désavantage salarial puisqu'elle n'a pas mis en évidence d'empêchements supplémentaires qui restreindraient la recourante dans l'exercice d'une activité adaptée. Sur ce point, le recours est infondé.
4.
4.1. En ce qui concerne la situation médicale prévalant à compter du 1er janvier 2016, la juridiction cantonale a constaté qu'aucun des rapports médicaux subséquents ne laissait apparaître une réelle aggravation de l'état de santé depuis la date des expertises. Elle en a déduit que l'intimé était en droit de retenir que l'exigibilité fixée par les experts dans leurs expertises en 2015 était encore valable au moment où la décision administrative avait été rendue.
4.2. La recourante se prévaut d'une constatation manifestement inexacte des faits à cet égard (<ref-law>). Elle soutient que les premiers juges ont apprécié les preuves de manière arbitraire en admettant, à tort à ses yeux, que les rapports de la doctoresse E._, spécialiste en rhumatologie et médecine interne (des 2 juin 2016 et 10 avril 2017) et du docteur F._, spécialiste en psychiatrie et psychothérapie (rapports des 24 février 2016 et 1er mai 2017) n'établissaient pas une aggravation de son état de santé postérieurement aux expertises de la doctoresse C._ (du 17 août 2015) et du docteur D._ (du 1er octobre 2015).
4.3. L'instance précédente s'est déterminée sur ces objections que la recourante avait déjà soulevées devant elle. Les réponses apportées sont néanmoins suffisantes (consid. 4.2.2 du jugement attaqué, p. 14). L'appréciation des divers avis médicaux par la juridiction cantonale ne saurait être qualifiée d'arbitraire au point d'entraîner l'annulation du jugement. En effet, en ce qui concerne le volet rhumatologique, les premiers juges ont retenu que la doctoresse E._ avait posé les mêmes diagnostics que sa consoeur C._, experte rhumatologue. Ils ont rappelé à cet égard que le diagnostic de spondylarthropathie n'avait pas été confirmé par l'IRM des sacro-illiaques, tandis que le docteur G._, spécialiste en neurologie, n'avait pas retenu de diagnostic neurologique mais avait conclu à la présence de troubles sensitifs purement subjectifs et aspécifiques (rapport du 25 novembre 2016). Au sujet de l'intervention chirurgicale pour une hernie discale cervicale subie le 11 février 2017, la juridiction cantonale a aussi retenu que le docteur H._ avait expliqué clairement, dans son rapport du 27 mars 2017, qu'elle s'était bien déroulée avec une récupération complète de la sensibilité et de la motricité du membre supérieur droit en postopératoire, mis à part un nouveau déficit moteur survenu une dizaine de jours plus tard mais qui s'était spontanément résolu. Les juges ont admis que cet élément ne pouvait avoir qu'une influence temporaire sur la capacité de travail, estimée à trois mois par le médecin du Service médical régional (rapport du docteur I._, du 14 juin 2017), et ne pouvait ainsi être retenu comme une aggravation durable de l'état de santé.
Quant à l'appréciation du volet psychiatrique, elle ne prête pas davantage le flanc à la critique. L'avis divergent du docteur F._, qui certes atteste une péjoration de l'état de santé, ne peut justifier une telle aggravation à défaut d'être accompagné d'une explication médicale circonstanciée.
Sur ce point, le recours est également infondé.
5.
La recourante, qui succombe, supportera les frais de la procédure (<ref-law>).

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté.
2.
Les frais judiciaires, arrêtés à 800 fr., sont mis à la charge de la recourante.
3.
Le présent arrêt est communiqué aux parties, au Tribunal cantonal du canton de Fribourg, Cour des assurances sociales, à l'Office fédéral des assurances sociales et au J._, Vevey.
Lucerne, le 18 février 2019
Au nom de la IIe Cour de droit social
du Tribunal fédéral suisse
La Présidente : Pfiffner
Le Greffier : Berthoud