增加upx压缩

This commit is contained in:
DevWiki 2025-08-22 19:17:15 +08:00
parent c903a9e444
commit 5b2e82af3c
7 changed files with 278 additions and 24 deletions

View File

@ -65,9 +65,10 @@ python build.py
构建脚本会: 构建脚本会:
- 自动检查PyInstaller是否安装 - 自动检查PyInstaller是否安装
- 自动清理之前的构建文件 - 自动清理之前的构建文件
- 构建HarmonyDevTools.exe - 构建HarmonyDevTools_v版本号.exe(包含版本信息)
- 自动创建完整的发布包 - 自动创建完整的发布包
- 生成启动脚本和说明文档 - 生成说明文档
- 构建完成后自动清理临时文件
### 4.2 使用PyInstaller手动打包 ### 4.2 使用PyInstaller手动打包
@ -76,10 +77,25 @@ python build.py
pip install pyinstaller pip install pyinstaller
# 打包为exe文件 # 打包为exe文件
pyinstaller --onefile --windowed --name HarmonyDevTools main.py pyinstaller --onefile --windowed --name HarmonyDevTools_v版本号 main.py
``` ```
### 4.3 使用auto-py-to-exeGUI工具 ### 4.3 版本管理
```bash
# 更新版本号
python update_version.py
# 查看当前版本
# 运行 update_version.py 会显示当前版本
```
**版本号格式**: x.y.z (例如: 1.4.0)
- 文件名格式: HarmonyDevTools_v1_4_0.exe
- 程序内显示: 1.4.0(构建时通过命令行参数传递)
- 版本号来源: version_info.txtmain.py中的VERSION变量用于开发调试
### 4.4 使用auto-py-to-exeGUI工具
```bash ```bash
# 安装auto-py-to-exe # 安装auto-py-to-exe
@ -94,6 +110,9 @@ auto-py-to-exe
``` ```
HarmonyDevTools_Python/ HarmonyDevTools_Python/
├── main.py # 主程序文件 ├── main.py # 主程序文件
├── build.py # 构建脚本
├── version_info.txt # 版本信息文件
├── update_version.py # 版本更新脚本
├── requirements.txt # Python依赖文件 ├── requirements.txt # Python依赖文件
├── README_Python.md # 说明文档 ├── README_Python.md # 说明文档
├── toolchains/ # 工具链目录 ├── toolchains/ # 工具链目录

View File

@ -9,6 +9,7 @@ import os
import sys import sys
import subprocess import subprocess
import shutil import shutil
import re
from pathlib import Path from pathlib import Path
def check_pyinstaller(): def check_pyinstaller():
@ -30,6 +31,54 @@ def install_pyinstaller():
print("PyInstaller安装失败") print("PyInstaller安装失败")
return False return False
def get_version_from_version_info():
"""从version_info.txt文件中获取版本号"""
if not os.path.exists("version_info.txt"):
return "1.0.0"
try:
with open("version_info.txt", 'r', encoding='utf-8') as f:
content = f.read()
match = re.search(r"StringStruct\(u'FileVersion', u'([^']+)'\)", content)
if match:
return match.group(1)
except Exception as e:
print(f"读取version_info.txt版本信息失败: {e}")
return "1.0.0"
def build_with_version(main_file, exe_name, version):
"""使用指定版本号构建exe文件"""
# 构建命令,通过命令行参数传递版本号
cmd = [
"pyinstaller",
"--onefile", # 打包为单个文件
"--windowed", # 无控制台窗口
f"--name={exe_name}", # 输出文件名
"--icon=icon.ico", # 图标文件(如果存在)
"--version-file=version_info.txt", # 版本信息文件
"--add-data=toolchains;toolchains", # 包含toolchains目录
f"--args=--version={version}", # 传递版本号参数给main.py
main_file
]
# 如果图标文件不存在,移除图标参数
if not os.path.exists("icon.ico"):
cmd = [arg for arg in cmd if not arg.startswith("--icon")]
# 如果版本信息文件不存在,移除版本信息参数
if not os.path.exists("version_info.txt"):
cmd = [arg for arg in cmd if not arg.startswith("--version-file")]
return cmd
def get_version_for_filename(version):
"""将版本号转换为文件名格式(只取前三位)"""
parts = version.split('.')
if len(parts) >= 3:
return f"{parts[0]}.{parts[1]}.{parts[2]}"
return version
def build_exe(): def build_exe():
"""构建exe文件""" """构建exe文件"""
print("开始构建exe文件...") print("开始构建exe文件...")
@ -39,28 +88,19 @@ def build_exe():
print("错误找不到main.py文件") print("错误找不到main.py文件")
return False return False
# 从version_info.txt获取版本号
version = get_version_from_version_info()
version_for_filename = get_version_for_filename(version)
main_file = "main.py" main_file = "main.py"
exe_name = "HarmonyDevTools" exe_name = f"HarmonyDevTools_v{version_for_filename}"
print("构建HarmonyDevTools...") print(f"构建HarmonyDevTools v{version}...")
# 检查toolchains目录是否存在 # 检查toolchains目录是否存在
if not os.path.exists("toolchains"): if not os.path.exists("toolchains"):
print("警告找不到toolchains目录请确保包含hdc.exe文件") print("警告找不到toolchains目录请确保包含hdc.exe文件")
# 构建命令 # 构建命令
cmd = [ cmd = build_with_version(main_file, exe_name, version_for_filename)
"pyinstaller",
"--onefile", # 打包为单个文件
"--windowed", # 无控制台窗口
f"--name={exe_name}", # 输出文件名
"--icon=icon.ico", # 图标文件(如果存在)
"--add-data=toolchains;toolchains", # 包含toolchains目录
main_file
]
# 如果图标文件不存在,移除图标参数
if not os.path.exists("icon.ico"):
cmd = [arg for arg in cmd if not arg.startswith("--icon")]
try: try:
subprocess.check_call(cmd) subprocess.check_call(cmd)
@ -99,7 +139,12 @@ def create_distribution(exe_name="HarmonyDevTools"):
def create_release_readme(dist_dir): def create_release_readme(dist_dir):
"""创建发布版README文件""" """创建发布版README文件"""
readme_content = """# HarmonyDevTools # 获取当前版本号
version = get_version_from_version_info()
version_for_filename = get_version_for_filename(version)
version_underscore = version_for_filename.replace('.', '_')
readme_content = f"""# HarmonyDevTools
HarmonyOS/OpenHarmony开发工具提供图形化界面操作HDC工具 HarmonyOS/OpenHarmony开发工具提供图形化界面操作HDC工具
@ -113,7 +158,7 @@ HarmonyOS/OpenHarmony开发工具提供图形化界面操作HDC工具。
## 使用方法 ## 使用方法
1. **启动程序**: 双击 `HarmonyDevTools.exe` 启动程序 1. **启动程序**: 双击 `HarmonyDevTools_v{version_underscore}.exe` 启动程序
2. **连接设备**: 点击"列举设备"查看可用设备输入connect key后点击"连接设备" 2. **连接设备**: 点击"列举设备"查看可用设备输入connect key后点击"连接设备"
3. **安装应用**: 选择hap文件设置安装选项后点击"安装hap" 3. **安装应用**: 选择hap文件设置安装选项后点击"安装hap"
4. **导出文件**: 点击"导出照片""导出日志"从设备导出文件 4. **导出文件**: 点击"导出照片""导出日志"从设备导出文件
@ -138,6 +183,7 @@ HarmonyOS/OpenHarmony开发工具提供图形化界面操作HDC工具。
--- ---
基于原C# WPF项目转换的Python Tkinter版本 基于原C# WPF项目转换的Python Tkinter版本
版本: {version}
""" """
readme_path = os.path.join(dist_dir, "README.md") readme_path = os.path.join(dist_dir, "README.md")
@ -152,7 +198,7 @@ def clean_build_files():
print("清理构建文件...") print("清理构建文件...")
# 清理所有构建相关的临时文件 # 清理所有构建相关的临时文件
dirs_to_clean = ["build", "dist", "__pycache__"] dirs_to_clean = ["build", "__pycache__"]
files_to_clean = ["HarmonyDevTools.spec", "HarmonyDevTools_Enhanced.spec"] files_to_clean = ["HarmonyDevTools.spec", "HarmonyDevTools_Enhanced.spec"]
for dir_name in dirs_to_clean: for dir_name in dirs_to_clean:
@ -167,6 +213,24 @@ def clean_build_files():
print("清理完成") print("清理完成")
def clean_after_build(exe_name):
"""构建完成后清理临时文件"""
print("清理构建临时文件...")
# 清理build目录
if os.path.exists("build"):
shutil.rmtree("build")
print("已删除build目录")
# 清理spec文件
spec_files = [f"{exe_name}.spec"]
for spec_file in spec_files:
if os.path.exists(spec_file):
os.remove(spec_file)
print(f"已删除文件:{spec_file}")
print("构建后清理完成")
def main(): def main():
"""主函数""" """主函数"""
print("=" * 50) print("=" * 50)
@ -202,6 +266,9 @@ def main():
# 自动创建发布包 # 自动创建发布包
create_distribution(exe_name) create_distribution(exe_name)
# 构建完成后清理临时文件
clean_after_build(exe_name)
print("\n构建完成!") print("\n构建完成!")
print(f"exe文件位置dist/{exe_name}.exe") print(f"exe文件位置dist/{exe_name}.exe")
print("发布包位置dist/目录") print("发布包位置dist/目录")

View File

@ -15,9 +15,13 @@ import logging
import json import json
import ctypes import ctypes
import webbrowser import webbrowser
import re
from pathlib import Path from pathlib import Path
from typing import Optional, Dict, Any from typing import Optional, Dict, Any
# 版本信息
VERSION = "1.4.0"
# --- UI 界面 --- # --- UI 界面 ---
# 启用 DPI 感知(避免高分屏模糊) # 启用 DPI 感知(避免高分屏模糊)
try: try:
@ -47,6 +51,14 @@ def center_window(win, width, height):
y = (screen_height - height) // 2 y = (screen_height - height) // 2
win.geometry(f"{width}x{height}+{x}+{y}") win.geometry(f"{width}x{height}+{x}+{y}")
def get_version():
"""获取版本号"""
import sys
# 检查是否有命令行参数传入版本号
if len(sys.argv) > 1 and sys.argv[1].startswith('--version='):
return sys.argv[1].split('=', 1)[1]
return VERSION
class Config: class Config:
"""配置管理类""" """配置管理类"""
@ -596,9 +608,10 @@ class HarmonyDevTools:
def show_about(self): def show_about(self):
"""显示关于信息""" """显示关于信息"""
about_text = """HarmonyDevTools - Python版本 version = get_version()
about_text = f"""HarmonyDevTools - Python版本
版本: 1.0.0 版本: {version}
作者: Python版本转换 作者: Python版本转换
功能: HarmonyOS/OpenHarmony开发工具 功能: HarmonyOS/OpenHarmony开发工具

View File

@ -0,0 +1,26 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
测试版本号传递功能
"""
import sys
# 模拟main.py中的get_version函数
def get_version():
"""获取版本号"""
# 检查是否有命令行参数传入版本号
if len(sys.argv) > 1 and sys.argv[1].startswith('--version='):
return sys.argv[1].split('=', 1)[1]
return "1.4.0" # 默认版本号
if __name__ == "__main__":
version = get_version()
print(f"当前版本: {version}")
print(f"命令行参数: {sys.argv}")
# 测试不同情况
print("\n测试用例:")
print("1. 无参数运行: python test_version.py")
print("2. 带版本号运行: python test_version.py --version=2.0.0")
print("3. 其他参数运行: python test_version.py --help")

View File

@ -0,0 +1,86 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
版本信息更新脚本
用于快速更新版本号
"""
import re
import os
def update_version_info(new_version):
"""更新版本信息文件"""
version_file = "version_info.txt"
if not os.path.exists(version_file):
print(f"错误:找不到 {version_file} 文件")
return False
# 解析版本号
version_parts = new_version.split('.')
if len(version_parts) < 3:
print("错误:版本号格式应为 x.y.z (例如: 1.4.0)")
return False
try:
major, minor, patch = map(int, version_parts[:3])
build = 0 # 第四位默认为0
except ValueError:
print("错误:版本号必须为数字")
return False
# 读取文件内容
with open(version_file, 'r', encoding='utf-8') as f:
content = f.read()
# 更新版本号
content = re.sub(r'filevers=\(\d+, \d+, \d+, \d+\)',
f'filevers=({major}, {minor}, {patch}, {build})', content)
content = re.sub(r'prodvers=\(\d+, \d+, \d+, \d+\)',
f'prodvers=({major}, {minor}, {patch}, {build})', content)
content = re.sub(r"StringStruct\(u'FileVersion', u'[^']+'\)",
f"StringStruct(u'FileVersion', u'{new_version}')", content)
content = re.sub(r"StringStruct\(u'ProductVersion', u'[^']+'\)",
f"StringStruct(u'ProductVersion', u'{new_version}')", content)
# 写回文件
with open(version_file, 'w', encoding='utf-8') as f:
f.write(content)
print(f"版本信息已更新为: {new_version}")
print(f"下次构建将生成: HarmonyDevTools_v{new_version.replace('.', '_')}.exe")
print("注意构建时会通过命令行参数传递版本号main.py中的VERSION变量保持不变")
return True
def main():
"""主函数"""
print("=" * 50)
print("HarmonyDevTools 版本更新工具")
print("=" * 50)
# 显示当前版本
if os.path.exists("version_info.txt"):
with open("version_info.txt", 'r', encoding='utf-8') as f:
content = f.read()
match = re.search(r"StringStruct\(u'FileVersion', u'([^']+)'\)", content)
if match:
current_version = match.group(1)
print(f"当前版本: {current_version}")
# 获取新版本号
print("\n请输入新版本号 (格式: x.y.z例如: 1.4.0)")
new_version = input("新版本号: ").strip()
if not new_version:
print("未输入版本号,操作取消")
return
# 更新版本信息
if update_version_info(new_version):
print("\n版本更新完成!")
print("现在可以运行 python build.py 来构建新版本")
else:
print("\n版本更新失败!")
if __name__ == "__main__":
main()

Binary file not shown.

View File

@ -0,0 +1,43 @@
# UTF-8
#
# For more details about fixed file info 'ffi' see:
# http://msdn.microsoft.com/en-us/library/ms646997.aspx
VSVersionInfo(
ffi=FixedFileInfo(
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
# Set not needed items to zero 0.
filevers=(1, 4, 0, 0),
prodvers=(1, 4, 0, 0),
# Contains a bitmask that specifies the valid bits 'flags'r
mask=0x3f,
# Contains a bitmask that specifies the Boolean attributes of the file.
flags=0x0,
# The operating system for which this file was designed.
# 0x4 - NT and there is no need to change it.
OS=0x40004,
# The general type of file.
# 0x1 - the file is an application.
fileType=0x1,
# The function of the file.
# 0x0 - the function is not defined for this fileType
subtype=0x0,
# Creation date and time stamp.
date=(0, 0)
),
kids=[
StringFileInfo(
[
StringTable(
u'040904B0',
[StringStruct(u'CompanyName', u'HarmonyDevTools'),
StringStruct(u'FileDescription', u'HarmonyOS/OpenHarmony开发工具'),
StringStruct(u'FileVersion', u'1.4.0'),
StringStruct(u'InternalName', u'HarmonyDevTools'),
StringStruct(u'LegalCopyright', u'Copyright (C) 2025 DevWiki'),
StringStruct(u'OriginalFilename', u'HarmonyDevTools.exe'),
StringStruct(u'ProductName', u'HarmonyDevTools'),
StringStruct(u'ProductVersion', u'1.4.0')])
]),
VarFileInfo([VarStruct(u'Translation', [1033, 1200])])
]
)