'How to extract Android API calls invoked by Android app

I want to get all the Android SDK APIs invoked by an Android app. I have the following sample code.

#!/usr/bin/python3

from sys import argv
from androguard.core.bytecodes import dvm
from androguard.core.analysis import analysis
from androguard.misc import AnalyzeAPK, AnalyzeDex

a, d, dx = AnalyzeAPK(argv[1])

print(a.get_package())

pkg = a.get_package()
pkg = pkg.replace(".", "/")

print(pkg)

# Get method in external classes
for cl in list(dx.get_external_classes()):
    
    for mt in cl.get_methods():
    
        # Need to check whether calls are from dev defined class/methods
        for cls, call, _ in mt.get_xref_from():
            
            # Check 1:
            # if not cls.is_android_api() and not cls.is_external():
            # if not cls.is_external():
            if pkg in str(cls.name):
                
                print(str(mt.full_name))
                print('--> called from ' + str(cls.name))

For Check 1, I tried three options. When using cls.is_android_api() or cls.is_external(), in the output I will see API calls not directly made by my app. For example I will see the following in the output:

Ljava/lang/Object; <init> ()V
--> called from Landroidx/core/view/ViewGroupCompat;

I want to ignore API calls made by AOSP code / libraries and focus on only the calls directly made by the app in Java code. For now I decided to use an approach which checks the package name for caller.

I have the following questions: (1) Are there any API calls which I will miss if I use the package name check as discussed above ? (2) The Androguard documentation has the following note.

enter image description here

(2-a) Does the call AnalyzeAPK() ensure all DEX files are loaded ? (2-b) Classes not defined because they are dynamically loaded later: is there a way to identify this via any API call ?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source