解决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文件的命名一定要复合规范,解决这个问题的方法有很多,当前使用的是最复杂的方法,后续会想办法继续优化

原文地址:https://www.cnblogs.com/reseelei-despair/p/11098206.html