Python调用aapt解析apk教程(避坑指南)

今天尝试用python调用aapt解析apk,获取包名等信息,使用popen调用aapt一直遇到编码之类的错误,找了许多解决办法都不行,然后又用Popen尝试调用aapt解析,还是遇到了编码问题,尝试使用decode("utf8","ignore")这种方式解码,完美解决了编码的问题。代码如下:

其中aapt因为我是添加了环境变量的原因,可以直接以"aapt"在命令行启动,没添加环境变量的,可以输入:"路径+aapt.exe"的方式调用aapt来解析apk。

# -*- coding: utf-8 -*-
import re
import subprocess
import os

class ApkInfo:
    def __init__(self, apk_path):
        self.apkPath = apk_path
        #self.aapt_path = self.get_aapt()
    def get_apk_base_info(self):
        p = subprocess.Popen("aapt" + " dump badging %s" % self.apkPath, stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE,
                             stdin=subprocess.PIPE, shell=True)
        (output, err) = p.communicate()
        match = re.compile("package: name='(\S+)'").match(output.decode("utf8","ignore"))
        if not match:
            raise Exception("can't get packageinfo")
        package_name = match.group(1)
        return package_name

    def get_apk_activity(self):
        p = subprocess.Popen("aapt" + " dump badging %s" % self.apkPath, stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE,
                             stdin=subprocess.PIPE, shell=True)
        (output, err) = p.communicate()
        match = re.compile("launchable-activity: name='(\S+)'").search(output.decode("utf8","ignore"))
        if match is not None:
            return match.group(1)

    def get_apk_sdkVersion(self):
        p = subprocess.Popen("aapt" + " dump badging %s" % self.apkPath, stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE,
                             stdin=subprocess.PIPE, shell=True)
        (output, err) = p.communicate()
        match = re.compile("sdkVersion:'(\S+)'").search(output.decode("utf8","ignore"))
        return match.group(1)

    def get_apk_targetSdkVersion(self):
        p = subprocess.Popen("aapt" + " dump badging %s" % self.apkPath, stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE,
                             stdin=subprocess.PIPE, shell=True)
        (output, err) = p.communicate()
        match = re.compile("targetSdkVersion:'(\S+)'").search(output.decode("utf8","ignore"))
        return match.group(1)

if __name__ == '__main__':
    apk_info = ApkInfo(r"D:\pythontest\one\Blued.apk")
    print("Activity:%s"%apk_info.get_apk_activity())
    print("apkName:%s"%apk_info.get_apk_base_info())
    print("sdkVersion:%s"%apk_info.get_apk_sdkVersion())
    print("targetSdkVersion:%s"%apk_info.get_apk_targetSdkVersion())

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值