J. Nathan Kutz

251 papers A* 1B 1Misc 2Journal 235Unranked 11
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Lydia France, Karl Lapo, J. Nathan Kutz
2026 J jnl
CoRR
Yuxuan Bao, Jan Zajac, Megan Powers, Venkat Raman, J. Nathan Kutz
2026 J jnl
CoRR
Yanxin Si, Bayu Jayawardhana, J. Nathan Kutz, Yunpeng Zhu, Liangliang Cheng
2026 J jnl
CoRR
Jan P. Williams, Dima Tretiak, Steven L. Brunton, J. Nathan Kutz, Krithika Manohar
2026 J jnl
J. Open Source Softw.
Niharika Karnik, Yash Bhangale, Mohammad G. Abdo, Andrei A. Klishin, Joshua J. Cogliati, Bingni W. Brunton, J. Nathan Kutz, Steven L. Brunton, Krithika Manohar
2026 J jnl
CoRR
Xingyue Zhang, Yuxuan Bao, Mars Liyao Gao, J. Nathan Kutz
2026 J jnl
CoRR
M. Lo Verso, Carolina Introini, E. Cervi, L. Savoldi, J. Nathan Kutz, Antonio Cammi
2026 J jnl
CoRR
Shuangshan Nors Li, J. Nathan Kutz
2026 J jnl
Neural Networks
Paolo Conti, Jonas Kneifl, Andrea Manzoni, Attilio Frangi, Jörg Fehr, Steven L. Brunton, J. Nathan Kutz
2025 J jnl
CoRR
Pavel Komarov, Floris van Breugel, J. Nathan Kutz
2025 J jnl
J. Mach. Learn. Res.
Samuel E. Otto, Nicholas Zolman, J. Nathan Kutz, Steven L. Brunton
2025 J jnl
CoRR
Alexander W. Hsu, Ike Griss Salas, Jacob Stevens-Haas, J. Nathan Kutz, Aleksandr Y. Aravkin, Bamdad Hosseini
2025 J jnl
CoRR
J. Nathan Kutz, Peter W. Battaglia, Michael P. Brenner, Kevin Carlberg, Aric A. Hagberg, Shirley Ho, Stephan Hoyer, Henning Lange, Hod Lipson, Michael W. Mahoney, Frank Noé, Max Welling, Laure Zanna, Francis Zhu, Steven L. Brunton
2025 J jnl
Nat.
Ryan V. Raut, Zachary P. Rosenthal, Xiaodan Wang, Hanyang Miao, Zhanqi Zhang, Jin-Moo Lee, Marcus E. Raichle, Adam Q. Bauer, Steven L. Brunton, Bingni W. Brunton, J. Nathan Kutz
2025 J jnl
CoRR
Ziyu Lu, Anna J. Li, Alexander E. Ladd, Pascha Matveev, Aditya Deole, Eric Shea-Brown, J. Nathan Kutz, Nicholas A. Steinmetz
2025 J jnl
CoRR
Romulo B. da Silva, Diego Passos, Cassio M. Oishi, J. Nathan Kutz
2025 J jnl
CoRR
Ike Griss Salas, Megan R. Ebers, Jake Stevens-Haas, J. Nathan Kutz
2025 J jnl
CoRR
Philippe Martin Wyder, Judah Goldfeder, Alexey Yermakov, Yue Zhao, Stefano Riva, Jan P. Williams, David Zoro, Amy Sara Rude, Matteo Tomasetto, Joe Germany, Joseph Bakarji, Georg Maierhofer, Miles D. Cranmer, J. Nathan Kutz
2025 J jnl
CoRR
Stefano Riva, Carolina Introini, J. Nathan Kutz, Antonio Cammi
2025 J jnl
CoRR
Yuxuan Bao, J. Nathan Kutz
2025 J jnl
CoRR
Semyon Lomaso, Judah Goldfeder, Mehmet Hamza Erol, Matthew So, Yao Yan, Addison Howard, J. Nathan Kutz, Ravid Shwartz-Ziv
2025 J jnl
CoRR
Carolina Introini, Stefano Riva, J. Nathan Kutz, Antonio Cammi
2025 J jnl
CoRR
Yuxuan Bao, J. Nathan Kutz
2025 J jnl
CoRR
Yunpeng Zhu, Liangliang Cheng, Anping Jing, Hanyu Huo, Ziqiang Lang, Bo Zhang, J. Nathan Kutz
2025 J jnl
Annu. Rev. Control. Robotics Auton. Syst.
Steven L. Brunton, Nicholas Zolman, J. Nathan Kutz, Urban Fasel
2025 J jnl
CoRR
Mars Liyao Gao, J. Nathan Kutz, Bernat Font
2025 conf
L4DC
Dima Tretiak, Anastasia S. Bizyaeva, J. Nathan Kutz, Steven L. Brunton
2025 J jnl
CoRR
David Ye, Jan P. Williams, Mars Liyao Gao, Stefano Riva, Matteo Tomasetto, David Zoro, J. Nathan Kutz
2025 J jnl
CoRR
Niharika Karnik, Yash Bhangale, Mohammad G. Abdo, Andrei A. Klishin, Joshua J. Cogliati, Bingni W. Brunton, J. Nathan Kutz, Steven L. Brunton, Krithika Manohar
2025 J jnl
CoRR
Matteo Tomasetto, Jan P. Williams, Francesco Braghin, Andrea Manzoni, J. Nathan Kutz
2025 J jnl
Mach. Learn. Sci. Technol.
Farbod Faraji, Maryam Reza, J. Nathan Kutz
2025 J jnl
CoRR
Mars Liyao Gao, Jan P. Williams, J. Nathan Kutz
2025 J jnl
CoRR
Sara M. Ichinaga, Steven L. Brunton, Aleksandr Y. Aravkin, J. Nathan Kutz
2025 J jnl
CoRR
Alexey Yermakov, David Zoro, Mars Liyao Gao, J. Nathan Kutz
2025 J jnl
CoRR
Andrew Ferguson, Marisa Lafleur, Lars Ruthotto, Jesse Thaler, Yuan-Sen Ting, Pratyush Tiwary, Soledad Villar, E. Paulo Alves, Jeremy Avigad, Simon Billinge, Camille L. Bilodeau, Keith Brown, Emmanuel J. Candès, Arghya Chattopadhyay, Bingqing Cheng, Jonathan Clausen, Connor W. Coley, Andrew J. Connolly, Fred Daum, Sijia S. Dong, Chrisy Xiyu Du, Cora Dvorkin, Cristiano Fanelli, Eric B. Ford, Luis Manuel Frutos, Nicolás García Trillos, Cecilia Garraffo, Robert Ghrist, Rafael Gómez-Bombarelli, Gianluca Guadagni, Sreelekha Guggilam, Sergei Gukov, Juan B. Gutierrez, Salman Habib, Johannes Hachmann, Boris Hanin, Philip C. Harris, Murray Holland, Elizabeth Holm, Hsin-Yuan Huang, Shih-Chieh Hsu, Nick Jackson, Olexandr Isayev, Heng Ji, Aggelos K. Katsaggelos, Jeremy Kepner, Yannis G. Kevrekidis, Michelle P. Kuchera, J. Nathan Kutz, Branislava Lalic, Ann Lee, Matt LeBlanc, Josiah Lim, Rebecca Lindsey, Yongmin Liu, Peter Y. Lu, Sudhir Malik, Vuk Mandic, Vidya B. Manian, Emeka P. Mazi, Pankaj Mehta, Peter Melchior, Brice Ménard, Jennifer Ngadiuba, Stella Offner, Elsa Olivetti, Shyue Ping Ong, Christopher Rackauckas, Philippe Rigollet, Chad Risko, Philip Romero, Grant M. Rotskoff, Brett Savoie, Uros Seljak, David Shih, Gary Shiu, Dima Shlyakhtenko, Eva Silverstein, Taylor Sparks, Thomas Strohmer, Christopher Stubbs, Stephen Thomas, Suriyanarayanan Vaikuntanathan, René Vidal, Francisco Villaescusa-Navarro, Gregory Voth, Benjamin Wandelt, Rachel Ward, Melanie Weber, Risa Wechsler, Stephen Whitelam, Olaf Wiest, Mike Williams, Zhuoran Yang, Yaroslava G. Yingling, Bin Yu, Shuwen Yue, Ann Zabludoff, Huimin Zhao, Tong Zhang
2025 J jnl
CoRR
Alexey Yermakov, Yue Zhao, Marine Denolle, Yiyu Ni, Philippe Martin Wyder, Judah Goldfeder, Stefano Riva, Jan P. Williams, David Zoro, Amy Sara Rude, Matteo Tomasetto, Joe Germany, Joseph Bakarji, Georg Maierhofer, Miles D. Cranmer, J. Nathan Kutz
2025 J jnl
CoRR
Stefano Riva, Carolina Introini, J. Nathan Kutz, Antonio Cammi
2024 J jnl
CoRR
Oliver Bensch, Leonie Bensch, Tommy Nilsson, Florian Saling, Bernd Bewer, Sophie F. Jentzsch, Tobias Hecking, J. Nathan Kutz
2024 J jnl
AI Mag.
J. Nathan Kutz, Steven L. Brunton, Krithika Manohar, Hod Lipson, Na Li
2024 J jnl
CoRR
Sebastian Musslick, Laura Bartlett, Suyog H. Chandramouli, Marina Dubova, Fernand Gobet, Thomas L. Griffiths, Jessica Hullman, Ross D. King, J. Nathan Kutz, Christopher G. Lucas, Suhas Mahesh, Franco Pestilli, Sabina J. Sloman, William R. Holmes
2024 J jnl
CoRR
Farbod Faraji, Maryam Reza, Aaron Knoll, J. Nathan Kutz
2024 J jnl
CoRR
Farbod Faraji, Maryam Reza, Aaron Knoll, J. Nathan Kutz
2024 J jnl
CoRR
Doris Voina, Steven L. Brunton, J. Nathan Kutz
2024 J jnl
SIAM J. Appl. Dyn. Syst.
Megan R. Ebers, Katherine M. Steele, J. Nathan Kutz
2024 J jnl
IEEE Access
Olga Dorabiala, Aleksandr Y. Aravkin, J. Nathan Kutz
2024 J jnl
IEEE Access
Jacob Stevens-Haas, Yash Bhangale, J. Nathan Kutz, Aleksandr Y. Aravkin
2024 J jnl
IEEE Access
Megan R. Ebers, Jan P. Williams, Katherine M. Steele, J. Nathan Kutz
2024 J jnl
Sensors
Jiazhong Mei, Steven L. Brunton, J. Nathan Kutz
2024 J jnl
CoRR
Olivia T. Zahn, Thomas L. Daniel, J. Nathan Kutz
2024 J jnl
CoRR
Jonas Kneifl, Jörg Fehr, Steven L. Brunton, J. Nathan Kutz
2024 J jnl
CoRR
Meghana Velegar, Christoph Keller, J. Nathan Kutz
2024 J jnl
Nat. Comput. Sci.
Steven L. Brunton, J. Nathan Kutz
2024 J jnl
J. Mach. Learn. Res.
Sara M. Ichinaga, Francesco Andreuzzi, Nicola Demo, Marco Tezzele, Karl Lapo, Gianluigi Rozza, Steven L. Brunton, J. Nathan Kutz
2024 J jnl
CoRR
Sara M. Ichinaga, Francesco Andreuzzi, Nicola Demo, Marco Tezzele, Karl Lapo, Gianluigi Rozza, Steven L. Brunton, J. Nathan Kutz
2024 J jnl
J. Open Source Softw.
Shaowu Pan, Eurika Kaiser, Brian M. de Silva, J. Nathan Kutz, Steven L. Brunton
2024 J jnl
CoRR
Jan P. Williams, J. Nathan Kutz, Krithika Manohar
2024 J jnl
CoRR
Stefano Riva, Carolina Introini, Antonio Cammi, J. Nathan Kutz
2024 J jnl
CoRR
Nicholas Zolman, Urban Fasel, J. Nathan Kutz, Steven L. Brunton
2024 J jnl
CoRR
J. Nathan Kutz, Maryam Reza, Farbod Faraji, Aaron Knoll
2024 Misc conf
ICASSP
Aleksei Sholokhov, Joshua Rapp, Saleh Nabi, Steven L. Brunton, J. Nathan Kutz, Hassan Mansour
2024 J jnl
IEEE Trans. Computational Imaging
Aleksei Sholokhov, Saleh Nabi, Joshua Rapp, Steven L. Brunton, J. Nathan Kutz, Petros T. Boufounos, Hassan Mansour
2024 J jnl
SIAM J. Appl. Dyn. Syst.
Megan Morrison, J. Nathan Kutz
2024 J jnl
CoRR
Andrei A. Klishin, Joseph Bakarji, J. Nathan Kutz, Krithika Manohar
2024 J jnl
CoRR
Oliver Bensch, Leonie Bensch, Tommy Nilsson, Florian Saling, Wafa Sadri, Carsten Hartmann, Tobias Hecking, J. Nathan Kutz
2024 J jnl
CoRR
Paolo Conti, Jonas Kneifl, Andrea Manzoni, Attilio Frangi, Jörg Fehr, Steven L. Brunton, J. Nathan Kutz
2023 J jnl
CoRR
Samuel E. Otto, Nicholas Zolman, J. Nathan Kutz, Steven L. Brunton
2023 J jnl
CoRR
Ziyu Lu, Anika Tabassum, Shruti R. Kulkarni, Lu Mi, J. Nathan Kutz, Eric Shea-Brown, Seung-Hwan Lim
2023 J jnl
CoRR
L. Mars Gao, Urban Fasel, Steven L. Brunton, J. Nathan Kutz
2023 J jnl
SIAM J. Appl. Dyn. Syst.
Katherine Owens, J. Nathan Kutz
2023 J jnl
CoRR
Andrei A. Klishin, J. Nathan Kutz, Krithika Manohar
2023 J jnl
CoRR
Erdi Kara, George Zhang, Joseph J. Williams, Gonzalo Ferrandez-Quinto, Leviticus J. Rhoden, Maximilian Kim, J. Nathan Kutz, Aminur Rahman
2023 J jnl
J. Real Time Image Process.
Erdi Kara, George Zhang, Joseph J. Williams, Gonzalo Ferrandez-Quinto, Leviticus J. Rhoden, Maximilian Kim, J. Nathan Kutz, Aminur Rahman
2023 J jnl
CoRR
Farbod Faraji, Maryam Reza, Aaron Knoll, J. Nathan Kutz
2023 J jnl
CoRR
Farbod Faraji, Maryam Reza, Aaron Knoll, J. Nathan Kutz
2023 Misc conf
QCE
Erfan Abbasgholinejad, Haoqin Deng, John King Gamble, J. Nathan Kutz, Erik Nielsen, Neal C. Pisenti, Ningzhi Xie
2023 J jnl
CoRR
Mozes Jacobs, Bingni W. Brunton, Steven L. Brunton, J. Nathan Kutz, Ryan V. Raut
2023 J jnl
Mach. Learn. Sci. Technol.
Alex Mallen, Christoph A. Keller, J. Nathan Kutz
2023 J jnl
CoRR
Megan R. Ebers, Jan P. Williams, Katherine M. Steele, J. Nathan Kutz
2023 J jnl
CoRR
Steven L. Brunton, J. Nathan Kutz
2023 J jnl
CoRR
Paolo Conti, Mengwu Guo, Andrea Manzoni, Attilio Frangi, Steven L. Brunton, J. Nathan Kutz
2023 J jnl
J. Comput. Phys.
Yuying Liu, Colin Ponce, Steven L. Brunton, J. Nathan Kutz
2023 J jnl
J. Mach. Learn. Res.
Shaowu Pan, Steven L. Brunton, J. Nathan Kutz
2023 J jnl
IEEE Access
John Ferré, Ariel Rokem, Elizabeth A. Buffalo, J. Nathan Kutz, Adrienne Fairhall
2023 J jnl
CoRR
Cassio M. Oishi, Alan A. Kaptanoglu, J. Nathan Kutz, Steven L. Brunton
2023 conf
CDC
Jiazhong Mei, J. Nathan Kutz, Steven L. Brunton
2023 J jnl
CoRR
Shaowu Pan, Eurika Kaiser, Brian M. de Silva, J. Nathan Kutz, Steven L. Brunton
2023 A* conf
ICRA
Andrea Tagliabue, Yi-Hsuan Hsiao, Urban Fasel, J. Nathan Kutz, Steven L. Brunton, YuFeng Chen, Jonathan P. How
2023 J jnl
SIAM J. Appl. Dyn. Syst.
Bian Li, Yi-An Ma, J. Nathan Kutz, Xiu Yang
2023 J jnl
Netw. Sci.
Megan Morrison, J. Nathan Kutz, Michael Gabbay
2023 J jnl
SIAM J. Appl. Dyn. Syst.
Aminur Rahman, J. Nathan Kutz
2022 J jnl
IEEE Access
Charles B. Delahunt, J. Nathan Kutz
2022 J jnl
Mach. Learn. Sci. Technol.
Kadierdan Kaheman, Steven L. Brunton, J. Nathan Kutz
2022 J jnl
CoRR
L. Mars Gao, J. Nathan Kutz
2022 J jnl
Mach. Learn. Sci. Technol.
Moritz Hoffmann, Martin Scherer, Tim Hempel, Andreas Mardt, Brian de Silva, Brooke E. Husic, Stefan Klus, Hao Wu, J. Nathan Kutz, Steven L. Brunton, Frank Noé
2022 J jnl
CoRR
Joseph Bakarji, Jared Callaham, Steven L. Brunton, J. Nathan Kutz
2022 J jnl
Nat. Comput. Sci.
Joseph Bakarji, Jared Callaham, Steven L. Brunton, J. Nathan Kutz
2022 J jnl
CoRR
Joseph Bakarji, Kathleen P. Champion, J. Nathan Kutz, Steven L. Brunton
2022 J jnl
Frontiers Artif. Intell.
Nina de Lacy, Michael J. Ramshaw, J. Nathan Kutz
2022 J jnl
CoRR
Alex Mallen, Christoph A. Keller, J. Nathan Kutz
2022 J jnl
CoRR
Marta D'Elia, Hang Deng, Cedric G. Fraces, Krishna C. Garikipati, Lori Graham-Brady, Amanda A. Howard, George Em Karniadakis, Vahid Keshavarzzadeh, Robert M. Kirby, J. Nathan Kutz, Chunhui Li, Xing Liu, Hannah Lu, Pania Newell, Daniel O'Malley, Masa Prodanovic, Gowri Srinivasan, Alexandre M. Tartakovsky, Daniel M. Tartakovsky, Hamdi A. Tchelepi, Bozo Vazic, Hari S. Viswanathan, Hongkyu Yoon, Piotr Zarzycki
2022 J jnl
Quantum
Andy Goldschmidt, Jonathan L. Dubois, Steven L. Brunton, J. Nathan Kutz
2022 J jnl
SIAM Rev.
Steven L. Brunton, Marko Budisic, Eurika Kaiser, J. Nathan Kutz
2022 J jnl
CoRR
Shaowu Pan, Steven L. Brunton, J. Nathan Kutz
2022 J jnl
IEEE Trans. Autom. Control.
Krithika Manohar, J. Nathan Kutz, Steven L. Brunton
2022 J jnl
PLoS Comput. Biol.
Olivia Zahn, Jorge Bustamante, Callin Switzer, Thomas L. Daniel, J. Nathan Kutz
2022 J jnl
J. Open Source Softw.
Floris van Breugel, Yuying Liu, Bingni W. Brunton, J. Nathan Kutz
2022 J jnl
J. Open Source Softw.
Alan A. Kaptanoglu, Brian de Silva, Urban Fasel, Kadierdan Kaheman, Andy Goldschmidt, Jared Callaham, Charles B. Delahunt, Zachary Nicolaou, Kathleen P. Champion, Jean-Christophe Loiseau, J. Nathan Kutz, Steven L. Brunton
2022 J jnl
SIAM J. Appl. Dyn. Syst.
Travis Askham, Peng Zheng, Aleksandr Y. Aravkin, J. Nathan Kutz
2022 J jnl
Pattern Recognit. Lett.
Olga Dorabiala, J. Nathan Kutz, Aleksandr Y. Aravkin
2022 J jnl
CoRR
Andrea Tagliabue, Yi-Hsuan Hsiao, Urban Fasel, J. Nathan Kutz, Steven L. Brunton, YuFeng Chen, Jonathan P. How
2022 J jnl
CoRR
Olga Dorabiala, Jennifer Webster, J. Nathan Kutz, Aleksandr Y. Aravkin
2022 J jnl
IEEE Access
Daniel Dylewsky, David Barajas-Solano, Tong Ma, Alexandre M. Tartakovsky, J. Nathan Kutz
2022 J jnl
CoRR
Kadierdan Kaheman, Urban Fasel, Jason J. Bramburger, Benjamin Strom, J. Nathan Kutz, Steven L. Brunton
2022 J jnl
CoRR
Megan Morrison, J. Nathan Kutz, Michael Gabbay
2021 J jnl
CoRR
Charles B. Delahunt, J. Nathan Kutz
2021 J jnl
CoRR
Diya Sashidhar, J. Nathan Kutz
2021 J jnl
IEEE Access
Jason J. Bramburger, J. Nathan Kutz, Steven L. Brunton
2021 J jnl
Mach. Learn. Sci. Technol.
Eurika Kaiser, J. Nathan Kutz, Steven L. Brunton
2021 J jnl
CoRR
Jason J. Bramburger, Steven L. Brunton, J. Nathan Kutz
2021 J jnl
CoRR
Alex Mallen, Henning Lange, J. Nathan Kutz
2021 J jnl
CoRR
Craig R. Gin, Daniel E. Shea, Steven L. Brunton, J. Nathan Kutz
2021 J jnl
CoRR
Moritz Hoffmann, Martin Scherer, Tim Hempel, Andreas Mardt, Brian de Silva, Brooke E. Husic, Stefan Klus, Hao Wu, J. Nathan Kutz, Steven L. Brunton, Frank Noé
2021 J jnl
CoRR
Urban Fasel, J. Nathan Kutz, Bingni W. Brunton, Steven L. Brunton
2021 J jnl
IEEE Access
Daniel E. Shea, Rajiv Giridharagopal, David S. Ginger, Steven L. Brunton, J. Nathan Kutz
2021 J jnl
CoRR
Daniel E. Shea, Rajiv Giridharagopal, David S. Ginger, Steven L. Brunton, J. Nathan Kutz
2021 J jnl
CoRR
Henning Lange, J. Nathan Kutz
2021 J jnl
J. Mach. Learn. Res.
Henning Lange, Steven L. Brunton, J. Nathan Kutz
2021 J jnl
CoRR
Manu Kalia, Steven L. Brunton, Hil G. E. Meijer, Christoph Brune, J. Nathan Kutz
2021 J jnl
CoRR
Steven L. Brunton, Marko Budisic, Eurika Kaiser, J. Nathan Kutz
2021 J jnl
IEEE Trans. Netw. Sci. Eng.
Megan Morrison, J. Nathan Kutz
2021 J jnl
CoRR
Peter J. Baddoo, Benjamin Herrmann, Beverley J. McKeon, J. Nathan Kutz, Steven L. Brunton
2021 J jnl
CoRR
Alan A. Kaptanoglu, Brian M. de Silva, Urban Fasel, Kadierdan Kaheman, Jared L. Callaham, Charles B. Delahunt, Kathleen P. Champion, Jean-Christophe Loiseau, J. Nathan Kutz, Steven L. Brunton
2021 J jnl
CoRR
Brian M. de Silva, Krithika Manohar, Emily Clark, Bingni W. Brunton, Steven L. Brunton, J. Nathan Kutz
2021 J jnl
J. Open Source Softw.
Brian M. de Silva, Krithika Manohar, Emily Clark, Bingni W. Brunton, J. Nathan Kutz, Steven L. Brunton
2021 J jnl
CoRR
Olga Dorabiala, J. Nathan Kutz, Aleksandr Y. Aravkin
2021 conf
CDC
Urban Fasel, Eurika Kaiser, J. Nathan Kutz, Bingni W. Brunton, Steven L. Brunton
2020 J jnl
IEEE Access
Kathleen P. Champion, Peng Zheng, Aleksandr Y. Aravkin, Steven L. Brunton, J. Nathan Kutz
2020 J jnl
CoRR
Kadierdan Kaheman, Steven L. Brunton, J. Nathan Kutz
2020 J jnl
CoRR
Emily Clark, Angelie Vincent, J. Nathan Kutz, Steven L. Brunton
2020 J jnl
SIAM J. Appl. Dyn. Syst.
Seth M. Hirsh, Kameron Decker Harris, J. Nathan Kutz, Bingni W. Brunton
2020 J jnl
CoRR
Steven L. Brunton, J. Nathan Kutz, Krithika Manohar, Aleksandr Y. Aravkin, Kristi Morgansen, Jennifer Klemisch, Nicholas Goebel, James Buttrick, Jeffrey Poskin, Agnes Blom-Schieber, Thomas A. Hogan, Darren McDonald
2020 J jnl
Mach. Learn. Sci. Technol.
Chang Sun, Eurika Kaiser, Steven L. Brunton, J. Nathan Kutz
2020 J jnl
Frontiers Artif. Intell.
Brian de Silva, David M. Higdon, Steven L. Brunton, J. Nathan Kutz
2020 J jnl
CoRR
Daniel Dylewsky, David Barajas-Solano, Tong Ma, Alexandre M. Tartakovsky, J. Nathan Kutz
2020 J jnl
CoRR
Henning Lange, Steven L. Brunton, J. Nathan Kutz
2020 J jnl
CoRR
Yuying Liu, J. Nathan Kutz, Steven L. Brunton
2020 J jnl
CoRR
Yuying Liu, Colin Ponce, Steven L. Brunton, J. Nathan Kutz
2020 J jnl
Frontiers Comput. Neurosci.
Megan Morrison, Charles Fieseler, J. Nathan Kutz
2020 J jnl
IEEE Access
Floris van Breugel, J. Nathan Kutz, Bingni W. Brunton
2020 J jnl
CoRR
Brian M. de Silva, Jared Callaham, Jonathan Jonker, Nicholas Goebel, Jennifer Klemisch, Darren McDonald, Nathan Hicks, J. Nathan Kutz, Steven L. Brunton, Aleksandr Y. Aravkin
2020 J jnl
CoRR
Daniel Dylewsky, Eurika Kaiser, Steven L. Brunton, J. Nathan Kutz
2020 J jnl
J. Open Source Softw.
Brian de Silva, Kathleen P. Champion, Markus Quade, Jean-Christophe Loiseau, J. Nathan Kutz, Steven L. Brunton
2020 J jnl
Mach. Learn. Sci. Technol.
N. Benjamin Erichson, Krithika Manohar, Steven L. Brunton, J. Nathan Kutz
2020 J jnl
CoRR
Daniel E. Shea, Steven L. Brunton, J. Nathan Kutz
2020 J jnl
CoRR
Kadierdan Kaheman, J. Nathan Kutz, Steven L. Brunton
2020 J jnl
CoRR
Jason J. Bramburger, Daniel Dylewsky, J. Nathan Kutz
2020 J jnl
SIAM J. Appl. Math.
N. Benjamin Erichson, Peng Zheng, Krithika Manohar, Steven L. Brunton, J. Nathan Kutz, Aleksandr Y. Aravkin
2020 J jnl
SIAM J. Appl. Dyn. Syst.
Mason Kamb, Eurika Kaiser, Steven L. Brunton, J. Nathan Kutz
2019 J jnl
IEEE Access
Peng Zheng, Travis Askham, Steven L. Brunton, J. Nathan Kutz, Aleksandr Y. Aravkin
2019 J jnl
CoRR
Kathleen P. Champion, Peng Zheng, Aleksandr Y. Aravkin, Steven L. Brunton, J. Nathan Kutz
2019 J jnl
Complex.
Francisco Javier Montáns, Francisco Chinesta, Rafael Gómez-Bombarelli, J. Nathan Kutz
2019 J jnl
J. Real Time Image Process.
N. Benjamin Erichson, Steven L. Brunton, J. Nathan Kutz
2019 J jnl
SIAM J. Appl. Dyn. Syst.
Samuel H. Rudy, Alessandro Alla, Steven L. Brunton, J. Nathan Kutz
2019 J jnl
CoRR
Daniel Dylewsky, Molei Tao, J. Nathan Kutz
2019 J jnl
CoRR
Craig Gin, Bethany Lusch, Steven L. Brunton, J. Nathan Kutz
2019 J jnl
CoRR
Katharina Bieker, Sebastian Peitz, Steven L. Brunton, J. Nathan Kutz, Michael Dellnitz
2019 J jnl
J. Comput. Phys.
Samuel H. Rudy, J. Nathan Kutz, Steven L. Brunton
2019 J jnl
SIAM J. Appl. Dyn. Syst.
Kathleen P. Champion, Steven L. Brunton, J. Nathan Kutz
2019 J jnl
CoRR
Brian de Silva, David M. Higdon, Steven L. Brunton, J. Nathan Kutz
2019 J jnl
Appl. Netw. Sci.
Daniel Dylewsky, Xiu Yang, Alexandre M. Tartakovsky, J. Nathan Kutz
2019 J jnl
Frontiers Comput. Neurosci.
James M. Kunert-Graf, Kristian M. Eschenburg, David J. Galas, J. Nathan Kutz, Swati D. Rane, Bingni W. Brunton
2019 J jnl
CoRR
Kadierdan Kaheman, Eurika Kaiser, Benjamin Strom, J. Nathan Kutz, Steven L. Brunton
2019 J jnl
CoRR
Charles B. Delahunt, Courosh Mehanian, J. Nathan Kutz
2019 J jnl
Multiscale Model. Simul.
Krithika Manohar, Eurika Kaiser, Steven L. Brunton, J. Nathan Kutz
2019 J jnl
Neural Networks
Charles B. Delahunt, J. Nathan Kutz
2019 J jnl
SIAM J. Appl. Dyn. Syst.
N. Benjamin Erichson, Lionel Mathelin, J. Nathan Kutz, Steven L. Brunton
2019 J jnl
Adv. Comput. Math.
Alessandro Alla, J. Nathan Kutz
2019 J jnl
NeuroImage
Nina de Lacy, Elizabeth McCauley, J. Nathan Kutz, Vince D. Calhoun
2019 J jnl
CoRR
N. Benjamin Erichson, Lionel Mathelin, Zhewei Yao, Steven L. Brunton, Michael W. Mahoney, J. Nathan Kutz
2019 B conf
DSAA
Bethany Lusch, Eric C. Chi, J. Nathan Kutz
2019 J jnl
J. Comput. Neurosci.
Pedro D. Maia, Ashish Raj, J. Nathan Kutz
2019 J jnl
J. Comput. Phys.
Samuel H. Rudy, Steven L. Brunton, J. Nathan Kutz
2018 conf
ICLR (Workshop)
Charles B. Delahunt, J. Nathan Kutz
2018 J jnl
Complex.
J. Nathan Kutz, Joshua L. Proctor, Steven L. Brunton
2018 J jnl
Frontiers Comput. Neurosci.
Charles B. Delahunt, Jeffrey A. Riffell, J. Nathan Kutz
2018 J jnl
CoRR
Charles B. Delahunt, Jeffrey A. Riffell, J. Nathan Kutz
2018 J jnl
CoRR
N. Benjamin Erichson, Lionel Mathelin, Steven L. Brunton, J. Nathan Kutz
2018 conf
CDC
Eurika Kaiser, J. Nathan Kutz, Steven L. Brunton
2018 J jnl
CoRR
Eurika Kaiser, J. Nathan Kutz, Steven L. Brunton
2018 J jnl
SIAM J. Appl. Dyn. Syst.
Joshua L. Proctor, Steven L. Brunton, J. Nathan Kutz
2018 J jnl
CoRR
Charles B. Delahunt, J. Nathan Kutz
2018 J jnl
SIAM J. Sci. Comput.
Syuzanna Sargsyan, Steven L. Brunton, J. Nathan Kutz
2018 J jnl
CoRR
Krithika Manohar, J. Nathan Kutz, Steven L. Brunton
2018 J jnl
CoRR
Charles B. Delahunt, J. Nathan Kutz
2018 J jnl
Pattern Recognit. Lett.
N. Benjamin Erichson, Ariana Mendible, Sophie Wihlborn, J. Nathan Kutz
2018 J jnl
CoRR
N. Benjamin Erichson, Peng Zeng, Krithika Manohar, Steven L. Brunton, J. Nathan Kutz, Aleksandr Y. Aravkin
2018 J jnl
CoRR
Peng Zheng, Travis Askham, Steven L. Brunton, J. Nathan Kutz, Aleksandr Y. Aravkin
2018 J jnl
J. Comput. Phys.
Eurika Kaiser, Marek Morzynski, Guillaume Daviller, J. Nathan Kutz, Bingni W. Brunton, Steven L. Brunton
2018 J jnl
J. Comput. Civ. Eng.
Rouzbeh Davoudi, Gregory R. Miller, J. Nathan Kutz
2018 J jnl
SIAM J. Appl. Dyn. Syst.
Travis Askham, J. Nathan Kutz
2017 conf
ICCV Workshops
N. Benjamin Erichson, Steven L. Brunton, J. Nathan Kutz
2017 J jnl
CoRR
Krithika Manohar, Bingni W. Brunton, J. Nathan Kutz, Steven L. Brunton
2017 conf
CAMSAP
J. Nathan Kutz, Samuel H. Rudy, Alessandro Alla, Steven L. Brunton
2017 J jnl
CoRR
Thomas Baumeister, Steven L. Brunton, J. Nathan Kutz
2017 J jnl
CoRR
Bethany Lusch, J. Nathan Kutz, Steven L. Brunton
2017 conf
ICCV Workshops
Seth D. Pendergrass, Steven L. Brunton, J. Nathan Kutz, N. Benjamin Erichson, Travis Askham
2017 J jnl
CoRR
Zhe Bai, Eurika Kaiser, Joshua L. Proctor, J. Nathan Kutz, Steven L. Brunton
2017 J jnl
PLoS Comput. Biol.
James M. Kunert, Pedro D. Maia, J. Nathan Kutz
2017 conf
IEEE BigData
Christoph A. Keller, Mathew J. Evans, J. Nathan Kutz, Steven Pawson
2017 J jnl
Frontiers Comput. Neurosci.
James M. Kunert-Graf, Eli Shlizerman, Andrew Walker, J. Nathan Kutz
2017 J jnl
SIAM J. Sci. Comput.
Alessandro Alla, J. Nathan Kutz
2017 J jnl
Comput. Math. Methods Medicine
Megan Morrison, Pedro D. Maia, J. Nathan Kutz
2017 J jnl
CoRR
N. Benjamin Erichson, Krithika Manohar, Steven L. Brunton, J. Nathan Kutz
2017 J jnl
CoRR
N. Benjamin Erichson, Steven L. Brunton, J. Nathan Kutz
2017 J jnl
CoRR
N. Benjamin Erichson, Ariana Mendible, Sophie Wihlborn, J. Nathan Kutz
2017 J jnl
J. Comput. Neurosci.
Pedro D. Maia, J. Nathan Kutz
2017 J jnl
PLoS Comput. Biol.
James M. Kunert, Joshua L. Proctor, Steven L. Brunton, J. Nathan Kutz
2016 J jnl
Multiscale Model. Simul.
Ido Bright, Guang Lin, J. Nathan Kutz
2016 J jnl
SIAM J. Appl. Dyn. Syst.
Joshua L. Proctor, Steven L. Brunton, J. Nathan Kutz
2016 book
J. Nathan Kutz, Steven L. Brunton, Bingni W. Brunton, Joshua L. Proctor
2016 J jnl
IEEE Trans. Mol. Biol. Multi Scale Commun.
Niall M. Mangan, Steven L. Brunton, Joshua L. Proctor, J. Nathan Kutz
2016 J jnl
SIAM J. Appl. Dyn. Syst.
J. Nathan Kutz, Xing Fu, Steven L. Brunton
2016 J jnl
CoRR
Syuzanna Sargsyan, Steven L. Brunton, J. Nathan Kutz
2016 J jnl
CoRR
N. Benjamin Erichson, Sergey Voronin, Steven L. Brunton, J. Nathan Kutz
2016 J jnl
CoRR
Bethany Lusch, Eric C. Chi, J. Nathan Kutz
2016 J jnl
SIAM J. Appl. Math.
Bingni W. Brunton, Steven L. Brunton, Joshua L. Proctor, J. Nathan Kutz
2016 J jnl
CoRR
Seth D. Pendergrass, J. Nathan Kutz, Steven L. Brunton
2015 J jnl
CoRR
N. Benjamin Erichson, Steven L. Brunton, J. Nathan Kutz
2015 conf
ICCV Workshops
J. Nathan Kutz, Xing Fu, Steven L. Brunton, N. Benjamin Erichson
2014 J jnl
PLoS Comput. Biol.
Benjamin Lansdell, Kevin Ford, J. Nathan Kutz
2014 J jnl
SIAM J. Appl. Dyn. Syst.
Steven L. Brunton, Jonathan H. Tu, Ido Bright, J. Nathan Kutz
2014 J jnl
J. Comput. Neurosci.
Pedro D. Maia, J. Nathan Kutz
2014 J jnl
Frontiers Comput. Neurosci.
Eli Shlizerman, Jeffrey Riffell, J. Nathan Kutz
2014 J jnl
CoRR
Jacob Grosek, J. Nathan Kutz
2014 J jnl
PLoS Comput. Biol.
Varsha Dhankani, J. Nathan Kutz, Joshua T. Schiffer
2014 J jnl
J. Comput. Neurosci.
Pedro D. Maia, J. Nathan Kutz
2014 J jnl
CoRR
Jacob Grosek, J. Nathan Kutz
2013 J jnl
Multiscale Model. Simul.
Matthew O. Williams, Peter J. Schmid, J. Nathan Kutz
2013 J jnl
Multiscale Model. Simul.
Matthew O. Williams, Peter J. Schmid, J. Nathan Kutz
2013 J jnl
CoRR
Bingni W. Brunton, Steven L. Brunton, Joshua L. Proctor, J. Nathan Kutz
2013 conf
ICAIT
Feng Li, J. Nathan Kutz, Alexander Ping-Kong Wai
2012 J jnl
SIAM J. Appl. Math.
Eli Shlizerman, Konrad Schroder, J. Nathan Kutz
2012 J jnl
SIAM J. Appl. Dyn. Syst.
Matthew O. Williams, Eli Shlizerman, Jon Wilkening, J. Nathan Kutz
2007 J jnl
Math. Comput. Simul.
Joshua L. Proctor, J. Nathan Kutz
2007 J jnl
Math. Comput. Simul.
Bernard Deconinck, Firat Kiyak, John D. Carter, J. Nathan Kutz
2006 J jnl
J. Comput. Phys.
Bernard Deconinck, J. Nathan Kutz
2006 J jnl
SIAM Rev.
J. Nathan Kutz
2005 J jnl
SIAM J. Appl. Dyn. Syst.
Sarah E. Hewitt, J. Nathan Kutz
2002 J jnl
J. Nonlinear Sci.
Bernard Deconinck, Bela A. Frigyik, J. Nathan Kutz
1999 J jnl
SIAM J. Appl. Math.
J. Nathan Kutz, Philip Holmes
1996 J jnl
SIAM J. Appl. Math.
J. Nathan Kutz, William L. Kath
APK_CODE_ANALYSIS_PDD.md
← Index APK_CODE_ANALYSIS_PDD.md markdown
# APK Code Analysis — Product Design Document

**Author:** Engineering Team
**Date:** 2026-03-07
**Status:** Draft
**Target:** redb ingestor pipeline
**Depends on:** APK_FEATURES_PDD.md (APK static analysis extractors — implemented)

---

## 1. Overview

This document describes the design for adding **DEX code analysis** (decompilation, disassembly, call graphs, cross-references, and function similarity) to the redb ingestor pipeline. This is the Android equivalent of the Binary Ninja code analysis pipeline that exists for PE and ELF binaries.

### 1.1 Goals

- Decompile and disassemble APK DEX bytecode at the **method level**, producing per-method content and reference records analogous to the Binary Ninja `code_binja_*` tables
- Extract **call graphs and cross-references** (caller/callee relationships) for each method
- Compute **function similarity hashes** (SHA-256, ssdeep, TLSH, MinHash) for method-level clustering and hunting
- **Filter out library/framework code** to focus on user-written application logic — same philosophy as the `is_lib_or_thunk()` filter in Binary Ninja analysis
- Produce **decompiled Java source** (via JADX) and **smali disassembly** (via apktool) for each method, following the content/reference split pattern used by Binary Ninja tables
- Integrate with the existing APK extractor pipeline (runs after the Phase 1 APK extractors from `APK_FEATURES_PDD.md`)

### 1.2 Non-Goals

- **Native .so library analysis** — These are equivalent to external DLLs/shared libraries in PE/ELF. They are catalogued by `APKNativeLibExtractor` but not decompiled. If deep native analysis is needed, the existing ELF pipeline can be used on extracted `.so` files in a future phase.
- **Dynamic analysis / emulation** — Out of scope
- **Full APK repackaging / patching** — We use apktool for disassembly only, not rebuild
- **Inter-procedural data-flow analysis** (e.g., FlowDroid taint tracking) — Future consideration

### 1.3 Relationship to Existing Work

| Existing | New (this PDD) |
|----------|----------------|
| `APK_FEATURES_PDD.md` — APK metadata, manifest, permissions, certificates, DEX summary, resources, native libs | DEX **code-level** analysis: per-method decompilation, disassembly, call graphs, similarity hashes |
| `DecompileBinja` — PE/ELF code analysis via Binary Ninja | `DecompileAPK` — APK/DEX code analysis via androguard + JADX + apktool |
| `code_binja_*` ClickHouse tables | `code_apk_*` ClickHouse tables (same content/reference split pattern) |

---

## 2. Background

### 2.1 DEX Bytecode vs Native Code

| Aspect | PE/ELF (Binary Ninja) | APK/DEX (This PDD) |
|--------|----------------------|---------------------|
| Code format | Machine code (x86, ARM) | Dalvik bytecode (register-based VM) |
| Basic unit | Function (by address) | Method (by class + signature) |
| Disassembly | x86/ARM mnemonics | Smali (Dalvik assembly) |
| Decompilation | Pseudo-C (HLIL) | Java source code |
| Library filtering | `is_lib_or_thunk()` — symbol type | Package prefix filtering (e.g., `android.*`, `androidx.*`, `com.google.*`) |
| Similarity hashing | SHA-256 of normalized disassembly | SHA-256 of normalized smali |

### 2.2 Tool Selection

Three tools are combined to replicate the Binary Ninja analysis depth:

| Tool | Role | Integration | License |
|------|------|-------------|---------|
| **Androguard** (Python library) | Method enumeration, call graphs, cross-references, bytecode access, permissions analysis | Direct Python import — `from androguard.misc import AnalyzeAPK` | Apache 2.0 |
| **JADX** (Java CLI) | High-quality Java decompilation (equivalent to Binary Ninja HLIL) | subprocess (following CAPA/DIE pattern) | Apache 2.0 |
| **apktool** (Java CLI) | Smali disassembly with resource decoding (equivalent to Binary Ninja disassembly) | subprocess (following CAPA/DIE pattern) | Apache 2.0 |

**Why all three:**
- **Androguard** is the analysis engine — it provides call graphs, xrefs, and method enumeration natively in Python. However, its decompiler (DAD) produces lower-quality Java than JADX.
- **JADX** produces the best Java decompilation available. It is the industry standard for Android reverse engineering (47k+ GitHub stars).
- **apktool** produces canonical smali output with decoded resources. While androguard can access bytecode, apktool's smali output is the standard interchange format for Android RE.

### 2.3 Library Filtering Strategy

Native `.so` libraries are **not reverse-engineered** — they are equivalent to external DLLs in PE or shared libraries in ELF, and are already inventoried by `APKNativeLibExtractor`.

For DEX code, we filter out **framework/library packages** to focus on user-written code. This is the Android equivalent of `is_lib_or_thunk()` in the Binary Ninja pipeline.

**Default filter list** (configurable via environment variable `APK_LIBRARY_PREFIXES`):

```
android.*              # Android SDK
androidx.*             # AndroidX support libraries
com.google.android.*   # Google Play Services, Firebase
com.google.firebase.*  # Firebase
com.google.gson.*      # Gson JSON library
com.google.protobuf.*  # Protocol Buffers
kotlin.*               # Kotlin stdlib
kotlinx.*              # Kotlin extensions
org.apache.*           # Apache Commons
com.squareup.*         # OkHttp, Retrofit, Moshi
io.reactivex.*         # RxJava
org.reactivestreams.*  # Reactive Streams
com.facebook.*         # Facebook SDK
com.crashlytics.*      # Crashlytics
io.fabric.*            # Fabric
org.junit.*            # Test frameworks
org.mockito.*          # Test frameworks
```

Methods in filtered packages are still counted in call graph edges (caller/callee arrays) but their content is not stored in content tables. This mirrors how Binary Ninja records calls to library functions in `functions_caller`/`functions_call` arrays without decompiling the library functions themselves.

### 2.4 Packer Detection

Packer/protector detection for APKs uses **DetectItEasy (DIE)**, consistent with how packer detection works for PE/ELF/Mach-O in the existing pipeline. DIE already has signatures for common Android packers (Qihoo 360, Bangcle, Ijiami, Tencent Legu, Baidu, etc.).

The existing `DIEExtractor` runs as a format-agnostic extractor before format-specific analysis and requires no changes.

---

## 3. Architecture

### 3.1 Extractor Class Hierarchy

```
Extractor (redb/extractors/extractor.py)
└── DecompileAPK (NEW — redb/extractors/decompiler/DecompileAPK.py)
    ├── Uses: APKCodeAnalyzer (NEW — redb/extractors/decompiler/apk/analyzer.py)
    │   ├── AndroguardAnalysis — call graphs, xrefs, method enumeration
    │   ├── JADXDecompiler — Java decompilation (subprocess)
    │   └── ApktoolDisassembler — smali extraction (subprocess)
    └── Produces: multi_table ClickHouse export (same pattern as DecompileBinja)
```

**Design rationale:** `DecompileAPK` extends `Extractor` directly (not `APKExtractor`) because it follows the `DecompileBinja` pattern — a standalone extractor with its own analysis engine, rather than an APK metadata extractor that shares a parsed `APK` object. The APK parsing object from androguard is used internally but not shared with other extractors.

### 3.2 Analysis Pipeline Flow

```
APK file
  │
  ├─[1]─► apktool d <apk> ─► smali files on disk (temp dir)
  │
  ├─[2]─► jadx <apk> --no-res ─► Java source files on disk (temp dir)
  │
  └─[3]─► androguard AnalyzeAPK() ─► Analysis object (in-memory)
              │
              ├── Method enumeration ──► filter library packages
              │
              ├── For each user method:
              │     ├── Read smali from apktool output [1]
              │     ├── Read Java source from JADX output [2]
              │     ├── Get xrefs from Analysis object [3]
              │     ├── Compute content hashes (SHA-256 of smali, SHA-256 of Java)
              │     ├── Compute similarity hashes (ssdeep, TLSH of smali)
              │     └── Emit content + reference records
              │
              └── Call graph export ──► caller/callee arrays per method
```

Steps [1], [2], and [3] run in parallel (apktool and JADX as subprocess, androguard in-process). All three must complete before per-method analysis begins.

### 3.3 Content/Reference Split Pattern

Following the Binary Ninja schema pattern exactly:

- **Content tables** — Keyed by `function_hash` (SHA-256 of the method content). Deduplicated: if two APKs share identical method code, only one content record exists.
- **Reference tables** — Keyed by `(sha256, method_hash)`. Links a specific binary to its methods. Contains per-binary metadata (method name, class, address, callers, callees, fuzzy hashes).

This is the same pattern as `code_binja_decompiled_functions_content` / `code_binja_decompiled_functions_references`.

### 3.4 Method-Level Hashing

Hashing is computed at the **method level** for consistency with the Binary Ninja pipeline:

| Hash | Input | Purpose |
|------|-------|---------|
| `decompiled_method_hash` | SHA-256 of decompiled Java source (whitespace-normalized) | Content deduplication, exact match |
| `smali_method_hash` | SHA-256 of smali body (instructions only, no `.method`/`.end method` directives) | Content deduplication, exact match |
| `ssdeep_smali` | ssdeep of smali body | Fuzzy similarity search |
| `tlsh_smali` | TLSH of smali body | Fuzzy similarity search |
| `minhash_smali` | MinHash signature of smali instruction n-grams | LSH-based similarity clustering |

### 3.5 Obfuscation Indicators (per method)

Computed from the smali representation:

- `short_method_name` — Method name is <= 2 characters (a, b, c — typical R8/ProGuard output)
- `short_class_name` — Enclosing class has a single-letter name
- `has_string_encryption` — Method contains `const-string` followed by decryption-pattern calls
- `has_reflection_calls` — Method uses `java.lang.reflect.*` APIs
- `excessive_goto_count` — Number of `goto` instructions exceeds threshold (control flow flattening indicator)

---

## 4. Data Model

### 4.1 New Dataclasses

```python
@dataclass
class APKDecompiledMethodContent:
    """Decompiled Java source for a single method (content table — deduplicated by hash)."""
    decompiled_method_hash: str          # SHA-256 of normalized Java source
    decompiled_method: str               # Full Java method source
    method_type: str                     # "USER" or "LIBRARY"
    has_string_encryption: bool = False
    has_reflection_calls: bool = False
    excessive_goto_count: bool = False


@dataclass
class APKDecompiledMethodReference:
    """Links a specific APK to one of its decompiled methods (reference table)."""
    sha256: str                          # APK hash
    sha1: str
    md5: str
    decompiled_method_hash: str          # FK to content table
    smali_method_hash: Optional[str]     # FK to smali content table
    class_name: str                      # e.g., "com.example.MainActivity"
    method_name: str                     # e.g., "onCreate"
    method_signature: str                # e.g., "(Landroid/os/Bundle;)V"
    method_prototype: str                # e.g., "void onCreate(Bundle)"
    functions_caller: List[str]          # Methods that call this method
    functions_call: List[str]            # Methods called by this method


@dataclass
class APKSmaliMethodContent:
    """Smali disassembly for a single method (content table — deduplicated by hash)."""
    smali_method_hash: str               # SHA-256 of normalized smali body
    smali_method: str                    # Full smali method body
    method_type: str                     # "USER" or "LIBRARY"
    instructions_count: int = 0
    register_count: int = 0
    has_string_encryption: bool = False
    has_reflection_calls: bool = False
    excessive_goto_count: bool = False


@dataclass
class APKSmaliMethodReference:
    """Links a specific APK to one of its smali methods (reference table)."""
    sha256: str
    sha1: str
    md5: str
    smali_method_hash: str               # FK to content table
    decompiled_method_hash: Optional[str] # FK to decompiled content table
    class_name: str
    method_name: str
    method_signature: str
    ssdeep_smali: Optional[str] = None
    tlsh_smali: Optional[str] = None


@dataclass
class APKMethodSimilarityMetrics:
    """Similarity hashes for method-level clustering (keyed by smali hash)."""
    smali_method_hash: str
    cyclomatic_complexity: Optional[int] = None
    ssdeep_smali: Optional[str] = None
    tlsh_smali: Optional[str] = None
    minhash: Optional[List[int]] = None


@dataclass
class APKCodeAnalysisError:
    """Error encountered during method analysis."""
    sha256: str
    class_name: Optional[str] = None
    method_name: Optional[str] = None
    error_location: str = ""             # "jadx", "apktool", "androguard", "analysis"
    error_message: Optional[str] = None
    error_type: Optional[str] = None
```

### 4.2 Tag Enum Addition

```python
# In redb/extractors/enum.py
APK_DECOMPILED = "apk_decompiled"
```

### 4.3 ClickHouse Tables

| Table | Key | Pattern | Analog |
|-------|-----|---------|--------|
| `code_apk_decompiled_methods_content` | `decompiled_method_hash` | Content (deduplicated) | `code_binja_decompiled_functions_content` |
| `code_apk_decompiled_methods_references` | `(sha256, decompiled_method_hash)` | Reference (per-binary) | `code_binja_decompiled_functions_references` |
| `code_apk_smali_methods_content` | `smali_method_hash` | Content (deduplicated) | `code_binja_disassembled_functions_content` |
| `code_apk_smali_methods_references` | `(sha256, smali_method_hash)` | Reference (per-binary) | `code_binja_disassembled_functions_references` |
| `code_apk_method_similarity_metrics` | `smali_method_hash` | Similarity | `code_binja_function_similarity_metrics` |
| `code_apk_analysis_errors` | `(sha256, class_name, method_name)` | Errors | `function_analysis_errors_binja` |

All tables use `ReplacingMergeTree(analysis_date)` engine, consistent with existing schema.

---

## 5. External Tool Management

### 5.1 JADX

- **Invocation:** `jadx --no-res --no-imports --threads-count 2 --output-dir <tmpdir> <apk_path>`
- **Flags:**
  - `--no-res` — Skip resource decompilation (androguard handles resources)
  - `--no-imports` — Omit import statements for cleaner per-method extraction
  - `--threads-count 2` — Limit threads (same as Binary Ninja worker thread limit)
- **Output:** Java source files in `<tmpdir>/<package>/<Class>.java`
- **Timeout:** Configurable via `JADX_TIMEOUT` env var (default: 600s)
- **Path:** Configurable via `JADX_PATH` env var (default: `jadx`)
- **Error handling:** If JADX fails for a specific APK, the decompiled content tables are skipped but smali analysis continues. Error logged to `code_apk_analysis_errors`.

### 5.2 apktool

- **Invocation:** `apktool d --no-res --force --output <tmpdir> <apk_path>`
- **Flags:**
  - `--no-res` — Skip resource decoding (only want smali)
  - `--force` — Overwrite output directory if exists
- **Output:** Smali files in `<tmpdir>/smali/com/example/ClassName.smali` (one per class, containing all methods)
- **Timeout:** Configurable via `APKTOOL_TIMEOUT` env var (default: 600s)
- **Path:** Configurable via `APKTOOL_PATH` env var (default: `apktool`)
- **Error handling:** Same as JADX — if apktool fails, smali content tables are skipped but decompiled Java analysis continues. Error logged.

### 5.3 Androguard

- **Invocation:** Direct Python API — `AnalyzeAPK(filepath)` returns `(APK, list[DEX], Analysis)`
- **The `Analysis` object provides:**
  - `get_methods()` — All `MethodAnalysis` objects
  - `get_call_graph()` — networkx `MultiDiGraph` of method calls
  - `MethodAnalysis.get_xref_from()` — Who calls this method
  - `MethodAnalysis.get_xref_to()` — What this method calls
  - `MethodAnalysis.get_method()` — Access to `EncodedMethod` for bytecode
- **No timeout needed** — runs in-process, same Python process

---

## 6. Ingestor Integration

In `workers.py:process_binary_file()`, the APK branch will be extended to run `DecompileAPK` after the existing APK extractors:

```python
# Existing APK extractors (from APK_FEATURES_PDD.md)
for module in apk_modules:
    extractor = module(filepath, logger, exporters=exporters, ...)
    extractor.export_data()

# NEW: Code analysis (this PDD)
if "DecompileAPK" in selected_modules or "all" in selected_modules:
    decompiler = DecompileAPK(
        filepath, logger, exporters=exporters,
        index_prefix=index_prefix, filetype="apk",
    )
    decompiler.export_data()
```

The `DecompileAPK` extractor runs with its own timeout (configurable via `APK_DECOMPILE_TIMEOUT`, default: 1800s) using the same daemon-thread pattern as `DecompileBinja`.

---

## 7. New Dependencies

### 7.1 Required (system-level)

| Tool | Installation | Version | License | Purpose |
|------|-------------|---------|---------|---------|
| **JADX** | System package or download from GitHub releases | >= 1.5 | Apache 2.0 | Java decompilation |
| **apktool** | System package or download from GitHub releases | >= 2.9 | Apache 2.0 | Smali disassembly |
| **Java Runtime** | System package (`openjdk-17-jre` or similar) | >= 11 | GPL+CE | Required by JADX and apktool |

### 7.2 Required (Python — already installed)

| Library | Current Version | Usage in this PDD |
|---------|----------------|-------------------|
| `androguard` | >=4.1 | Call graphs, xrefs, method enumeration (already in requirements.txt) |
| `ppdeep` | installed | ssdeep fuzzy hashing (already used by Binary Ninja pipeline) |
| `py-tlsh` | installed | TLSH fuzzy hashing (already used by Binary Ninja pipeline) |
| `mmh3` | installed | MinHash computation (already used by Binary Ninja pipeline) |
| `networkx` | installed via androguard | Call graph representation (transitive dependency) |

### 7.3 No new Python dependencies required

All Python libraries needed are already in `requirements.txt`. The only new system-level dependencies are JADX, apktool, and a Java runtime.

---

## 8. Implementation Phases

### Phase 1 — Core Infrastructure

1. `APKCodeAnalyzer` class — androguard integration (method enumeration, call graph, xrefs, library filtering)
2. `JADXDecompiler` wrapper — subprocess management with timeout, output parsing
3. `ApktoolDisassembler` wrapper — subprocess management with timeout, smali parsing
4. Method-level content extraction and hashing logic
5. Unit tests for all Phase 1 components

### Phase 2 — Extractor and Data Export

6. `DecompileAPK` extractor class (following `DecompileBinja` pattern)
7. ClickHouse table creation functions
8. Multi-table export (`prepare_export_data`) for all 6 tables
9. Integration with `workers.py` dispatch
10. Unit tests for extractor, schema, and export
11. Update `TEST_INDEX.md`

### Phase 3 — Similarity and Obfuscation Analysis

12. Method-level similarity hash computation (ssdeep, TLSH, MinHash on smali)
13. Obfuscation indicator computation per method
14. `code_apk_method_similarity_metrics` table population
15. Unit tests for similarity and obfuscation
16. Update `TEST_INDEX.md`

### Phase 4 — Integration Testing and Hardening

17. End-to-end integration tests with real APK samples (benign + malicious + obfuscated)
18. Edge case handling: multi-DEX, empty DEX, packed APKs, APKs with no user code
19. Performance profiling and timeout tuning
20. Final `TEST_INDEX.md` update

---

## 9. Testing Strategy

### 9.1 Unit Tests

All unit tests mock external tools (JADX, apktool, androguard) and require no system dependencies:

- **Analyzer tests** — Method enumeration, library filtering, call graph extraction, xref parsing
- **JADX wrapper tests** — Subprocess invocation, output parsing, timeout handling, error recovery
- **Apktool wrapper tests** — Same as JADX
- **Hashing tests** — SHA-256 normalization, ssdeep/TLSH computation, MinHash signature generation
- **Extractor tests** — `DecompileAPK.extract()`, `prepare_export_data()`, multi-table schema validation
- **Smali parsing tests** — Method boundary detection, instruction extraction, register counting

### 9.2 Integration Tests

Require JADX, apktool, and Java installed:

- Full pipeline run on known APK samples
- Cross-validate decompiled output against known method signatures
- Verify ClickHouse export column counts and types
- Test with obfuscated APKs (ProGuard/R8 output)

### 9.3 Markers

```python
@pytest.mark.apk           # All APK tests
@pytest.mark.decompile      # All decompiler tests
@pytest.mark.unit           # No external deps
@pytest.mark.integration    # Requires JADX/apktool/Java
```

---

## 10. Configuration

All configuration via environment variables, consistent with existing extractors:

| Variable | Default | Description |
|----------|---------|-------------|
| `JADX_PATH` | `jadx` | Path to JADX binary |
| `JADX_TIMEOUT` | `600` | JADX subprocess timeout (seconds) |
| `APKTOOL_PATH` | `apktool` | Path to apktool binary |
| `APKTOOL_TIMEOUT` | `600` | apktool subprocess timeout (seconds) |
| `APK_DECOMPILE_TIMEOUT` | `1800` | Overall decompilation timeout (seconds) |
| `APK_LIBRARY_PREFIXES` | (see §2.3) | Comma-separated package prefixes to filter |
| `APK_MIN_METHOD_INSTRUCTIONS` | `5` | Minimum smali instruction count to analyze a method |

---

## 11. Open Questions / Future Work

1. **ProGuard/R8 mapping file support** — If mapping files are bundled (rare in malware, common in crash reports), JADX can use them to restore original names. Deferred.
2. **Kotlin-specific analysis** — Kotlin metadata annotations could provide richer type information. Deferred.
3. **Cross-DEX analysis** — Multi-DEX APKs may have cross-DEX method calls. Androguard handles this via `AnalyzeAPK()` which loads all DEX files into a single `Analysis` object. No special handling needed.
4. **JADX as Java library via JPype** — Could eliminate subprocess overhead. Deferred in favor of the proven subprocess pattern, but may be revisited if performance is an issue.

---

## Appendix A — CFG Feature Parity with Binary Ninja Pipeline

**Date:** 2026-03-13
**Status:** Planned (Phase 5)
**Depends on:** Phases 13 complete

### A.1 Motivation

The Binary Ninja pipeline produces a dedicated `code_binja_cfg_functions` table with 17 fields capturing graph topology, structural hashes, and per-block feature vectors. The current APK pipeline computes only basic graph scalars (`block_count`, `edge_count`, `cyclomatic_complexity`, `loop_count`, `max_depth`, `max_fan_out`) and bundles them into the `code_apk_method_similarity_metrics` table alongside fuzzy hashes.

Analysis shows that **all advanced CFG features can be computed from smali** — this is not a limitation of Java bytecode. The existing APK infrastructure already:

- Builds `successors[]` adjacency lists from smali control flow (`smali_cfg.py`)
- Computes per-block ACFG feature vectors using the same 8-category schema as Binary Ninja (`smali_cfg.py:_build_block_features`)
- Normalizes Dalvik opcodes into semantic categories equivalent to LLIL categories (`smali_normalization.py`)

The generic functions in `cfg_features.py` (`compute_topology_hash`, `compute_md_index_topdown/bottomup`, `compute_wl_minhash`, `compute_cfg_feature_tlsh`, `pack_adjacency`) operate on adjacency lists and block feature arrays — they have no Binary Ninja dependency and can be called directly from the APK pipeline.

### A.2 Table Restructuring

Split the current single table into two, mirroring the Binja pattern:

#### `code_apk_method_similarity_metrics` (content-based fuzzy matching)

Retains only fuzzy hashes and instruction-sequence similarity data:

| Column | Type | Change |
|--------|------|--------|
| `smali_method_hash` | FixedString(64) | Unchanged |
| `cyclomatic_complexity` | Nullable(UInt16) | Stays (duplicated in both, same as Binja) |
| `ssdeep_smali` | Nullable(String) | Unchanged |
| `tlsh_smali` | Nullable(FixedString(72)) | Unchanged |
| `minhash` | Array(UInt8) | Unchanged |
| `analysis_date` | DateTime64(3, 'UTC') | Unchanged |

Removed from this table: `block_count`, `edge_count`, `loop_count`, `max_depth`, `max_fan_out` — these move to the CFG table.

#### `code_apk_cfg_methods` (NEW — structural/topological similarity)

Mirrors `code_binja_cfg_functions`:

| Column | Type | Source | Analog in Binja |
|--------|------|--------|-----------------|
| `smali_method_hash` | FixedString(64) | Existing | `disassembled_function_hash` |
| `cfg_topology_hash` | FixedString(16) | NEW — `cfg_features.compute_topology_hash()` | Same |
| `block_count` | UInt16 | Moved from similarity table | Same |
| `edge_count` | UInt16 | Moved from similarity table | Same |
| `instructions_count` | UInt32 | Existing (total Dalvik instructions) | `llil_total_operations` |
| `call_count` | UInt16 | NEW — count of `invoke-*` instructions | Same |
| `cyclomatic_complexity` | UInt16 | Moved from similarity table | Same |
| `loop_count` | UInt8 | Moved from similarity table | Same |
| `max_depth` | UInt16 | Moved from similarity table | Same |
| `max_fan_out` | UInt8 | Moved from similarity table | Same |
| `md_index_topdown` | UInt64 | NEW — `cfg_features.compute_md_index_topdown()` | Same |
| `md_index_bottomup` | UInt64 | NEW — `cfg_features.compute_md_index_bottomup()` | Same |
| `prime_product_smali` | UInt64 | NEW — Dalvik opcode → prime mapping | `prime_product_llil` |
| `cfg_feature_tlsh` | Nullable(FixedString(72)) | NEW — `cfg_features.compute_cfg_feature_tlsh()` | Same |
| `wl_minhash` | Array(UInt8) | NEW — `cfg_features.compute_wl_minhash()`, 128 elements | Same |
| `bb_features` | Array(Array(UInt16)) | Existing (computed, not exported) | Same |
| `cfg_adjacency` | Array(UInt32) | NEW — `cfg_features.pack_adjacency()` | Same |
| `analysis_date` | DateTime64(3, 'UTC') | | Same |

### A.3 Naming Differences from Binja

Two columns are intentionally renamed to reflect what the data actually represents:

- **`prime_product_smali`** (not `prime_product_llil`) — the prime mapping is applied to normalized Dalvik opcodes, not LLIL. Semantically equivalent for APK-to-APK comparison but not numerically comparable to Binja values.
- **`instructions_count`** (not `llil_total_operations`) — counts Dalvik instructions, not LLIL operations. LLIL decomposes machine instructions into sub-operations; Dalvik bytecode is already at a higher abstraction level where one instruction ≈ one operation.

### A.4 Implementation Requirements

| Task | Effort | Notes |
|------|--------|-------|
| Build `predecessors[]` from `successors[]` in `smali_cfg.py` | ~5 lines | Trivial reverse mapping |
| Define `SMALI_OP_PRIMES` mapping | ~30 lines | Map semantic categories from `smali_normalization.py` to same primes used in `cfg_features.py` |
| Wire `cfg_features.py` functions into `smali_cfg.py` | ~40 lines | Call `compute_topology_hash`, `compute_md_index_*`, `compute_wl_minhash`, `compute_cfg_feature_tlsh`, `pack_adjacency` |
| Export `bb_features` (already computed, not exported) | ~5 lines | Add to results dict |
| Count `invoke-*` instructions for `call_count` | ~5 lines | Filter in instruction loop |
| New `code_apk_cfg_methods` table export in `DecompileAPK.py` | ~60 lines | Follow existing export pattern |
| Slim down `code_apk_method_similarity_metrics` export | ~10 lines | Remove moved columns |
| ClickHouse schema for new table | ~30 lines | Mirror `code_binja_cfg_functions` |
| Unit tests | ~100 lines | Test new fields, reuse patterns from `test_cfg_features.py` |

**Total estimated: ~285 lines of code changes.**

### A.5 What Cannot Be Identical Cross-Platform

The `prime_product_smali` values are **not numerically comparable** to `prime_product_llil` from the Binja pipeline. LLIL decomposes native instructions into sub-operations (e.g., one x86 `push` becomes `STORE` + `SET_REG`), while Dalvik bytecode maps 1:1 to semantic categories. The prime products are valid for APK-vs-APK similarity and APK-vs-APK clustering, which is the intended use case.

All other fields (`cfg_topology_hash`, `md_index_*`, `wl_minhash`, `cfg_feature_tlsh`, `bb_features`, `cfg_adjacency`) are computed from the same generic algorithms and are structurally equivalent across platforms.