Python——使用ElementTree解析AndroidManifest.xml文件

  1. 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.cElementTree as ET
except  ImportError:
     import  xml.etree.ElementTree as ET
import  sys
 
# Manifest namespace
namespace  =  '{http://schemas.android.com/apk/res/android}'
# Exported activities
exported_activities  =  []
 
 
# XML analyze
def  __xml_analyze__():
     tree  =  ET.parse(r "./app/AndroidManifest.xml" )
     root  =  tree.getroot()
     # print tree.namespace
     # 1.get package name
     packagename  =  root.attrib[ "package" ]
     # 2.get exported activity
     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.save result to xml file
     __save_result_to_xml__()
 
 
# get exported activities
def  __get_exported_activities__(application, packagename):
     for  activity  in  application:
         # 2.1 MainActivity name
         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.1 exported activities except mainactivtiy
             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']
                     # print permission
                     exported_activity.__set_permission__(permission)
                 exported_activities.append(exported_activity)
 
 
# save result to xml file
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" )
 
 
# the activity is or not MainActivity
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  'this is main activity'
             return  True
     return  False
 
 
# main fun
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




本文出自 “wauoen” 博客,请务必保留此出处http://7183397.blog.51cto.com/7173397/1829345

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值