上一篇:
背景:
随着权限的滥用,安卓各大市场开始对各种权限开始限制说明,必须要有对应的说明,不然就会面临无法申请绿色应用,甚至导致应用下架,自己引用的权限是比较清楚的,可是在实际的开发中,我们会引用大量的第三方库,又没办法去除,自己要是每个库都要看,那成百上千的库自己手动查询不仅效率低下,还浪费大量的时间。本文就是针对该痛点去智能帮你查询第三方库权限,方便你查找和解决,可结合上篇文章危险权限处理。希望能够帮助你!!!
位置:
效果图:
代码:
import os
from bs4 import BeautifulSoup
# 项目路径 动态改动
projectPath = 'C:/Users/Administrator/AndroidStudioProjects/bjxRecruit' + '/'
# projectPath = 'H:/AndroidProjects/EyeShield' + '/'
# host主目录 as 缓存都是在此目录下 一般是死的,除非你的修改过主盘
USER_HOME = "C:/Users/Administrator"
path = projectPath + '.idea/libraries/'
class LibData:
def __init__(self, name, path):
self.name = name
self.path = path
class PermissionData:
def __init__(self, name, permissions):
self.name = name
self.permissions = permissions
# 获取文件名和路径
def getLibrariesList(path):
f = os.walk(path)
list = []
for root, dirs, files in f:
for i in files:
p = root + i
# print('路径:',p)
# print('文件名:',i)
try:
s = open(p, 'r', encoding='utf-8')
except:
print("文件不存在:",p)
content = s.read()
soup = BeautifulSoup(content, 'html.parser')
urls = soup.find_all('root')
for l in urls:
url = l.get('url')
if not url:
continue
if url.endswith("AndroidManifest.xml"):
# print('文件名:', i)
# print('文件路径: ', url)
list.append(LibData(i, url))
break
soup.clear()
return list
# 获取含有权限的文件数据
def getHavePermissionList(mainPathList):
list = []
for item in mainPathList:
if not item.path:
continue
else:
l = item.path
# print('处理前path: ',l)
l = l.replace('file://$USER_HOME$', USER_HOME)
l = l.replace('file://', "")
l = l.replace('jar://$USER_HOME$', USER_HOME)
l = l.replace('jar://', "")
# print('处理后path: ', l)
# print('\n\n打开文件名:', item.name)
# print('打开路径:',l)
try:
file = open(l, 'r', encoding='utf-8')
except:
print("文件不存在:",l)
continue
content = file.read()
file.close()
# print(content)
soup = BeautifulSoup(content, 'html.parser')
ps = soup.find_all('uses-permission')
if not ps:
continue
else:
strArr = []
for u in ps:
p = u.get('android:name')
strArr.append(p)
# print(p)
list.append(PermissionData(item.name, strArr))
soup.clear()
return list
mainPathList = getLibrariesList(path)
print(f'---------发现第三方数:{len(mainPathList)}个')
list = getHavePermissionList(mainPathList)
print(f'---------含有权限的库数:{len(list)}个')
for m in list:
print("\n")
print('第三库名: ',m.name)
print('第三库里含有的权限: ',m.permissions)