Xianping Fu

183 papers A* 10A 2B 7C 5Journal 140Unranked 19
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Guangyao Ju, Jiqing Zhang, Jingqi Zang, Yafeng Li, Yudong Li, Zetian Mi, Xin Yang, Huibing Wang, Jiarui Fan, Xianping Fu
2026 J jnl
Pattern Recognit.
Zhengjie Lu, Jinjia Peng, Huibing Wang, Xianping Fu
2026 J jnl
Pattern Recognit.
Jinjia Peng, Chengjun Wang, Jican Tan, Huibing Wang, Xianping Fu
2026 A* conf
AAAI
Mingze Yao, Zhiying Jiang, Xianping Fu, Huibing Wang
2026 J jnl
J. Real Time Image Process.
GuoLiang Yuan, Liming Zhao, Junchi Li, Hongming Chen, Chaomin Tan, Xianping Fu, Yafei Wang
2026 J jnl
Int. J. Comput. Vis.
Jiqing Zhang, Xin Yang, Haoming Tang, Yuanchen Wang, Baocai Yin, Huibing Wang, Xianping Fu
2026 J jnl
Comput. Electr. Eng.
Soomro Pir Dino, Xianping Fu, Santosh Kumar Banbhrani, Arsalan Ali, Muhammad Asad
2026 J jnl
IEEE Wirel. Commun. Lett.
Anliang Liu, Xuyang Li, Xianping Fu
2026 A* conf
AAAI
Linfeng Qi, Huibing Wang, Jinjia Peng, Xianping Fu, Jiqing Zhang
2026 J jnl
Displays
Gan Zhang, Yafei Wang, Runze Yan, Xianping Fu
2025 J jnl
Multim. Tools Appl.
Soomro Pir Dino, Xianping Fu, Santosh Kumar Banbhrani, Muhammad Asad, Zayyanu Shuaibu
2025 J jnl
Knowl. Based Syst.
Peng Lin, Yafei Wang, YuanYuan Li, Yuán-Ruì Yáng, Xianping Fu
2025 J jnl
Int. J. Mach. Learn. Cybern.
Salahuddin Unar, Saifullah Unar, Yining Su, Pengbo Liu, Xianping Fu
2025 B conf
IJCNN
Zhiye Xie, Enmei Tu, Xianping Fu, GuoLiang Yuan, Yi Han
2025 J jnl
CoRR
Zhiye Xie, Enmei Tu, Xianping Fu, GuoLiang Yuan, Yi Han
2025 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Yafeng Li, Yuehan Chen, Jiqing Zhang, Yudong Li, Xianping Fu
2025 J jnl
IEEE Trans. Multim.
Mingze Yao, Huibing Wang, Yawei Chen, Xianping Fu
2025 J jnl
Appl. Intell.
Huibing Wang, Wei Wang, Mingze Yao, Yawei Chen, Jinjia Peng, Guangqi Jiang, Xianping Fu
2025 A* conf
IJCAI
Qian Liu, Huibing Wang, Jinjia Peng, Yawei Chen, Mingze Yao, Xianping Fu, Yang Wang
2025 J jnl
J. Electronic Imaging
Guangqi Jiang, Mingze Yao, Wangjie Chen, Xueyuan Wang, Xianping Fu
2025 J jnl
Educ. Inf. Technol.
Chrispus Zacharia Oroni, Xianping Fu, Daniela Daniel Ndunguru, Arsenyan Ani
2025 J jnl
Vis. Comput.
Yulin Wang, Zheng Liang, Zetian Mi, Jiqing Zhang, Xianping Fu, Yujia Wang
2025 A conf
IROS
Tianzhu Gao, Yudong Luo, Na Zhao, Jianda Wang, Yuanchu Yan, Xianping Fu, Xi Luo, Yantao Shen
2025 J jnl
IEEE Internet Things J.
Yangyang Wang, Xiaokai Liu, Dongbing Gu, Jie Wang, Xianping Fu
2025 J jnl
Eng. Appl. Artif. Intell.
Mingze Yao, Huibing Wang, Yudong Li, WenZhe Liu, Xianping Fu
2025 A* conf
ACM Multimedia
Luyan Cui, Huibing Wang, Yawei Chen, Mingze Yao, Xianping Fu, Jiqing Zhang
2025 A* conf
ICRA
Yudong Luo, Tong Wang, Feiyu Xie, Na Zhao, Xianping Fu, Yantao Shen
2025 J jnl
IEEE Internet Things J.
Pengbo Liu, Lin Teng, Huipeng Liu, Herbert Ho-Ching Iu, Mingxu Wang, Xiaopeng Yan, Xianping Fu
2025 J jnl
Comput. Secur.
Chrispus Zacharia Oroni, Xianping Fu, Daniela Daniel Ndunguru, Arsenyan Ani
2025 A* conf
ACM Multimedia
Zixuan Wan, Jiqing Zhang, Yushan Wang, Hu Lin, Yafei Wang, Zetian Mi, Xin Yang, Xianping Fu, Huibing Wang
2025 B conf
ETRA
Yafei Wang, Haiheng Nan, Xianping Fu
2025 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Boyu Cai, Huibing Wang, Mingze Yao, Xianping Fu
2025 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Yuehan Chen, Jiqing Zhang, Yafeng Li, Yudong Li, Haoming Tang, Huibing Wang, Xianping Fu
2025 J jnl
J. Inf. Secur. Appl.
Pengbo Liu, Lin Teng, Herbert Ho-Ching Iu, Mingxu Wang, Qi Li, Xianping Fu
2025 J jnl
Displays
Peng Lin, Zihao Fan, Yafei Wang, Xudong Sun, Yuán-Ruì Yáng, Xianping Fu
2025 J jnl
IEEE Trans Autom. Sci. Eng.
Lu Sun, Ziqian Liu, Zhaolong Ning, Jie Wang, Xianping Fu
2025 J jnl
Displays
YuanYuan Li, Zetian Mi, Xianping Fu
2025 B conf
ETRA
Yafei Wang, Runze Yan, Yaxiong Lei, Xianping Fu
2025 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Qi Li, Bin Ma, Xianping Fu, Xiao-Yu Wang, Chunpeng Wang, Xiaolong Li
2025 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Jingchun Zhou, Zongxin He, Dehuan Zhang, Siyuan Liu, Xianping Fu, Xuelong Li
2025 J jnl
IEEE Trans. Circuits Syst. Video Technol.
YuanYuan Li, Zetian Mi, Yulin Wang, Shuaiyong Jiang, Xianping Fu
2025 J jnl
IEEE Trans. Multim.
Huibing Wang, Yawei Chen, Mingze Yao, WenZhe Liu, Jinjia Peng, Xianping Fu
2025 B conf
ETRA
Yafei Wang, GuoLiang Yuan, Xianping Fu
2025 J jnl
Neural Comput. Appl.
Gan Zhang, Yafei Wang, Wenju Li, Xianping Fu
2025 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Yulin Wang, Yueming Ma, YuanYuan Li, Jiqing Zhang, Zetian Mi, Xianping Fu
2025 J jnl
Displays
Yushan Wang, Jiqing Zhang, Zixuan Wan, Xinbo Zhang, Yafei Wang, Xianping Fu
2025 J jnl
Signal Process. Image Commun.
YuanYuan Li, Zetian Mi, Peng Lin, Xianping Fu
2025 J jnl
Artif. Intell. Rev.
Xin Shen, GuoLiang Yuan, Huibing Wang, Xianping Fu
2024 J jnl
Eng. Appl. Artif. Intell.
Zetian Mi, Haixia Qi, Jiaxin Chen, Yang Yu, Yujia Wang, Huibing Wang, Xianping Fu
2024 J jnl
Pattern Recognit.
Jinjia Peng, Jiazuo Yu, Chengjun Wang, Huibing Wang, Xianping Fu
2024 J jnl
IEEE Access
Yujia Wang, Xianping Fu
2024 J jnl
Int. J. Comput. Vis.
Jingchun Zhou, Jiaming Sun, Chongyi Li, Qiuping Jiang, Man Zhou, Kin-Man Lam, Weishi Zhang, Xianping Fu
2024 J jnl
Multim. Tools Appl.
Xin Shen, Huibing Wang, Yafeng Li, Tianzhu Gao, Xianping Fu
2024 J jnl
Int. J. Multim. Inf. Retr.
Divine Njengwie Achinek, Ibrahim Shehi Shehu, Athuman Mohamed Athuman, Xianping Fu
2024 A* conf
IJCAI
Tianxiang Cui, Huibing Wang, Jinjia Peng, Ruoxi Deng, Xianping Fu, Yang Wang
2024 J jnl
CoRR
Tianxiang Cui, Huibing Wang, Jinjia Peng, Ruoxi Deng, Xianping Fu, Yang Wang
2024 J jnl
IEEE Trans. Neural Networks Learn. Syst.
Huibing Wang, Mingze Yao, Guangqi Jiang, Zetian Mi, Xianping Fu
2024 J jnl
Int. J. Comput. Vis.
Jingchun Zhou, Jiaming Sun, Chongyi Li, Qiuping Jiang, Man Zhou, Kin-Man Lam, Weishi Zhang, Xianping Fu
2024 J jnl
Multim. Syst.
Xin Shen, GuoLiang Yuan, Huibing Wang, Xianping Fu
2024 J jnl
IEEE Trans. Geosci. Remote. Sens.
Jingchun Zhou, Qilin Gai, Dehuan Zhang, Kin-Man Lam, Weishi Zhang, Xianping Fu
2024 J jnl
Multim. Tools Appl.
Yulin Wang, Yunjie Zhang, Xianping Fu
2024 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Xudong Sun, Peng Lin, Xiao-Di Shang, Huijuan Pang, Xianping Fu
2024 J jnl
IEEE Trans. Multim.
Huibing Wang, Mingze Yao, Yawei Chen, Yunqiu Xu, Haipeng Liu, Wei Jia, Xianping Fu, Yang Wang
2024 J jnl
CoRR
Huibing Wang, Mingze Yao, Yawei Chen, Yunqiu Xu, Haipeng Liu, Wei Jia, Xianping Fu, Yang Wang
2024 J jnl
IEEE Internet Things J.
Anliang Liu, Xinping Liu, Xianping Fu
2024 A* conf
ICRA
Tianzhu Gao, Yudong Luo, Chao Lv, Weirong Luo, Xianping Fu, Na Zhao, Xi Luo, Yantao Shen
2024 J jnl
Educ. Inf. Technol.
Chrispus Zacharia Oroni, Xianping Fu
2024 J jnl
Vis. Comput.
Xin Shen, Huibing Wang, Tianxiang Cui, Zhicheng Guo, Xianping Fu
2024 J jnl
Vis. Comput.
Xin Shen, Huibing Wang, Tianxiang Cui, Zhicheng Guo, Xianping Fu
2024 J jnl
J. Electronic Imaging
Muhammad Aon, Huibing Wang, Muhammad Noman Waleed, Yulin Wei, Xianping Fu
2024 A* conf
IJCAI
Yimin Jiang, Huibing Wang, Jinjia Peng, Xianping Fu, Yang Wang
2024 J jnl
CoRR
Yimin Jiang, Huibing Wang, Jinjia Peng, Xianping Fu, Yang Wang
2024 J jnl
CoRR
Hongming Chen, Xiang Chen, Chen Wu, Zhuoran Zheng, Jinshan Pan, Xianping Fu
2024 J jnl
Multim. Tools Appl.
Salahuddin Unar, Yining Su, Xiu Zhao, Pengbo Liu, Yafei Wang, Xianping Fu
2024 J jnl
IEEE Trans. Multim.
Peng Lin, Yafei Wang, YuanYuan Li, Zihao Fan, Xianping Fu
2024 J jnl
Multim. Tools Appl.
Xiaohong Yan, Guangyuan Wang, Peng Lin, Junbo Zhang, Yafei Wang, Xianping Fu
2024 J jnl
Knowl. Based Syst.
Yafeng Li, Jiqing Zhang, Yuehan Chen, Yudong Li, Haoming Tang, Xianping Fu
2023 J jnl
Sensors
Salahuddin Unar, Yining Su, Pengbo Liu, Lin Teng, Yafei Wang, Xianping Fu
2023 J jnl
CoRR
Jingchun Zhou, Zongxin He, Dehuan Zhang, Kin-Man Lam, Weishi Zhang, Xianping Fu, Yi Wang, Chongyi Li
2023 J jnl
Entropy
Dani Elias Mfungo, Xianping Fu
2023 J jnl
CoRR
Huibing Wang, Mingze Yao, Guangqi Jiang, Zetian Mi, Xianping Fu
2023 J jnl
CoRR
Jingchun Zhou, Qilin Gai, Weishi Zhang, Kin-Man Lam, Xianping Fu, Ting Li, Chongyi Li
2023 J jnl
Multim. Tools Appl.
Xianping Fu, Xueyan Ding, Zheng Liang, Yafei Wang
2023 J jnl
Appl. Intell.
Guangqi Jiang, Huibing Wang, Jinjia Peng, Dongyan Chen, Xianping Fu
2023 J jnl
Neural Comput. Appl.
Xin Shen, Xudong Sun, Huibing Wang, Xianping Fu
2023 J jnl
IEEE Trans. Instrum. Meas.
Xudong Sun, Yuan Zhu, Xianping Fu
2023 conf
PRCV (7)
Huijuan Pang, Xudong Sun, Xianping Fu, Huibing Wang
2023 J jnl
IEEE Trans. Multim.
Huibing Wang, Guangqi Jiang, Jinjia Peng, Ruoxi Deng, Xianping Fu
2023 J jnl
Eng. Appl. Artif. Intell.
Pengli Zhu, Yancheng Liu, Yuanquan Wen, Minyi Xu, Xianping Fu, Siyuan Liu
2023 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Yining Su, Lin Teng, Pengbo Liu, Salahuddin Unar, Xingyuan Wang, Xianping Fu
2023 J jnl
CoRR
Jingchun Zhou, Tianyu Liang, Zongxin He, Dehuan Zhang, Weishi Zhang, Xianping Fu, Chongyi Li
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Zheng Liang, Xueyan Ding, Jie Jin, Yafei Wang, Yulin Wang, Xianping Fu
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Zetian Mi, YuanYuan Li, Jie Jin, Zheng Liang, Xianping Fu
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Hongqi Zhang, Xudong Sun, Yuan Zhu, Fengqiang Xu, Xianping Fu
2022 J jnl
Multim. Tools Appl.
Xiaohong Yan, Guangxin Wang, Guangqi Jiang, Yafei Wang, Zetian Mi, Xianping Fu
2022 J jnl
Signal Process. Image Commun.
Xiaohong Yan, Guangxin Wang, Guangyuan Wang, Yafei Wang, Xianping Fu
2022 J jnl
Knowl. Based Syst.
Xueyan Ding, Yafei Wang, Zheng Liang, Xianping Fu
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Xueyan Ding, Yafei Wang, Xianping Fu
2022 J jnl
Knowl. Based Syst.
Xiaohong Yan, Wenqiang Qin, Yafei Wang, Guangyuan Wang, Xianping Fu
2022 J jnl
Signal Process. Image Commun.
Peng Lin, Yafei Wang, Guangyuan Wang, Xiaohong Yan, Guangqi Jiang, Xianping Fu
2022 J jnl
Sensors
Yafei Wang, GuoLiang Yuan, Xianping Fu
2022 J jnl
Sensors
Yafei Wang, Xueyan Ding, GuoLiang Yuan, Xianping Fu
2022 J jnl
IEEE Geosci. Remote. Sens. Lett.
Zheng Liang, Xueyan Ding, Zetian Mi, Yafei Wang, Xianping Fu
2022 J jnl
Multim. Tools Appl.
Jinjia Peng, Guangqi Jiang, Dongyan Chen, Tongtong Zhao, Huibing Wang, Xianping Fu
2022 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Zheng Liang, Xueyan Ding, Yafei Wang, Xiaohong Yan, Xianping Fu
2022 J jnl
Eng. Appl. Artif. Intell.
Xianping Fu, Jinjia Peng, Guangqi Jiang, Huibing Wang
2022 J jnl
Remote. Sens.
Xudong Sun, Xin Shen, Huijuan Pang, Xianping Fu
2022 B conf
ICMR
Guangqi Jiang, Huibing Wang, Jinjia Peng, Xianping Fu
2022 J jnl
J. Electronic Imaging
Guangqi Jiang, Huibing Wang, Xiaohong Yan, Huizhu Yan, Jinjia Peng, Xianping Fu
2022 J jnl
Neural Comput. Appl.
Fengqiang Xu, Huibing Wang, Xudong Sun, Xianping Fu
2022 J jnl
Knowl. Based Syst.
GuoLiang Yuan, Yafei Wang, Huizhu Yan, Xianping Fu
2022 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Guangqi Jiang, Jinjia Peng, Huibing Wang, Zetian Mi, Xianping Fu
2021 J jnl
IEEE Access
GuoLiang Yuan, Yafei Wang, Jinjia Peng, Xianping Fu
2021 C conf
IGARSS
Xudong Sun, Site Li, Hongqi Zhang, Fengqiang Xu, Xianping Fu
2021 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Xudong Sun, Hongqi Zhang, Fengqiang Xu, Yuan Zhu, Xianping Fu
2021 J jnl
Signal Process. Image Commun.
Xueyan Ding, Zheng Liang, Yafei Wang, Xianping Fu
2021 J jnl
Neurocomputing
Huibing Wang, Jinjia Peng, Guangqi Jiang, Fengqiang Xu, Xianping Fu
2021 conf
CSAE
Divine Njengwie Achinek, Ibrahim Shehi Shehu, Athuman Mohamed Athuman, Xianping Fu
2021 J jnl
Neurocomputing
Guangqi Jiang, Huibing Wang, Jinjia Peng, Dongyan Chen, Xianping Fu
2021 J jnl
IEEE Trans. Multim.
Huibing Wang, Yang Wang, Zhao Zhang, Xianping Fu, Li Zhuo, Mingliang Xu, Meng Wang
2021 A conf
ICME
Huibing Wang, Jinjia Peng, Guangqi Jiang, Xianping Fu
2021 B conf
ICMR
Huibing Wang, Guangqi Jiang, Jinjia Peng, Xianping Fu
2021 J jnl
Neural Comput. Appl.
Fengqiang Xu, Huibing Wang, Jinjia Peng, Xianping Fu
2021 J jnl
Neurocomputing
Zheng Liang, Yafei Wang, Xueyan Ding, Zetian Mi, Xianping Fu
2020 J jnl
IEEE Multim.
Huibing Wang, Jinjia Peng, Dongyan Chen, Guangqi Jiang, Tongtong Zhao, Xianping Fu
2020 J jnl
CoRR
Huibing Wang, Jinjia Peng, Dongyan Chen, Guangqi Jiang, Tongtong Zhao, Xianping Fu
2020 J jnl
Neurocomputing
Jinjia Peng, Huibing Wang, Fengqiang Xu, Xianping Fu
2020 J jnl
CoRR
Huibing Wang, Jinjia Peng, Guangqi Jiang, Fengqiang Xu, Xianping Fu
2020 J jnl
IET Image Process.
Zetian Mi, Yafei Wang, Congcong Zhao, Fengming Du, Xianping Fu
2020 J jnl
IEEE Trans. Veh. Technol.
Huibing Wang, Jinjia Peng, Yanzhu Zhao, Xianping Fu
2020 J jnl
IEEE Access
Zetian Mi, YuanYuan Li, Yafei Wang, Xianping Fu
2020 J jnl
CoRR
Yuxiao Yan, Yang Yan, Jinjia Peng, Huibing Wang, Xianping Fu
2020 J jnl
Eng. Appl. Artif. Intell.
Xianping Fu, Yuxiao Yan, Yang Yan, Jinjia Peng, Huibing Wang
2020 J jnl
Remote. Sens.
Xianping Fu, Xiao-Di Shang, Xudong Sun, Haoyang Yu, Meiping Song, Chein-I Chang
2020 A* conf
IJCAI
Jinjia Peng, Yang Wang, Huibing Wang, Zhao Zhang, Xianping Fu, Meng Wang
2020 J jnl
CoRR
Jinjia Peng, Yang Wang, Huibing Wang, Zhao Zhang, Xianping Fu, Meng Wang
2020 J jnl
Multim. Tools Appl.
Jinjia Peng, Yun Hao, Fengqiang Xu, Xianping Fu
2019 J jnl
CoRR
Huibing Wang, Haohao Li, Xianping Fu
2019 J jnl
Multim. Tools Appl.
Huibing Wang, Haohao Li, Xianping Fu
2019 J jnl
CoRR
Huibing Wang, Jinjia Peng, Xianping Fu
2019 J jnl
Neurocomputing
Huibing Wang, Jinjia Peng, Xianping Fu
2019 J jnl
Sensors
Yafei Wang, GuoLiang Yuan, Zetian Mi, Jinjia Peng, Xueyan Ding, Zheng Liang, Xianping Fu
2019 J jnl
CoRR
Jinjia Peng, Huibing Wang, Xianping Fu
2019 conf
ICME Workshops
Jinjia Peng, Huibing Wang, Tongtong Zhao, Xianping Fu
2019 J jnl
CoRR
Jinjia Peng, Huibing Wang, Tongtong Zhao, Xianping Fu
2019 J jnl
CoRR
Jinjia Peng, Guangqi Jiang, Dongyan Chen, Tongtong Zhao, Huibing Wang, Xianping Fu
2019 J jnl
CoRR
Guangqi Jiang, Huibing Wang, Jinjia Peng, Dongyan Chen, Xianping Fu
2019 J jnl
Pattern Recognit. Lett.
Tongtong Zhao, Yuxiao Yan, Jinjia Peng, Zetian Mi, Xianping Fu
2019 J jnl
CoRR
Xueyan Ding, Yafei Wang, Yang Yan, Zheng Liang, Zetian Mi, Xianping Fu
2019 J jnl
CoRR
Huibing Wang, Yang Wang, Zhao Zhang, Xianping Fu, Meng Wang
2019 J jnl
Neurocomputing
Jinjia Peng, Huibing Wang, Tongtong Zhao, Xianping Fu
2019 conf
ICME Workshops
Tongtong Zhao, Yuxiao Yan, Jinjia Peng, Huibing Wang, Xianping Fu
2019 J jnl
CoRR
Tongtong Zhao, Yuxiao Yan, Jinjia Peng, Huibing Wang, Xianping Fu
2019 conf
BigComp
GuoLiang Yuan, Yafei Wang, Yuxiao Yan, Tianyi Shen, Weitao Wang, Zetian Mi, Xianping Fu
2019 J jnl
CoRR
Huibing Wang, Haohao Li, Xianping Fu
2019 J jnl
Multim. Tools Appl.
Huibing Wang, Haohao Li, Jinjia Peng, Xianping Fu
2019 J jnl
CoRR
Tongtong Zhao, Yuxiao Yan, Ibrahim Shehi Shehu, Xianping Fu, Huibing Wang
2019 J jnl
Eng. Appl. Artif. Intell.
Tongtong Zhao, Yuxiao Yan, Ibrahim Shehi Shehu, Xianping Fu, Huibing Wang
2019 conf
ICME Workshops
Huibing Wang, Jinjia Peng, Xianping Fu
2019 J jnl
CoRR
Huibing Wang, Jinjia Peng, Xianping Fu
2018 conf
ICIMCS
Na Cheng, Tongtong Zhao, Zhengyu Chen, Xianping Fu
2018 J jnl
CoRR
Tongtong Zhao, Yuxiao Yan, Jinjia Peng, Zetian Mi, Xianping Fu
2018 B conf
IJCNN
Tongtong Zhao, Yuxiao Yan, Ibrahim Shehi Shehu, Xianping Fu
2018 conf
ICTC
Tongtong Zhao, Yuxiao Yan, Ibrahim Shehi Shehu, HaoHui Wei, Xianping Fu
2018 J jnl
Knowl. Based Syst.
Yafei Wang, Tongtong Zhao, Xueyan Ding, Jinjia Peng, Jiming Bian, Xianping Fu
2018 C conf
ACML
Tongtong Zhao, Yuxiao Yan, Jinjia Peng, HaoHui Wei, Xianping Fu
2017 conf
ICIT
Yafei Wang, Xueyan Ding, Ruoqian Wang, Jun Zhang, Xianping Fu
2017 conf
BigComp
Yafei Wang, Tongtong Zhao, Xueyan Ding, Jiming Bian, Xianping Fu
2017 conf
ICIMCS
Tongtong Zhao, Yafei Wang, Xianping Fu
2017 conf
ICIMCS
Xueyan Ding, Yafei Wang, Zheng Liang, Jun Zhang, Xianping Fu
2016 J jnl
Knowl. Based Syst.
Yafei Wang, Tianyi Shen, GuoLiang Yuan, Jiming Bian, Xianping Fu
2016 conf
ICIMCS
Jinjia Peng, Tianyi Shen, Yafei Wang, Tongtong Zhao, Jun Zhang, Xianping Fu
2015 C conf
FIE
Jun Zhang, Sheng Bi, Xueyu Geng, Xianping Fu
2015 conf
ICIMCS
Ruoqian Wang, Yafei Wang, Jun Zhang, Xianping Fu
2014 conf
ICIMCS
Yafei Wang, Bowen Zhang, Xianping Fu
2013 J jnl
IEEE Trans. Intell. Transp. Syst.
Xianping Fu, Xiao Guan, Eli Peli, Hongbo Liu, Gang Luo
2012 J jnl
Int. J. Wirel. Mob. Comput.
Xianping Fu, Yafei Wang, Hongbo Liu, GuoLiang Yuan
2010 conf
DBTA
Xianping Fu, YuGang Men, GuoLiang Yuan
2009 conf
IPCV
Xianping Fu, Gang Luo, Eli Peli
2007 conf
VISUAL
Xianping Fu, Dequn Liang, Dongsheng Wang
2007 C conf
NPC
Haixia Wang, Dongsheng Wang, Peng Li, Jinglei Wang, Xianping Fu
2003 C conf
VCIP
Xianping Fu, Zhao Wang
2003 conf
WAA
Xianping Fu, Zhao Wang, Dequn Liang
redb/extractors/decompiler/apk/analyzer.py
← Index redb/extractors/decompiler/apk/analyzer.py python
"""APK Code Analyzer — orchestrates androguard + JADX + apktool analysis.

This is the APK equivalent of BinaryNinjaDecompiler in
redb/extractors/decompiler/bninja/decompiler.py.
"""

import math
import os
import tempfile
from collections import Counter
from concurrent.futures import ThreadPoolExecutor, as_completed
from typing import Any, Dict, List, Optional, Set

from redb.extractors.decompiler.apk.apktool_wrapper import ApktoolDisassembler
from redb.extractors.decompiler.apk.jadx_wrapper import JADXDecompiler
from redb.extractors.decompiler.apk.library_filter import LibraryFilter
from redb.extractors.decompiler.apk.method_extractor import (
    compute_minhash,
    compute_prime_product_smali,
    compute_sha256,
    compute_ssdeep,
    compute_tlsh,
    count_call_instructions,
    dalvik_to_java_class,
    dalvik_to_java_prototype,
    detect_obfuscation_indicators,
)
from redb.extractors.decompiler.apk.smali_normalization import normalize_method_body
from redb.extractors.decompiler.apk.smali_cfg import compute_cfg_metrics
from redb.extractors.decompiler.apk.smali_parser import SmaliParser


class APKCodeAnalyzer:
    """Orchestrates APK code analysis combining three tools.

    Combines androguard (call graphs, xrefs, method enumeration),
    JADX (Java decompilation), and apktool (smali disassembly).
    """

    def __init__(
        self,
        filepath: str,
        timeout: int = 600,
        log=None,
        decompile_modules: Set[str] = None,
    ):
        self.filepath = filepath
        self.timeout = timeout
        self.log = log
        self.decompile_modules = decompile_modules or {"all"}
        self.min_instructions = int(
            os.getenv("APK_MIN_METHOD_INSTRUCTIONS", "5")
        )
        self.library_filter = LibraryFilter()
        self.jadx = JADXDecompiler(log=log)
        self.apktool = ApktoolDisassembler(log=log)

        self._temp_dirs = []

    def extract(self) -> Dict[str, Any]:
        """Run full APK code analysis.

        Returns dict with keys:
            decompiled_content, decompiled_refs,
            smali_content, smali_refs,
            similarity_metrics, strings, analysis_errors
        """
        results = {
            "decompiled_content": [],
            "decompiled_refs": [],
            "smali_content": [],
            "smali_refs": [],
            "similarity_metrics": [],
            "cfg": [],
            "strings": [],
            "analysis_errors": [],
        }

        # Create temp directories
        jadx_dir = tempfile.mkdtemp(prefix="redb_jadx_")
        apktool_dir = tempfile.mkdtemp(prefix="redb_apktool_")
        self._temp_dirs.extend([jadx_dir, apktool_dir])

        # Step 1-3: Run JADX, apktool, and androguard in parallel
        jadx_success = False
        apktool_success = False
        androguard_result = None

        with ThreadPoolExecutor(max_workers=3) as executor:
            futures = {}
            futures[executor.submit(self.jadx.decompile, self.filepath, jadx_dir)] = "jadx"
            futures[executor.submit(self.apktool.disassemble, self.filepath, apktool_dir)] = "apktool"
            futures[executor.submit(self._run_androguard)] = "androguard"

            for future in as_completed(futures):
                tool = futures[future]
                try:
                    result = future.result()
                    if tool == "jadx":
                        jadx_success = result
                    elif tool == "apktool":
                        apktool_success = result
                    elif tool == "androguard":
                        androguard_result = result
                except Exception as e:
                    if self.log:
                        self.log.error(f"{tool} failed: {e}")
                    results["analysis_errors"].append({
                        "class_name": None,
                        "method_name": None,
                        "error_location": tool,
                        "error_message": str(e),
                        "error_type": type(e).__name__,
                    })

        if androguard_result is None:
            if self.log:
                self.log.error("Androguard analysis failed — cannot proceed")
            return results

        apk_obj, dexs, analysis = androguard_result

        # Step 4b: Extract strings from DEX files
        try:
            results["strings"] = self._extract_strings(dexs)
        except Exception as e:
            if self.log:
                self.log.error(f"String extraction failed: {e}")
            results["analysis_errors"].append({
                "class_name": None,
                "method_name": None,
                "error_location": "strings",
                "error_message": f"String extraction failed: {e}",
                "error_type": type(e).__name__,
            })

        # Step 5: Parse smali output
        smali_methods = {}
        if apktool_success:
            try:
                smali_dirs = self.apktool.get_smali_directories(apktool_dir)
                for sdir in smali_dirs:
                    smali_methods.update(SmaliParser.parse_smali_directory(sdir))
            except Exception as e:
                if self.log:
                    self.log.error(f"Smali parsing failed: {e}")
                results["analysis_errors"].append({
                    "class_name": None,
                    "method_name": None,
                    "error_location": "apktool",
                    "error_message": f"Smali parsing failed: {e}",
                    "error_type": type(e).__name__,
                })

        # Step 6: Parse Java output
        java_methods = {}
        if jadx_success:
            try:
                java_methods = self.jadx.parse_java_methods(jadx_dir)
            except Exception as e:
                if self.log:
                    self.log.error(f"Java parsing failed: {e}")
                results["analysis_errors"].append({
                    "class_name": None,
                    "method_name": None,
                    "error_location": "jadx",
                    "error_message": f"Java parsing failed: {e}",
                    "error_type": type(e).__name__,
                })

        if not apktool_success and self.log:
            self.log.info(
                "apktool failed — falling back to androguard disassembly"
            )

        # Step 7-8: Process each method from androguard
        seen_decompiled_hashes = set()
        seen_smali_hashes = set()

        try:
            for method in analysis.get_methods():
                try:
                    self._process_method(
                        method,
                        smali_methods,
                        java_methods,
                        results,
                        seen_decompiled_hashes,
                        seen_smali_hashes,
                    )
                except Exception as e:
                    method_name = "unknown"
                    class_name = "unknown"
                    try:
                        if not method.is_external():
                            enc = method.get_method()
                            class_name = enc.get_class_name()
                            method_name = enc.get_name()
                    except Exception:
                        pass
                    results["analysis_errors"].append({
                        "class_name": class_name,
                        "method_name": method_name,
                        "error_location": "analysis",
                        "error_message": str(e),
                        "error_type": type(e).__name__,
                    })
        except Exception as e:
            if self.log:
                self.log.error(f"Method enumeration failed: {e}")
            results["analysis_errors"].append({
                "class_name": None,
                "method_name": None,
                "error_location": "androguard",
                "error_message": f"Method enumeration failed: {e}",
                "error_type": type(e).__name__,
            })

        if self.log:
            stats = self.library_filter.get_filter_stats()
            self.log.info(
                f"APK analysis complete: {stats['user']} user methods, "
                f"{stats['library']} library methods filtered, "
                f"{len(results['decompiled_content'])} decompiled, "
                f"{len(results['smali_content'])} smali, "
                f"{len(results['strings'])} strings"
            )

        return results

    def _run_androguard(self):
        """Run androguard analysis on the APK."""
        from androguard.misc import AnalyzeAPK
        return AnalyzeAPK(self.filepath)

    def _process_method(
        self,
        method,
        smali_methods: Dict,
        java_methods: Dict,
        results: Dict,
        seen_decompiled: set,
        seen_smali: set,
    ):
        """Process a single method from androguard analysis."""
        # Skip external methods (no code body)
        if method.is_external():
            return

        encoded = method.get_method()
        class_name = encoded.get_class_name()
        method_name = encoded.get_name()
        descriptor = encoded.get_descriptor()

        # Build method key for cross-tool matching
        method_key = SmaliParser.make_method_key(class_name, method_name, descriptor)

        # Check if library
        is_lib = self.library_filter.is_library(class_name)
        method_type = "LIBRARY" if is_lib else "USER"

        # Skip library methods for content tables (but they're still in xrefs)
        if is_lib:
            return

        # Get xrefs
        # In androguard 4.x, xref tuples are (ClassAnalysis, MethodAnalysis, offset).
        # The MethodAnalysis wrapper doesn't expose get_class_name()/get_name()
        # directly — we need to unwrap via .get_method() first.
        callers = []
        callees = []
        try:
            for ref_class, ref_method, offset in method.get_xref_from():
                try:
                    enc = ref_method.get_method()
                    caller_key = f"{enc.get_class_name()}->{enc.get_name()}"
                except AttributeError:
                    # Fallback for older androguard where ref_method is EncodedMethod
                    caller_key = f"{ref_method.get_class_name()}->{ref_method.get_name()}"
                callers.append(caller_key)
        except Exception:
            pass

        try:
            for ref_class, ref_method, offset in method.get_xref_to():
                try:
                    enc = ref_method.get_method()
                    callee_key = f"{enc.get_class_name()}->{enc.get_name()}"
                except AttributeError:
                    callee_key = f"{ref_method.get_class_name()}->{ref_method.get_name()}"
                callees.append(callee_key)
        except Exception:
            pass

        # Look up smali body
        smali_method = smali_methods.get(method_key)
        smali_body = None
        smali_normalized = None
        smali_hash = None
        instruction_count = 0
        register_count = 0

        if smali_method:
            smali_body = smali_method.body
            instruction_count = smali_method.instruction_count
            register_count = smali_method.register_count
        else:
            # Fallback: use androguard's own disassembler
            smali_body, instruction_count, register_count = (
                self._disassemble_with_androguard(encoded)
            )

        # Apply minimum instruction filter
        if instruction_count < self.min_instructions:
            return

        if smali_body:
            smali_normalized = SmaliParser.normalize_smali_body(smali_body)
            if smali_normalized:
                smali_hash = compute_sha256(smali_normalized)

        if not smali_hash:
            return

        # Compute obfuscation indicators from smali
        obfuscation = detect_obfuscation_indicators(
            method_name, class_name, smali_body, instruction_count
        )

        # Compute CFG metrics early — needed for both content tables and cfg table
        cfg_metrics = None
        if smali_body:
            try:
                cfg_metrics = compute_cfg_metrics(smali_body)
            except Exception:
                pass

        # Smali content (deduplicated)
        if smali_hash and smali_hash not in seen_smali:
            seen_smali.add(smali_hash)
            results["smali_content"].append({
                "smali_method_hash": smali_hash,
                "smali_method": smali_body,
                "smali_method_type": method_type,
                "smali_instructions_count": instruction_count,
                "smali_register_count": register_count,
                "smali_has_string_encryption": obfuscation.get("has_string_encryption", False),
                "smali_has_reflection_calls": obfuscation.get("has_reflection_calls", False),
                "smali_excessive_goto_count": obfuscation.get("excessive_goto_count", False),
                "smali_flattened_score": cfg_metrics.flattened_score if cfg_metrics else 0.0,
                "smali_mba_score": cfg_metrics.mba_score if cfg_metrics else 0.0,
            })

        # Smali reference (per-binary)
        ssdeep_val = compute_ssdeep(smali_normalized) if smali_normalized else None
        tlsh_val = compute_tlsh(smali_normalized) if smali_normalized else None

        # Semantically normalized ssdeep/TLSH (analogous to Binja's ssdeep_llil/tlsh_llil)
        ssdeep_normalized_val = None
        tlsh_normalized_val = None
        if smali_normalized:
            normalized_lines = normalize_method_body(smali_normalized, level="opcode_api")
            if normalized_lines:
                normalized_text = "\n".join(normalized_lines)
                ssdeep_normalized_val = compute_ssdeep(normalized_text)
                tlsh_normalized_val = compute_tlsh(normalized_text)

        # Look up Java source
        java_class = dalvik_to_java_class(class_name)
        java_key_candidates = [
            f"{java_class}.{method_name}",
        ]
        java_source = None
        decompiled_hash = None

        for jk in java_key_candidates:
            for key, source in java_methods.items():
                if key.startswith(jk):
                    java_source = source
                    break
            if java_source:
                break

        if java_source:
            # Normalize and hash decompiled content
            normalized_java = _normalize_java(java_source)
            decompiled_hash = compute_sha256(normalized_java)

            # Decompiled content (deduplicated)
            if decompiled_hash not in seen_decompiled:
                seen_decompiled.add(decompiled_hash)
                results["decompiled_content"].append({
                    "decompiled_method_hash": decompiled_hash,
                    "decompiled_method": java_source,
                    "decompiled_method_type": method_type,
                    "decompiled_has_string_encryption": obfuscation.get("has_string_encryption", False),
                    "decompiled_has_reflection_calls": obfuscation.get("has_reflection_calls", False),
                    "decompiled_excessive_goto_count": obfuscation.get("excessive_goto_count", False),
                })

            # Decompiled reference
            method_prototype = dalvik_to_java_prototype(
                method_name, descriptor, class_name
            )
            results["decompiled_refs"].append({
                "decompiled_method_hash": decompiled_hash,
                "smali_method_hash": smali_hash,
                "decompiled_class_name": dalvik_to_java_class(class_name),
                "decompiled_method_name": method_name,
                "decompiled_method_signature": descriptor,
                "decompiled_method_prototype": method_prototype,
                "functions_caller": callers,
                "functions_call": callees,
            })

        # Smali reference
        if smali_hash:
            results["smali_refs"].append({
                "smali_method_hash": smali_hash,
                "decompiled_method_hash": decompiled_hash,
                "smali_class_name": dalvik_to_java_class(class_name),
                "smali_method_name": method_name,
                "smali_method_signature": descriptor,
                "ssdeep_smali": ssdeep_val,
                "tlsh_smali": tlsh_val,
            })

        # Similarity metrics (content-based fuzzy matching only)
        if smali_hash and smali_normalized:
            minhash_sig = compute_minhash(smali_normalized)
            sim_entry = {
                "smali_method_hash": smali_hash,
                "cyclomatic_complexity": cfg_metrics.cyclomatic_complexity if cfg_metrics else None,
                "ssdeep_smali": ssdeep_val,
                "tlsh_smali": tlsh_val,
                "ssdeep_smali_normalized": ssdeep_normalized_val,
                "tlsh_smali_normalized": tlsh_normalized_val,
                "minhash": minhash_sig or [],
            }
            results["similarity_metrics"].append(sim_entry)

        # CFG entry (structural/topological features)
        if smali_hash and cfg_metrics and smali_body:
            prime_product = compute_prime_product_smali(smali_body)
            call_count = count_call_instructions(smali_body)
            cfg_entry = {
                "smali_method_hash": smali_hash,
                "cfg_topology_hash": cfg_metrics.cfg_topology_hash,
                "block_count": cfg_metrics.block_count,
                "edge_count": cfg_metrics.edge_count,
                "cfg_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,
            }
            results["cfg"].append(cfg_entry)

    @staticmethod
    def _string_entropy(s: str) -> float:
        """Compute Shannon entropy of a string."""
        if not s:
            return 0.0
        freq = Counter(s)
        length = len(s)
        return -sum(
            (count / length) * math.log2(count / length)
            for count in freq.values()
        )

    def _extract_strings(self, dexs) -> List[Dict[str, Any]]:
        """Extract deduplicated strings from all DEX objects.

        Uses androguard's get_strings() on each DEX, deduplicates by value,
        and computes entropy — matching the Binja StringAnalysis output format
        so IOCExtractorFromResults can consume them identically.

        Returns list of dicts with keys:
            string, string_encoding, string_offset, string_length, string_entropy
        """
        seen = set()
        strings = []
        offset_counter = 0

        for dex in dexs:
            try:
                dex_strings = dex.get_strings()
            except Exception:
                continue

            if not dex_strings:
                continue

            for s in dex_strings:
                if not s or s in seen:
                    continue
                # DEX MUTF-8 strings may contain unpaired surrogates (e.g. \ud800)
                # that are invalid UTF-8 and will fail ClickHouse insert
                s = s.encode('utf-8', errors='replace').decode('utf-8')
                if not s or s in seen:
                    continue
                seen.add(s)

                strings.append({
                    "string": s,
                    "string_encoding": "UTF8",
                    "string_offset": offset_counter,
                    "string_length": len(s),
                    "string_entropy": self._string_entropy(s),
                })
                offset_counter += 1

        return strings

    @staticmethod
    def _disassemble_with_androguard(encoded):
        """Fallback disassembly using androguard when apktool fails.

        Returns (smali_body, instruction_count, register_count).
        """
        code = encoded.get_code()
        if not code:
            return None, 0, 0

        register_count = code.get_registers_size()
        lines = []
        instruction_count = 0

        try:
            bytecode = code.get_bc()
            if not bytecode:
                return None, 0, register_count

            for instruction in bytecode.get_instructions():
                op_name = instruction.get_name()
                output = instruction.get_output()
                if output:
                    output = _normalize_androguard_operands(op_name, output)
                    lines.append(f"    {op_name} {output}")
                else:
                    lines.append(f"    {op_name}")
                instruction_count += 1
        except Exception:
            return None, 0, register_count

        if not lines:
            return None, 0, register_count

        smali_body = "\n".join(lines)
        return smali_body, instruction_count, register_count

    def cleanup(self):
        """Remove temporary directories."""
        import shutil
        for d in self._temp_dirs:
            try:
                if os.path.isdir(d):
                    shutil.rmtree(d)
            except Exception:
                pass
        self._temp_dirs.clear()


def _normalize_androguard_operands(op_name: str, output: str) -> str:
    """Normalize androguard instruction output to match apktool smali format.

    Androguard's get_output() differs from apktool in two key ways:
    1. invoke-* operands lack {braces} around registers:
       androguard: 'v0, v1, Lcom/Foo;->bar()V'
       apktool:    '{v0, v1}, Lcom/Foo;->bar()V'
    2. Field instructions use a space instead of colon between name and type:
       androguard: 'v0, v1, LA;->field Ljava/lang/String;'
       apktool:    'v0, v1, LA;->field:Ljava/lang/String;'
    """
    # invoke-* instructions: wrap register args in {braces}
    if op_name.startswith("invoke-"):
        # Find the class/method reference (starts with L or [)
        # Split on ', ' and find where the reference begins
        parts = output.split(", ")
        reg_parts = []
        ref_idx = None
        for i, part in enumerate(parts):
            stripped = part.strip()
            if stripped.startswith("L") or stripped.startswith("["):
                ref_idx = i
                break
            reg_parts.append(part)

        if ref_idx is not None and reg_parts:
            regs = ", ".join(reg_parts)
            ref = ", ".join(parts[ref_idx:])
            return "{" + regs + "}, " + ref
        elif reg_parts:
            # No reference found — just wrap all as registers
            return "{" + ", ".join(reg_parts) + "}"

    # Field instructions: fix 'field Ltype;' → 'field:Ltype;'
    if op_name.startswith(("iget", "iput", "sget", "sput")):
        # Pattern: '... ClassName;->fieldName Ltype;' or '... ClassName;->fieldName [Ltype;'
        # The space between fieldName and the type descriptor should be a colon
        arrow_idx = output.find("->")
        if arrow_idx != -1:
            after_arrow = output[arrow_idx + 2:]
            # Find the space before the type descriptor
            space_idx = after_arrow.find(" ")
            if space_idx != -1:
                remaining = after_arrow[space_idx + 1:]
                # Check that what follows is a type descriptor
                if remaining.startswith(("L", "[", "Z", "B", "S", "C",
                                         "I", "J", "F", "D")):
                    after_arrow = after_arrow[:space_idx] + ":" + remaining
                    output = output[:arrow_idx + 2] + after_arrow

    return output


def _normalize_java(source: str) -> str:
    """Normalize Java source for consistent hashing.

    Strip leading/trailing whitespace, normalize indentation.
    """
    lines = []
    for line in source.split("\n"):
        stripped = line.strip()
        if stripped:
            lines.append(stripped)
    return "\n".join(lines)