去除AndroidManifest.xml里重復申請的權限(uses-permission)

2017年的第一篇文章,新的起點,不忘初心

花了點時間,解決了最近遇到的一個問題:

  • 在引用第三方的服務時都會在Manifest中添加權限,一般都是無腦的復制粘貼,久而久之,項目里重復的權限越來越多

在我印象里好像以前的編輯器是會提醒你在AndroidManifest.xml里重復申請的權限,無論是eclipse還是Android studio,不過很奇怪,現在好像這個功能沒有了,就算你重復申請了很多,只會在你編譯的時候在日志里警告你一下,不會報錯。

但是對于有嚴重強迫癥的我,怎么能忍一大堆重復的權限呢,so ...

用Python寫了個簡單的腳本,方便快捷

GitHub地址:https://github.com/ckdroid/ClearManifest_Py

歡迎提 bug

去除AndroidManifest.xml里重復申請的權限(uses-permission)

使用說明:

本程序使用ElementTree對XML進行處理,它在Python2.5以后成為Python標準庫的一部分,但是Python2.4之前需要單獨安裝。

使用方法:

將 ClearManifest.py 和 AndroidManifest.xml 放在一個文件夾下

然后執行 python ClearManifest.py

得到的 AndroidManifest.xml 就是清理后的文件( AndroidManifest_backup.xml 為備份)

以下為源碼:

# -*- coding: UTF-8 -*-

'''
Created on 2017年1月1日

@author: ckdroid
'''

import xml.etree.ElementTree as ET
import sys
import shutil

class PCParser(ET.XMLTreeBuilder):
    def __init__(self):
        ET.XMLTreeBuilder.__init__(self)
        # assumes ElementTree 1.2.X
        self._parser.CommentHandler = self.handle_comment

    def handle_comment(self, data):
        self._target.start(ET.Comment, {})
        self._target.data(data)
        self._target.end(ET.Comment)

# 備份源文件
shutil.copy("AndroidManifest.xml", "AndroidManifest_backup.xml")

try:
    # 定義namespace,這一步必須在parse之前做
    ET.register_namespace('android', "http://schemas.android.com/apk/res/android")
    ET.register_namespace('tools', "http://schemas.android.com/tools")
    ET.register_namespace('app', "http://schemas.android.com/apk/res-auto")
    parser = PCParser()
    tree = ET.parse("AndroidManifest.xml",parser)     #打開xml文檔 
    root = tree.getroot()         #獲得root節點  
except Exception, e: 
    print "Error:cannot parse file:AndroidManifest.xml."
    print e
    sys.exit(1) 


print('root.tag =', root.tag)

#獲得 android 的 name space
name_space="{http://schemas.android.com/apk/res/android}"

mdict = { };

print('----- clear uses-permission -----')

for element in root.findall('uses-permission'):
    rank = element.get(name_space+'name')
    if(mdict.has_key(rank)):
        root.remove(element)
        print(rank)
    else:
        mdict[rank]=element
    
print('----- clear done -----')

tree.write('AndroidManifest.xml',encoding="utf-8", xml_declaration=True,  method='xml')

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,532評論 25 708
  • 總結整理了一下android權限相關的知識,由于篇幅過長,分為兩篇博客來寫,上篇博客主要是詳解權限和安全,下篇主要...
    Shawn_Dut閱讀 3,845評論 2 10
  • Alpha用來保存選區的,選擇-存儲選區-建成新的通道(不可見。) 白顏色用來記錄選區。黑色用來記錄非選區 調用的...
    大蔡楚閱讀 546評論 0 1
  • 讀寫營要求堅持70天,我最后草草的完成了49天,抱怨工作忙,其實也不是,抱怨沒恒心,好像有點,每次寫的文都只...
    D016pudding閱讀 282評論 0 0
  • 很久之前看過一個故事。 有個人和朋友說自己想創業但苦于資金不足,編輯了一天短信和朋友說明情況求助,朋友問需要多少資...
    元氣小老虎修煉基地閱讀 207評論 0 0