James Bailey

379 papers A* 61A 36B 38C 9Misc 10Journal 145Unranked 62
YearRankTypeTitle / Venue / Authors
2026 J jnl
Inf. Syst.
Zaher Joukhadar, Hanxun Huang, Sarah Monazam Erfani, Ricardo J. G. B. Campello, Michael E. Houle, James Bailey
2026 J jnl
CoRR
Xueqi Ma, Shuo Yang, Yanbei Jiang, Shu Liu, Zhenzhen Liu, Jiayang Ao, Xingjun Ma, Sarah Monazam Erfani, James Bailey
2026 A* conf
AAAI
Xueqi Ma, Xingjun Ma, Sarah Monazam Erfani, Danilo P. Mandic, James Bailey
2026 J jnl
CoRR
Kristóf Péter, Ricardo J. G. B. Campello, James Bailey, Michael E. Houle
2025 J jnl
CoRR
Xueqi Ma, Xingjun Ma, Sarah Monazam Erfani, Danilo P. Mandic, James Bailey
2025 J jnl
CoRR
Xueqi Ma, Jun Wang, Yanbei Jiang, Sarah Monazam Erfani, Tongliang Liu, James Bailey
2025 A* conf
ICLR
Hanxun Huang, Sarah Monazam Erfani, Yige Li, Xingjun Ma, James Bailey
2025 J jnl
CoRR
Hanxun Huang, Sarah M. Erfani, Yige Li, Xingjun Ma, James Bailey
2025 J jnl
CoRR
Jingmin Zhu, Anqi Zhu, James Bailey, Jun Liu, Hossein Rahmani, Mohammed Bennamoun, Farid Boussaïd, Qiuhong Ke
2025 A conf
CIKM
Dinuka Manohara de Zoysa, James Bailey, Renata Borovica-Gajic
2025 J jnl
CoRR
Jinhao Li, Sarah M. Erfani, Lei Feng, James Bailey, Feng Liu
2025 J jnl
Trans. Mach. Learn. Res.
Jinhao Li, Sarah Monazam Erfani, Lei Feng, James Bailey, Feng Liu
2025 B conf
SISAP
James Bailey, Ricardo J. G. B. Campello, Michael E. Houle
2025 J jnl
CoRR
Yanbei Jiang, Xueqi Ma, Shu Liu, Sarah Monazam Erfani, Tongliang Liu, James Bailey, Jey Han Lau, Krista A. Ehinger
2025 B conf
EDBT
Kasun Amarasinghe, Farhana Choudhury, Jianzhong Qi, James Bailey
2025 A* conf
ACM Multimedia
Xueqi Ma, Yanbei Jiang, Sarah M. Erfani, James Bailey, Weifeng Liu, Krista A. Ehinger, Jey Han Lau
2025 J jnl
CoRR
Xueqi Ma, Yanbei Jiang, Sarah M. Erfani, James Bailey, Weifeng Liu, Krista A. Ehinger, Jey Han Lau
2025 J jnl
Int. J. Data Sci. Anal.
Yuansan Liu, Sudanthi N. R. Wijewickrema, Christofer Bester, Stephen J. O'Leary, James Bailey
2025 J jnl
CoRR
Xingjun Ma, Yifeng Gao, Yixu Wang, Ruofan Wang, Xin Wang, Ye Sun, Yifan Ding, Hengyuan Xu, Yunhao Chen, Yunhan Zhao, Hanxun Huang, Yige Li, Jiaming Zhang, Xiang Zheng, Yang Bai, Zuxuan Wu, Xipeng Qiu, Jingfeng Zhang, Yiming Li, Jun Sun, Cong Wang, Jindong Gu, Baoyuan Wu, Siheng Chen, Tianwei Zhang, Yang Liu, Mingming Gong, Tongliang Liu, Shirui Pan, Cihang Xie, Tianyu Pang, Yinpeng Dong, Ruoxi Jia, Yang Zhang, Shiqing Ma, Xiangyu Zhang, Neil Gong, Chaowei Xiao, Sarah M. Erfani, Bo Li, Masashi Sugiyama, Dacheng Tao, James Bailey, Yu-Gang Jiang
2025 J jnl
Found. Trends Priv. Secur.
Xingjun Ma, Yifeng Gao, Yixu Wang, Ruofan Wang, Xin Wang, Ye Sun, Yifan Ding, Hengyuan Xu, Yunhao Chen, Yunhao Zhao, Hanxun Huang, Yige Li, Yutao Wu, Jiaming Zhang, Xiang Zheng, Yang Bai, Yiming Li, Zuxuan Wu, Xipeng Qiu, Jingfeng Zhang, Xudong Han, Haonan Li, Jun Sun, Cong Wang, Jindong Gu, Baoyuan Wu, Siheng Chen, Tianwei Zhang, Yang Liu, Mingming Gong, Tongliang Liu, Shirui Pan, Cihang Xie, Tianyu Pang, Yinpeng Dong, Ruoxi Jia, Yang Zhang, Shiqing Ma, Xiangyu Zhang, Neil Gong, Chaowei Xiao, Sarah M. Erfani, Tim Baldwin, Bo Li, Masashi Sugiyama, Dacheng Tao, James Bailey, Yu-Gang Jiang
2025 A* conf
CVPR
Anqi Zhu, Jingmin Zhu, James Bailey, Mingming Gong, Qiuhong Ke
2025 conf
KDD (2)
Yuansan Liu, Sudanthi N. R. Wijewickrema, Dongting Hu, Christofer Bester, Stephen J. O'Leary, James Bailey
2025 conf
AI (1)
Pagnarasmey Pit, Xingjun Ma, Mike Conway, Qingyu Chen, James Bailey, Pagnarith Pit, Putrasmey Keo, Watey Diep, Yu-Gang Jiang
2025 A* conf
ICML
Hanxun Huang, Sarah Monazam Erfani, Yige Li, Xingjun Ma, James Bailey
2025 J jnl
CoRR
Hanxun Huang, Sarah M. Erfani, Yige Li, Xingjun Ma, James Bailey
2024 B conf
SISAP
Zaher Joukhadar, Hanxun Huang, Sarah Monazam Erfani, Ricardo J. G. B. Campello, Michael E. Houle, James Bailey
2024 J jnl
CoRR
Yuansan Liu, Jeygopi Panisilvam, Peter M. Dower, Sejeong Kim, James Bailey
2024 conf
AI (1)
Zaher Joukhadar, Jonathan Morgan, Christopher Bayliss, Miguel Ortiz del Castillo, Jack McRobbie, Robert Mearns, Krista A. Ehinger, Benjamin I. P. Rubinstein, Richard O. Sinnott, Michele Trenti, James Bailey
2024 A conf
SDM
Alastair Anderberg, James Bailey, Ricardo J. G. B. Campello, Michael E. Houle, Henrique O. Marques, Milos Radovanovic, Arthur Zimek
2024 J jnl
CoRR
Alastair Anderberg, James Bailey, Ricardo J. G. B. Campello, Michael E. Houle, Henrique O. Marques, Milos Radovanovic, Arthur Zimek
2024 J jnl
CoRR
Yujing Jiang, Xingjun Ma, Sarah Monazam Erfani, Yige Li, James Bailey
2024 conf
HICSS
Zihan Yang, Richard O. Sinnott, James Bailey, Krista A. Ehinger
2024 J jnl
Neural Networks
Sichao Fu, Xueqi Ma, Yibing Zhan, Fanyu You, Qinmu Peng, Tongliang Liu, James Bailey, Danilo P. Mandic
2024 J jnl
Mach. Learn.
Xingjun Ma, Linxi Jiang, Hanxun Huang, Zejia Weng, James Bailey, Yu-Gang Jiang
2024 A* conf
ICLR
Hanxun Huang, Ricardo J. G. B. Campello, Sarah Monazam Erfani, Xingjun Ma, Michael E. Houle, James Bailey
2024 J jnl
CoRR
Hanxun Huang, Ricardo J. G. B. Campello, Sarah Monazam Erfani, Xingjun Ma, Michael E. Houle, James Bailey
2024 J jnl
CoRR
Kasun Amarasinghe, Farhana Choudhury, Jianzhong Qi, James Bailey
2024 conf
CVPR Workshops
Miguel Ortiz del Castillo, Jonathan Morgan, Jack McRobbie, Clint Therakam, Zaher Joukhadar, Robert Mearns, Simon Barraclough, Richard O. Sinnott, Andrew Woods, Chris Bayliss, Kris Ehinger, Benjamin I. P. Rubinstein, James Bailey, Airlie Chapman, Michele Trenti
2024 J jnl
CoRR
Miguel Ortiz del Castillo, Jonathan Morgan, Jack McRobbie, Clint Therakam, Zaher Joukhadar, Robert Mearns, Simon Barraclough, Richard O. Sinnott, Andrew Woods, Chris Bayliss, Kris Ehinger, Benjamin I. P. Rubinstein, James Bailey, Airlie Chapman, Michele Trenti
2024 A* conf
CVPR
Anqi Zhu, Qiuhong Ke, Mingming Gong, James Bailey
2024 J jnl
CoRR
Anqi Zhu, Qiuhong Ke, Mingming Gong, James Bailey
2024 J jnl
CoRR
Yuansan Liu, Sudanthi N. R. Wijewickrema, Dongting Hu, Christofer Bester, Stephen J. O'Leary, James Bailey
2024 B conf
IJCNN
Yuansan Liu, Sudanthi N. R. Wijewickrema, Christofer Bester, Stephen J. O'Leary, James Bailey
2024 J jnl
CoRR
Yuansan Liu, Sudanthi N. R. Wijewickrema, Christofer Bester, Stephen J. O'Leary, James Bailey
2024 A conf
SDM
Yuansan Liu, Sudanthi N. R. Wijewickrema, Ang Li, Christofer Bester, Stephen J. O'Leary, James Bailey
2024 A conf
SDM
Xueqi Ma, Xingjun Ma, Sarah M. Erfani, James Bailey
2024 J jnl
CoRR
Yujing Jiang, Xingjun Ma, Sarah Monazam Erfani, James Bailey
2024 conf
PAKDD (6)
Yujing Jiang, Xingjun Ma, Sarah Monazam Erfani, James Bailey
2024 A* conf
ICML
Jinhao Li, Haopeng Li, Sarah Monazam Erfani, Lei Feng, James Bailey, Feng Liu
2024 J jnl
CoRR
Jinhao Li, Haopeng Li, Sarah M. Erfani, Lei Feng, James Bailey, Feng Liu
2024 J jnl
CoRR
Pagnarasmey Pit, Xingjun Ma, Mike Conway, Qingyu Chen, James Bailey, Henry Pit, Putrasmey Keo, Watey Diep, Yu-Gang Jiang
2023 J jnl
Knowl. Inf. Syst.
Zihan Yang, Richard O. Sinnott, James Bailey, Qiuhong Ke
2023 A conf
WACV
Anqi Zhu, Qiuhong Ke, Mingming Gong, James Bailey
2023 conf
SaTML
Yujing Jiang, Xingjun Ma, Sarah Monazam Erfani, James Bailey
2023 conf
PACIS
Tingru Cui, Sharon Li, Kaiping Chen, James Bailey, Feng Liu
2023 A* conf
ICLR
Hanxun Huang, Xingjun Ma, Sarah Monazam Erfani, James Bailey
2023 J jnl
CoRR
Hanxun Huang, Xingjun Ma, Sarah M. Erfani, James Bailey
2023 A* conf
ICDE
Guanli Liu, Jianzhong Qi, Christian S. Jensen, James Bailey, Lars Kulik
2023 A* conf
KDD
Derek Zhiyuan Cheng, Dhaval Patel, Linsey Pang, Sameep Mehta, Kexin Xie, Ed H. Chi, Wei Liu, Nitesh V. Chawla, James Bailey
2023 J jnl
Neural Networks
Wenhang Yu, Xueqi Ma, James Bailey, Yibing Zhan, Jia Wu, Bo Du, Wenbin Hu
2023 A conf
CP
Vincent Barbosa Vaz, James Bailey, Christopher Leckie, Peter J. Stuckey
2023 J jnl
Inf. Syst.
James Bailey, Michael E. Houle, Xingjun Ma
2023 J jnl
IEEE Trans. Sustain. Comput.
Xinghao Yang, Yongshun Gong, Weifeng Liu, James Bailey, Dacheng Tao, Wei Liu
2023 J jnl
CoRR
Yuansan Liu, Sudanthi N. R. Wijewickrema, Ang Li, Christofer Bester, Stephen J. O'Leary, James Bailey
2022 A* conf
AAAI
Ali Ugur Guler, Emir Demirovic, Jeffrey Chan, James Bailey, Christopher Leckie, Peter J. Stuckey
2022 J jnl
CoRR
Zihan Yang, Richard O. Sinnott, James Bailey, Qiuhong Ke
2022 J jnl
CoRR
Anqi Zhu, Qiuhong Ke, Mingming Gong, James Bailey
2022 J jnl
CoRR
Yujing Jiang, Xingjun Ma, Sarah Monazam Erfani, James Bailey
2022 Misc conf
AI
Yuansan Liu, James Bailey
2022 A conf
CIKM
Wei Liu, Kexin Xie, Linsey Pang, James Bailey, Longbing Cao, Yuxi Zhang
2022 J jnl
Int. J. Artif. Intell. Educ.
Sadia Nawaz, Namrata Srivastava, Ji Hyun Yu, Anam Ahmad Khan, Gregor E. Kennedy, James Bailey, Ryan Shaun Baker
2022 conf
ECCV (25)
Yunsheng Pang, Qiuhong Ke, Hossein Rahmani, James Bailey, Jun Liu
2022 J jnl
CoRR
Yunsheng Pang, Qiuhong Ke, Hossein Rahmani, James Bailey, Jun Liu
2022 A* conf
CHI
Anam Ahmad Khan, Joshua Newn, James Bailey, Eduardo Velloso
2022 J jnl
Entropy
James Bailey, Michael E. Houle, Xingjun Ma
2022 conf
PAKDD (2)
Laurence A. F. Park, Mohadeseh Ganji, Emir Demirovic, Jeffrey Chan, Peter J. Stuckey, James Bailey, Christopher Leckie, Rao Kotagiri
2022 J jnl
J. Mach. Learn. Res.
Emir Demirovic, Anna Lukina, Emmanuel Hebrard, Jeffrey Chan, James Bailey, Christopher Leckie, Kotagiri Ramamohanarao, Peter J. Stuckey
2022 A* conf
CHI
Anam Ahmad Khan, Sadia Nawaz, Joshua Newn, Ryan M. Kelly, Jason M. Lodge, James Bailey, Eduardo Velloso
2021 A* conf
NeurIPS
Jiabo He, Sarah M. Erfani, Xingjun Ma, James Bailey, Ying Chi, Xian-Sheng Hua
2021 B conf
IJCNN
Mahtab Mirmomeni, Lars Kulik, James Bailey
2021 J jnl
CoRR
Nodens Koren, Qiuhong Ke, Yisen Wang, James Bailey, Xingjun Ma
2021 J jnl
CoRR
Jiabo He, Sarah M. Erfani, Xingjun Ma, James Bailey, Ying Chi, Xian-Sheng Hua
2021 A conf
LAK
Namrata Srivastava, Sadia Nawaz, Joshua Newn, Jason M. Lodge, Eduardo Velloso, Sarah M. Erfani, Dragan Gasevic, James Bailey
2021 A* conf
AAAI
Xinghao Yang, Weifeng Liu, James Bailey, Dacheng Tao, Wei Liu
2021 J jnl
CoRR
Yuansan Liu, James Bailey
2021 B conf
IJCNN
Yujing Jiang, Xingjun Ma, Sarah Monazam Erfani, James Bailey
2021 J jnl
CoRR
Yujing Jiang, Xingjun Ma, Sarah Monazam Erfani, James Bailey
2021 A* conf
NeurIPS
Hanxun Huang, Yisen Wang, Sarah M. Erfani, Quanquan Gu, James Bailey, Xingjun Ma
2021 J jnl
CoRR
Hanxun Huang, Yisen Wang, Sarah Monazam Erfani, Quanquan Gu, James Bailey, Xingjun Ma
2021 J jnl
CoRR
Anam Ahmad Khan, Joshua Newn, Ryan Kelly, Namrata Srivastava, James Bailey, Eduardo Velloso
2021 J jnl
ACM Trans. Comput. Hum. Interact.
Anam Ahmad Khan, Joshua Newn, Ryan M. Kelly, Namrata Srivastava, James Bailey, Eduardo Velloso
2021 C conf
ACML
Guohang Zeng, Yousef Kowsar, Sarah M. Erfani, James Bailey
2021 J jnl
IEEE Trans. Inf. Forensics Secur.
Laurent Amsaleg, James Bailey, Amélie Barbe, Sarah M. Erfani, Teddy Furon, Michael E. Houle, Milos Radovanovic, Xuan Vinh Nguyen
2021 A* ed.
ICDM
James Bailey, Pauli Miettinen, Yun Sing Koh, Dacheng Tao, Xindong Wu
2021 C conf
BDCAT
Zihan Yang, Richard O. Sinnott, Qiuhong Ke, James Bailey
2021 B conf
IJCNN
Hanxun Huang, Xingjun Ma, Sarah M. Erfani, James Bailey
2021 J jnl
CoRR
Hanxun Huang, Xingjun Ma, Sarah M. Erfani, James Bailey
2021 J jnl
CoRR
Yisen Wang, Xingjun Ma, James Bailey, Jinfeng Yi, Bowen Zhou, Quanquan Gu
2021 B conf
SISAP
James Bailey, Michael E. Houle, Xingjun Ma
2021 J jnl
IEEE Trans. Cloud Comput.
Yali Zhao, Rodrigo N. Calheiros, Graeme Gange, James Bailey, Richard O. Sinnott
2021 J jnl
CoRR
Xinghao Yang, Weifeng Liu, James Bailey, Tianqing Zhu, Dacheng Tao, Wei Liu
2021 J jnl
Pattern Recognit.
Xingjun Ma, Yuhao Niu, Lin Gu, Yisen Wang, Yitian Zhao, James Bailey, Feng Lu
2021 A* conf
ICLR
Hanxun Huang, Xingjun Ma, Sarah Monazam Erfani, James Bailey, Yisen Wang
2021 J jnl
CoRR
Hanxun Huang, Xingjun Ma, Sarah Monazam Erfani, James Bailey, Yisen Wang
2021 J jnl
CoRR
Shihao Zhao, Xingjun Ma, Yisen Wang, James Bailey, Bo Li, Yu-Gang Jiang
2020 A* conf
CVPR
Ranjie Duan, Xingjun Ma, Yisen Wang, James Bailey, A. K. Qin, Yun Yang
2020 J jnl
CoRR
Ranjie Duan, Xingjun Ma, Yisen Wang, James Bailey, A. K. Qin, Yun Yang
2020 conf
AIED (1)
Sadia Nawaz, Namrata Srivastava, Ji Hyun Yu, Ryan S. Baker, Gregor E. Kennedy, James Bailey
2020 A* conf
CVPR
Shihao Zhao, Xingjun Ma, Xiang Zheng, James Bailey, Jingjing Chen, Yu-Gang Jiang
2020 J jnl
CoRR
Shihao Zhao, Xingjun Ma, Xiang Zheng, James Bailey, Jingjing Chen, Yu-Gang Jiang
2020 J jnl
CoRR
Ali Ugur Guler, Emir Demirovic, Jeffrey Chan, James Bailey, Christopher Leckie, Peter J. Stuckey
2020 A* conf
AAAI
Emir Demirovic, Peter J. Stuckey, Tias Guns, James Bailey, Christopher Leckie, Kotagiri Ramamohanarao, Jeffrey Chan
2020 J jnl
Knowl. Inf. Syst.
Yunzhe Jia, James Bailey, Kotagiri Ramamohanarao, Christopher Leckie, Xingjun Ma
2020 A conf
LAK
Namrata Srivastava, Sadia Nawaz, Jason M. Lodge, Eduardo Velloso, Sarah M. Erfani, James Bailey
2020 J jnl
CoRR
Linxi Jiang, Xingjun Ma, Zejia Weng, James Bailey, Yu-Gang Jiang
2020 A* conf
ICLR
Yisen Wang, Difan Zou, Jinfeng Yi, James Bailey, Xingjun Ma, Quanquan Gu
2020 B conf
IJCNN
Rishabh Ramteke, Peter J. Stuckey, Jeffrey Chan, Kotagiri Ramamohanarao, James Bailey, Christopher Leckie, Emir Demirovic
2020 J jnl
J. Learn. Anal.
Sadia Nawaz, Gregor E. Kennedy, James Bailey, Chris Mead
2020 J jnl
CoRR
Emir Demirovic, Anna Lukina, Emmanuel Hebrard, Jeffrey Chan, James Bailey, Christopher Leckie, Kotagiri Ramamohanarao, Peter J. Stuckey
2020 A* conf
ICML
Xingjun Ma, Hanxun Huang, Yisen Wang, Simone Romano, Sarah M. Erfani, James Bailey
2020 J jnl
CoRR
Xingjun Ma, Hanxun Huang, Yisen Wang, Simone Romano, Sarah M. Erfani, James Bailey
2020 J jnl
Data Knowl. Eng.
Tahrima Hashem, Lida Rashidi, Lars Kulik, James Bailey
2020 A conf
LAK
Donia Malekian, James Bailey, Gregor E. Kennedy
2020 J jnl
ACM Trans. Spatial Algorithms Syst.
Elham Naghizade, Lars Kulik, Egemen Tanin, James Bailey
2020 conf
ECCV (10)
Yunfei Liu, Xingjun Ma, James Bailey, Feng Lu
2020 J jnl
CoRR
Yunfei Liu, Xingjun Ma, James Bailey, Feng Lu
2020 A* conf
ICLR
Dongxian Wu, Yisen Wang, Shu-Tao Xia, James Bailey, Xingjun Ma
2020 J jnl
CoRR
Dongxian Wu, Yisen Wang, Shu-Tao Xia, James Bailey, Xingjun Ma
2020 J jnl
Comput. Educ.
Paula G. de Barba, Donia Malekian, Eduardo Araujo Oliveira, James Bailey, Tracii Ryan, Gregor E. Kennedy
2020 conf
AIED (1)
Jesslyn Lamtara, Nathan Hanegbi, Benjamin Talks, Sudanthi N. R. Wijewickrema, Xingjun Ma, Patorn Piromchai, James Bailey, Stephen J. O'Leary
2020 J jnl
CoRR
Anam Ahmad Khan, Sadia Nawaz, Joshua Newn, Jason M. Lodge, James Bailey, Eduardo Velloso
2019 ed.
Australasian Conference on Artificial Intelligence
Jixue Liu, James Bailey
2019 B conf
CPAIOR
Emir Demirovic, Peter J. Stuckey, James Bailey, Jeffrey Chan, Chris Leckie, Kotagiri Ramamohanarao, Tias Guns
2019 J jnl
Data Min. Knowl. Discov.
Somayeh Naderivesal, Lars Kulik, James Bailey
2019 A* conf
ACM Multimedia
Linxi Jiang, Xingjun Ma, Shaoxiang Chen, James Bailey, Yu-Gang Jiang
2019 J jnl
CoRR
Linxi Jiang, Xingjun Ma, Shaoxiang Chen, James Bailey, Yu-Gang Jiang
2019 B conf
EDM
Donia Malekian, James Bailey, Gregor E. Kennedy, Paula G. de Barba, Sadia Nawaz
2019 B conf
SISAP
Tahrima Hashem, Lida Rashidi, James Bailey, Lars Kulik
2019 J jnl
Proc. ACM Interact. Mob. Wearable Ubiquitous Technol.
Yomna Abdelrahman, Anam Ahmad Khan, Joshua Newn, Eduardo Velloso, Sherine Ashraf Safwat, James Bailey, Andreas Bulling, Frank Vetere, Albrecht Schmidt
2019 A* conf
CHI
Namrata Srivastava, Eduardo Velloso, Jason M. Lodge, Sarah M. Erfani, James Bailey
2019 J jnl
CoRR
Sukarna Barua, Sarah Monazam Erfani, James Bailey
2019 A* conf
KDD
Yunzhe Jia, James Bailey, Kotagiri Ramamohanarao, Christopher Leckie, Michael E. Houle
2019 A* conf
ICML
Yisen Wang, Xingjun Ma, James Bailey, Jinfeng Yi, Bowen Zhou, Quanquan Gu
2019 J jnl
Int. J. Intell. Syst.
Masud Moshtaghi, James C. Bezdek, Sarah M. Erfani, Christopher Leckie, James Bailey
2019 A* conf
IJCAI
Emir Demirovic, Peter J. Stuckey, James Bailey, Jeffrey Chan, Christopher Leckie, Kotagiri Ramamohanarao, Tias Guns
2019 A conf
ICWS
Yali Zhao, Rodrigo N. Calheiros, Athanasios V. Vasilakos, James Bailey, Richard O. Sinnott
2019 conf
eScience
Yali Zhao, Athanasios V. Vasilakos, James Bailey, Richard O. Sinnott
2019 J jnl
CoRR
Sukarna Barua, Xingjun Ma, Sarah Monazam Erfani, Michael E. Houle, James Bailey
2019 B conf
CLOUD
Yali Zhao, Rodrigo N. Calheiros, Athanasios V. Vasilakos, James Bailey, Richard O. Sinnott
2019 A* conf
ICCV
Yisen Wang, Xingjun Ma, Zaiyi Chen, Yuan Luo, Jinfeng Yi, James Bailey
2019 J jnl
CoRR
Yisen Wang, Xingjun Ma, Zaiyi Chen, Yuan Luo, Jinfeng Yi, James Bailey
2019 A* conf
IJCAI
Florin Schimbinschi, Christian Walder, Sarah M. Erfani, James Bailey
2019 conf
AIED (1)
Myles Davaris, Sudanthi N. R. Wijewickrema, Yun Zhou, Patorn Piromchai, James Bailey, Gregor E. Kennedy, Stephen J. O'Leary
2019 J jnl
CoRR
Xingjun Ma, Yuhao Niu, Lin Gu, Yisen Wang, Yitian Zhao, James Bailey, Feng Lu
2018 B conf
PRICAI
Mahtab Mirmomeni, Yousef Kowsar, Lars Kulik, James Bailey
2018 conf
ICLR
Xingjun Ma, Bo Li, Yisen Wang, Sarah M. Erfani, Sudanthi N. R. Wijewickrema, Grant Schoenebeck, Dawn Song, Michael E. Houle, James Bailey
2018 J jnl
CoRR
Xingjun Ma, Bo Li, Yisen Wang, Sarah M. Erfani, Sudanthi N. R. Wijewickrema, Michael E. Houle, Grant Schoenebeck, Dawn Song, James Bailey
2018 B conf
CBMS
Sudanthi N. R. Wijewickrema, Bridget Copson, Xingjun Ma, Robert Briggs, James Bailey, Gregor E. Kennedy, Stephen J. O'Leary
2018 A* conf
ICML
Xingjun Ma, Yisen Wang, Michael E. Houle, Shuo Zhou, Sarah M. Erfani, Shu-Tao Xia, Sudanthi N. R. Wijewickrema, James Bailey
2018 J jnl
CoRR
Xingjun Ma, Yisen Wang, Michael E. Houle, Shuo Zhou, Sarah M. Erfani, Shu-Tao Xia, Sudanthi N. R. Wijewickrema, James Bailey
2018 A conf
SDM
Mohadeseh Ganji, Jeffrey Chan, Peter J. Stuckey, James Bailey, Christopher Leckie, Kotagiri Ramamohanarao, Ian Davidson
2018 A* conf
CVPR
Yisen Wang, Weiyang Liu, Xingjun Ma, James Bailey, Hongyuan Zha, Le Song, Shu-Tao Xia
2018 J jnl
CoRR
Yisen Wang, Weiyang Liu, Xingjun Ma, James Bailey, Hongyuan Zha, Le Song, Shu-Tao Xia
2018 A* conf
AAAI
Mohadeseh Ganji, James Bailey, Peter J. Stuckey
2018 A conf
UAI
Yisen Wang, Bo Dai, Lingkai Kong, Sarah Monazam Erfani, James Bailey, Hongyuan Zha
2018 J jnl
CoRR
Yisen Wang, Bo Dai, Lingkai Kong, Sarah Monazam Erfani, James Bailey, Hongyuan Zha
2018 A* conf
ICDM
Shuo Zhou, Sarah M. Erfani, James Bailey
2018 J jnl
CoRR
Masud Moshtaghi, James C. Bezdek, Sarah M. Erfani, Christopher Leckie, James Bailey
2018 conf
AIED (1)
Sudanthi N. R. Wijewickrema, Xingjun Ma, Patorn Piromchai, Robert Briggs, James Bailey, Gregor E. Kennedy, Stephen J. O'Leary
2018 ch.
Encyclopedia of Database Systems (2nd ed.)
James Bailey, François Bry, Tim Furche, Sebastian Schaffert
2018 conf
ECML/PKDD (2)
Mohadeseh Ganji, Jeffrey Chan, Peter J. Stuckey, James Bailey, Christopher Leckie, Kotagiri Ramamohanarao, Laurence A. F. Park
2018 J jnl
Mach. Learn.
Simone Romano, Xuan Vinh Nguyen, Karin Verspoor, James Bailey
2017 A conf
CP
Mohadeseh Ganji, James Bailey, Peter J. Stuckey
2017 C conf
MobiQuitous
Somayeh Naderivesal, Lars Kulik, James Bailey
2017 A* conf
IJCAI
Xingjun Ma, Sudanthi N. R. Wijewickrema, Shuo Zhou, Yun Zhou, Zakaria Mhammedi, Stephen J. O'Leary, James Bailey
2017 B conf
SSDBM
Elham Naghizade, James Bailey, Lars Kulik, Egemen Tanin
2017 conf
MLDM
Goce Ristanoski, Rahul Soni, Sutharshan Rajasegarar, James Bailey, Christopher Leckie
2017 B conf
CBMS
Sudanthi N. R. Wijewickrema, Bridget Copson, Yun Zhou, Xingjun Ma, Robert Briggs, James Bailey, Gregor E. Kennedy, Stephen J. O'Leary
2017 A* conf
ICML
Zakaria Mhammedi, Andrew D. Hellicar, Ashfaqur Rahman, James Bailey
2017 J jnl
IEEE Trans. Fuzzy Syst.
Yang Lei, James C. Bezdek, Jeffrey Chan, Xuan Vinh Nguyen, Simone Romano, James Bailey
2017 J jnl
CoRR
Xingjun Ma, James Bailey, Sudanthi N. R. Wijewickrema, Shuo Zhou, Zakaria Mhammedi, Yun Zhou, Stephen J. O'Leary
2017 J jnl
CoRR
Sudanthi N. R. Wijewickrema, Xingjun Ma, James Bailey, Gregor E. Kennedy, Stephen J. O'Leary
2017 J jnl
CoRR
Xingjun Ma, Chunping Li, James Bailey, Sudanthi N. R. Wijewickrema
2017 A* conf
AAAI
Sarah M. Erfani, Mahsa Baktashmotlagh, Masud Moshtaghi, Vinh Nguyen, Christopher Leckie, James Bailey, Kotagiri Ramamohanarao
2017 J jnl
Pattern Recognit.
Yang Lei, James C. Bezdek, Simone Romano, Xuan Vinh Nguyen, Jeffrey Chan, James Bailey
2017 conf
MICCAI (2)
Xingjun Ma, Sudanthi N. R. Wijewickrema, Yun Zhou, Shuo Zhou, Stephen J. O'Leary, James Bailey
2017 J jnl
CoRR
Xingjun Ma, Sudanthi N. R. Wijewickrema, Yun Zhou, Shuo Zhou, Stephen J. O'Leary, James Bailey
2017 A* conf
ICDM
Shuo Zhou, Sarah M. Erfani, James Bailey
2017 B conf
CBMS
Xingjun Ma, Sudanthi N. R. Wijewickrema, Yun Zhou, Bridget Copson, James Bailey, Gregor E. Kennedy, Stephen J. O'Leary
2017 conf
WIFS
Laurent Amsaleg, James Bailey, Dominique Barbe, Sarah M. Erfani, Michael E. Houle, Vinh Nguyen, Milos Radovanovic
2017 J jnl
Expert Syst. Appl.
Florin Schimbinschi, Luís Moreira-Matias, Xuan Vinh Nguyen, James Bailey
2017 A* conf
AAAI
Yisen Wang, Simone Romano, Vinh Nguyen, James Bailey, Xingjun Ma, Shu-Tao Xia
2017 C conf
ICIS
Reeva Lederman, Dora Constantinidis, Tanya Linden, Linda Corrin, Jon M. Pearce, Wally Smith, James Bailey
2017 J jnl
Knowl. Inf. Syst.
Yang Lei, Xuan Vinh Nguyen, Jeffrey Chan, James Bailey
2016 A conf
SDM
Simone Romano, Xuan Vinh Nguyen, James Bailey, Karin Verspoor
2016 A* conf
KDD
Shuo Zhou, Xuan Vinh Nguyen, James Bailey, Yunzhe Jia, Ian Davidson
2016 J jnl
J. Mach. Learn. Res.
Simone Romano, Xuan Vinh Nguyen, James Bailey, Karin Verspoor
2016 ed.
PAKDD
James Bailey, Latifur Khan, Takashi Washio, Gillian Dobbie, Joshua Zhexue Huang, Ruili Wang
2016 ed.
PAKDD (2)
James Bailey, Latifur Khan, Takashi Washio, Gillian Dobbie, Joshua Zhexue Huang, Ruili Wang
2016 J jnl
Pattern Recognit.
Xuan Vinh Nguyen, Shuo Zhou, Jeffrey Chan, James Bailey
2016 J jnl
Int. J. Data Sci. Anal.
James Bailey, Latifur Khan, Takashi Washio
2016 J jnl
Data Min. Knowl. Discov.
Xuan Vinh Nguyen, Jeffrey Chan, Simone Romano, James Bailey, Christopher Leckie, Kotagiri Ramamohanarao, Jian Pei
2016 J jnl
CoRR
Zakaria Mhammedi, Andrew D. Hellicar, Ashfaqur Rahman, James Bailey
2016 J jnl
Knowl. Inf. Syst.
Lei Duan, Guanting Tang, Jian Pei, James Bailey, Guozhu Dong, Xuan Vinh Nguyen, Akiko Campbell, Changjie Tang
2016 J jnl
CoRR
Yang Lei, James C. Bezdek, Simone Romano, Xuan Vinh Nguyen, Jeffrey Chan, James Bailey
2016 A conf
SDM
Mohadeseh Ganji, James Bailey, Peter J. Stuckey
2016 A* conf
AAAI
Jiazhen He, Benjamin I. P. Rubinstein, James Bailey, Rui Zhang, Sandra Milligan, Jeffrey Chan
2016 B conf
ICPR
Simone Romano, Oussama Chelly, Vinh Nguyen, James Bailey, Michael E. Houle
2016 conf
ECML/PKDD (2)
Lida Rashidi, Andrey Kan, James Bailey, Jeffrey Chan, Christopher Leckie, Wei Liu, Sutharshan Rajasegarar, Kotagiri Ramamohanarao
2016 B conf
VRST
Sudanthi N. R. Wijewickrema, Yun Zhou, James Bailey, Gregor E. Kennedy, Stephen J. O'Leary
2016 A conf
SDM
Sarah M. Erfani, Mahsa Baktashmotlagh, Sutharshan Rajasegarar, Vinh Nguyen, Christopher Leckie, James Bailey, Kotagiri Ramamohanarao
2016 C conf
MobiQuitous
Tanusri Bhattacharya, Lars Kulik, James Bailey
2016 A* conf
IJCAI
Sarah M. Erfani, Mahsa Baktashmotlagh, Masud Moshtaghi, Vinh Nguyen, Christopher Leckie, James Bailey, Kotagiri Ramamohanarao
2016 conf
IEEE BigData
Yali Zhao, Rodrigo N. Calheiros, James Bailey, Richard O. Sinnott
2016 J jnl
Pers. Ubiquitous Comput.
Zilu Liang, Bernd Ploderer, Wanyu Liu, Yukiko Nagata, James Bailey, Lars Kulik, Yuxuan Li
2016 J jnl
CoRR
Jiazhen He, Rui Zhang, James Bailey, Benjamin I. P. Rubinstein, Sandra Milligan
2016 B conf
ICPR
Xuan Vinh Nguyen, Sarah M. Erfani, Sakrapee Paisitkriangkrai, James Bailey, Christopher Leckie, Kotagiri Ramamohanarao
2016 A conf
LAK
Sandra Milligan, Jiazhen He, James Bailey, Rui Zhang, Benjamin I. P. Rubinstein
2016 J jnl
IEEE Trans. Knowl. Data Eng.
Laurence Anthony F. Park, James C. Bezdek, Christopher Leckie, Kotagiri Ramamohanarao, James Bailey, Marimuthu Palaniswami
2015 A conf
SDM
Chia-Tung Kuo, James Bailey, Ian Davidson
2015 J jnl
Mach. Learn.
Xuan-Hong Dang, James Bailey
2015 conf
MICCAI (1)
Yun Zhou, Ioanna Ioannou, Sudanthi N. R. Wijewickrema, James Bailey, Gregor E. Kennedy, Stephen J. O'Leary
2015 J jnl
Pervasive Mob. Comput.
Tanusri Bhattacharya, Lars Kulik, James Bailey
2015 conf
JSAI-isAI Workshops
Zilu Liang, Wanyu Liu, Bernd Ploderer, James Bailey, Lars Kulik, Yuxuan Li
2015 B conf
ICMI
Sergey Demyanov, James Bailey, Kotagiri Ramamohanarao, Christopher Leckie
2015 J jnl
Data Knowl. Eng.
Yuxuan Li, James Bailey, Lars Kulik
2015 J jnl
Mach. Learn.
Eric Bae, James Bailey
2015 conf
ECML/PKDD (2)
Mohadeseh Ganji, Abbas Seifi, Hosein Alizadeh, James Bailey, Peter J. Stuckey
2015 Misc conf
UbiComp
Elham Naghizade, James Bailey, Lars Kulik, Egemen Tanin
2015 A* conf
AAAI
Jiazhen He, James Bailey, Benjamin I. P. Rubinstein, Rui Zhang
2015 J jnl
CoRR
Sergey Demyanov, James Bailey, Kotagiri Ramamohanarao, Christopher Leckie
2015 J jnl
CoRR
Jiazhen He, Benjamin I. P. Rubinstein, James Bailey, Rui Zhang, Sandra Milligan, Jeffrey Chan
2015 J jnl
Intell. Data Anal.
Guanting Tang, Jian Pei, James Bailey, Guozhu Dong
2015 J jnl
Data Min. Knowl. Discov.
Lei Duan, Guanting Tang, Jian Pei, James Bailey, Akiko Campbell, Changjie Tang
2015 A ed.
CIKM
James Bailey, Alistair Moffat, Charu C. Aggarwal, Maarten de Rijke, Ravi Kumar, Vanessa Murdock, Timos K. Sellis, Jeffrey Xu Yu
2015 J jnl
Pattern Recognit. Lett.
Andrey Kan, John Markham, Rajib Chakravorty, James Bailey, Christopher Leckie
2015 B conf
CBMS
Sudanthi N. R. Wijewickrema, Ioanna Ioannou, Yun Zhou, Patorn Piromchai, James Bailey, Gregor E. Kennedy, Stephen J. O'Leary
2015 conf
PAKDD (2)
Xuan Vinh Nguyen, Jeffrey Chan, James Bailey, Christopher Leckie, Kotagiri Ramamohanarao, Jian Pei
2015 conf
IEEE BigData
Florin Schimbinschi, Xuan Vinh Nguyen, James Bailey, Christopher Leckie, Hai Le Vu, Rao Kotagiri
2015 conf
SIGSPATIAL/GIS
Kushani Perera, Tanusri Bhattacharya, Lars Kulik, James Bailey
2014 conf
MMVR
Sudanthi N. R. Wijewickrema, Ioanna Ioannou, Yun Zhou, Patorn Piromchai, James Bailey, Gregor E. Kennedy, Stephen J. O'Leary
2014 B conf
MUM
Yujue Qin, Tanusri Bhattacharya, Lars Kulik, James Bailey
2014 A* conf
KDD
Xuan Vinh Nguyen, Jeffrey Chan, Simone Romano, James Bailey
2014 A conf
SDM
Yuxuan Li, James Bailey, Lars Kulik, Jian Pei
2014 conf
DASFAA (2)
Jiazhen He, James Bailey, Rui Zhang
2014 conf
ECML/PKDD (2)
Yang Lei, Xuan Vinh Nguyen, Jeffrey Chan, James Bailey
2014 C conf
CIDM
Yang Lei, James C. Bezdek, Jeffrey Chan, Xuan Vinh Nguyen, Simone Romano, James Bailey
2014 J jnl
Data Min. Knowl. Discov.
Xuan-Hong Dang, James Bailey
2014 B conf
PRICAI
Yamuna Kankanige, James Bailey
2014 B conf
MUM
Anthony Quattrone, Tanusri Bhattacharya, Lars Kulik, Egemen Tanin, James Bailey
2014 conf
PAKDD (1)
Lei Duan, Guanting Tang, Jian Pei, James Bailey, Guozhu Dong, Akiko Campbell, Changjie Tang
2014 A* conf
AAAI
Xuan Vinh Nguyen, Jeffrey Chan, James Bailey
2014 A* conf
ICML
Simone Romano, James Bailey, Xuan Vinh Nguyen, Karin Verspoor
2014 conf
PAKDD (1)
Jeffrey Chan, Xuan Vinh Nguyen, Wei Liu, James Bailey, Christopher Leckie, Kotagiri Ramamohanarao, Jian Pei
2014 A* conf
ICDM
Jeffrey Chan, Christopher Leckie, James Bailey, Kotagiri Ramamohanarao
2014 B conf
ICPR
Yun Zhou, Ioanna Ioannou, Sudanthi N. R. Wijewickrema, James Bailey, Patorn Piromchai, Gregor E. Kennedy, Stephen J. O'Leary
2014 ed.
PAKDD Workshops
Wen-Chih Peng, Haixun Wang, James Bailey, Vincent S. Tseng, Tu Bao Ho, Zhi-Hua Zhou, Arbee L. P. Chen
2013 conf
ECML/PKDD (2)
Wei Liu, Jeffrey Chan, James Bailey, Christopher Leckie, Fang Chen, Kotagiri Ramamohanarao
2013 J jnl
World Wide Web
Andrey Kan, Jeffrey Chan, Conor Hayes, Bernie Hogan, James Bailey, Christopher Leckie
2013 A* conf
KDD
Goce Ristanoski, Wei Liu, James Bailey
2013 ch.
Data Clustering: Algorithms and Applications
James Bailey
2013 B conf
FUZZ-IEEE
Timothy C. Havens, James C. Bezdek, Christopher Leckie, Jeffrey Chan, Wei Liu, James Bailey, Kotagiri Ramamohanarao, Marimuthu Palaniswami
2013 J jnl
Pattern Recognit.
Xuan Vinh Nguyen, James Bailey
2013 conf
MICCAI (3)
Yun Zhou, James Bailey, Ioanna Ioannou, Sudanthi N. R. Wijewickrema, Gregor E. Kennedy, Stephen J. O'Leary
2013 book
Guozhu Dong, James Bailey
2013 A conf
CIKM
Jeffrey Chan, Wei Liu, Andrey Kan, Christopher Leckie, James Bailey, Kotagiri Ramamohanarao
2013 J jnl
BMC Bioinform.
Raj K. Gaire, Lorey Smith, Patrick Humbert, James Bailey, Peter J. Stuckey, Izhak Haviv
2013 A conf
CIKM
Goce Ristanoski, Wei Liu, James Bailey
2013 J jnl
Pattern Recognit.
Andrey Kan, Christopher Leckie, James Bailey, John Markham, Rajib Chakravorty
2013 ch.
Contrast Data Mining
James Bailey, Kotagiri Ramamohanarao
2013 ch.
Contrast Data Mining
James Bailey, Elsa Loekito
2013 ch.
Contrast Data Mining
James Bailey
2013 A conf
SDM
James Bailey, Jeffrey Chan, Kotagiri Ramamohanarao, Christopher Leckie, Wei Liu
2013 A* conf
ICDM
Yuxuan Li, James Bailey, Lars Kulik, Jian Pei
2013 B conf
SSDBM
Guanting Tang, James Bailey, Jian Pei, Guozhu Dong
2013 B conf
VRST
Yun Zhou, James Bailey, Ioanna Ioannou, Sudanthi N. R. Wijewickrema, Stephen J. O'Leary, Gregor E. Kennedy
2013 ch.
Contrast Data Mining
James Bailey
2013 conf
PAKDD (1)
Goce Ristanoski, Wei Liu, James Bailey
2012 J jnl
CoRR
Andrey Kan, Jeffrey Chan, Conor Hayes, Bernie Hogan, James Bailey, Christopher Leckie
2012 C conf
ACML
Sergey Demyanov, James Bailey, Kotagiri Ramamohanarao, Christopher Leckie
2012 ed.
PAKDD (2)
Pang-Ning Tan, Sanjay Chawla, Chin Kuan Ho, James Bailey
2012 ed.
PAKDD (1)
Pang-Ning Tan, Sanjay Chawla, Chin Kuan Ho, James Bailey
2012 conf
Australasian Conference on Artificial Intelligence
Wei Liu, Sanjay Chawla, James Bailey, Christopher Leckie, Kotagiri Ramamohanarao
2012 J jnl
IEEE Trans. Inf. Technol. Biomed.
Rahil Garnavi, Mohammad Aldeen, James Bailey
2012 conf
SIGSPATIAL/GIS
Tanusri Bhattacharya, Lars Kulik, James Bailey
2012 conf
MultiClust@SDM
Xuan-Hong Dang, Ira Assent, James Bailey
2012 ed.
PAKDD Workshops
Longbing Cao, Joshua Zhexue Huang, James Bailey, Yun Sing Koh, Jun Luo
2012 A conf
CIKM
Wei Liu, Andrey Kan, Jeffrey Chan, James Bailey, Christopher Leckie, Jian Pei, Kotagiri Ramamohanarao
2012 B conf
WISE
Xiuzhen Zhang, Yun Zhou, James Bailey, Kotagiri Ramamohanarao
2012 A* conf
KDD
Jeffrey Chan, Wei Liu, Christopher Leckie, James Bailey, Kotagiri Ramamohanarao
2012 A conf
CIKM
Wei Liu, Jeffrey Chan, James Bailey, Christopher Leckie, Kotagiri Ramamohanarao
2012 J jnl
ACM Trans. Knowl. Discov. Data
Jeffrey Chan, James Bailey, Christopher Leckie, Michael E. Houle
2011 conf
Australasian Conference on Artificial Intelligence
Goce Ristanoski, James Bailey
2011 J jnl
J. Biomed. Informatics
Bader Aljaber, David Martínez, Nicola Stokes, James Bailey
2011 conf
ICDM Workshops
Guozhu Dong, James Bailey
2010 conf
PAKDD (1)
Md. Rafiul Hassan, Kotagiri Ramamohanarao, Chandan K. Karmakar, M. Maruf Hossain, James Bailey
2010 J jnl
Knowl. Inf. Syst.
Elsa Loekito, James Bailey, Jian Pei
2010 J jnl
Data Min. Knowl. Discov.
Eric Bae, James Bailey, Guozhu Dong
2010 J jnl
BMC Bioinform.
Lei Zhang, James Bailey, Arun Siddharth Konagurthu, Kotagiri Ramamohanarao
2010 A* conf
KDD
Xuan-Hong Dang, James Bailey
2010 Misc conf
DICTA
Rahil Garnavi, Mohammad Aldeen, James Bailey
2010 J jnl
Neurocomputing
Xiaonan Ji, James Bailey, Kotagiri Ramamohanarao
2010 J jnl
Inf. Retr.
Bader Aljaber, Nicola Stokes, James Bailey, Jian Pei
2010 J jnl
Inf. Process. Lett.
James Bailey, Elsa Loekito
2010 J jnl
Inf. Process. Lett.
Cui Yu, James Bailey, Julian Montefusco, Rui Zhang, Jiling Zhong
2010 A conf
SDM
Xuan-Hong Dang, James Bailey
2010 J jnl
J. Mach. Learn. Res.
Xuan Vinh Nguyen, Julien Epps, James Bailey
2010 J jnl
ACM Trans. Comput. Log.
James Bailey, Guozhu Dong, Anthony Widjaja To
2010 J jnl
Bioinform.
Raj K. Gaire, James Bailey, Jennifer Bearfoot, Ian G. Campbell, Peter J. Stuckey, Izhak Haviv
2010 A* conf
ICDE
Xiaoyan Liu, Xindong Wu, Huaiqing Wang, Rui Zhang, James Bailey, Kotagiri Ramamohanarao
2010 J jnl
Pattern Recognit. Lett.
Geoff MacIntyre, James Bailey, Daniel Gustafsson, Izhak Haviv, Adam Kowalczyk
2010 J jnl
Bioinform.
Geoff MacIntyre, James Bailey, Izhak Haviv, Adam Kowalczyk
2010 J jnl
BMC Bioinform.
Geoff MacIntyre, James Bailey, Izhak Haviv, Adam Kowalczyk
2009 ch.
Safety and Security in Multiagent Systems
Amy Unruh, James Bailey, Kotagiri Ramamohanarao
2009 Misc conf
AusDM
Andrey Kan, Jeffrey Chan, James Bailey, Christopher Leckie
2009 J jnl
BMC Bioinform.
Md. Rafiul Hassan, M. Maruf Hossain, James Bailey, Geoff MacIntyre, Joshua Wing Kei Ho, Kotagiri Ramamohanarao
2009 J jnl
Web Intell. Agent Syst.
Amy Unruh, James Bailey, Kotagiri Ramamohanarao
2009 A conf
SDM
Shaoyi Zhang, M. Maruf Hossain, Md. Rafiul Hassan, James Bailey, Kotagiri Ramamohanarao
2009 A* conf
ICML
Xuan Vinh Nguyen, Julien Epps, James Bailey
2009 ch.
Encyclopedia of Database Systems
James Bailey, François Bry, Tim Furche, Sebastian Schaffert
2009 B conf
PAKDD
Elsa Loekito, James Bailey
2009 J jnl
Intell. Data Anal.
Jeffrey Chan, James Bailey, Christopher Leckie
2008 J jnl
Knowl. Inf. Syst.
Jeffrey Chan, James Bailey, Christopher Leckie
2008 conf
PRIB
Geoff MacIntyre, James Bailey, Daniel Gustafsson, Alex Boussioutas, Izhak Haviv, Adam Kowalczyk
2008 conf
ECML/PKDD (1)
Md. Rafiul Hassan, M. Maruf Hossain, James Bailey, Kotagiri Ramamohanarao
2008 J jnl
CoRR
James Bailey, Guozhu Dong, Anthony Widjaja To
2008 A conf
CIKM
Elsa Loekito, James Bailey
2008 C conf
APWeb
Xiaonan Ji, Gu Xu, James Bailey, Hang Li
2008 A conf
SDM
M. Maruf Hossain, Md. Rafiul Hassan, James Bailey
2008 B ed.
WISE
James Bailey, David Maier, Klaus-Dieter Schewe, Bernhard Thalheim, Xiaoyang Sean Wang
2008 conf
PRIB
Xiaonan Ji, James Bailey, Kotagiri Ramamohanarao
2007 conf
ICDM Workshops
Xiaonan Ji, James Bailey
2007 Misc conf
AusDM
Elsa Loekito, James Bailey
2007 Misc ed.
ADC
James Bailey, Alan D. Fekete
2007 Misc conf
APCCM
James Bailey, Ce Dong
2007 J jnl
Knowl. Inf. Syst.
Xiaonan Ji, James Bailey, Guozhu Dong
2006 A conf
ER
Ce Dong, James Bailey
2006 conf
IAT
Amy Unruh, James Bailey, Kotagiri Ramamohanarao
2006 A* conf
ICDM
Eric Bae, James Bailey
2006 conf
Australian Conference on Artificial Intelligence
Eric Bae, James Bailey, Guozhu Dong
2006 Misc ed.
ADC
Gillian Dobbie, James Bailey
2006 conf
ICDM Workshops
Jeffrey Chan, James Bailey, Christopher Leckie
2006 A* conf
KDD
Elsa Loekito, James Bailey
2006 conf
Australian Conference on Artificial Intelligence
Xiaoyuan Qian, James Bailey, Christopher Leckie
2006 A conf
SDM
Roger Ming Hieng Ting, James Bailey
2006 ed.
PPSWR
José Júlio Alferes, James Bailey, Wolfgang May, Uta Schwertel
2006 J jnl
J. Data Semant.
Stella Waworuntu, James Bailey
2005 conf
WWW (Special interest tracks and posters)
James Bailey, François Bry, Paula-Lavinia Patranjan
2005 C conf
PADL
James Bailey, Peter J. Stuckey
2005 conf
RuleML
James Bailey, François Bry, Michael Eckert, Paula-Lavinia Patranjan
2005 A* conf
ICDM
Xiaonan Ji, James Bailey, Guozhu Dong
2005 B conf
WISE
Ce Dong, James Bailey
2005 conf
Reasoning Web
James Bailey, François Bry, Tim Furche, Sebastian Schaffert
2004 ch.
Web Dynamics
James Bailey, George Papamarkos, Alexandra Poulovassilis, Peter T. Wood
2004 conf
CoopIS/DOA/ODBASE (1)
Amy Unruh, James Bailey, Kotagiri Ramamohanarao
2004 J jnl
Theor. Comput. Sci.
James Bailey, Guozhu Dong, Kotagiri Ramamohanarao
2004 B conf
WISE
Ce Dong, James Bailey
2004 B conf
PAKDD
Roger Ming Hieng Ting, James Bailey, Kotagiri Ramamohanarao
2004 Misc conf
ADC
Ce Dong, James Bailey
2004 A conf
ER
Stella Waworuntu, James Bailey
2003 A* conf
ICDM
James Bailey, Thomas Manoukian, Kotagiri Ramamohanarao
2003 conf
WAIM
James Bailey, Thomas Manoukian, Kotagiri Ramamohanarao
2003 B conf
WISE
Eric Bae, James Bailey
2003 conf
Australian Conference on Artificial Intelligence
Kotagiri Ramamohanarao, James Bailey
2002 A* conf
WWW
James Bailey, Alexandra Poulovassilis, Peter T. Wood
2002 J jnl
Comput. Networks
James Bailey, Alexandra Poulovassilis, Peter T. Wood
2002 conf
PKDD
James Bailey, Thomas Manoukian, Kotagiri Ramamohanarao
2001 conf
DBPL
James Bailey, Alexandra Poulovassilis, Simon Courtenage
2001 B conf
ICTAI
Kotagiri Ramamohanarao, James Bailey, Paolo Busetta
2000 conf
Computational Logic
James Bailey, Alexandra Poulovassilis, Peter Newson
1999 J jnl
J. Intell. Inf. Syst.
James Bailey, Alexandra Poulovassilis
1999 conf
DBPL
James Bailey, Alexandra Poulovassilis
1999 A conf
ICDT
James Bailey, Guozhu Dong
1998 A* conf
PODS
James Bailey, Guozhu Dong, Kotagiri Ramamohanarao
1998 J jnl
Distributed Parallel Databases
James Bailey, Guozhu Dong, Mukesh K. Mohania, Xiaoyang Sean Wang
1997 A conf
ICDT
James Bailey, Lobel Crnogorac, Kotagiri Ramamohanarao, Harald Søndergaard
1997 A conf
ICDT
James Bailey, Guozhu Dong, Kotagiri Ramamohanarao
1995 conf
Rules in Database Systems
James Bailey, Michael P. Georgeff, David B. Kemp, David Kinny, Kotagiri Ramamohanarao
1995 Misc conf
Australasian Database Conference
James Bailey, Kotagiri Ramamohanarao
APK_CODE_ANALYSIS_PDD-Tech_Annex.md
← Index APK_CODE_ANALYSIS_PDD-Tech_Annex.md markdown
# APK Code Analysis — Technical Annex

**Companion to:** APK_CODE_ANALYSIS_PDD.md
**Audience:** Engineers implementing APK code analysis
**Date:** 2026-03-07

---

## Table of Contents

1. [File Structure](#1-file-structure)
2. [System Dependencies Setup](#2-system-dependencies-setup)
3. [Phase 1 — Core Infrastructure](#3-phase-1--core-infrastructure)
4. [Phase 2 — Extractor and Data Export](#4-phase-2--extractor-and-data-export)
5. [Phase 3 — Similarity and Obfuscation](#5-phase-3--similarity-and-obfuscation)
6. [Phase 4 — Integration Testing](#6-phase-4--integration-testing)
7. [ClickHouse Schema](#7-clickhouse-schema)
8. [Androguard API Quick Reference](#8-androguard-api-quick-reference)
9. [Smali Format Reference](#9-smali-format-reference)

---

## SDLC Requirements

**Each phase ends with a quality gate:**

1. All new code has unit tests (mocked externals — no JADX/apktool/Java required)
2. All existing tests pass (`pytest tests/unit/` — must remain at 579+ tests passing)
3. New tests are added to the appropriate test file and documented
4. `TEST_INDEX.md` is updated with new test counts and file descriptions
5. Code passes `flake8`, `pylint`, `black`, `isort` (existing dev tools in `requirements.txt`)
6. Commit only after all tests pass. Move to next phase only after commit.

---

## 1. File Structure

### New files to create:

```
redb/extractors/decompiler/
├── DecompileAPK.py                    # Main extractor (like DecompileBinja.py)
├── apk/
│   ├── __init__.py
│   ├── analyzer.py                    # APKCodeAnalyzer — orchestrates analysis
│   ├── jadx_wrapper.py               # JADXDecompiler — subprocess + output parsing
│   ├── apktool_wrapper.py            # ApktoolDisassembler — subprocess + smali parsing
│   ├── method_extractor.py           # Per-method content extraction and hashing
│   ├── library_filter.py             # Package-based library filtering
│   └── smali_parser.py               # Smali file parsing — method boundary detection

tests/unit/
├── test_apk_code_analyzer.py          # Analyzer, library filtering, method enumeration
├── test_apk_jadx_wrapper.py           # JADX subprocess, output parsing, timeouts
├── test_apk_apktool_wrapper.py        # Apktool subprocess, smali parsing, timeouts
├── test_apk_method_extractor.py       # Hashing, content extraction, similarity
├── test_apk_decompile_extractor.py    # DecompileAPK extractor, export, schema

docs/
└── apk-code-schema.md                 # ClickHouse table definitions (like new-code-binja-schema.md)
```

### Files to modify:

```
redb/extractors/enum.py               # Add APK_DECOMPILED tag
redb/models/dataclasses.py            # Add APK code analysis dataclasses
redb/workers.py                        # Wire up DecompileAPK in APK dispatch
tests/TEST_INDEX.md                    # Update test inventory
```

---

## 2. System Dependencies Setup

### JADX Installation

```bash
# Option 1: Download from GitHub releases
wget https://github.com/skylot/jadx/releases/download/v1.5.5/jadx-1.5.5.zip
unzip jadx-1.5.5.zip -d /opt/jadx
ln -s /opt/jadx/bin/jadx /usr/local/bin/jadx

# Option 2: Package manager (if available)
# apt install jadx  OR  brew install jadx

# Verify
jadx --version
```

### apktool Installation

```bash
# Download wrapper script + jar
wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool
wget https://github.com/iBotPeaches/Apktool/releases/download/v2.12.0/apktool_2.12.0.jar
mv apktool_2.12.0.jar /usr/local/bin/apktool.jar
mv apktool /usr/local/bin/apktool
chmod +x /usr/local/bin/apktool

# Verify
apktool --version
```

### Java Runtime

```bash
apt install openjdk-17-jre-headless
java -version
```

### Docker considerations

If running in Docker, add to Dockerfile:

```dockerfile
RUN apt-get update && apt-get install -y openjdk-17-jre-headless
# Then install jadx and apktool as above
```

---

## 3. Phase 1 — Core Infrastructure

### Task 1.1: Library Filter (`library_filter.py`)

**What to build:** A class that determines whether a method belongs to a known library/framework package and should be filtered out of content tables.

**Behavior:**
- Accept a list of package prefixes (default list in PDD §2.3)
- Configurable via `APK_LIBRARY_PREFIXES` environment variable (comma-separated)
- Method `is_library(class_name: str) -> bool` — returns True if class_name starts with any filter prefix
- Method `get_filter_stats() -> dict` — returns counts of filtered vs. retained classes (for logging)

**Reference pattern:** Similar to `is_lib_or_thunk()` in `redb/extractors/decompiler/bninja/decompiler.py` (module-level function that checks `symbol.type` against `SymbolType.LibraryFunctionSymbol`, etc.)

**Tests:** Unit tests with various class names, custom prefix lists, env var override.

---

### Task 1.2: Smali Parser (`smali_parser.py`)

**What to build:** Parser that reads apktool's smali output files and extracts individual method bodies.

**apktool output structure:**
```
<tmpdir>/smali/com/example/MyClass.smali
```

Each `.smali` file contains one class with all its methods. Method boundaries are delimited by:
```smali
.method public onCreate(Landroid/os/Bundle;)V
    .registers 4
    .param p1, "savedInstanceState"

    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
    const/high16 v0, 0x7f090000
    invoke-virtual {p0, v0}, Lcom/example/MyClass;->setContentView(I)V
    return-void
.end method
```

**Methods to implement:**
- `parse_smali_file(filepath: str) -> List[SmaliMethod]` — Returns list of `(class_name, method_name, method_signature, method_body, instruction_count, register_count)`
- `parse_smali_directory(dirpath: str) -> Dict[str, SmaliMethod]` — Parses all `.smali` files, returns dict keyed by `class_name->method_name(signature)`
- `normalize_smali_body(body: str) -> str` — Strip comments, normalize whitespace, remove line numbers (`.line N` directives) for consistent hashing
- `count_instructions(body: str) -> int` — Count actual Dalvik instructions (skip directives like `.registers`, `.param`, `.line`, `.local`, `.annotation`)

**Key parsing rules:**
- Method starts with `.method` line, ends with `.end method`
- Access modifiers: `public`, `private`, `protected`, `static`, `final`, `abstract`, `native`
- Skip `abstract` and `native` methods (no body)
- Dalvik instructions start with a verb: `invoke-*`, `const*`, `move*`, `if-*`, `goto*`, `return*`, `new-*`, `iget*`, `iput*`, `sget*`, `sput*`, `aget*`, `aput*`, etc.
- Directives start with `.` — these are metadata, not instructions

**Tests:** Parse sample smali files, verify method boundaries, instruction counts, normalization.

---

### Task 1.3: JADX Wrapper (`jadx_wrapper.py`)

**What to build:** Subprocess wrapper for JADX decompilation, following the CAPA extractor pattern.

**Reference implementation:** `redb/extractors/capa.py` — uses `subprocess.Popen` with process group management and timeout escalation (SIGTERM → wait 3s → SIGKILL).

**Methods to implement:**
- `__init__(jadx_path, timeout, log)` — Configure from env vars `JADX_PATH` and `JADX_TIMEOUT`
- `decompile(apk_path: str, output_dir: str) -> bool` — Run JADX, return success/failure
- `parse_java_methods(output_dir: str) -> Dict[str, str]` — Parse JADX output into per-method Java source, keyed by `class_name.method_name(param_types)`
- `cleanup(output_dir: str)` — Remove temp directory

**JADX command:**
```bash
jadx --no-res --no-imports --threads-count 2 --output-dir <tmpdir>/jadx <apk_path>
```

**Output structure from JADX:**
```
<tmpdir>/jadx/sources/com/example/MyClass.java
```

Each `.java` file contains one class. Methods must be extracted by parsing Java source (find method signatures via regex or simple brace-counting parser).

**Java method extraction approach:**
- Use regex to find method declarations: `(public|private|protected|static|...)*\s+\w+\s+\w+\s*\([^)]*\)\s*\{`
- Track brace depth to find method end
- Key each method by `fully.qualified.ClassName.methodName(ParamType1, ParamType2)`
- Normalize: strip leading/trailing whitespace, normalize indentation

**Tests:** Mock subprocess, test output parsing with sample Java files, test timeout handling, test error recovery.

---

### Task 1.4: Apktool Wrapper (`apktool_wrapper.py`)

**What to build:** Subprocess wrapper for apktool disassembly, same pattern as JADX wrapper.

**Methods to implement:**
- `__init__(apktool_path, timeout, log)` — Configure from env vars `APKTOOL_PATH` and `APKTOOL_TIMEOUT`
- `disassemble(apk_path: str, output_dir: str) -> bool` — Run apktool, return success/failure
- `get_smali_directory(output_dir: str) -> str` — Return path to smali output (handles multi-dex: `smali/`, `smali_classes2/`, `smali_classes3/`, etc.)
- `cleanup(output_dir: str)` — Remove temp directory

**apktool command:**
```bash
apktool d --no-res --force --output <tmpdir>/apktool <apk_path>
```

**Multi-DEX handling:** apktool creates `smali/` for `classes.dex`, `smali_classes2/` for `classes2.dex`, etc. The wrapper must iterate all `smali*` directories.

**Tests:** Mock subprocess, test multi-dex directory detection, test timeout handling.

---

### Task 1.5: APK Code Analyzer (`analyzer.py`)

**What to build:** Orchestrator that combines androguard, JADX, and apktool into a single analysis engine. This is the APK equivalent of `BinaryNinjaDecompiler` in `redb/extractors/decompiler/bninja/decompiler.py`.

**Constructor:**
- `__init__(filepath, timeout, log, decompile_modules={"all"})` — Same module selection pattern as `BinaryNinjaDecompiler`

**Main method — `extract() -> dict`:**

1. Create temp directories for JADX and apktool output
2. Run JADX and apktool in parallel (use `concurrent.futures.ThreadPoolExecutor` with 2 workers)
3. While JADX/apktool run, start androguard analysis: `AnalyzeAPK(filepath)` → get `(apk, dexs, analysis)`
4. Wait for JADX and apktool to complete
5. Parse smali output → `Dict[method_key, SmaliMethod]`
6. Parse Java output → `Dict[method_key, str]`
7. Get method list from androguard `analysis.get_methods()`
8. For each method from androguard:
   a. Check if library → skip content if yes (but keep in xref arrays)
   b. Look up smali body from parsed smali output
   c. Look up Java source from parsed Java output
   d. Get xrefs: `method.get_xref_from()` (callers) and `method.get_xref_to()` (callees)
   e. Compute hashes (SHA-256 of normalized smali, SHA-256 of normalized Java)
   f. Apply minimum instruction filter (`APK_MIN_METHOD_INSTRUCTIONS`, default 5)
   g. Build content and reference records
9. Return results dict with keys: `decompiled_content`, `decompiled_refs`, `smali_content`, `smali_refs`, `similarity_metrics`, `analysis_errors`

**Method key matching:**
The critical challenge is matching methods across three tools that use different naming conventions:
- **Androguard:** `Lcom/example/MyClass;->onCreate(Landroid/os/Bundle;)V` (Dalvik descriptor format)
- **Smali (apktool):** Same Dalvik descriptor format (same as androguard)
- **Java (JADX):** `com.example.MyClass.onCreate(Bundle)` (Java format)

Build a `method_key_converter` utility that normalizes between these formats:
- `dalvik_to_java(descriptor: str) -> str` — Convert `Lcom/example/MyClass;->onCreate(Landroid/os/Bundle;)V` to `com.example.MyClass.onCreate(Bundle)`
- `java_to_dalvik(java_sig: str) -> str` — Reverse mapping (may not be needed)

**Reference pattern:** Study `BinaryNinjaDecompiler.analyze_binary()` in `redb/extractors/decompiler/bninja/decompiler.py` — it follows the same per-function loop with content extraction, hash computation, and cross-linking.

**Tests:** Mock all three tools, test method key matching, test library filtering integration, test parallel execution, test error handling when one tool fails.

---

### Phase 1 Quality Gate

After completing Tasks 1.11.5:

```bash
# Run all existing tests — must pass
pytest tests/unit/ -v

# Run new tests
pytest tests/unit/test_apk_code_analyzer.py tests/unit/test_apk_jadx_wrapper.py \
       tests/unit/test_apk_apktool_wrapper.py -v

# Linting
black redb/extractors/decompiler/apk/ tests/unit/test_apk_*.py
isort redb/extractors/decompiler/apk/ tests/unit/test_apk_*.py
flake8 redb/extractors/decompiler/apk/
```

Update `TEST_INDEX.md` with new test file entries. Commit.

---

## 4. Phase 2 — Extractor and Data Export

### Task 2.1: Tag Enum Update

**File:** `redb/extractors/enum.py`

Add after the existing APK tags:

```python
APK_DECOMPILED = "apk_decompiled"
```

---

### Task 2.2: Dataclasses

**File:** `redb/models/dataclasses.py`

Add the 6 dataclasses defined in PDD §4.1:
- `APKDecompiledMethodContent`
- `APKDecompiledMethodReference`
- `APKSmaliMethodContent`
- `APKSmaliMethodReference`
- `APKMethodSimilarityMetrics`
- `APKCodeAnalysisError`

Follow the exact style of existing dataclasses in the file. Use `Optional` for nullable fields, `field(default_factory=list)` for list defaults.

---

### Task 2.3: DecompileAPK Extractor (`DecompileAPK.py`)

**What to build:** The main extractor class, following `DecompileBinja.py` exactly.

**File:** `redb/extractors/decompiler/DecompileAPK.py`

**Pattern to follow (from `DecompileBinja.py`):**
- Extends `Extractor` directly
- Constructor: filepath, log, exporters, index_prefix, filetype
- Timeouts from env vars: `APK_DECOMPILE_TIMEOUT` (default 1800s)
- `extract()`: Run `APKCodeAnalyzer` in a daemon thread with timeout (same pattern as DecompileBinja)
- `tag()`: Return `Tag.APK_DECOMPILED.value`
- `prepare_export_data()`: Build `multi_table` dict for ClickHouse export
- `cleanup_run()`: Remove temp directories, force GC
- `get_clickhouse_table()`: Return `None` (multi-table export, no single table)

**Multi-table export structure** (from `prepare_export_data` — follow the exact pattern in `DecompileBinja.prepare_export_data()`):

```python
export_data = {"multi_table": True}

# Table 1: Decompiled method content
if self.analysis_results.get("decompiled_content"):
    export_data["code_apk_decompiled_methods_content"] = {
        "data": [...],
        "column_names": [...],
        "column_type_names": [...]
    }

# Table 2: Decompiled method references
# Table 3: Smali method content
# Table 4: Smali method references
# Table 5: Similarity metrics
# Table 6: Analysis errors
```

**Column names and types** must match the ClickHouse schema in §7. Study `DecompileBinja.prepare_export_data()` for the exact tuple format.

---

### Task 2.4: ClickHouse Schema Functions

**File:** `docs/apk-code-schema.md`

Create table creation functions following `docs/new-code-binja-schema.md` pattern. Full schema in §7 below.

---

### Task 2.5: Workers Integration

**File:** `redb/workers.py`

In the APK processing section (search for `apk` filetype handling), add `DecompileAPK` after the existing APK extractors.

Follow the same conditional pattern used for `DecompileBinja`:
- Check if module is selected
- Instantiate with filepath, logger, exporters
- Call `export_data()`

Also update `get_module_by_name()` to register `"DecompileAPK"` in the modules map.

---

### Phase 2 Quality Gate

```bash
pytest tests/unit/ -v                          # All existing + new tests pass
pytest tests/unit/test_apk_decompile_extractor.py -v   # New extractor tests
pytest tests/unit/test_apk_dataclasses.py -v           # Updated dataclass tests
```

Update `TEST_INDEX.md`. Commit.

---

## 5. Phase 3 — Similarity and Obfuscation

### Task 3.1: Method-Level Similarity Hashes

**File:** Extend `method_extractor.py`

Compute for each user method's smali body:
- **ssdeep** — Use `ppdeep` (already in requirements): `ppdeep.hash(smali_body.encode())`
- **TLSH** — Use `tlsh` (already in requirements): `tlsh.hash(smali_body.encode())`
- **MinHash** — Use existing `MinHashCustom` from `redb/extractors/decompiler/bninja/similarity.py`. Generate n-grams from smali instructions, compute MinHash signature.

**Reference:** Study `BinaryNinjaDecompiler.analyze_binary()` where it computes `ssdeep_disassembly`, `tlsh_disassembly`, and calls `MinHasher`.

**Minimum size for fuzzy hashes:** ssdeep and TLSH both require minimum input sizes. Skip if smali body is too short (ssdeep < 4096 bytes returns empty, TLSH < 50 bytes returns empty).

---

### Task 3.2: Obfuscation Indicators (per method)

**File:** Extend `method_extractor.py`

For each method's smali body, compute:
- `short_method_name`: method name length <= 2
- `short_class_name`: class simple name (after last `/`) length <= 2
- `has_string_encryption`: presence of `const-string` followed within 3 instructions by `invoke-*` to known decryptor patterns
- `has_reflection_calls`: presence of `invoke-*` targeting `Ljava/lang/reflect/*` or `Ljava/lang/Class;->forName`
- `excessive_goto_count`: count of `goto` / `goto/16` / `goto/32` instructions exceeds `max(5, instruction_count * 0.15)`

---

### Task 3.3: Populate Similarity Metrics Table

Extend `APKCodeAnalyzer.extract()` to populate the `similarity_metrics` results key with `APKMethodSimilarityMetrics` records.

---

### Phase 3 Quality Gate

```bash
pytest tests/unit/ -v
pytest tests/unit/test_apk_method_extractor.py -v   # Hashing + obfuscation tests
```

Update `TEST_INDEX.md`. Commit.

---

## 6. Phase 4 — Integration Testing

### Task 4.1: Integration Test Suite

**File:** `tests/integration/test_apk_code_analysis.py`

**Requirements:** JADX, apktool, and Java must be installed.

**Test cases:**
1. **Simple APK** — Known benign APK with 5-10 user classes. Verify: methods extracted, smali and Java content populated, xrefs present, hashes computed.
2. **Multi-DEX APK** — APK with `classes.dex` + `classes2.dex`. Verify: methods from both DEX files analyzed, cross-DEX xrefs work.
3. **Obfuscated APK** — ProGuard/R8 obfuscated APK. Verify: short name indicators detected, library filter still works on renamed packages.
4. **Empty DEX** — APK with only framework calls, no user code after filtering. Verify: extractor returns gracefully with zero methods.
5. **Packed APK** — APK with encrypted DEX (e.g., Qihoo 360). Verify: error logged, no crash, analysis_errors table populated.
6. **JADX failure** — Simulate JADX timeout/crash. Verify: smali analysis still completes, decompiled content tables empty, error logged.
7. **apktool failure** — Same for apktool. Verify: Java analysis still completes.
8. **Large APK** — APK with 1000+ user methods. Verify: completes within timeout, memory stays bounded.

**Markers:**
```python
@pytest.mark.integration
@pytest.mark.apk
@pytest.mark.decompile
```

---

### Task 4.2: Performance Profiling

Run the integration tests with timing:
```bash
pytest tests/integration/test_apk_code_analysis.py -v --durations=0
```

Verify:
- apktool + JADX subprocess total < 60s for a typical APK
- Androguard analysis < 30s for a typical APK
- Per-method processing < 5ms
- Total pipeline < `APK_DECOMPILE_TIMEOUT` (1800s) for even the largest APKs

---

### Task 4.3: Final TEST_INDEX.md Update

Add all new test files, update counts, add integration test descriptions.

Final commit.

---

## 7. ClickHouse Schema

All tables follow the `ReplacingMergeTree(analysis_date)` pattern from `docs/new-code-binja-schema.md`,
except `code_apk_analysis_errors` which uses `MergeTree()`.

Full DDL is also available in `docs/apk-code-schema.md`.

### Table overview

| # | Table | Analog (Binja) | Engine | Key |
|---|-------|----------------|--------|-----|
| 1 | `code_apk_decompiled_methods_content` | `code_binja_decompiled_functions_content` | ReplacingMergeTree | `decompiled_method_hash` |
| 2 | `code_apk_decompiled_methods_references` | `code_binja_decompiled_functions_references` | ReplacingMergeTree | `(sha256, decompiled_method_hash)` |
| 3 | `code_apk_smali_methods_content` | `code_binja_disassembled_functions_content` | ReplacingMergeTree | `smali_method_hash` |
| 4 | `code_apk_smali_methods_references` | `code_binja_disassembled_functions_references` | ReplacingMergeTree | `(sha256, smali_method_hash)` |
| 5 | `code_apk_method_similarity_metrics` | `code_binja_function_similarity_metrics` | ReplacingMergeTree | `smali_method_hash` |
| 6 | `code_apk_cfg_methods` | `code_binja_cfg_functions` | ReplacingMergeTree | `smali_method_hash` |
| 7 | `code_binja_strings_raw` *(shared)* | — | Null (→ MV) | — |
| 8 | `code_apk_analysis_errors` | `function_analysis_errors_binja` | MergeTree | `(sha256, error_location, error_hash)` |

### Table 1: `code_apk_decompiled_methods_content`

**Analog:** `code_binja_decompiled_functions_content`

```sql
CREATE TABLE IF NOT EXISTS code_apk_decompiled_methods_content (
    decompiled_method_hash FixedString(64),          -- SHA-256 of normalized Java source
    decompiled_method String CODEC(ZSTD(3)),          -- Full Java method source
    decompiled_method_lower String MATERIALIZED lower(decompiled_method) CODEC(ZSTD(3)),
    method_type Enum8('USER'=1, 'LIBRARY'=2, 'UNKNOWN'=5) DEFAULT 'UNKNOWN',
    has_string_encryption UInt8 DEFAULT 0,
    has_reflection_calls UInt8 DEFAULT 0,
    excessive_goto_count UInt8 DEFAULT 0,
    analysis_date DateTime64(3, 'UTC'),

    INDEX idx_method_content_token lower(decompiled_method) TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 1,
    INDEX idx_method_hash decompiled_method_hash TYPE bloom_filter GRANULARITY 1
) ENGINE = ReplacingMergeTree(analysis_date)
PRIMARY KEY decompiled_method_hash
ORDER BY decompiled_method_hash;
```

### Table 2: `code_apk_decompiled_methods_references`

**Analog:** `code_binja_decompiled_functions_references`

```sql
CREATE TABLE IF NOT EXISTS code_apk_decompiled_methods_references (
    sha256 FixedString(64),
    sha1 FixedString(40),
    md5 FixedString(32),
    decompiled_method_hash FixedString(64),
    smali_method_hash Nullable(FixedString(64)),
    class_name LowCardinality(String),
    method_name LowCardinality(String),
    method_signature String,                          -- Dalvik descriptor: (Landroid/os/Bundle;)V
    method_prototype String,                          -- Java-style: void onCreate(Bundle)
    functions_caller Array(String),
    functions_call Array(String),
    analysis_date DateTime64(3, 'UTC'),

    INDEX idx_sha256 sha256 TYPE bloom_filter GRANULARITY 1,
    INDEX idx_method_hash decompiled_method_hash TYPE bloom_filter GRANULARITY 1,
    INDEX idx_class_name class_name TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 1,
    INDEX idx_method_name method_name TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 1
) ENGINE = ReplacingMergeTree(analysis_date)
ORDER BY (sha256, decompiled_method_hash);
```

### Table 3: `code_apk_smali_methods_content`

**Analog:** `code_binja_disassembled_functions_content`

```sql
CREATE TABLE IF NOT EXISTS code_apk_smali_methods_content (
    smali_method_hash FixedString(64),                -- SHA-256 of normalized smali body
    smali_method String CODEC(ZSTD(3)),               -- Full smali method body
    method_type Enum8('USER'=1, 'LIBRARY'=2, 'UNKNOWN'=5) DEFAULT 'UNKNOWN',
    instructions_count UInt32,
    register_count UInt16,
    has_string_encryption UInt8 DEFAULT 0,
    has_reflection_calls UInt8 DEFAULT 0,
    excessive_goto_count UInt8 DEFAULT 0,
    analysis_date DateTime64(3, 'UTC'),

    INDEX idx_smali_ngram smali_method TYPE ngrambf_v1(3, 32768, 3, 0) GRANULARITY 1,
    INDEX idx_method_type method_type TYPE set(10) GRANULARITY 1,
    INDEX idx_instr_count instructions_count TYPE minmax GRANULARITY 4
) ENGINE = ReplacingMergeTree(analysis_date)
ORDER BY smali_method_hash;
```

### Table 4: `code_apk_smali_methods_references`

**Analog:** `code_binja_disassembled_functions_references`

```sql
CREATE TABLE IF NOT EXISTS code_apk_smali_methods_references (
    sha256 FixedString(64),
    sha1 FixedString(40),
    md5 FixedString(32),
    smali_method_hash FixedString(64),
    decompiled_method_hash Nullable(FixedString(64)),
    class_name LowCardinality(String),
    method_name LowCardinality(String),
    method_signature String,
    ssdeep_smali Nullable(String),
    tlsh_smali Nullable(FixedString(72)),
    analysis_date DateTime64(3, 'UTC'),

    INDEX idx_sha256 sha256 TYPE bloom_filter GRANULARITY 1,
    INDEX idx_smali_hash smali_method_hash TYPE bloom_filter GRANULARITY 1,
    INDEX idx_tlsh_smali tlsh_smali TYPE bloom_filter GRANULARITY 1,
    INDEX idx_ssdeep_smali ssdeep_smali TYPE bloom_filter GRANULARITY 1
) ENGINE = ReplacingMergeTree(analysis_date)
ORDER BY (sha256, smali_method_hash);
```

### Table 5: `code_apk_method_similarity_metrics`

**Analog:** `code_binja_function_similarity_metrics`

Content-based fuzzy matching table. Structural/CFG scalars (block_count, edge_count, etc.)
are in `code_apk_cfg_methods` (Table 6) — this table holds only fuzzy hashes and MinHash.

```sql
CREATE TABLE IF NOT EXISTS code_apk_method_similarity_metrics (
    smali_method_hash FixedString(64),
    cyclomatic_complexity Nullable(UInt16),
    ssdeep_smali Nullable(String),
    tlsh_smali Nullable(FixedString(72)),
    minhash Array(UInt8),
    analysis_date DateTime64(3, 'UTC'),

    INDEX idx_complexity cyclomatic_complexity TYPE minmax GRANULARITY 4,
    INDEX idx_ssdeep ssdeep_smali TYPE bloom_filter GRANULARITY 1,
    INDEX idx_tlsh tlsh_smali TYPE bloom_filter GRANULARITY 1
) ENGINE = ReplacingMergeTree(analysis_date)
ORDER BY smali_method_hash;
```

### Table 6: `code_apk_cfg_methods`

**Analog:** `code_binja_cfg_functions` (see `db_migration/cfg_functions_ddl.sql`)

Structural and topological features computed from smali CFG. All fields mirror
the Binja table with APK-appropriate naming (`smali_method_hash` instead of
`disassembled_function_hash`, `instructions_count` instead of `llil_total_operations`,
`prime_product_smali` instead of `prime_product_llil`).

```sql
CREATE TABLE IF NOT EXISTS code_apk_cfg_methods (
    -- Identity
    smali_method_hash FixedString(64),

    -- Tier 0: Exact structural match
    cfg_topology_hash FixedString(16),

    -- Tier 1: Structural pre-filtering
    block_count UInt16,
    edge_count UInt16,
    instructions_count UInt32,               -- Dalvik instruction count (analog: llil_total_operations)
    call_count UInt16,
    cyclomatic_complexity UInt16,
    loop_count UInt8,
    max_depth UInt16,
    max_fan_out UInt8,
    md_index_topdown UInt64,
    md_index_bottomup UInt64,
    prime_product_smali UInt64,              -- Dalvik semantic primes (analog: prime_product_llil)

    -- Tier 2: Fuzzy matching
    cfg_feature_tlsh Nullable(FixedString(72)),
    wl_minhash Array(UInt8),

    -- Embedding-ready storage
    bb_features Array(Array(UInt16)),        -- ACFG block feature vectors
    cfg_adjacency Array(UInt32),             -- Packed (src << 16 | tgt)

    analysis_date DateTime64(3, 'UTC'),

    -- Indexes
    INDEX idx_topology cfg_topology_hash TYPE bloom_filter GRANULARITY 1,
    INDEX idx_complexity cyclomatic_complexity TYPE minmax GRANULARITY 4,
    INDEX idx_block_count block_count TYPE minmax GRANULARITY 4,
    INDEX idx_edge_count edge_count TYPE minmax GRANULARITY 4,
    INDEX idx_call_count call_count TYPE minmax GRANULARITY 4,
    INDEX idx_instr_count instructions_count TYPE minmax GRANULARITY 4,
    INDEX idx_md_topdown md_index_topdown TYPE bloom_filter GRANULARITY 1,
    INDEX idx_md_bottomup md_index_bottomup TYPE bloom_filter GRANULARITY 1,
    INDEX idx_prime prime_product_smali TYPE bloom_filter GRANULARITY 1,
    INDEX idx_cfg_tlsh cfg_feature_tlsh TYPE bloom_filter GRANULARITY 1
) ENGINE = ReplacingMergeTree(analysis_date)
ORDER BY smali_method_hash
SETTINGS index_granularity = 8192;
```

**Column mapping (APK → Binja):**

| APK column | Binja column | Notes |
|------------|-------------|-------|
| `smali_method_hash` | `disassembled_function_hash` | Both SHA-256 of normalized code |
| `instructions_count` | `llil_total_operations` | Dalvik instructions vs LLIL operations |
| `prime_product_smali` | `prime_product_llil` | Same prime algorithm, Dalvik semantic categories |
| All others | Same name | Identical algorithms from shared `cfg_features.py` |

### Table 7: `code_binja_strings_raw` (shared)

APK strings are inserted into the existing `code_binja_strings_raw` Null-engine table,
which feeds materialized views (`code_binja_strings_by_binary`, `mv_string_popularity_public`).
This enables cross-format string correlation between PE/ELF/Mach-O/APK samples.

No new table creation needed — see `docs/new-code-binja-schema.md` for the existing DDL.

### Table 8: `code_apk_analysis_errors`

**Analog:** `function_analysis_errors_binja`

```sql
CREATE TABLE IF NOT EXISTS code_apk_analysis_errors (
    sha256 FixedString(64),
    class_name Nullable(String) CODEC(ZSTD(3)),
    method_name Nullable(String) CODEC(ZSTD(3)),
    error_location LowCardinality(String) CODEC(ZSTD(3)),   -- 'jadx', 'apktool', 'androguard', 'analysis'
    error_message Nullable(String) CODEC(ZSTD(3)),
    error_type Nullable(String) CODEC(ZSTD(3)),
    error_hash FixedString(32),                               -- MD5 for dedup
    status Enum8('new' = 1, 'investigating' = 2, 'fixed' = 3, 'wontfix' = 4) DEFAULT 'new',
    analysis_date DateTime64(3, 'UTC'),
    PRIMARY KEY (sha256, error_location, error_hash)
) ENGINE = MergeTree()
ORDER BY (sha256, error_location, error_hash);
```

---

## 8. Androguard API Quick Reference

Key API calls used by `APKCodeAnalyzer`:

```python
from androguard.misc import AnalyzeAPK

# Parse APK — returns (APK object, list of DEX objects, Analysis object)
apk, dexs, analysis = AnalyzeAPK("sample.apk")

# Enumerate all methods
for method in analysis.get_methods():
    # method is a MethodAnalysis object

    # Check if it's an external method (no code body)
    if method.is_external():
        continue

    # Get the underlying EncodedMethod
    encoded = method.get_method()
    class_name = encoded.get_class_name()    # "Lcom/example/MyClass;"
    method_name = encoded.get_name()          # "onCreate"
    descriptor = encoded.get_descriptor()     # "(Landroid/os/Bundle;)V"

    # Cross-references: who calls this method
    for ref_class, ref_method, offset in method.get_xref_from():
        caller = f"{ref_method.get_class_name()}->{ref_method.get_name()}"

    # Cross-references: what this method calls
    for ref_class, ref_method, offset in method.get_xref_to():
        callee = f"{ref_method.get_class_name()}->{ref_method.get_name()}"

# Call graph (networkx MultiDiGraph)
call_graph = analysis.get_call_graph()
# Nodes are MethodAnalysis objects
# Edges represent caller → callee relationships
```

**Important notes:**
- `AnalyzeAPK()` loads ALL DEX files (handles multi-DEX automatically)
- `is_external()` returns True for methods declared but not defined (framework methods)
- `get_xref_from()` and `get_xref_to()` return tuples of `(ClassAnalysis, MethodAnalysis, int_offset)`
- The Analysis object is the single source of truth for method enumeration and xrefs

---

## 9. Smali Format Reference

### Method declaration syntax

```smali
.method <access_flags> <name>(<param_descriptors>)<return_type>
    .registers <N>              # Total register count
    .param p1, "paramName"      # Parameter name (debug info, may be missing)
    .line <N>                   # Source line number (debug info)

    # Instructions (Dalvik opcodes)
    invoke-virtual {p0, v0}, Lcom/example/Foo;->bar(I)V
    const-string v1, "hello"
    if-eqz v0, :cond_0
    goto :goto_0

    :cond_0                     # Label
    return-void
.end method
```

### Type descriptors

| Descriptor | Java Type |
|-----------|-----------|
| `V` | void |
| `Z` | boolean |
| `B` | byte |
| `I` | int |
| `J` | long |
| `F` | float |
| `D` | double |
| `Lcom/example/Foo;` | com.example.Foo |
| `[I` | int[] |
| `[Ljava/lang/String;` | String[] |

### Instructions to count (not directives)

All lines that are NOT labels (`:label_N`) and NOT directives (`.something`) are instructions. Common instruction prefixes:
`invoke-*`, `const*`, `move*`, `return*`, `if-*`, `goto*`, `new-*`, `iget*`, `iput*`, `sget*`, `sput*`, `aget*`, `aput*`, `check-cast`, `instance-of`, `throw`, `monitor-*`, `fill-*`, `packed-switch`, `sparse-switch`, `cmp*`, `add-*`, `sub-*`, `mul-*`, `div-*`, `rem-*`, `and-*`, `or-*`, `xor-*`, `shl-*`, `shr-*`, `ushr-*`, `neg-*`, `not-*`, `int-to-*`, `long-to-*`, `float-to-*`, `double-to-*`, `array-length`, `nop`

---

## Appendix A — Phase 5: CFG Feature Parity with Binary Ninja Pipeline

**Date:** 2026-03-13
**Depends on:** Phases 13 complete
**Reference:** APK_CODE_ANALYSIS_PDD.md, Appendix A

This appendix provides the implementation details for adding a dedicated `code_apk_cfg_methods` table and refactoring `code_apk_method_similarity_metrics` to match the Binja pipeline's separation of concerns.

---

### A.1 Rationale

The existing `smali_cfg.py` already builds full adjacency lists and computes per-block ACFG feature vectors, but this data is either reduced to scalars (block_count, edge_count, etc.) or silently dropped (bb_features). Meanwhile, `cfg_features.py` contains generic graph algorithms (topology hash, MD-index, WL-MinHash, etc.) that operate on adjacency lists — they have no Binary Ninja dependency. Connecting these two modules requires minimal glue code.

---

### A.2 File Changes

#### Modified files:

```
redb/extractors/decompiler/apk/smali_cfg.py       # Add predecessors, wire cfg_features
redb/extractors/decompiler/apk/method_extractor.py # Add call_count, prime_product_smali
redb/extractors/decompiler/apk/analyzer.py         # Populate new CFG fields in results
redb/extractors/decompiler/DecompileAPK.py         # New table export, slim similarity table
docs/apk-code-schema.md                            # Add code_apk_cfg_methods schema
tests/unit/test_apk_method_extractor.py            # Tests for new fields
```

#### No new files needed.

---

### A.3 Task A.1: Extend `smali_cfg.py`

**A.1.1 — Build predecessors from successors**

Add to `compute_cfg_metrics()`, after the adjacency list is built:

```python
predecessors = [[] for _ in range(n)]
for src, targets in enumerate(successors):
    for tgt in targets:
        predecessors[tgt].append(src)
```

**A.1.2 — Compute advanced CFG features**

Import and call `cfg_features.py` functions after building the graph:

```python
from redb.extractors.decompiler.bninja.analysis import cfg_features

bfs = cfg_features.bfs_order(successors, n)
topology_hash = cfg_features.compute_topology_hash(successors, bfs, n)
md_topdown = cfg_features.compute_md_index_topdown(successors, predecessors, bfs)
md_bottomup = cfg_features.compute_md_index_bottomup(successors, predecessors, n)
cfg_tlsh = cfg_features.compute_cfg_feature_tlsh(block_features, bfs)
wl_minhash = cfg_features.compute_wl_minhash(successors, predecessors, block_features, n)
adjacency = cfg_features.pack_adjacency(successors)
```

**A.1.3 — Extend `SmaliCFGMetrics` dataclass**

Add fields to the existing dataclass:

```python
@dataclass
class SmaliCFGMetrics:
    # Existing fields (unchanged)
    block_count: int = 0
    edge_count: int = 0
    cyclomatic_complexity: int = 1
    loop_count: int = 0
    max_depth: int = 0
    max_fan_out: int = 0
    block_features: List[List[int]] = field(default_factory=list)

    # New fields
    cfg_topology_hash: bytes = field(default_factory=lambda: b'\x00' * 16)
    md_index_topdown: int = 0
    md_index_bottomup: int = 0
    cfg_feature_tlsh: Optional[str] = None
    wl_minhash: List[int] = field(default_factory=lambda: [255] * 128)
    cfg_adjacency: List[int] = field(default_factory=list)
```

---

### A.4 Task A.2: Smali Prime Product (`method_extractor.py`)

Define a Dalvik-to-prime mapping using the semantic categories already in `smali_normalization.py`. Each category maps to the same prime its LLIL equivalent uses in `cfg_features.py`:

```python
SMALI_OP_PRIMES = {
    "ALU":    37,   # ADD/SUB → same prime as LLIL_ADD
    "CONV":   131,  # Type conversions → same as LLIL_SX
    "CMP":    103,  # Comparisons → same as LLIL_CMP_E
    "MOV":    2,    # Register moves → same as LLIL_SET_REG
    "CONST":  2,    # Constants → SET_REG equivalent
    "LOAD":   5,    # Field/array reads → same as LLIL_LOAD
    "STORE":  7,    # Field/array writes → same as LLIL_STORE
    "CALL":   17,   # invoke-* → same as LLIL_CALL
    "BRANCH": 29,   # if-* → same as LLIL_IF
    "JMP":    31,   # goto → same as LLIL_GOTO
    "SWITCH": 151,  # switch → same as LLIL_JUMP_TO
    "RET":    23,   # return → same as LLIL_RET
    "ALLOC":  5,    # new-instance/new-array → LOAD-adjacent (heap access)
    "TYPE":   1,    # check-cast/instance-of → identity (metadata)
    "ARR":    5,    # array-length/fill-array → LOAD-adjacent
    "EXC":    23,   # throw → RET-adjacent (control transfer out)
    "SYNC":   1,    # monitor → identity (no LLIL equivalent)
    "OTHER":  1,    # Unknown → identity
}


def compute_prime_product_smali(smali_body: str) -> int:
    """Multiplicative hash of normalized Dalvik opcodes. Mod 2^64."""
    product = 1
    for line in smali_body.splitlines():
        stripped = line.strip()
        if not stripped or stripped.startswith(('.', ':', '#')):
            continue
        category = classify_instruction(stripped)  # existing function
        prime = SMALI_OP_PRIMES.get(category, 1)
        product = (product * prime) % (2**64)
    return product
```

**`call_count`** — count lines where `classify_instruction()` returns `"CALL"`.

---

### A.5 Task A.3: Populate CFG Results (`analyzer.py`)

In `_process_method()`, after `compute_cfg_metrics()`, add the new fields to the results dict:

```python
cfg_metrics = compute_cfg_metrics(smali_body)

# Build cfg entry (separate from similarity_metrics)
cfg_entry = {
    "smali_method_hash": sha256_smali,
    "cfg_topology_hash": cfg_metrics.cfg_topology_hash,
    "block_count": cfg_metrics.block_count,
    "edge_count": cfg_metrics.edge_count,
    "instructions_count": instruction_count,
    "call_count": call_count,
    "cyclomatic_complexity": cfg_metrics.cyclomatic_complexity,
    "loop_count": cfg_metrics.loop_count,
    "max_depth": cfg_metrics.max_depth,
    "max_fan_out": cfg_metrics.max_fan_out,
    "md_index_topdown": cfg_metrics.md_index_topdown,
    "md_index_bottomup": cfg_metrics.md_index_bottomup,
    "prime_product_smali": prime_product,
    "cfg_feature_tlsh": cfg_metrics.cfg_feature_tlsh,
    "wl_minhash": cfg_metrics.wl_minhash,
    "bb_features": cfg_metrics.block_features,
    "cfg_adjacency": cfg_metrics.cfg_adjacency,
}
```

Add `"cfg"` as a new top-level key in the results dict returned by `extract()`.

---

### A.6 Task A.4: Export Tables (`DecompileAPK.py`)

**New table — `code_apk_cfg_methods`:**

```python
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("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", "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", "UInt8",
            "UInt16", "UInt8",
            "UInt64", "UInt64",
            "UInt64", "Nullable(FixedString(72))",
            "Array(UInt8)", "Array(Array(UInt16))", "Array(UInt32)",
            "DateTime64(3, 'UTC')",
        ],
    }
```

**Slim down `code_apk_method_similarity_metrics`** — remove `block_count`, `edge_count`, `loop_count`, `max_depth`, `max_fan_out` from its column lists and data arrays.

---

### A.7 Task A.5: ClickHouse Schema

```sql
CREATE TABLE IF NOT EXISTS code_apk_cfg_methods (
    smali_method_hash FixedString(64),
    cfg_topology_hash FixedString(16),
    block_count UInt16,
    edge_count UInt16,
    instructions_count UInt32,
    call_count UInt16,
    cyclomatic_complexity UInt16,
    loop_count UInt8,
    max_depth UInt16,
    max_fan_out UInt8,
    md_index_topdown UInt64,
    md_index_bottomup UInt64,
    prime_product_smali UInt64,
    cfg_feature_tlsh Nullable(FixedString(72)),
    wl_minhash Array(UInt8),
    bb_features Array(Array(UInt16)),
    cfg_adjacency Array(UInt32),
    analysis_date DateTime64(3, 'UTC'),

    INDEX idx_topology cfg_topology_hash TYPE bloom_filter GRANULARITY 1,
    INDEX idx_complexity cyclomatic_complexity TYPE minmax GRANULARITY 4,
    INDEX idx_block_count block_count TYPE minmax GRANULARITY 4,
    INDEX idx_md_topdown md_index_topdown TYPE bloom_filter GRANULARITY 1,
    INDEX idx_md_bottomup md_index_bottomup TYPE bloom_filter GRANULARITY 1,
    INDEX idx_prime prime_product_smali TYPE bloom_filter GRANULARITY 1,
    INDEX idx_cfg_tlsh cfg_feature_tlsh TYPE bloom_filter GRANULARITY 1
) ENGINE = ReplacingMergeTree(analysis_date)
ORDER BY smali_method_hash;
```

---

### A.8 Task A.6: Tests

Add to `tests/unit/test_apk_method_extractor.py`:

- **`test_predecessors_from_successors`** — verify reverse mapping is correct
- **`test_cfg_topology_hash_identical_graphs`** — two methods with same control flow produce same hash
- **`test_cfg_topology_hash_different_graphs`** — different structure produces different hash
- **`test_md_index_topdown_bottomup`** — verify non-zero values for multi-block methods
- **`test_prime_product_smali`** — known input produces expected product
- **`test_prime_product_smali_position_independent`** — reordering blocks doesn't change result
- **`test_call_count`** — count invoke-* instructions
- **`test_wl_minhash_length`** — verify 128-element signature
- **`test_cfg_feature_tlsh_small_method`** — returns None when < 50 bytes
- **`test_bb_features_exported`** — verify block features appear in results
- **`test_cfg_adjacency_packed`** — verify (src << 16) | tgt encoding
- **`test_similarity_table_slimmed`** — verify block_count etc. removed from similarity export

---

### A.9 Phase 5 Quality Gate

```bash
# All existing tests pass
pytest tests/unit/ -v

# New CFG tests
pytest tests/unit/test_apk_method_extractor.py -k "cfg or prime_product or call_count or wl_minhash" -v

# Linting
black redb/extractors/decompiler/apk/ tests/unit/test_apk_method_extractor.py
isort redb/extractors/decompiler/apk/ tests/unit/test_apk_method_extractor.py
flake8 redb/extractors/decompiler/apk/
```

Update `TEST_INDEX.md`. Commit.