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

  1. XML内容如下:
<?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文件中

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

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
时间: 2024-12-18 13:58:53

Python——使用ElementTree解析AndroidManifest.xml文件的相关文章

python中用ElementTree.iterparse()读取xml文件中的多层节点

我在使用Python解析比较大型的xml文件时,为了提高效率,决定使用iterparse()方法,但是发现根据网上的例子:每次if event == 'end':之后elem.clear()或者是每次 if elem.tag == '':之后clear(),都只能去到当前标签的相关内容,如果想继续读取得到标签的子标签,则会返回为空,也就是取不到. 其实iterparse()方法的原理是当遇到标签的“>”符号时触发start,当遇到标签的结束标志是会触发end,比如: <item> <

android基础知识13:AndroidManifest.xml文件解析

1.重要性 AndroidManifest.xml是Android应用程序中最重要的文件之一.它是Android程序的全局配置文件,是每个 android程序中必须的文件.它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息. 因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所

【转】AndroidManifest.xml文件解析

AndroidManifest.xml是每个android程序中必须的文件.它位于application的根目录,描述了package中的全局数据,包括了package中暴露的组件(activities, services, 等等),它们各自的实现类,各种能被处理的数据和启动位置. 此文件一个重要的地方就是它所包含的intent-filters. 这些filters描述了activity启动的位置和时间.每当一个activity(或者操作系统)要执行一个操作,例如:打开网页或联系簿时,它创建出一

[转]AndroidManifest.xml文件详解

转自:http://www.cnblogs.com/greatverve/archive/2012/05/08/AndroidManifest-xml.html AndroidManifest.xml文件详解(一) 每个应用程序在它的根目录中都必须要有一个AndroidManifest.xml文件.这个清单把应用程序的基本信息提交给Android系统,在应用程序的代码能够运行之前,这个信息系统必须建立.以下是清单文件要做的一些事情: 1. 用Java包给应用程序命名.这个包名是应用程序的唯一标识

Python,ElementTree模块处理XML时注释无法读取和保存的问题

from xml.etree import ElementTree class CommentedTreeBuilder ( ElementTree.XMLTreeBuilder ): def __init__ ( self, html = 0, target = None ): ElementTree.XMLTreeBuilder.__init__( self, html, target ) self._parser.CommentHandler = self.handle_comment d

AndroidManifest.xml文件综合详解(转)

一,重要性AndroidManifest.xml是Android应用程序中最重要的文件之一.它是Android程序的全局配置文件,是每个 android程序中必须的文件.它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息. 因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所必

AndroidManifest.xml文件详解(uses-permission)

语法(SYNTAX): <uses-permissionandroid:name="string"/> 被包含于(CONTAINED IN): <manifest> 说明(DESCRIPTION): 这个属性用于给应用程序授予正确的操作的所必须的权限.这些权限是在应用程序安装时被授予的,而不是在运行时授予的. 有关更多的权限信息,请看<AndroidManifest.xml文件详解(三)>文档中“权限”介绍(http://blog.csdn.net/

[安卓学习]AndroidManifest.xml文件内容详解

一,重要性 AndroidManifest.xml是Android应用程序中最重要的文件之一.它是Android程序的全局配置文件,是每个 android程序中必须的文件.它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息. 因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所

分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要)

原文:分享非常有用的Java程序 (关键代码)(六)---解析/读取XML 文件(重要) XML文件 <?xml version="1.0"?> <students> <student> <name>John</name> <grade>B</grade> <age>12</age> </student> <student> <name>Mar