import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler
public class PermissionHandler extends DefaultHandler {
public HashSet<String> permissions;
public PermissionHandler(){
permissions = new HashSet<>();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// 接收元素开始的通知。
if ("uses-permission".equals(localName)) {
//如果当前运行的节点名称与设定需要读取的节点名称相同,则实例化HashMap
permissions.add(attributes.getValue("android:name"));
}else if("uses-permission-sdk-23".equals(localName)){
permissions.add(attributes.getValue("android:name"));
}else if("uses-permission-sdk-m".equals(localName)){
permissions.add(attributes.getValue("android:name"));
}
}
public HashSet<String> getPermissions(){
return permissions;
}
}
import java.util.zip.ZipEntry
import java.util.zip.ZipFile
import com.android.SdkConstants
import static com.android.build.gradle.internal.publishing.AndroidArtifacts.ConsumedConfigType.RUNTIME_CLASSPATH
import static com.android.build.gradle.internal.publishing.AndroidArtifacts.ArtifactScope.ALL
import static com.android.build.gradle.internal.publishing.AndroidArtifacts.ArtifactType.AAR
import javax.xml.parsers.SAXParserFactory
import groovy.json.JsonOutput
gradle.projectsEvaluated {
def factory = SAXParserFactory.newInstance()
factory.setNamespaceAware(true)
factory.setFeature("http://xml.org/sax/features/namespace-prefixes", true)
factory.setFeature("http://xml.org/sax/features/xmlns-uris", true)
factory.setValidating(false)
def permission_extension = project.extensions.getByName("android")
//assembleDebug
permission_extension.applicationVariants.all { variant ->
variant.getPreBuildProvider().get().doLast{
HashMap<String, Set<String>> permission_map = new HashMap<String, Set<String>>()
variant.variantData.scope.getArtifactFileCollection(RUNTIME_CLASSPATH, ALL, AAR).files.forEach(){
String aar_file_path = it.absolutePath
//排除libs目录下的aar的影响
//!aar_file_path.contains(project_path)
// /Users/lianjia/.gradle/caches/modules-2/files-2.1/com.lianjia.common.android/lib_vr/2.11.6/41f182428c6c4f13cfe2d5023c90cd1db3efb024/lib_vr-2.11.6.aar
def component_name = null
if (!aar_file_path.contains(project.path)){
def paths = aar_file_path.split('/')
def name = paths[-4]
def group = paths[-5]
component_name = group + ":" + name
}else{
component_name = it.name//aar文件
}
ZipFile aarFile
InputStream source
try {
aarFile = new ZipFile(aar_file_path)
ZipEntry zipEntry = aarFile.getEntry(SdkConstants.FN_ANDROID_MANIFEST_XML)
source = aarFile.getInputStream(zipEntry)
def handler = new PermissionHandler()
factory.newSAXParser().parse(source, handler)
HashSet<String> permissions = handler.getPermissions()
if(permissions.size() > 0 && component_name != null){
permission_map.put(component_name, permissions)
}
}catch(IOException e){
e.printStackTrace()
}finally{
try {
if (aarFile != null) {
aarFile.close();
}
if(source != null) {
source.close();
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
//产生html文件
def json = JsonOutput.toJson(permission_map)
String jsonStr = JsonOutput.prettyPrint(json)
File dir = new File(project.projectDir.absolutePath + "/dependencies")
if(!dir.exists()){
dir.mkdir()
}
def inputFile = new File(dir.absolutePath, "permission.json")
if(inputFile.exists()){
inputFile.delete()
}
inputFile.createNewFile()
inputFile.withWriter('utf-8') { writer ->
writer.write jsonStr
}
}
}
}
Android AAR权限检测脚本
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 一般检测root权限分两种情况: 第一种:检测应用是否拥有root权限,这种检测可以直接运行su命令,然后一般会有...
- 权限检测生效条件: targetSdkVersion 以及 compileSdkVersion 升级到 23 及以...
- 在做Android开发过程中,兼容问题一直都是安卓攻城狮们的常见的一个问题,各种手机品牌的兼容。还有API版本高低...
- 1.首先判断版本是否是6.0以下,然后通过映射调用方法 2.通过映射执行对应的注解方法 3.Main调用 源码地址...