Python——使用ElementTree解析AndroidManifest.xml文件
XML内容如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <? xml version = "1.0" encoding = "utf-8" standalone = "no" ?> < manifest xmlns:android = "http://schemas.android.com/apk/res/android" package = "com.dongbao.wauoen.interappactivitytesting" platformBuildVersionCode = "23" platformBuildVersionName = "6.0-2704002" > < uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE" /> < application android:allowBackup = "true" android:icon = "@mipmap/ic_launcher" android:label = "@string/app_name" android:supportsRtl = "true" android:theme = "@style/AppTheme" > < activity android:exported = "true" android:name = "com.dongbao.wauoen.interappactivitytesting.MainActivity" > < intent-filter > < action android:name = "android.intent.action.MAIN" /> < category android:name = "android.intent.category.LAUNCHER" /> </ intent-filter > </ activity > < activity android:enabled = "@bool/use_activity" android:exported = "true" android:icon = "@drawable/ic_chooser" android:label = "@string/choose_file" android:name = "com.ipaulpro.afilechooser.FileChooserActivity" /> < activity android:exported = "true" android:name = "com.dongbao.wauoen.interappactivitytesting.ExampleActivity" android:permission = "android.permission.READ_EXTERNAL_STORAGE" /> </ application > </ manifest > 2.解析过程:主要获取开放activity的信息,并保存到xml文件中 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 from ActivityInfo import ActivityInfo try : import xml.etree.cElementTreeasET except ImportError: import xml.etree.ElementTreeasET import sys #Manifestnamespace namespace = '{http://schemas.android.com/apk/res/android}' #Exportedactivities exported_activities = [] #XMLanalyze def __xml_analyze__(): tree = ET.parse(r "./app/AndroidManifest.xml" ) root = tree.getroot() #printtree.namespace #1.getpackagename packagename = root.attrib[ "package" ] #2.getexportedactivity application = root.find( "application" ) __get_exported_activities__(application,packagename) for activity in exported_activities: print activity.__get_name__(),activity.__get_package_name__(),activity.__get_permission__() #3.saveresulttoxmlfile __save_result_to_xml__() #getexportedactivities def __get_exported_activities__(application,packagename): for activity in application: #2.1MainActivityname if __is_main_activity__(activity): name = activity.attrib[namespace + 'name' ] main_activtiy = ActivityInfo(name) main_activtiy.__set_package_name__(packagename) if activity.find(namespace + 'permission' ) is not None : permission = activity.attrib[name + 'permission' ] main_activtiy.__set_permission__(permission) exported_activities.append(main_activtiy) else : #2.1exportedactivitiesexceptmainactivtiy exported = activity.attrib[namespace + 'exported' ] if exported: activity_name = activity.attrib[namespace + 'name' ] exported_activity = ActivityInfo(activity_name) exported_activity.__set_package_name__(packagename) permission = activity.attrib.get(namespace + 'permission' , None ) if permission is not None : #permission=activity.attrib[name+'permission'] #printpermission exported_activity.__set_permission__(permission) exported_activities.append(exported_activity) #saveresulttoxmlfile def __save_result_to_xml__(): tree = ET.ElementTree() root = ET.Element( 'data' ) tree._setroot(root) for activity in exported_activities: node = ET.Element( 'activity' ) node. set ( 'name' ,activity.__get_name__()) node. set ( 'packagename' ,activity.__get_package_name__()) root.append(node) if activity.__get_permission__() is not None : node. set ( 'permission' ,activity.__get_permission__()) tree.write( "output.xml" ) #theactivityisornotMainActivity def __is_main_activity__(activity): intent_filter = activity.find( "intent-filter" ) if intent_filter is not None : action = intent_filter.find( 'action' ) category = intent_filter.find( 'category' ) if action is not None and category is not None \ and action.attrib[namespace + "name" ] = = 'android.intent.action.MAIN' \ and category.attrib[namespace + "name" ] = = 'android.intent.category.LAUNCHER' : print 'thisismainactivity' return True return False #mainfun if __name__ = = "__main__" : __xml_analyze__() 3.ActivityInfo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class ActivityInfo: def __init__( self ,name): self .name = name self .package_name = '' self .permission = '' def __set_package_name__( self ,package_name): self .package_name = package_name def __get_package_name__( self ): return self .package_name def __set_name__( self ,name): self .name = name def __get_name__( self ): return self .name def __set_permission__( self ,permission): self .permission = permission def __get_permission__( self ): return self .permission 本文转自wauoen51CTO博客,原文链接:http://blog.51cto.com/7183397/1829345,如需转载请自行联系原作者