<span style="font-family: Arial, Helvetica, sans-serif;">0x1:</span><span style="font-family: 宋体;">简述</span>
经过第一篇的简单布局以后,我们来考虑是否可以放上一个按钮,来执行相关的动作呢?答案是肯定可以的,经过测试,已经简单整理一个按钮的点击事件响应,来执行反编译动作。这里将学习过程记录一下。
我们想要做反编译的动作,首先是要准备反编译所需要的相关东西。所以我们下载apktool.jar来执行相关动作,我这里采用的是一个朋友编译的1.5版本的apktool,相关网址为:
http://bbs.chinaunix.net/thread-4096302-1-1.html
使用apktool.jar的命令即可,我们可以用Python来执行cmd的命令的,所以这个是可以实现的。
这个方法处理好以后,就是需要跟按钮点击事件关联起来即可。那么下面我们就分开实现这个。
import os #####设置apk路径,我们这里先使用固定路径##### apk_path=os.getcwd()+"\\aa.apk" def apkD(apk_path): ###打印一下路径,看看是否正确##### print(apk_path) ###apktool的命令使用##### apkToD='java -jar apktool.jar d '+apk_path ###查看一下命令,是否正确,有写错### print(apkToD) ###调用os的system命令来执行cmd的相关命令### os.system(apkToD) apkD(apk_path)
代码中已经写清楚了详细的注释,这里我们可以看一下截图,证明我们的方法是有效的:
我们现在已经可以实现这个功能了,即使用apktool.jar的命令,在命令行下来实现,也是比较简单的,只要配置好java的环境变量即可,那么下一步我们就开始编写一个按钮,实现简单的鼠标点击事件。
import sys import os from PyQt4 import QtGui from PyQt4 import QtCore ###apk的位置,当前类下,我们这里先放到当前文件所在目录### apk_path=os.getcwd()+"\\aa.apk" ################################# 自定义窗口类 ##################################### class MyWindow(QtGui.QWidget): '''自定义窗口类''' ############################# 构造、析构函数 ################################# def __init__(self,parent=None): '''构造函数''' # 调用父类构造函数 super(MyWindow,self).__init__(parent) # 设置窗口固定尺寸 self.setFixedSize(QtCore.QSize(800,600)) # 创建主控件 bodyWidget = QtGui.QWidget(self) # 创建主布局 mainLayout = QtGui.QVBoxLayout(bodyWidget) # 创建自定义按钮 button = MyButton(self) # 设置文本内容 button.setText("Apk_Decode") # 添加控件 mainLayout.addWidget(button) # 设置按钮点击连接槽函数 button.clicked.connect(self.OnClick) ############################### 命令 ######################################## def OnClick(self): '''响应点击''' QtGui.QMessageBox.about(self,"apk_d","apk is decoding") ################################ 事件 ######################################## def mousePressEvent(self,event): '''鼠标按下事件''' # 判断是否为鼠标左键按下 if event.button() == QtCore.Qt.LeftButton: # 设置窗口背景颜色 self.setStyleSheet('''''') ################################## 自定义按钮类 #################################### class MyButton(QtGui.QToolButton): '''自定义按钮类''' ############################## 构造、析构函数 ################################## def __init__(self,parent=None): '''构造函数''' # 调用父类构造函数 super(MyButton,self).__init__(parent) # 设置按钮尺寸 self.setFixedSize(QtCore.QSize(800,120)) # 设置按钮背景颜色 self.setStyleSheet('''background-color:red;''') ################################ 事件 ######################################### def mousePressEvent(self,event): '''鼠标按下事件''' # 判断是否为鼠标左键按下 if event.button() == QtCore.Qt.LeftButton: # 发射点击信号 self.clicked.emit(True) # 传递至父窗口响应鼠标按下事件 self.parent().mousePressEvent(event) ################################## 主函数 ########################################## if __name__ == "__main__": '''主函数''' # 声明变量 app = QtGui.QApplication(sys.argv) # 创建窗口 window = MyWindow() # 设置窗口显示 window.show() #应用程序事件循环 sys.exit(app.exec_())
代码中有详细的注释,这里是效果截图:
点击apk_decode按钮,会弹出一个对话框提示正在反编译,说明我们已经将按钮的点击事件写上了,然后下一步我们就是将反编译的方法加上,并且对应放到按钮的点击事件里面。
详细代码如下:
import sys import os from PyQt4 import QtGui from PyQt4 import QtCore ###apk的位置,当前类下,我们这里先放到当前文件所在目录### apk_path=os.getcwd()+"\\aa.apk" ################################# 自定义窗口类 ##################################### class MyWindow(QtGui.QWidget): '''自定义窗口类''' ############################# 构造、析构函数 ################################# def __init__(self,parent=None): '''构造函数''' # 调用父类构造函数 super(MyWindow,self).__init__(parent) # 设置窗口固定尺寸 self.setFixedSize(QtCore.QSize(800,600)) # 创建主控件 bodyWidget = QtGui.QWidget(self) # 创建主布局 mainLayout = QtGui.QVBoxLayout(bodyWidget) # 创建自定义按钮 button = MyButton(self) # 设置文本内容 button.setText("Apk_Decode") # 添加控件 mainLayout.addWidget(button) # 设置按钮点击连接槽函数 button.clicked.connect(self.OnClick) ############################### 命令 ######################################## def OnClick(self): '''响应点击''' QtGui.QMessageBox.about(self,"apk_d","apk is decoding") ############################### 反编译方法 ######################################## def apk_decode(self,path): print(path) apkToD='java -jar apktool.jar d '+path print(apkToD) os.system(apkToD) ################################ 事件 ######################################## def mousePressEvent(self,event): '''鼠标按下事件''' # 判断是否为鼠标左键按下 if event.button() == QtCore.Qt.LeftButton: # 设置窗口背景颜色 self.setStyleSheet('''''') self.apk_decode(apk_path) ################################## 自定义按钮类 #################################### class MyButton(QtGui.QToolButton): '''自定义按钮类''' ############################## 构造、析构函数 ################################## def __init__(self,parent=None): '''构造函数''' # 调用父类构造函数 super(MyButton,self).__init__(parent) # 设置按钮尺寸 self.setFixedSize(QtCore.QSize(800,120)) # 设置按钮背景颜色 self.setStyleSheet('''background-color:red;''') ################################ 事件 ######################################### def mousePressEvent(self,event): '''鼠标按下事件''' # 判断是否为鼠标左键按下 if event.button() == QtCore.Qt.LeftButton: # 发射点击信号 self.clicked.emit(True) # 传递至父窗口响应鼠标按下事件 self.parent().mousePressEvent(event) ################################## 主函数 ########################################## if __name__ == "__main__": '''主函数''' # 声明变量 app = QtGui.QApplication(sys.argv) # 创建窗口 window = MyWindow() # 设置窗口显示 window.show() #应用程序事件循环 sys.exit(app.exec_())
看到这个截图,可以发现我们已经成功实现了点击按钮实现反编译的功能了。
上面我们已经可以简单实现按钮的反编译了,毕竟没有白白浪费时间,证明我们是可以做一个反编译工具的,那么平时操作中,我们肯定不会是在代码中写死apk的路径的。常用的方法是加一个选择apk路径的window,然后选定apk,这样来确定apk所在的路径的。那么下一篇我们就一起来探索如何实现这个功能。
中秋第二天,下午就在探索中度过了。。。
祝福大家中秋愉快~~~
上面代码都是完整代码,所以本篇不再上传到网盘了,大家直接复制代码测试使用即可,欢迎有兴趣的大神交流指导~~~
破解群:,爱鬼哥
原文地址:http://blog.csdn.net/guiguzi1110/article/details/39119171