本文我们主要是创建一个window选择文件,从而来确定apk的路径,然后点击反编译按钮来对其进行反编译。
QFileDialog类提供了类似的其他静态函数,如下表,通过这些函数,用户可以方便地定制自己的文件对话框。
静态函数 说明
getOpenFileName 获得用户选择的文件名
getSaveFileName 获得用户保存的文件名
getExistingDirectory 获得用户选择的已存在的目录名
getOpenFileNames 获得用户选择的文件名列表
按钮的点击事件,经过一下午的分析,果断抛弃上一课的总结使用的鼠标点击事件,而直接对按钮的响应事件作出处理。也可以说通过今天下午的学习,比上午进步了一点点。。。
self.connect(decode,SIGNAL('clicked()'),self.apkD)
然后就是下午对布局文件的继续熟悉,感觉写布局代码越来越像写安卓代码的布局了,好了,下面我贴上全部代码,里面已经写了比较详细的注释了,相信有编码基础的读者是可以看懂的:
# -*- coding: utf-8 -*- from PyQt4.QtGui import * from PyQt4.QtCore import * import sys import os class GridLayout2(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.setWindowTitle('Android_APK') ###第一行 self.apk_path = QLabel('APk Path') self.apk_path_edit = QLineEdit() ###第二行,三个按钮,这里第三个按钮的点击事件还没写 file_search=QPushButton("Search_File") decode = QPushButton("Apk_Decode") build = QPushButton("Apk_Build") ###寻找文件按钮的点击事件 self.connect(file_search,SIGNAL('clicked()'),self.openFile) ###反编译按钮的点击事件 self.connect(decode,SIGNAL('clicked()'),self.apkD) grid = QGridLayout() grid.setSpacing(10) grid.addWidget(self.apk_path, 1, 0) grid.addWidget(self.apk_path_edit, 1, 1) grid.addWidget(file_search,2,0) grid.addWidget(decode, 2,1) grid.addWidget(build, 2,2) self.setLayout(grid) self.resize(350, 300) def openFile(self): ##调用QfileDialog的相关方法来打开文件选择框 s=QFileDialog.getOpenFileName(self,"Open file dialog","/","Apk files(*.apk)") ##定义全局变量,用于接收需要反编译的apk的路径 global APK_STR APK_STR=str(s) self.apk_path_edit.setText(APK_STR) def apkD(self): ###上面openFIle方法中定义的全局变量,打印一下路径,看看是否正确##### print(APK_STR) ###apktool的命令使用##### apkToD='java -jar apktool.jar d '+APK_STR ###调用os的system命令来执行cmd的相关命令### os.system(apkToD) app = QApplication(sys.argv) qb = GridLayout2() qb.show() sys.exit(app.exec_())
Search_file的点击事件:
Apk_Decode的点击事件:
上面的大家可以看到,我们已经可以实现两个功能了,即打开window找文件,然后进行反编译,但是在反编译完成以后,我们需要对里面的smali文件进行操作,然后再回编译文件,签名,才能对手机进行安装,所以下一篇文章,我们就主要是编写回编译的方法以及对apk签名的方法。