@@ -2070,22 +2070,28 @@ def dex_classes(apk_dir):
20702070 dexdump_cmd = f"{ build_tools_dir } /{ newest_ver } /dexdump"
20712071
20722072 classes = {}
2073- file_num = 1
2073+ file_num = 0
20742074 while True :
20752075 # Multidex is used by default in debug builds when minSdkVersion is 21 or higher
20762076 # (https://developer.android.com/studio/build/multidex).
2077+ file_num += 1
20772078 dex_filename = f"{ apk_dir } /classes{ file_num if (file_num > 1 ) else '' } .dex"
2078- if exists (dex_filename ):
2079- for line in run ([dexdump_cmd , dex_filename ], check = True , capture_output = True ,
2080- text = True ).stdout .splitlines ():
2081- match = re .search (r"Class descriptor *: *'L(.*);'" , line )
2082- if match :
2083- package , _ , name = match [1 ].replace ("/" , "." ).rpartition ("." )
2084- if not exclude_class (name ):
2085- classes .setdefault (package , []).append (name )
2086- else :
2079+ if not exists (dex_filename ):
20872080 break
2088- file_num += 1
2081+
2082+ pending_class = None
2083+ for line in run ([dexdump_cmd , dex_filename ], check = True , capture_output = True ,
2084+ text = True ).stdout .splitlines ():
2085+ if match := re .search (r"Class descriptor *: *'L(.*);'" , line ):
2086+ package , _ , name = match [1 ].replace ("/" , "." ).rpartition ("." )
2087+ if not exclude_class (name ):
2088+ pending_class = (package , name )
2089+ elif pending_class :
2090+ # AGP 9.2 generates hundreds of synthetic classes for Android APIs.
2091+ if "SYNTHETIC" not in line :
2092+ package , name = pending_class
2093+ classes .setdefault (package , []).append (name )
2094+ pending_class = None
20892095
20902096 return classes
20912097
0 commit comments