本文我们主要是创建一个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签名的方法。