zoukankan      html  css  js  c++  java
  • 解决aapt工具拖入重复下载的带数字后缀安装包后造成程序停止运行的Bug(字符串处理)

    背景:

    在上一篇的工具出现的bug,第二条:若安装包是重复下载的安装包,包名带了后缀(1),这类apk拖拽进工具会直接造成程序停止运行

    https://www.cnblogs.com/reseelei-despair/p/11089950.html

    发现是aapt无法直接读取该命名的安装包的具体信息

    为了处理这个问题,所以在读取包信息前,需要对apk文件的文件名进行处理

    思路:

    工具读取到当前文件名时,对字符进行修改,替换掉.apk前的字符串,为了保持安装包的命名没有产生变化,执行结束后将包的文件名修改回来

    处理字符串使用split方法先切片定位到需要的信息,后用replace方法将有问题的部分做替换,修改文件名使用os.rename(filename,newfilename)

    代码:

    有问题的部分在这里

        def dragEnterEvent(self, evn):
            self.QLabl.setText('文件路径:
    ' + evn.mimeData().text())
            c = evn.mimeData().text()
            d = re.sub("file:///", "", c)
            apk_info = ApkInfo(r"%s"%d)
            self.QLabl.setText("Activity:%s 
    apkName:%s 
    sdkVersion:%s 
    targetSdkVersion:%s" % (apk_info.get_apk_activity(),apk_info.get_apk_base_info(),apk_info.get_apk_sdkVersion(),apk_info.get_apk_targetSdkVersion()))

    获取到的文件路径d后的apk文件名字是带(1)的

    观察路径,可以发现,字符串“.apk”永远处于该字符串d的最后,而需要获取的是.apk到上一个“/”之间的字符,所以可以先用split对字符串切片

    e= d.split(".apk")

    此时,变量e返回的是一个数组

    那么,继续切片,以“/”为分隔符,将“D:/aaaaaaarrrr(1)”这个部分切片

    ee = e[0].split("/")

    这里需要注意,e是一个数组,所以要处理字符串,需要带上下标,上述代码返回的结果是

    可以看到,成功切片了,接下来就是获取到“aaaaaaarrrr(1)”这个部分了,当然,在这个例子中,ee[1]就是需要的数值,但是在实际运用中,可能因为路径没有这么短,所以不能这样处理,但是需要处理的这个部分,一定是路径的最后一个部分,所以,ee[-1]就是需要处理的部分

    定位到需要处理的部分后,使用replace将变量d中需要替换的部分替换掉

    f = d.replace(ee[-1], "ssss")

    此时,f就是新组成的第二个路径

    但是这个路径下是没有这个文件的,这只是需要替换的名字,所以使用os.rename重新命名文件

    os.rename(d,f)

    这段运行后,文件aaaaaaarrrr(1).apk就被重命名为ssss.apk,此时再去调用aapt就不会造成程序停止运行

    最后再用一次重命名功能将名字重新改回来,问题就用一个比较复杂的方式解决了

    完整代码如下

        def dragEnterEvent(self, evn):
            self.QLabl.setText('文件路径:
    ' + evn.mimeData().text())
            c = evn.mimeData().text()
            d = re.sub("file:///", "", c)
            e= d.split(".apk")
            ee = e[0].split("/")
            f = d.replace(ee[-1], "ssss")
            os.rename(d,f)
            apk_info = ApkInfo(r"%s"%f)
            self.QLabl.setText("Activity:%s 
    apkName:%s 
    sdkVersion:%s 
    targetSdkVersion:%s" % (apk_info.get_apk_activity(),apk_info.get_apk_base_info(),apk_info.get_apk_sdkVersion(),apk_info.get_apk_targetSdkVersion()))
            os.rename(f,d)

     总结:

    问题的解决思路一定绕不开的部分就是在用aapt获取信息前,apk文件的命名一定要复合规范,解决这个问题的方法有很多,当前使用的是最复杂的方法,后续会想办法继续优化

  • 相关阅读:
    aaronyang的百度地图API之LBS云与.NET开发 Javascript API 2.0【把数据存到LBS云2/2】
    aaronyang的百度地图API之LBS云与.NET开发 Javascript API 2.0【把数据存到LBS云1/2】
    aaronyang的百度地图API之LBS云与.NET开发 Javascript API 2.0【基本地图的操作】
    aaronyang的百度地图API之LBS云 笔记[位置数据 geotable]
    aaronyang的百度地图API之LBS云 笔记[开发准备]
    windows7 sqlserver2012 无法写入受保护的内存 解决办法
    [AaronYang风格]微软Unity2.X系统学习笔记,记录
    Javascript 原生Cookie使用用法
    注册asp.net 4.0 到iis
    茗洋Easy UI 1.3.5 部分问题解决系列专题[自定义alert关闭时间,自动关]
  • 原文地址:https://www.cnblogs.com/reseelei-despair/p/11098206.html
Copyright © 2011-2022 走看看