Skip to content

Instantly share code, notes, and snippets.

@SebaUbuntu
Last active June 27, 2024 08:09
Show Gist options
  • Save SebaUbuntu/ec053a00a9988eaea091fb1cc1f19324 to your computer and use it in GitHub Desktop.
Save SebaUbuntu/ec053a00a9988eaea091fb1cc1f19324 to your computer and use it in GitHub Desktop.
Generate framework compatibility matrix from fqnames

Generate framework compatibility matrix from fqnames

  • Download these 2 files
  • Compile AOSP without fcm from stock and wait for check_vintf to error out
  • Delete Python prefix from all lines (e.g. checkvintf E 06-24 00:30:22 49120 49120 check_vintf.cpp:554])
  • Paste the result in fqnames.txt
  • Launch the script
# Add here a list of fqname
# You can get it if you try to build AOSP without a fcm
# check_vintf will print a list of needed entries
# This currently works with AIDL and HIDL
# Here an example from Xiaomi SM8150 common tree
android.hardware.gnss@1.0::IGnss/gnss_vendor
android.hardware.radio@1.2::ISap/slot2
com.qualcomm.qti.imscmservice@2.2::IImsCmService/qti.ims.connectionmanagerservice
com.qualcomm.qti.uceservice@2.2::IUceService/com.qualcomm.qti.uceservice
vendor.display.color@1.3::IDisplayColor/default
vendor.display.config@2.0::IDisplayConfig/default
vendor.display.postproc@1.0::IDisplayPostproc/default
vendor.goodix.hardware.cap.biometrics.fingerprint@2.1::IGoodixFingerprintDaemon/default
vendor.goodix.hardware.cap.biometrics.fingerprint@2.1::IGoodixFingerprintDaemonExt/default
vendor.lineage.livedisplay@2.0::IDisplayModes/default
vendor.lineage.livedisplay@2.0::IPictureAdjustment/default
vendor.lineage.power.IPower/default
vendor.lineage.trust@1.0::IUsbRestrict/default
vendor.qti.data.factory@2.1::IFactory/default
vendor.qti.esepowermanager@1.1::IEsePowerManager/default
vendor.qti.gnss@1.2::ILocHidlGnss/gnss_vendor
vendor.qti.gnss@2.1::ILocHidlGnss/gnss_vendor
vendor.qti.gnss@3.0::ILocHidlGnss/gnss_vendor
vendor.qti.gnss@4.0::ILocHidlGnss/gnss_vendor
vendor.qti.hardware.alarm@1.0::IAlarm/default
vendor.qti.hardware.audiohalext@1.0::IAudioHalExt/default
vendor.qti.hardware.bluetooth_audio@2.0::IBluetoothAudioProvidersFactory/default
vendor.qti.hardware.bluetooth_sar@1.1::IBluetoothSar/default
vendor.qti.hardware.btconfigstore@2.0::IBTConfigStore/default
vendor.qti.hardware.capabilityconfigstore@1.0::ICapabilityConfigStore/default
vendor.qti.hardware.data.connection@1.1::IDataConnection/slot1
vendor.qti.hardware.data.connection@1.1::IDataConnection/slot2
vendor.qti.hardware.display.allocator@3.0::IQtiAllocator/default
vendor.qti.hardware.display.allocator@4.0::IQtiAllocator/default
vendor.qti.hardware.display.mapper@3.0::IQtiMapper/default
vendor.qti.hardware.display.mapper@4.0::IQtiMapper/default
vendor.qti.hardware.dsp@1.0::IDspService/dspservice
vendor.qti.hardware.fm@1.0::IFmHci/default
vendor.qti.hardware.iop@2.0::IIop/default
vendor.qti.hardware.perf@2.2::IPerf/default
vendor.qti.hardware.qccvndhal@1.0::IQccvndhal/qccvndhal
vendor.qti.hardware.qseecom@1.0::IQSEECom/default
vendor.qti.hardware.qteeconnector@1.0::IAppConnector/default
vendor.qti.hardware.qteeconnector@1.0::IGPAppConnector/default
vendor.qti.hardware.radio.am@1.0::IQcRilAudio/slot1
vendor.qti.hardware.radio.am@1.0::IQcRilAudio/slot2
vendor.qti.hardware.radio.ims@1.6::IImsRadio/imsradio0
vendor.qti.hardware.radio.ims@1.6::IImsRadio/imsradio1
vendor.qti.hardware.radio.lpa@1.0::IUimLpa/UimLpa0
vendor.qti.hardware.radio.lpa@1.0::IUimLpa/UimLpa1
vendor.qti.hardware.radio.qcrilhook@1.0::IQtiOemHook/oemhook0
vendor.qti.hardware.radio.qcrilhook@1.0::IQtiOemHook/oemhook1
vendor.qti.hardware.radio.qtiradio@1.0::IQtiRadio/slot1
vendor.qti.hardware.radio.qtiradio@1.0::IQtiRadio/slot2
vendor.qti.hardware.radio.qtiradio@2.4::IQtiRadio/slot1
vendor.qti.hardware.radio.qtiradio@2.4::IQtiRadio/slot2
vendor.qti.hardware.radio.uim@1.2::IUim/Uim0
vendor.qti.hardware.radio.uim@1.2::IUim/Uim1
vendor.qti.hardware.radio.uim_remote_client@1.0::IUimRemoteServiceClient/uimRemoteClient0
vendor.qti.hardware.radio.uim_remote_client@1.0::IUimRemoteServiceClient/uimRemoteClient1
vendor.qti.hardware.radio.uim_remote_server@1.0::IUimRemoteServiceServer/uimRemoteServer0
vendor.qti.hardware.radio.uim_remote_server@1.0::IUimRemoteServiceServer/uimRemoteServer1
vendor.qti.hardware.sensorscalibrate@1.0::ISensorsCalibrate/default
vendor.qti.hardware.soter@1.0::ISoter/default
vendor.qti.hardware.tui_comm@1.0::ITuiComm/default
vendor.qti.hardware.vpp@1.3::IHidlVppService/vppService
vendor.qti.hardware.wifidisplaysession@1.0::IWifiDisplaySessionImageTrack/wifidisplaysessionimagetrack
vendor.qti.imsrtpservice@3.0::IRTPService/imsrtpservice
vendor.xiaomi.hardware.fingerprintextension@1.0::IXiaomiFingerprint/default
vendor.xiaomi.hardware.mlipay@1.1::IMlipayService/default
# Author: Sebastiano Barezzi <barezzisebastiano@gmail.com>
# Version: 1.3
from re import search
class Version:
def __init__(self, version: str):
self.major, self.minor = version.split(".")
def merge_version(self, version):
if version.minor > self.minor:
self.minor = version.minor
def format(self):
version_str = ' <version>'
if int(self.minor) > 0:
version_str += f"{self.major}.0-{self.minor}"
else:
version_str += f"{self.major}.{self.minor}"
version_str += '</version>\n'
return version_str
class Interface:
def __init__(self, name: str, instance: str):
self.name = name
self.instances = [instance]
def merge_interface(self, interface):
for instance in interface.instances:
if not instance in self.instances:
self.instances += [instance]
def format(self):
interface_str = ' <interface>\n'
interface_str += f' <name>{self.name}</name>\n'
for instance in self.instances:
interface_str += f' <instance>{instance}</instance>\n'
interface_str += ' </interface>\n'
return interface_str
class Entry:
def __init__(self, fqname: str):
self.type = "HIDL" if "@" in fqname else "AIDL"
if self.type == "HIDL":
self.name, version = fqname.split("::")[0].split("@")
interface_name, interface_instance = fqname.split("::")[1].split("/", 1)
else:
self.name, interface_str = fqname.rsplit(".", 1)
interface_name, interface_instance = interface_str.split("/")
if self.type == "HIDL":
version = Version(version)
self.versions = {version.major: version}
else:
self.versions = {}
interface = Interface(interface_name, interface_instance)
self.interfaces = {interface.name: interface}
def merge_entry(self, entry):
if entry.name != self.name:
raise AssertionError("Different entry name")
if entry.type != self.type:
raise AssertionError("Different HAL type")
for version_major, version in entry.versions.items():
if version_major in self.versions:
self.versions[version_major].merge_version(version)
else:
self.versions[version_major] = version
for interface_name, interface in entry.interfaces.items():
if interface_name in self.interfaces:
self.interfaces[interface_name].merge_interface(interface)
else:
self.interfaces[interface_name] = interface
pass
def format(self):
entry_str = f'<hal format="{self.type.lower()}" optional="true">\n'
entry_str += f' <name>{self.name}</name>\n'
for version in self.versions.values():
entry_str += version.format()
for interface in self.interfaces.values():
entry_str += interface.format()
entry_str += '</hal>\n'
return entry_str
def main():
entries = {}
for fqname in open("fqnames.txt").readlines():
fqname = fqname.strip()
if fqname == "" or fqname[0] == '#':
continue
versioned_aidl_match = search(" \(@[0-9]+\)$", fqname)
if versioned_aidl_match:
fqname = fqname.removesuffix(versioned_aidl_match.group(0))
entry = Entry(fqname)
if entry.name in entries:
entries[entry.name].merge_entry(entry)
else:
entries[entry.name] = entry
fcms = [entry.format() for entry in entries.values()]
print("".join(fcms))
return
main()
@davigamer987
Copy link

Traceback (most recent call last):
File "/home/davi/generate_fcm.py", line 116, in
main()
File "/home/davi/generate_fcm.py", line 104, in main
entry = Entry(fqname)
File "/home/davi/generate_fcm.py", line 47, in init
interface_name, interface_instance = fqname.split("::")[1].split("/", 1)
IndexError: list index out of range

@davigamer987
Copy link

This is my fqnames, i think it's formated properly https://nekobin.com/nevutivuvu

@SebaUbuntu
Copy link
Author

This is my fqnames, i think it's formated properly https://nekobin.com/nevutivuvu

Should be fixed now

@Waxaranai
Copy link

Hey, it doesn't work when there is aidl type entry
example: android.hardware.power.IPower/default (@2)

@RDS-007
Copy link

RDS-007 commented Aug 18, 2022

ye. I too faced it

@karthik1896
Copy link

Hey, it doesn't work when there is aidl type entry example: android.hardware.power.IPower/default (@2)

Remove those values with braces . It should be android.hardware.power.IPower/default

@erikdrozina
Copy link

Hey, it doesn't work when there is aidl type entry example: android.hardware.power.IPower/default (@2)

The ouput is:

<hal format="aidl" optional="true">
    <name>android.hardware.power</name>
    <version>2</version>
    <interface>
        <name>IPower</name>
        <instance>default</instance>
    </interface>
</hal>

@itsxrp
Copy link

itsxrp commented Jan 3, 2023

from: too many arguments
generate_fcm.py: line 6: class: command not found
generate_fcm.py: line 7: syntax error near unexpected token (' generate_fcm.py: line 7: def init(self, version: str):'

any clue why it appearing

@fuyukihidekii
Copy link

from: too many arguments generate_fcm.py: line 6: class: command not found generate_fcm.py: line 7: syntax error near unexpected token (' generate_fcm.py: line 7: def init(self, version: str):'

any clue why it appearing

python3 generate_fcm.py

@s4704
Copy link

s4704 commented Oct 3, 2023

Not work for me: https://gist.github.com/s4704/c8171239a87fefac3f6bb83ab1419f6a
python3 generate_fcm.py Traceback (most recent call last): File "/home/igor/dev/distrib/generate_fcm/generate_fcm.py", line 122, in <module> main() File "/home/igor/dev/distrib/generate_fcm/generate_fcm.py", line 112, in main entries[entry.name].merge_entry(entry) File "/home/igor/dev/distrib/generate_fcm/generate_fcm.py", line 68, in merge_entry raise AssertionError("Different HAL type") AssertionError: Different HAL type

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment