Olivier Teste

231 papers A 7B 38C 14Misc 4Journal 49Unranked 110
YearRankTypeTitle / Venue / Authors
2026 B conf
IDA
Vincent Blase, Julien Aligon, Moncef Garouani, Isabelle Ader, Olivier Teste
2026 J jnl
CoRR
Aymane Harkati, Moncef Garouani, Olivier Teste, Julien Aligon, Mohamed Hamlich
2025 A conf
CIKM
Michael Ben Ali, Imen Megdiche, André Péninou, Olivier Teste
2025 J jnl
CoRR
Michael Ben Ali, Imen Megdiche, André Péninou, Olivier Teste
2025 J jnl
CoRR
Omar El Rifai, Michael Ben Ali, Imen Megdiche, André Péninou, Olivier Teste
2025 conf
RCIS (2)
Nour Elhouda Kired, Franck Ravat, Jiefu Song, Olivier Teste
2025 J jnl
CoRR
Pierre Lotte, André Péninou, Olivier Teste
2025 conf
EGC
Pierre Lotte, André Péninou, Olivier Teste
2025 conf
REW
Jean-Michel Bruel, T. Gouaichault, Olivier Teste, Mireille Blay-Fornarino, Nathan Lacroix, Frédéric Precioso, Sébastien Mosser
2025 J jnl
J. Big Data
Abdoulaye Diop, Nabil El Malki, Max Chevalier, André Péninou, Geoffrey Roman-Jimenez, Olivier Teste
2025 J jnl
Inf. Fusion
Moncef Garouani, Ayah Barhrhouj, Olivier Teste
2025 J jnl
CoRR
Moncef Garouani, Ayah Barhrhouj, Olivier Teste
2024 J jnl
CoRR
Michael Ben Ali, Omar El Rifai, Imen Megdiche, André Péninou, Olivier Teste
2024 B conf
DaWaK
Nour Elhouda Kired, Franck Ravat, Jiefu Song, Olivier Teste
2024 B conf
DaWaK
Oumaima El Haddadi, Max Chevalier, Bernard Dousset, Ahmad El Allaoui, Anass El Haddadi, Olivier Teste
2024 conf
INFORSID
Léa El Ahdab, André Péninou, Olivier Teste, Imen Megdiche
2024 B conf
SSDBM
Abdoulaye Diop, Nabil El Malki, Max Chevalier, André Péninou, Geoffrey Roman-Jimenez, Olivier Teste
2024 conf
OM@ISWC
Philippe Roussille, Olivier Teste
2024 B conf
DaWaK
Robin Cugny, Julien Aligon, Max Chevalier, Geoffrey Roman-Jimenez, Olivier Teste
2024 conf
RCIS (1)
Léa El Ahdab, Imen Megdiche, André Péninou, Olivier Teste
2024 conf
EGC
Yacine Mokhtari, Robin Cugny, Nabil El Malki, Julien Aligon, Max Chevalier, Olivier Teste
2023 conf
DEXA (1)
Lea El Ahdab, Olivier Teste, Imen Megdiche, André Péninou
2023 conf
INFORSID
Oumaima El Haddadi, Max Chevalier, Bernard Dousset, Ahmad El Allaoui, Anass El Haddadi, Olivier Teste
2023 conf
EGC
Robin Cugny, Julien Aligon, Max Chevalier, Geoffrey Roman-Jimenez, Olivier Teste
2023 B conf
RCIS
Elsa Negre, Franck Ravat, Olivier Teste
2023 J jnl
CoRR
Nabil El Malki, Robin Cugny, Olivier Teste, Franck Ravat
2023 J jnl
Mach. Learn.
Clément Lejeune, Josiane Mothe, Adil Soubki, Olivier Teste
2023 J jnl
Trans. Large Scale Data Knowl. Centered Syst.
Ginel Dorleon, Imen Megdiche, Nathalie Bricon-Souf, Olivier Teste
2023 conf
IC
Chloé Khadija Jradeh, Jérôme David, Olivier Teste, Cássia Trojahn
2023 conf
ICANN (6)
Michele Lazzara, Max Chevalier, Corentin Lapeyre, Olivier Teste
2023 conf
MEDI Workshops
Oumaima El Haddadi, Max Chevalier, Bernard Dousset, Ahmad El Allaoui, Anass El Haddadi, Olivier Teste
2023 conf
OM@ISWC
Philippe Roussille, Olivier Teste
2023 B conf
DaWaK
Lea El Ahdab, Olivier Teste, Imen Megdiche, André Péninou
2022 A conf
CIKM
Robin Cugny, Julien Aligon, Max Chevalier, Geoffrey Roman-Jimenez, Olivier Teste
2022 B conf
DaWaK
Yuzhao Yang, Fatma Abdelhédi, Jérôme Darmont, Franck Ravat, Olivier Teste
2022 B conf
RCIS
Elliot Maître, Max Chevalier, Bernard Dousset, Jean-Philippe Gitto, Olivier Teste
2022 C conf
ADBIS
Yuzhao Yang, Jérôme Darmont, Franck Ravat, Olivier Teste
2022 J jnl
CoRR
Yuzhao Yang, Jérôme Darmont, Franck Ravat, Olivier Teste
2022 B conf
DaWaK
Ginel Dorleon, Imen Megdiche, Nathalie Bricon-Souf, Olivier Teste
2022 Misc conf
SAC
Ginel Dorleon, Imen Megdiche, Nathalie Bricon-Souf, Olivier Teste
2022 B conf
SSDBM
Abdoulaye Diop, Nabil El Malki, Max Chevalier, André Péninou, Olivier Teste
2022 B conf
ICTAI
Michele Lazzara, Max Chevalier, Jasone Garay-Garcia, Corentin Lapeyre, Olivier Teste
2022 conf
OM@ISWC
Philippe Roussille, Olivier Teste
2022 J jnl
CoRR
Robin Cugny, Julien Aligon, Max Chevalier, Geoffrey Roman-Jimenez, Olivier Teste
2021 B conf
DaWaK
Nabil El Malki, Robin Cugny, Olivier Teste, Franck Ravat
2021 conf
DSIT
Ginel Dorleon, Nathalie Bricon-Souf, Imen Megdiche, Olivier Teste
2021 C conf
IDEAS
Yuzhao Yang, Jérôme Darmont, Franck Ravat, Olivier Teste
2021 J jnl
CoRR
Yuzhao Yang, Jérôme Darmont, Franck Ravat, Olivier Teste
2021 conf
EDA
Clément Lejeune, Josiane Mothe, Adil Soubki, Olivier Teste
2021 conf
ICDM (Workshops)
Tianyi Li, Philippe Goupil, Josiane Mothe, Olivier Teste
2021 B conf
EDBT
Ines Ben Kraiem, Faiza Ghozzi, André Péninou, Geoffrey Roman-Jimenez, Olivier Teste
2021 conf
DEXA (1)
Yuzhao Yang, Fatma Abdelhédi, Jérôme Darmont, Franck Ravat, Olivier Teste
2021 J jnl
CoRR
Yuzhao Yang, Fatma Abdelhédi, Jérôme Darmont, Franck Ravat, Olivier Teste
2021 conf
EGC
Ginel Dorleon, Nathalie Bricon-Souf, Imen Megdiche, Olivier Teste
2021 conf
CORIA
Andonirina Andriamihasinoro, Oihana Coustié, Josiane Mothe, Olivier Teste
2021 conf
INFORSID
Elliot Maître, Zakaria Chemli, Max Chevalier, Bernard Dousset, Jean-Philippe Gitto, Olivier Teste
2020 A conf
CIKM
Xavier Baril, Oihana Coustié, Josiane Mothe, Olivier Teste
2020 B conf
RCIS
Ines Ben Kraiem, Faiza Ghozzi, André Péninou, Geoffrey Roman-Jimenez, Olivier Teste
2020 conf
EDA
Yuzhao Yang, Jérôme Darmont, Franck Ravat, Olivier Teste
2020 J jnl
CoRR
Yuzhao Yang, Jérôme Darmont, Franck Ravat, Olivier Teste
2020 B conf
AIME
Omar El Rifai, Maelle Biotteau, Xavier de Boissezon, Imen Megdiche, Franck Ravat, Olivier Teste
2020 B conf
RCIS
Omar El Rifai, Maelle Biotteau, Xavier de Boissezon, Imen Megdiche, Franck Ravat, Olivier Teste
2020 A conf
CIKM
Nabil El Malki, Robin Cugny, Olivier Teste, Franck Ravat
2020 J jnl
Int. J. Inf. Manag.
Franck Ravat, Jiefu Song, Olivier Teste, Cássia Trojahn
2020 conf
CIRCLE
Elliot Maître, Zakaria Chemli, Max Chevalier, Bernard Dousset, Jean-Philippe Gitto, Olivier Teste
2020 C conf
DOLAP
Nabil El Malki, Franck Ravat, Olivier Teste
2020 A conf
ICWS
Oihana Coustié, Josiane Mothe, Olivier Teste, Xavier Baril
2020 B conf
EDBT
Clément Lejeune, Josiane Mothe, Olivier Teste
2020 conf
CIRCLE
Konstantinos P. Demestichas, Thi Bich Ngoc Hoang, Josiane Mothe, Olivier Teste, Md. Zia Ullah
2020 J jnl
Knowl. Based Syst.
Clément Lejeune, Josiane Mothe, Adil Soubki, Olivier Teste
2019 conf
EGC
Nabil El Malki, Franck Ravat, Olivier Teste
2019 conf
IC
Philippe Roussille, Imen Megdiche, Olivier Teste, Cássia Trojahn
2019 conf
ICEIS (Revised Selected Papers)
Ines Ben Kraiem, Faiza Ghozzi, André Péninou, Olivier Teste
2019 Misc conf
SAC
Franck Ravat, Jiefu Song, Olivier Teste, Cássia Trojahn
2019 conf
INFORSID
Ines Ben Kraiem, Faiza Ghozzi, André Péninou, Olivier Teste
2019 conf
OM@ISWC
Amir Laadhar, Faiza Ghozzi, Imen Megdiche, Franck Ravat, Olivier Teste, Faïez Gargouri
2019 Misc conf
SAC
Amir Laadhar, Faiza Ghozzi, Imen Megdiche, Franck Ravat, Olivier Teste, Faïez Gargouri
2019 conf
ICEIS (1)
Ines Ben Kraiem, Faiza Ghozzi, André Péninou, Olivier Teste
2019 conf
INFORSID
Xavier Baril, Oihana Coustié, Josiane Mothe, Olivier Teste
2019 J jnl
Inf. Syst.
Hamdi Ben Hamadou, Faiza Ghozzi, André Péninou, Olivier Teste
2019 conf
BIS (1)
Amir Laadhar, Faiza Ghozzi, Imen Megdiche, Franck Ravat, Olivier Teste, Faïez Gargouri
2019 conf
ICEIS (1)
Nabil El Malki, Franck Ravat, Olivier Teste
2018 conf
UNet
Mohammed El Malki, Arlind Kopliku, Essaid Sabir, Olivier Teste
2018 B conf
KES
Hana Mallek, Faiza Ghozzi, Olivier Teste, Faïez Gargouri
2018 B conf
EKAW
Philippe Roussille, Imen Megdiche, Olivier Teste, Cássia Trojahn
2018 conf
OM@ISWC
Philippe Roussille, Imen Megdiche, Olivier Teste, Cássia Trojahn
2018 conf
INFORSID
Mohammed El Malki, Hamdi Ben Hamadou, Max Chevalier, André Péninou, Olivier Teste
2018 conf
EGC
Hamdi Ben Hamadou, Faiza Ghozzi, André Péninou, Olivier Teste
2018 J jnl
Document Numérique
Olivier Teste
2018 B conf
SOFSEM
Franck Ravat, Jiefu Song, Olivier Teste
2018 conf
OM@ISWC
Amir Laadhar, Faiza Ghozzi, Imen Megdiche, Franck Ravat, Olivier Teste, Faïez Gargouri
2018 conf
DEXA (2)
Elsa Negre, Franck Ravat, Olivier Teste
2018 conf
OM@ISWC
Amir Laadhar, Faiza Ghozzi, Imen Megdiche, Franck Ravat, Olivier Teste
2018 B conf
DaWaK
Mohammed El Malki, Hamdi Ben Hamadou, Max Chevalier, André Péninou, Olivier Teste
2018 conf
ICEIS (1)
Hamdi Ben Hamadou, Faiza Ghozzi, André Péninou, Olivier Teste
2018 conf
ICEIS (Revised Selected Papers)
Hamdi Ben Hamadou, Faiza Ghozzi, André Péninou, Olivier Teste
2018 C conf
DOLAP
Hamdi Ben Hamadou, Faiza Ghozzi, André Péninou, Olivier Teste
2017 conf
DASFAA (2)
Baptiste de La Robertie, Liana Ermakova, Yoann Pitarch, Atsuhiro Takasu, Olivier Teste
2017 J jnl
Document Numérique
Max Chevalier, Mohammed El Malki, Arlind Kopliku, Olivier Teste, Ronan Tournier
2017 Misc conf
SAC
Baptiste de La Robertie, Yoann Pitarch, Atsuhiro Takasu, Olivier Teste
2017 conf
EDA
Maha Ben Kraiem, Kaïs Khrouf, Jamel Feki, Franck Ravat, Olivier Teste
2017 conf
OM@ISWC
Amir Laadhar, Faiza Ghozzi, Imen Megdiche, Franck Ravat, Olivier Teste, Faïez Gargouri
2017 C conf
KEOD
Amir Laadhar, Faiza Ghozzi, Imen Megdiche, Franck Ravat, Olivier Teste, Faïez Gargouri
2017 ch.
Prediction and Inference from Social Networks and Social Media
Baptiste de La Robertie, Yoann Pitarch, Olivier Teste
2017 conf
EDA
Max Chevalier, Mohammed El Malki, Arlind Kopliku, Olivier Teste, Ronan Tournier
2017 J jnl
Ingénierie des Systèmes d Inf.
Franck Ravat, Jiefu Song, Olivier Teste
2016 conf
ISWC (1)
Imen Megdiche, Olivier Teste, Cássia Trojahn dos Santos
2016 C conf
ISDA
Hana Mallek, Faiza Ghozzi, Olivier Teste, Faïez Gargouri
2016 conf
INFORSID
Franck Ravat, Jiefu Song, Olivier Teste
2016 B conf
RCIS
Franck Ravat, Jiefu Song, Olivier Teste
2016 conf
UNet
Max Chevalier, Mohammed El Malki, Arlind Kopliku, Olivier Teste, Ronan Tournier
2016 conf
ICEIS (1)
Max Chevalier, Mohammed El Malki, Arlind Kopliku, Olivier Teste, Ronan Tournier
2016 conf
INFORSID
Max Chevalier, Mohammed El Malki, Arlind Kopliku, Olivier Teste, Ronan Tournier
2016 B conf
RCIS
Max Chevalier, Mohammed El Malki, Arlind Kopliku, Olivier Teste, Ronan Tournier
2016 conf
OM@ISWC
Imen Megdiche, Olivier Teste, Cássia Trojahn dos Santos
2016 J jnl
Int. J. Data Warehous. Min.
Franck Ravat, Jiefu Song, Olivier Teste
2016 conf
EGC
Baptiste de La Robertie, Yoann Pitarch, Olivier Teste
2016 conf
DEXA (2)
Baptiste de La Robertie, Yoann Pitarch, Olivier Teste
2015 conf
DEXA (2)
Alain Berro, Imen Megdiche, Olivier Teste
2015 conf
EDA
Franck Ravat, Jiefu Song, Olivier Teste
2015 B conf
RCIS
Max Chevalier, Mohammed El Malki, Arlind Kopliku, Olivier Teste, Ronan Tournier
2015 conf
INFORSID
Sébastien Laborie, Franck Ravat, Jiefu Song, Olivier Teste
2015 J jnl
Trans. Large Scale Data Knowl. Centered Syst.
Ali Hassan, Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2015 conf
EDA
Max Chevalier, Mohammed El Malki, Arlind Kopliku, Olivier Teste, Ronan Tournier
2015 J jnl
Int. J. Decis. Support Syst. Technol.
Faten Atigui, Franck Ravat, Jiefu Song, Olivier Teste, Gilles Zurfluh
2015 conf
ICEIS (1)
Alain Berro, Imen Megdiche, Olivier Teste
2015 B conf
RCIS
Alain Berro, Imen Megdiche, Olivier Teste
2015 conf
ICEIS (Revised Selected Papers)
Max Chevalier, Mohammed El Malki, Arlind Kopliku, Olivier Teste, Ronan Tournier
2015 C conf
ADBIS
Max Chevalier, Mohammed El Malki, Arlind Kopliku, Olivier Teste, Ronan Tournier
2015 B conf
DaWaK
Max Chevalier, Mohammed El Malki, Arlind Kopliku, Olivier Teste, Ronan Tournier
2015 conf
ICEIS (1)
Max Chevalier, Mohammed El Malki, Arlind Kopliku, Olivier Teste, Ronan Tournier
2015 conf
EDA
Alain Berro, Imen Megdiche, Olivier Teste
2015 B conf
ASONAM
Baptiste de La Robertie, Yoann Pitarch, Olivier Teste
2015 J jnl
Soc. Netw. Anal. Min.
Maha Ben Kraiem, Jamel Feki, Kaïs Khrouf, Franck Ravat, Olivier Teste
2015 conf
ADBIS (Short Papers and Workshops)
Maha Ben Kraiem, Jamel Feki, Kaïs Khrouf, Franck Ravat, Olivier Teste
2014 conf
ADBIS (2)
Alain Berro, Imen Megdiche, Olivier Teste
2014 J jnl
J. Decis. Syst.
Ali Hassan, Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2014 B conf
RCIS
Maha Ben Kraiem, Jamel Feki, Kaïs Khrouf, Franck Ravat, Olivier Teste
2014 conf
INFORSID
Alain Berro, Imen Megdiche, Olivier Teste
2013 J jnl
Ingénierie des Systèmes d Inf.
Ali Hassan, Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2013 conf
INFORSID
Elsa Negre, Franck Ravat, Olivier Teste, Ronan Tournier
2013 B conf
RCIS
Elsa Negre, Franck Ravat, Olivier Teste, Ronan Tournier
2013 conf
SemStats@ISWC
Rafik Saad, Olivier Teste, Cássia Trojahn
2013 C conf
ADBIS
Ali Hassan, Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2013 conf
EDA
Ali Hassan, Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2013 conf
EDA
Maha Ben Kraiem, Jamel Feki, Kaïs Khrouf, Franck Ravat, Olivier Teste
2013 conf
EDA
Alain Berro, Imen Megdiche, Olivier Teste
2012 conf
INFORSID
Ali Hassan, Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2012 conf
EDA
Faten Atigui, Franck Ravat, Olivier Teste, Gilles Zurfluh
2012 B conf
DaWaK
Ali Hassan, Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2012 conf
INFORSID
Faten Atigui, Franck Ravat, Olivier Teste, Gilles Zurfluh
2012 J jnl
J. Decis. Syst.
Faten Atigui, Franck Ravat, Olivier Teste, Gilles Zurfluh
2012 conf
EDA
Ali Hassan, Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2012 B conf
DaWaK
Faten Atigui, Franck Ravat, Olivier Teste, Gilles Zurfluh
2011 conf
ICEIS (1)
Fatma Abdelhédi, Geneviève Pujolle, Olivier Teste, Gilles Zurfluh
2011 conf
EDA
Faten Atigui, Franck Ravat, Olivier Teste, Gilles Zurfluh
2011 B conf
DaWaK
Geneviève Pujolle, Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2011 conf
EDA
Fatma Abdelhédi, Franck Ravat, Olivier Teste, Gilles Zurfluh
2011 J jnl
Ingénierie des Systèmes d Inf.
Houssem Jerbi, Geneviève Pujolle, Franck Ravat, Olivier Teste
2011 conf
INFORSID
Fatma Abdelhédi, Franck Ravat, Olivier Teste, Gilles Zurfluh
2010 C conf
ADBIS
Houssem Jerbi, Franck Ravat, Olivier Teste, Gilles Zurfluh
2010 ch.
Strategic Advancements in Utilizing Data Mining and Warehousing Technologies
Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2010 J jnl
CoRR
Franck Ravat, Olivier Teste, Gilles Zurfluh
2010 J jnl
CoRR
Gilles Hubert, Olivier Teste
2010 J jnl
CoRR
Frédéric Bret, Olivier Teste
2010 J jnl
CoRR
Faiza Ghozzi, Franck Ravat, Olivier Teste, Gilles Zurfluh
2010 ch.
Complex Data Warehousing and Knowledge Discovery for Advanced Retrieval Development
Guillaume Cabanac, Max Chevalier, Franck Ravat, Olivier Teste
2010 J jnl
CoRR
Olivier Teste
2010 J jnl
Inf. Syst.
Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2010 J jnl
CoRR
Franck Ravat, Olivier Teste, Gilles Zurfluh
2010 J jnl
CoRR
Franck Ravat, Olivier Teste
2010 J jnl
CoRR
Houssem Jerbi, Geneviève Pujolle, Franck Ravat, Olivier Teste
2010 conf
INFORSID
Houssem Jerbi, Geneviève Pujolle, Franck Ravat, Olivier Teste
2010 J jnl
CoRR
Franck Ravat, Olivier Teste, Gilles Zurfluh
2010 conf
EDA
Houssem Jerbi, Franck Ravat, Olivier Teste, Gilles Zurfluh
2010 J jnl
CoRR
Olivier Teste
2009 conf
EGC
Gilles Hubert, Olivier Teste
2009 conf
ICEIS
Houssem Jerbi, Franck Ravat, Olivier Teste, Gilles Zurfluh
2009 ch.
Database Technologies: Concepts, Methodologies, Tools, and Applications
Franck Ravat, Olivier Teste, Gilles Zurfluh
2009 ch.
New Trends in Data Warehousing and Data Analysis
Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2009 conf
EGC
Houssem Jerbi, Franck Ravat, Olivier Teste, Gilles Zurfluh
2009 book
Olivier Teste
2009 conf
EGC (best of volume)
Gilles Hubert, Olivier Teste
2009 ch.
New Trends in Data Warehousing and Data Analysis
Franck Ravat, Olivier Teste
2009 conf
EDA
Fadila Bentayeb, Omar Boussaïd, Cécile Favre, Franck Ravat, Olivier Teste
2009 B conf
DaWaK
Houssem Jerbi, Franck Ravat, Olivier Teste, Gilles Zurfluh
2008 ed.
EDA
Franck Ravat, Olivier Teste, Gilles Zurfluh
2008 J jnl
Int. J. Data Warehous. Min.
Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2008 J jnl
Ingénierie des Systèmes d Inf.
Geneviève Pujolle, Franck Ravat, Olivier Teste, Ronan Tournier
2008 conf
ICDIM
Houssem Jerbi, Franck Ravat, Olivier Teste, Gilles Zurfluh
2008 conf
INFORSID
Estella Annoni, Franck Ravat, Olivier Teste
2008 conf
EDA
Estella Annoni, Franck Ravat, Olivier Teste, Gilles Zurfluh
2008 B conf
DaWaK
Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2008 conf
EDA
Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2008 J jnl
Ingénierie des Systèmes d Inf.
Franck Ravat, Olivier Teste, Gilles Zurfluh
2007 A conf
ER
Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2007 B conf
DaWaK
Guillaume Cabanac, Max Chevalier, Franck Ravat, Olivier Teste
2007 J jnl
Document Numérique
Franck Ravat, Olivier Teste, Ronan Tournier
2007 C conf
SEKE
Estella Annoni, Franck Ravat, Olivier Teste
2007 C conf
ADBIS
Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2007 C conf
SEKE
Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2007 conf
EDA
Franck Ravat, Olivier Teste, Ronan Tournier, Gilles Zurfluh
2007 conf
ICEIS (1)
Franck Ravat, Olivier Teste, Ronan Tournier
2007 conf
INFORSID
Franck Ravat, Olivier Teste, Gilles Zurfluh
2006 B conf
DaWaK
Franck Ravat, Olivier Teste, Gilles Zurfluh
2006 conf
INFORSID
Franck Ravat, Olivier Teste, Gilles Zurfluh
2006 C conf
DEXA
Estella Annoni, Franck Ravat, Olivier Teste, Gilles Zurfluh
2006 conf
EGC
Guillaume Cabanac, Max Chevalier, Franck Ravat, Olivier Teste
2006 conf
EDA
Estella Annoni, Franck Ravat, Olivier Teste, Gilles Zurfluh
2006 conf
EDA
Guillaume Cabanac, Max Chevalier, Franck Ravat, Olivier Teste
2006 conf
INFORSID
Estella Annoni, Franck Ravat, Olivier Teste, Gilles Zurfluh
2006 B conf
DaWaK
Estella Annoni, Franck Ravat, Olivier Teste, Gilles Zurfluh
2006 J jnl
Ingénierie des Systèmes d Inf.
Estella Annoni, Franck Ravat, Olivier Teste
2005 conf
EGC
Franck Ravat, Olivier Teste, Gilles Zurfluh
2005 conf
EDA
Faiza Ghozzi, Franck Ravat, Olivier Teste, Gilles Zurfluh
2005 J jnl
Ingénierie des Systèmes d Inf.
Estella Annoni, Franck Ravat, Olivier Teste, Gilles Zurfluh
2004 J jnl
Ingénierie des Systèmes d Inf.
Faiza Ghozzi, Franck Ravat, Olivier Teste, Gilles Zurfluh
2003 conf
ICEIS (1)
Faiza Ghozzi, Franck Ravat, Olivier Teste, Gilles Zurfluh
2003 conf
BDA
Faiza Ghozzi, Franck Ravat, Olivier Teste, Gilles Zurfluh
2003 conf
EGC
Faiza Ghozzi, Franck Ravat, Olivier Teste, Gilles Zurfluh
2002 J jnl
Ingénierie des Systèmes d Inf.
Franck Ravat, Olivier Teste, Gilles Zurfluh
2001 conf
BDA
Franck Ravat, Olivier Teste
2001 conf
EGC
Franck Ravat, Olivier Teste, Gilles Zurfluh
2000 C conf
DEXA
Franck Ravat, Olivier Teste
2000 conf
ADBIS-DASFAA Symposium
Franck Ravat, Olivier Teste
2000 conf
INFORSID
Olivier Teste
2000 conf
BDA
Franck Ravat, Olivier Teste, Gilles Zurfluh
2000
Olivier Teste
2000 conf
ICEIS
Franck Ravat, Olivier Teste
1999 conf
INFORSID
Frédéric Bret, Olivier Teste
1999 A conf
CIKM
Franck Ravat, Olivier Teste, Gilles Zurfluh
redb/extractors/decompiler/DecompileAPK.py
← Index redb/extractors/decompiler/DecompileAPK.py python
"""APK Code Analysis Extractor.

Decompiles and disassembles APK DEX bytecode at the method level,
producing per-method content and reference records analogous to
the Binary Ninja code_binja_* tables.

Uses androguard + JADX + apktool to replicate Binary Ninja analysis
depth for Android applications.
"""

import gc
import hashlib
import inspect
import logging
import os
import threading
import time
from datetime import datetime, timezone
from typing import Any, Dict, Optional

from redb.extractors.decompiler.apk.analyzer import APKCodeAnalyzer
from redb.extractors.enum import Tag
from redb.extractors.extractor import Extractor


class DecompileAPK(Extractor):
    """APK code analysis extractor — produces multi-table ClickHouse export.

    Follows the same pattern as DecompileBinja for consistency.
    """

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        known_benign=False,
        known_malicious=False,
        filetype=None,
        decompile_modules=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            known_benign=known_benign,
            known_malicious=known_malicious,
        )
        self.log.debug(inspect.currentframe().f_code.co_name)
        self.analysis_results = None
        self.analyzer = None
        self.filetype = filetype or "apk"
        self.decompile_modules = decompile_modules or {"all"}

        try:
            self.APK_DECOMPILE_TIMEOUT = int(
                os.getenv("APK_DECOMPILE_TIMEOUT", "600")
            )
        except ValueError:
            self.log.warning(
                "Invalid APK_DECOMPILE_TIMEOUT value, using default of 600 seconds"
            )
            self.APK_DECOMPILE_TIMEOUT = 600

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.cleanup_run()

    def calculate_md5(self, input_str):
        """Calculate MD5 hash of a string."""
        return hashlib.md5(input_str.encode("utf-8")).hexdigest()

    def cleanup_run(self):
        """Clean up after analysis."""
        try:
            if self.analyzer:
                self.analyzer.cleanup()
                self.analyzer = None
            gc.collect()
        except Exception as e:
            self.log.error(f"Error in cleanup: {e}")

    def analyze_apk(self) -> Optional[Dict[str, Any]]:
        """Run APK code analysis and return results."""
        self.log.debug("Starting APK code analysis")
        try:
            self.analyzer = APKCodeAnalyzer(
                filepath=self.filepath,
                timeout=self.APK_DECOMPILE_TIMEOUT,
                log=self.log,
                decompile_modules=self.decompile_modules,
            )
            results = self.analyzer.extract()
            return results
        except Exception as e:
            self.log.error(f"Error in APK code analysis: {e}")
            import traceback
            self.log.error(f"Traceback: {traceback.format_exc()}")
            return None
        finally:
            self.cleanup_run()

    def extract(self):
        """Extract and process all analysis results.

        Uses daemon thread with timeout, same pattern as DecompileBinja.
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        extraction_completed = False
        extraction_result = False
        extraction_error = None

        def do_extraction():
            nonlocal extraction_completed, extraction_result, extraction_error
            try:
                results = self.analyze_apk()
                if not results:
                    extraction_result = False
                else:
                    self.analysis_results = results
                    self.analysis_results["sha256"] = self.sha256
                    self.analysis_results["sha1"] = self.sha1
                    self.analysis_results["md5"] = self.md5
                    extraction_result = True
            except Exception as e:
                extraction_error = e
                extraction_result = False
            finally:
                extraction_completed = True

        extraction_thread = threading.Thread(target=do_extraction)
        extraction_thread.daemon = True
        extraction_thread.start()

        start_time = time.time()
        while (
            not extraction_completed
            and (time.time() - start_time) < self.APK_DECOMPILE_TIMEOUT
        ):
            time.sleep(1)

        if not extraction_completed:
            self.log.error(
                f"APK extraction timed out after {self.APK_DECOMPILE_TIMEOUT} seconds"
            )
            self.cleanup_run()
            return None

        if extraction_error:
            self.log.error(f"Error in APK extraction: {extraction_error}")
            return None

        return self.analysis_results if extraction_result else None

    def prepare_export_data(self, exporter_type: str) -> Any:
        """Prepare data for database export."""
        self.log.debug(inspect.currentframe().f_code.co_name)
        if not self.analysis_results:
            return None

        if exporter_type == "ClickHouseExporter":
            now = datetime.now(timezone.utc)
            export = {"multi_table": True}

            # Table 1: Decompiled method content
            if self.analysis_results.get("decompiled_content"):
                export["decompiled_content"] = {
                    "table": "code_apk_decompiled_methods_content",
                    "data": [
                        [
                            f["decompiled_method_hash"],
                            f["decompiled_method"],
                            f.get("decompiled_method_type", "UNKNOWN"),
                            1 if f.get("decompiled_has_string_encryption") else 0,
                            1 if f.get("decompiled_has_reflection_calls") else 0,
                            1 if f.get("decompiled_excessive_goto_count") else 0,
                            now,
                        ]
                        for f in self.analysis_results["decompiled_content"]
                    ],
                    "column_names": [
                        "decompiled_method_hash",
                        "decompiled_method",
                        "decompiled_method_type",
                        "decompiled_has_string_encryption",
                        "decompiled_has_reflection_calls",
                        "decompiled_excessive_goto_count",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'UNKNOWN'=5)",
                        "UInt8",
                        "UInt8",
                        "UInt8",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Table 2: Decompiled method references
            if self.analysis_results.get("decompiled_refs"):
                export["decompiled_refs"] = {
                    "table": "code_apk_decompiled_methods_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            f["decompiled_method_hash"],
                            f.get("smali_method_hash"),
                            f.get("decompiled_class_name", ""),
                            f.get("decompiled_method_name", ""),
                            f.get("decompiled_method_signature", ""),
                            f.get("decompiled_method_prototype", ""),
                            f.get("functions_caller", []),
                            f.get("functions_call", []),
                            now,
                        ]
                        for f in self.analysis_results["decompiled_refs"]
                    ],
                    "column_names": [
                        "sha256",
                        "decompiled_method_hash",
                        "smali_method_hash",
                        "decompiled_class_name",
                        "decompiled_method_name",
                        "decompiled_method_signature",
                        "decompiled_method_prototype",
                        "functions_caller",
                        "functions_call",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(64)",
                        "Nullable(FixedString(64))",
                        "LowCardinality(String)",
                        "LowCardinality(String)",
                        "String",
                        "String",
                        "Array(String)",
                        "Array(String)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Table 3: Smali method content
            if self.analysis_results.get("smali_content"):
                export["smali_content"] = {
                    "table": "code_apk_smali_methods_content",
                    "data": [
                        [
                            f["smali_method_hash"],
                            f["smali_method"],
                            f.get("smali_method_type", "UNKNOWN"),
                            f.get("smali_instructions_count", 0),
                            f.get("smali_register_count", 0),
                            1 if f.get("smali_has_string_encryption") else 0,
                            1 if f.get("smali_has_reflection_calls") else 0,
                            1 if f.get("smali_excessive_goto_count") else 0,
                            f.get("smali_flattened_score", 0.0),
                            f.get("smali_mba_score", 0.0),
                            now,
                        ]
                        for f in self.analysis_results["smali_content"]
                    ],
                    "column_names": [
                        "smali_method_hash",
                        "smali_method",
                        "smali_method_type",
                        "smali_instructions_count",
                        "smali_register_count",
                        "smali_has_string_encryption",
                        "smali_has_reflection_calls",
                        "smali_excessive_goto_count",
                        "smali_flattened_score",
                        "smali_mba_score",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "Enum8('USER'=1, 'LIBRARY'=2, 'UNKNOWN'=5)",
                        "UInt32",
                        "UInt16",
                        "UInt8",
                        "UInt8",
                        "UInt8",
                        "Float64",
                        "Float64",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Table 4: Smali method references
            if self.analysis_results.get("smali_refs"):
                export["smali_refs"] = {
                    "table": "code_apk_smali_methods_references",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            f["smali_method_hash"],
                            f.get("decompiled_method_hash"),
                            f.get("smali_class_name", ""),
                            f.get("smali_method_name", ""),
                            f.get("smali_method_signature", ""),
                            now,
                        ]
                        for f in self.analysis_results["smali_refs"]
                    ],
                    "column_names": [
                        "sha256",
                        "smali_method_hash",
                        "decompiled_method_hash",
                        "smali_class_name",
                        "smali_method_name",
                        "smali_method_signature",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(64)",
                        "Nullable(FixedString(64))",
                        "LowCardinality(String)",
                        "LowCardinality(String)",
                        "String",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Table 5: Method similarity metrics (content-based fuzzy matching)
            if self.analysis_results.get("similarity_metrics"):
                export["method_similarity_metrics"] = {
                    "table": "code_apk_method_similarity_metrics",
                    "data": [
                        [
                            f["smali_method_hash"],
                            f.get("ssdeep_smali"),
                            f.get("tlsh_smali"),
                            f.get("ssdeep_smali_normalized"),
                            f.get("tlsh_smali_normalized"),
                            f.get("minhash", []),
                            now,
                        ]
                        for f in self.analysis_results["similarity_metrics"]
                    ],
                    "column_names": [
                        "smali_method_hash",
                        "ssdeep_smali",
                        "tlsh_smali",
                        "ssdeep_smali_normalized",
                        "tlsh_smali_normalized",
                        "minhash",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "Nullable(String)",
                        "Nullable(FixedString(72))",
                        "Nullable(String)",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Table 5b: CFG method features (structural/topological)
            if self.analysis_results.get("cfg"):
                export["cfg_methods"] = {
                    "table": "code_apk_cfg_methods",
                    "data": [
                        [
                            cfg["smali_method_hash"],
                            cfg["cfg_topology_hash"],
                            cfg["block_count"],
                            cfg["edge_count"],
                            cfg.get("cfg_instructions_count", 0),
                            cfg.get("call_count", 0),
                            cfg["cyclomatic_complexity"],
                            cfg.get("loop_count", 0),
                            cfg.get("max_depth", 0),
                            cfg.get("max_fan_out", 0),
                            cfg.get("md_index_topdown", 0),
                            cfg.get("md_index_bottomup", 0),
                            cfg.get("prime_product_smali", 0),
                            cfg.get("cfg_feature_tlsh"),
                            cfg.get("wl_minhash", []),
                            cfg.get("bb_features", []),
                            cfg.get("cfg_adjacency", []),
                            now,
                        ]
                        for cfg in self.analysis_results["cfg"]
                        if cfg is not None
                    ],
                    "column_names": [
                        "smali_method_hash",
                        "cfg_topology_hash",
                        "block_count",
                        "edge_count",
                        "cfg_instructions_count",
                        "call_count",
                        "cyclomatic_complexity",
                        "loop_count",
                        "max_depth",
                        "max_fan_out",
                        "md_index_topdown",
                        "md_index_bottomup",
                        "prime_product_smali",
                        "cfg_feature_tlsh",
                        "wl_minhash",
                        "bb_features",
                        "cfg_adjacency",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "FixedString(16)",
                        "UInt16",
                        "UInt16",
                        "UInt32",
                        "UInt16",
                        "UInt16",
                        "UInt16",
                        "UInt16",
                        "UInt16",
                        "UInt64",
                        "UInt64",
                        "UInt64",
                        "Nullable(FixedString(72))",
                        "Array(UInt8)",
                        "Array(Array(UInt16))",
                        "Array(UInt32)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            # Table 6: Strings — reuse code_binja_strings_raw for cross-format correlation
            # DEX strings are MUTF-8; string_raw = string since no encoding difference
            if self.analysis_results.get("strings"):
                export["strings_raw"] = {
                    "table": "code_binja_strings_raw",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            s["string"],
                            s["string"],  # string_raw = string (MUTF-8 decoded to UTF-8)
                            s.get("string_encoding", "UTF8"),
                            s.get("string_offset", 0),
                            s.get("string_length", len(s["string"])),
                            s.get("string_length", len(s["string"])),  # string_raw_length = string_length
                            s.get("string_entropy", 0.0),
                        ]
                        for s in self.analysis_results["strings"]
                    ],
                    "column_names": [
                        "sha256",
                        "string",
                        "string_raw",
                        "string_encoding",
                        "string_offset",
                        "string_length",
                        "string_raw_length",
                        "string_entropy",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "String",
                        "String",
                        "LowCardinality(String)",
                        "UInt64",
                        "UInt32",
                        "UInt32",
                        "Float32",
                    ],
                }

            # Table 7: Analysis errors
            if self.analysis_results.get("analysis_errors"):
                export["analysis_errors"] = {
                    "table": "code_apk_analysis_errors",
                    "data": [
                        [
                            self.analysis_results["sha256"],
                            f.get("class_name"),
                            f.get("method_name"),
                            f.get("error_location", "unknown"),
                            f.get("error_message", ""),
                            f.get("error_type", "unknown"),
                            self.calculate_md5(
                                f"{f.get('error_message', '')}"
                                f"{f.get('class_name', '')}"
                                f"{f.get('method_name', '')}"
                                f"{f.get('error_location', 'unknown')}"
                            ),
                            "new",
                            now,
                        ]
                        for f in self.analysis_results["analysis_errors"]
                    ],
                    "column_names": [
                        "sha256",
                        "class_name",
                        "method_name",
                        "error_location",
                        "error_message",
                        "error_type",
                        "error_hash",
                        "status",
                        "analysis_date",
                    ],
                    "column_type_names": [
                        "FixedString(64)",
                        "Nullable(String)",
                        "Nullable(String)",
                        "LowCardinality(String)",
                        "Nullable(String)",
                        "Nullable(String)",
                        "FixedString(32)",
                        "Enum8('new'=1, 'investigating'=2, 'fixed'=3, 'wontfix'=4)",
                        "DateTime64(3, 'UTC')",
                    ],
                }

            return export

        return None

    def tag(self) -> str:
        """Return the tag for this extractor."""
        return Tag.APK_DECOMPILED.value

    def get_clickhouse_table(self) -> str:
        """Not used directly as we're handling multiple tables."""
        pass