#!/usr/bin/python2.4 # # # Copyright 2009, The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """In memory representation of AndroidManifest.xml file. Specification of AndroidManifest.xml can be found at http://developer.android.com/guide/topics/manifest/manifest-intro.html """ # python imports import os import xml.dom.minidom import xml.parsers class AndroidManifest(object): """In memory representation of AndroidManifest.xml file.""" FILENAME = 'AndroidManifest.xml' def __init__(self, app_path=None): if app_path: self._ParseManifest(app_path) def GetAppPath(self): """Retrieve file system path to this manifest file's directory.""" return self._app_path def GetPackageName(self): """Retrieve package name defined at . Returns: Package name if defined, otherwise None """ manifest = self._GetManifestElement() if not manifest or not manifest.hasAttribute('package'): return None return manifest.getAttribute('package') def _ParseManifest(self, app_path): """Parse AndroidManifest.xml at the specified path. Args: app_path: path to folder containing AndroidManifest.xml Raises: IOError: AndroidManifest.xml cannot be found at given path, or cannot be opened for reading """ self._app_path = app_path self._manifest_path = os.path.join(app_path, self.FILENAME) self._dom = xml.dom.minidom.parse(self._manifest_path) def AddUsesSdk(self, min_sdk_version): """Adds a uses-sdk element to manifest. Args: min_sdk_version: value to provide for minSdkVersion attribute. """ manifest = self._GetManifestElement() uses_sdk_elements = manifest.getElementsByTagName('uses-sdk') if uses_sdk_elements: uses_sdk_element = uses_sdk_elements[0] else: uses_sdk_element = self._dom.createElement('uses-sdk') manifest.appendChild(uses_sdk_element) uses_sdk_element.setAttribute('android:minSdkVersion', min_sdk_version) self._SaveXml() def GetInstrumentationNames(self): """Get the instrumentation names from manifest. Returns: list of names, might be empty """ instr_elements = self._dom.getElementsByTagName('instrumentation') instrs = [] for element in instr_elements: instrs.append(element.getAttribute('android:name')) return instrs def _GetManifestElement(self): """Retrieve the root manifest element. Returns: the DOM element for manifest or None. """ manifests = self._dom.getElementsByTagName('manifest') if not manifests: return None return manifests[0] def _SaveXml(self): """Saves the manifest to disk.""" self._dom.writexml(open(self._manifest_path, mode='w'), encoding='utf-8') def CreateAndroidManifest(path): """Factory method for creating a AndroidManifest. Args: path: the directory for the manifest file Return: the AndroidManifest or None if there was no file present """ manifest_path = os.path.join(path, AndroidManifest.FILENAME) if os.path.isfile(manifest_path): manifest = AndroidManifest() manifest._ParseManifest(path) return manifest else: return None