Xiaojun Bi

96 papers A* 59A 7B 6Misc 1Journal 10Unranked 9
YearRankTypeTitle / Venue / Authors
2026 A* conf
CHI
Satwik Ram Kodandaram, Jiawei Zhou, Xiaojun Bi, I. V. Ramakrishnan, Vikas Ashok
2026 J jnl
CoRR
Satwik Ram Kodandaram, Jiawei Zhou, Xiaojun Bi, I. V. Ramakrishnan, Vikas Ashok
2026 A* conf
CHI
Tony Li, Yan Ma, Zhuojun Li, Chun Yu, I. V. Ramakrishnan, Xiaojun Bi
2026 J jnl
CoRR
Tony Li, Yan Ma, Zhuojun Li, Chun Yu, I. V. Ramakrishnan, Xiaojun Bi
2026 A* conf
CHI
Monalika Padma Reddy, Aruna Balasubramanian, Jiawei Zhou, Xiaojun Bi, I. V. Ramakrishnan, Vikas Ashok
2026 J jnl
CoRR
Monalika Padma Reddy, Aruna Balasubramanian, Jiawei Zhou, Xiaojun Bi, I. V. Ramakrishnan, Vikas Ashok
2025 A* conf
UIST
Dan Zhang, Yan Ma, Glenn Dausch, William H. Seiple, Xianfeng David Gu, I. V. Ramakrishnan, Xiaojun Bi
2025 A conf
ASSETS
Prerna Khanna, Monalika Padma Reddy, I. V. Ramakrishnan, Xiaojun Bi, Aruna Balasubramanian
2025 A* conf
CHI
Yan Ma, Dan Zhang, I. V. Ramakrishnan, Xiaojun Bi
2025 conf
VR Workshops
Yan Ma, Tony Li, Zhi Li, Xiaojun Bi
2025 J jnl
Proc. ACM Interact. Mob. Wearable Ubiquitous Technol.
Hang Zhao, Kaiyan Ling, I. V. Ramakrishnan, M. D. Guy Schwartz, Xiaojun Bi
2025 A* conf
CHI
Hyunchul Lim, Nam Anh Dang, Dylan Lee, Tianhong Catherine Yu, Jane Lu, Franklin Mingzhe Li, Yiqi Jin, Yan Ma, Xiaojun Bi, François Guimbretière, Cheng Zhang
2025 J jnl
CoRR
Hyunchul Lim, Nam Anh Dang, Dylan Lee, Tianhong Catherine Yu, Jane Lu, Franklin Mingzhe Li, Yiqi Jin, Yan Ma, Xiaojun Bi, François Guimbretière, Cheng Zhang
2025 A* conf
CHI
Maozheng Zhao, Michael Xuelin Huang, Nathan G. Huang, Shanqing Cai, Henry Huang, Michael G. Huang, Shumin Zhai, I. V. Ramakrishnan, Xiaojun Bi
2024 A* conf
UIST
Dan Zhang, Zhi Li, Vikas Ashok, William H. Seiple, I. V. Ramakrishnan, Xiaojun Bi
2024 A conf
ASSETS
Satwik Ram Kodandaram, Utku Uckun, Xiaojun Bi, I. V. Ramakrishnan, Vikas Ashok
2024 J jnl
CoRR
Satwik Ram Kodandaram, Utku Uckun, Xiaojun Bi, I. V. Ramakrishnan, Vikas Ashok
2024 A* conf
CHI
Prerna Khanna, I. V. Ramakrishnan, Shubham Jain, Xiaojun Bi, Aruna Balasubramanian
2024 J jnl
Proc. ACM Interact. Mob. Wearable Ubiquitous Technol.
Kaiyan Ling, Hang Zhao, Xiangmin Fan, Xiaohui Niu, Wenchao Yin, Yue Liu, Cui Wang, Xiaojun Bi
2024 A conf
ASSETS
Anujay Ghosh, Monalika Padma Reddy, Satwik Ram Kodandaram, Utku Uckun, Vikas Ashok, Xiaojun Bi, I. V. Ramakrishnan
2023 A* conf
MobiCom
Prerna Khanna, Shirin Feiz, Jian Xu, I. V. Ramakrishnan, Shubham Jain, Xiaojun Bi, Aruna Balasubramanian
2023 A* conf
CHI
Wenzhe Cui, Rui Liu, Zhi Li, Yifan Wang, Andrew Wang, Xia Zhao, Sina Rashidian, Furqan Baig, I. V. Ramakrishnan, Fusheng Wang, Xiaojun Bi
2023 A* conf
CHI
Zhi Li, Yu-Jung Ko, Aini Putkonen, Shirin Feiz, Vikas Ashok, I. V. Ramakrishnan, Antti Oulasvirta, Xiaojun Bi
2023 A* conf
UIST
Jeremy Chu, Yan Ma, Shumin Zhai, Xianfeng David Gu, Xiaojun Bi
2023 A* conf
CHI
Jeremy Chu, Dongsheng An, Yan Ma, Wenzhe Cui, Shumin Zhai, Xianfeng David Gu, Xiaojun Bi
2022 A* conf
CHI
Lihang Pan, Chun Yu, Jiahui Li, Tian Huang, Xiaojun Bi, Yuanchun Shi
2022 A* conf
UIST
Hang Zhao, Sophia Gu, Chun Yu, Xiaojun Bi
2022 A conf
IUI
Maozheng Zhao, Henry Huang, Zhi Li, Rui Liu, Wenzhe Cui, Kajal Toshniwal, Ananya Goel, Andrew Wang, Xia Zhao, Sina Rashidian, Furqan Baig, Khiem Phi, Shumin Zhai, I. V. Ramakrishnan, Fusheng Wang, Xiaojun Bi
2022 A* conf
UIST
Zheer Xu, Yankang Meng, Xiaojun Bi, Xing-Dong Yang
2022 A* conf
CHI
Zhi Li, Maozheng Zhao, Dibyendu Das, Hang Zhao, Yan Ma, Wanyu Liu, Michel Beaudouin-Lafon, Fusheng Wang, I. V. Ramakrishnan, Xiaojun Bi
2022 A conf
UMAP
Utku Uckun, Rohan Tumkur Suresh, Md Javedul Ferdous, Xiaojun Bi, I. V. Ramakrishnan, Vikas Ashok
2022 B conf
Graphics Interface
Sophia Gu, Yan Ma, Zhi Li, Xiangmin Fan, Feng Tian, Xiaojun Bi
2021 A* conf
CHI
Wenzhe Cui, Suwen Zhu, Zhi Li, Zheer Xu, Xing-Dong Yang, I. V. Ramakrishnan, Xiaojun Bi
2021 B conf
Graphics Interface
Zhi Li, Maozheng Zhao, Yifan Wang, Sina Rashidian, Furqan Baig, Rui Liu, Wanyu Liu, Michel Beaudouin-Lafon, Brooke Ellison, Fusheng Wang, I. V. Ramakrishnan, Xiaojun Bi
2021 B conf
MobileHCI
Luis A. Leiva, Sunjun Kim, Wenzhe Cui, Xiaojun Bi, Antti Oulasvirta
2021 conf
CCHI
Yu-Jung Ko, Hang Zhao, I. V. Ramakrishnan, Shumin Zhai, Xiaojun Bi
2021 B conf
MobileHCI
Yu-Jung Ko, Aini Putkonen, Ali Selman Aydin, Shirin Feiz, Yuheng Wang, Vikas Ashok, I. V. Ramakrishnan, Antti Oulasvirta, Xiaojun Bi
2021 A* conf
UIST
Yan Ma, Shumin Zhai, I. V. Ramakrishnan, Xiaojun Bi
2021 B conf
Graphics Interface
Shirin Feiz, Anatoliy Borodin, Xiaojun Bi, I. V. Ramakrishnan
2021 A* conf
UIST
Michael Wang, Hang Zhao, Xiaolei Zhou, Xiangshi Ren, Xiaojun Bi
2021 A* conf
UIST
Maozheng Zhao, Wenzhe Cui, I. V. Ramakrishnan, Shumin Zhai, Xiaojun Bi
2020 A* conf
UIST
Wenzhe Cui, Suwen Zhu, Mingrui Ray Zhang, H. Andrew Schwartz, Jacob O. Wobbrock, Xiaojun Bi
2020 A* conf
UIST
Yu-Jung Ko, Hang Zhao, Yoonsang Kim, I. V. Ramakrishnan, Shumin Zhai, Xiaojun Bi
2020 B conf
MobileHCI
Conor Kelton, Jihoon Ryoo, Aruna Balasubramanian, Xiaojun Bi, Samir R. Das
2020 A* conf
CHI
Xin Yi, Chen Wang, Xiaojun Bi, Yuanchun Shi
2020 A conf
AsiaCCS
Joon Kuy Han, Xiaojun Bi, Hyoungshick Kim, Simon S. Woo
2020 A* conf
CHI
Suwen Zhu, Yoonsang Kim, Jingjie Zheng, Jennifer Yi Luo, Ryan Qin, Liuping Wang, Xiangmin Fan, Feng Tian, Xiaojun Bi
2019 A* conf
CHI
Syed Masum Billah, Yu-Jung Ko, Vikas Ashok, Xiaojun Bi, I. V. Ramakrishnan
2019 A* conf
CHI
Wenzhe Cui, Jingjie Zheng, Blaine Lewis, Daniel Vogel, Xiaojun Bi
2019 A* conf
UIST
Zheer Xu, Pui Chung Wong, Jun Gong, Te-yen Wu, Aditya Shekhar Nittala, Xiaojun Bi, Jürgen Steimle, Hongbo Fu, Kening Zhu, Xing-Dong Yang
2019 A* conf
CHI
Yiqin Lu, Chun Yu, Shuyi Fan, Xiaojun Bi, Yuanchun Shi
2019 A* conf
CHI
Weinan Shi, Chun Yu, Shuyi Fan, Feng Wang, Tong Wang, Xin Yi, Xiaojun Bi, Yuanchun Shi
2019 A* conf
CHI
Feng Tian, Xiangmin Fan, Junjun Fan, Yicheng Zhu, Jing Gao, Dakuo Wang, Xiaojun Bi, Hongan Wang
2019 A* conf
CHI
Suwen Zhu, Jingjie Zheng, Shumin Zhai, Xiaojun Bi
2018 book
Antti Oulasvirta, Per Ola Kristensson, Xiaojun Bi, Andrew Howes
2018 A* conf
CHI
Jingjie Zheng, Xiaojun Bi, Kun Li, Yang Li, Shumin Zhai
2018 Misc conf
ISS
Ryan Qin, Suwen Zhu, Yu-Hao Lin, Yu-Jung Ko, Xiaojun Bi
2018 ch.
Computational Interaction
Xiaojun Bi, Brian A. Smith, Tom Ouyang, Shumin Zhai
2018 A* conf
CHI
Suwen Zhu, Tianyao Luo, Xiaojun Bi, Shumin Zhai
2018 A* conf
UIST
Jian Xu, Suwen Zhu, Aruna Balasubramanian, Xiaojun Bi, Roy Shilkrot
2018 A conf
ASSETS
Yu-Hao Lin, Suwen Zhu, Yu-Jung Ko, Wenzhe Cui, Xiaojun Bi
2018 A* conf
CHI
Jun Gong, Zheer Xu, Qifan Guo, Teddy Seyed, Xiang 'Anthony' Chen, Xiaojun Bi, Xing-Dong Yang
2017 A* conf
CHI
Xin Yi, Chun Yu, Weijie Xu, Xiaojun Bi, Yuanchun Shi
2017 A* conf
UIST
Jessalyn Alvina, Carla F. Griggio, Xiaojun Bi, Wendy E. Mackay
2017 J jnl
Dagstuhl Reports
Xiaojun Bi, Otmar Hilliges, Takeo Igarashi, Antti Oulasvirta
2017 conf
CHI Extended Abstracts
Keith Vertanen, Kyle Montague, Mark D. Dunlop, Ahmed Sabbir Arif, Xiaojun Bi, Shiri Azenkot
2017 A* conf
CHI
Xin Yi, Chun Yu, Weinan Shi, Xiaojun Bi, Yuanchun Shi
2016 conf
CHI Extended Abstracts
Xiaojun Bi, Lu Xiao, Feng Tian, Sharon Xianghua Ding, Yong Ming Kow
2016 A* conf
CHI
Xiaojun Bi, Shumin Zhai
2016 A* conf
CHI
Chun Yu, Hongyi Wen, Wei Xiong, Xiaojun Bi, Yuanchun Shi
2016 A* conf
UIST
Xiaojun Bi, Shumin Zhai
2015 conf
CHI Extended Abstracts
Hao-Chuan Wang, Gary Hsieh, Xiaojun Bi, Henry B. L. Duh, Yihsiu Chen
2015 A* conf
CHI
Andrew Fowler, Kurt Partridge, Ciprian Chelba, Xiaojun Bi, Tom Ouyang, Shumin Zhai
2015 A* conf
CHI
Brian A. Smith, Xiaojun Bi, Shumin Zhai
2015 conf
CHI Extended Abstracts
Per Ola Kristensson, Xiaojun Bi, Andrew Howes, Antti Oulasvirta, Roderick Murray-Smith, Harold Thimbleby, John Williamson, Shumin Zhai
2015 ed.
CCHI
Henry B. L. Duh, Yihsiu Chen, Hao-Chuan Wang, Gary Hsieh, Xiaojun Bi, Yi Ji, Ryan Wang
2014 A* conf
CHI
Xiaojun Bi, Tom Ouyang, Shumin Zhai
2014 J jnl
Hum. Comput. Interact.
Xiaojun Bi, Seok-Hyung Bae, Ravin Balakrishnan
2013 A* conf
UIST
Xiaojun Bi, Shumin Zhai
2013 A* conf
CHI
Xiaojun Bi, Yang Li, Shumin Zhai
2013 A* conf
CHI
Xiaojun Bi, Shiri Azenkot, Kurt Partridge, Shumin Zhai
2012 A* conf
UIST
Xiaojun Bi, Ciprian Chelba, Tom Ouyang, Kurt Partridge, Shumin Zhai
2012 A* conf
CHI
Ken Hinckley, Xiaojun Bi, Michel Pahud, Bill Buxton
2012 J jnl
Hum. Comput. Interact.
Xiaojun Bi, Barton A. Smith, Shumin Zhai
2012 A* conf
CHI
Yizhong Xin, Xiaojun Bi, Xiangshi Ren
2012
Xiaojun Bi
2011 A* conf
CHI
Yizhong Xin, Xiaojun Bi, Xiangshi Ren
2011 A* conf
CHI
Xiaojun Bi, Tovi Grossman, Justin Matejka, George W. Fitzmaurice
2010 A* conf
CHI
Xiaojun Bi, Seok-Hyung Bae, Ravin Balakrishnan
2010 A* conf
CHI
Xiaojun Bi, Barton A. Smith, Shumin Zhai
2010 conf
Mobile HCI
James Scott, Shahram Izadi, Leila Sadat Rezai, Dominika Ruszkowski, Xiaojun Bi, Ravin Balakrishnan
2009 A* conf
CHI
Xiaojun Bi, Ravin Balakrishnan
2008 A* conf
UIST
Xiaojun Bi, Tomer Moscovich, Gonzalo A. Ramos, Ravin Balakrishnan, Ken Hinckley
2006 conf
Tabletop
Xiaojun Bi, Yuanchun Shi, Xiaojie Chen
2005 conf
sOc-EUSAI
Xiaojun Bi, Yuanchun Shi, Xiaojie Chen, Peifeng Xiang
2005 A* conf
ACM Multimedia
Xiaojun Bi, Yuanchun Shi, Xiaojie Chen, Peifeng Xiang
redb/extractors/apk_extractors/apk_manifest.py
← Index redb/extractors/apk_extractors/apk_manifest.py python
import inspect
import json
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.apk_extractor import APKExtractor
from redb.models.dataclasses import APKManifest, APKManifestComponent


class APKManifestExtractor(APKExtractor):

    def __init__(
        self, filepath, log, exporters=None, index_prefix=None,
        known_benign=False, known_malicious=False,
        apk=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix,
            known_benign, known_malicious, apk,
        )
        self.manifest = None
        self.components = []
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.APK_MANIFEST.value

    def _is_component_exported(self, component_type, component_name):
        """Determine if a component is exported.

        Pre-API 31: exported is implicitly True if intent filters exist.
        API 31+: android:exported must be explicit; default is False.
        """
        try:
            exported_attr = None
            # Try to get the exported attribute directly from the XML
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                for node in axml.getElementsByTagName(component_type):
                    name = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "name"
                    )
                    if name == component_name:
                        exported_attr = node.getAttributeNS(
                            "http://schemas.android.com/apk/res/android", "exported"
                        )
                        break
        except Exception:
            exported_attr = None

        if exported_attr == "true":
            return True
        if exported_attr == "false":
            return False

        # If not explicitly set, check for intent filters (pre-API 31 behavior)
        try:
            intent_filters = self.apk.get_intent_filters(component_type, component_name)
            if intent_filters:
                actions = intent_filters.get("action", [])
                if actions:
                    return True
        except Exception:
            pass

        return False

    def _get_intent_filters_for_component(self, component_type, component_name):
        """Get intent filters for a specific component."""
        actions = []
        categories = []
        try:
            intent_filters = self.apk.get_intent_filters(component_type, component_name)
            if intent_filters:
                actions = intent_filters.get("action", [])
                categories = intent_filters.get("category", [])
        except Exception:
            pass
        return actions, categories

    def _safe_extract(self, field_name, func, default=None):
        """Extract a single field, logging and returning default on failure."""
        try:
            return func()
        except Exception as e:
            self.log.warning(
                f"Error extracting APK manifest field '{field_name}' for "
                f"{self.hash.sha256}: {e}"
            )
            return default

    def extract(self):
        if not self._is_valid_apk():
            self.log.error(f"Invalid APK for {self.hash.sha256}")
            return None

        activities = self._safe_extract(
            "activities", lambda: list(self.apk.get_activities() or []), []
        )
        services = self._safe_extract(
            "services", lambda: list(self.apk.get_services() or []), []
        )
        receivers = self._safe_extract(
            "receivers", lambda: list(self.apk.get_receivers() or []), []
        )
        providers = self._safe_extract(
            "providers", lambda: list(self.apk.get_providers() or []), []
        )

        # Build component list with intent filter info
        self.components = []
        all_actions = set()
        all_categories = set()
        exported_components = []

        component_map = [
            ("activity", activities),
            ("service", services),
            ("receiver", receivers),
            ("provider", providers),
        ]

        for comp_type, comp_list in component_map:
            for comp_name in comp_list:
                try:
                    is_exported = self._is_component_exported(comp_type, comp_name)
                    actions, categories = self._get_intent_filters_for_component(
                        comp_type, comp_name
                    )
                    all_actions.update(actions)
                    all_categories.update(categories)
                    if is_exported:
                        exported_components.append(comp_name)

                    self.components.append(APKManifestComponent(
                        component_type=comp_type,
                        class_name=comp_name,
                        is_exported=is_exported,
                        intent_actions=list(actions),
                        intent_categories=list(categories),
                    ))
                except Exception as e:
                    self.log.warning(
                        f"Error processing component '{comp_name}' for "
                        f"{self.hash.sha256}: {e}"
                    )
                    # Still add the component with minimal info
                    self.components.append(APKManifestComponent(
                        component_type=comp_type,
                        class_name=comp_name,
                        is_exported=False,
                        intent_actions=[],
                        intent_categories=[],
                    ))

        # Uses-feature
        uses_features = []
        try:
            uses_features = list(self.apk.get_features() or [])
        except Exception:
            pass

        # Meta-data
        meta_data = None
        try:
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                md = {}
                for node in axml.getElementsByTagName("meta-data"):
                    name = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "name"
                    )
                    value = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "value"
                    )
                    resource = node.getAttributeNS(
                        "http://schemas.android.com/apk/res/android", "resource"
                    )
                    if name:
                        md[name] = value or resource or ""
                if md:
                    meta_data = md
        except Exception:
            pass

        # Full manifest XML
        manifest_xml = None
        try:
            axml = self.apk.get_android_manifest_xml()
            if axml is not None:
                manifest_xml = axml.toxml()
        except Exception:
            try:
                manifest_xml = self.apk.get_android_manifest_axml().get_xml()
                if isinstance(manifest_xml, bytes):
                    manifest_xml = manifest_xml.decode("utf-8", errors="replace")
            except Exception:
                pass

        self.manifest = APKManifest(
            activity_count=len(activities),
            service_count=len(services),
            receiver_count=len(receivers),
            provider_count=len(providers),
            activities=activities,
            services=services,
            receivers=receivers,
            providers=providers,
            exported_components=exported_components,
            intent_filters_by_action=sorted(all_actions),
            intent_filters_by_category=sorted(all_categories),
            uses_features=uses_features,
            meta_data=meta_data,
            manifest_xml=manifest_xml,
        )
        return self.manifest

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            if not self.manifest:
                return None

            current_time = datetime.now(timezone.utc)
            m = self.manifest

            # Components table (one row per component)
            components_data = []
            for comp in self.components:
                components_data.append([
                    self.sha256,
                    comp.component_type,
                    comp.class_name,
                    int(comp.is_exported),
                    comp.intent_actions,
                    comp.intent_categories,
                    current_time,
                ])

            # Manifest summary table (one row per APK)
            manifest_data = [[
                self.sha256,
                m.activity_count,
                m.service_count,
                m.receiver_count,
                m.provider_count,
                m.intent_filters_by_action,
                m.intent_filters_by_category,
                m.uses_features,
                m.manifest_xml,
                current_time,
            ]]

            return {
                'multi_table': True,
                'manifest': {
                    'table': 'redb_apk_manifest',
                    'data': manifest_data,
                    'column_names': [
                        'sha256',
                        'activity_count', 'service_count', 'receiver_count', 'provider_count',
                        'intent_filters_by_action', 'intent_filters_by_category',
                        'uses_features', 'manifest_xml', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)',
                        'UInt16', 'UInt16', 'UInt16', 'UInt16',
                        'Array(String)', 'Array(String)',
                        'Array(String)', 'Nullable(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
                'components': {
                    'table': 'redb_apk_components',
                    'data': components_data,
                    'column_names': [
                        'sha256', 'component_type', 'class_name', 'is_exported',
                        'intent_actions', 'intent_categories', 'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'LowCardinality(String)', 'String', 'UInt8',
                        'Array(String)', 'Array(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
            }

    def get_clickhouse_table(self) -> str:
        return "redb_apk_manifest"