reproto 0.1.2__py3-none-any.whl → 0.1.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- .git/COMMIT_EDITMSG +1 -30
- .git/index +0 -0
- .git/logs/HEAD +4 -0
- .git/logs/refs/heads/iyue +4 -0
- .git/logs/refs/remotes/gitlab/iyue +4 -0
- .git/logs/refs/remotes/origin/iyue +4 -0
- .git/objects/00/81a7e1ec3251cc192ed2b73d5be897593fb872 +0 -0
- .git/objects/00/885cebf557ff261574deb93cb96449d06db01c +0 -0
- .git/objects/02/33f5b60263e5dc6d041c0b223a0724eb650faa +0 -0
- .git/objects/07/557fbd1d149ce51af8e98e8ca8590757a89dfa +0 -0
- .git/objects/08/760c38a9f9a4b5d4de0a1df0d197b27c1592d6 +0 -0
- .git/objects/12/f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f +0 -0
- .git/objects/22/316ec4a32601c236f997552e9600b7b40e3162 +0 -0
- .git/objects/24/d78e796570a8572a03bc1dd26608a7cfb506f8 +2 -0
- .git/objects/2a/fe93d8bcbeab9e136d8b6766604c32b3610314 +0 -0
- .git/objects/2d/8a0da260a710010ae62be134ac1cea6ceecfd1 +0 -0
- .git/objects/2d/e8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8 +0 -0
- .git/objects/30/9347e5681d80bd3c7949882e27090dd9070d16 +0 -0
- .git/objects/33/633c9df669ff8cf38638717937a54990814268 +0 -0
- .git/objects/39/993e3600bf4ab82aa361b738ee97a108787450 +0 -0
- .git/objects/3b/ab663710fd6b43d9372313fced9043c4cb07dd +0 -0
- .git/objects/3e/b3f1273caf6814dfa69325ccbd9fd1340cf20a +0 -0
- .git/objects/3f/ac4973433ec0116d2348fe7a748a0002702efb +0 -0
- .git/objects/40/c6c8816b3ebd8cac4fa36f20454c84aa5929d1 +0 -0
- .git/objects/45/fbc774dedb61c7c205ea732f59a8dca8d13555 +3 -0
- .git/objects/5d/3e5b3d75b03eba63deda0dcac7ca304d41e4da +0 -0
- .git/objects/60/5cb6fd6a9f8894ad4d43a9b8e4785c1b3b0e17 +1 -0
- .git/objects/60/f61a0ea50091eac8d344c86597375cbdfc2785 +0 -0
- .git/objects/63/ddda2a403efaab3f4c6597b3a73a7b1147adb5 +0 -0
- .git/objects/66/6c5c5fc30435228116fa08c9d821bebaaa8926 +0 -0
- .git/objects/7c/ef0adfb28fd774bc78061c6f088e1ef9b050f6 +0 -0
- .git/objects/7d/dc129188a10c68ab756ef2cacb292c76920403 +0 -0
- .git/objects/80/17038e0f7818a44a742f77c86f4f88ed768fcd +0 -0
- .git/objects/87/c7db6c91c17a2df84b56d30bd24a0f6b9dbdd9 +0 -0
- .git/objects/90/6b05fdb9211a7d32515bb2da31e58e4ca89916 +0 -0
- .git/objects/92/984cf67b2c25d435468a8218daa26ba0466054 +0 -0
- .git/objects/93/140b54b1fb9116ee214afee8abf2c72a232487 +0 -0
- .git/objects/93/68f2c32f83054ab072b7c9686d8baa0bad7f12 +4 -0
- .git/objects/9a/5ad062be9f6e001f4237a598a08981aba731e6 +0 -0
- .git/objects/a1/655e0cb323c300562f97dcc67d5a446908c8ec +0 -0
- .git/objects/a5/38cc82cef7c49500d3522220f0f60a9ebc1ae6 +0 -0
- .git/objects/a9/41063a7ce89c353fa24378ec7c3f12f08f9df8 +0 -0
- .git/objects/ac/5c983d949d8c928bb022badf801e45e75e785e +0 -0
- .git/objects/b0/82ca2c1b5a03edff25da3c2b2b573d049877e9 +0 -0
- .git/objects/b2/a941b669991d7e0f9bdc35f1014897a933f4e2 +1 -0
- .git/objects/bc/e98bdb71c8681acb460195fdcbbe5d36290976 +0 -0
- .git/objects/c1/87d5e047eca86cfd8d444be2987aaa3f62c4d6 +0 -0
- .git/objects/c4/c2da96b0bb8db2acb0e6615cf340c7e51af26b +0 -0
- .git/objects/c5/13a96e7584636b20b12280c029750d5bc3da1e +0 -0
- .git/objects/c7/c34283697bd3cce07db53953eda25ee7cc371e +0 -0
- .git/objects/c9/d60d922a04b87587cd67b0abf9fe5a7b7b76cd +0 -0
- .git/objects/d2/69b1676dbf32f76a7c405d0b4ea6a70ac3a626 +0 -0
- .git/objects/d3/5a918b1d9125ad35d60e08b181323df3246f1a +0 -0
- .git/objects/d8/eaf86669fbfd10497570c1784db1ed2696b588 +0 -0
- .git/objects/d9/90e6d553577d37ebce8b28b3015ecbde038b42 +0 -0
- .git/objects/da/13cc15bcd8ee39c81f36dee7f179a569ecab0b +0 -0
- .git/objects/e4/4c1d8a90207ac082d8ab7ff0db66708e2ebc31 +0 -0
- .git/objects/e6/5ff9bea681f0b8f409ec27761935883c1f0cc9 +0 -0
- .git/objects/f8/ed595d25bd9d500e765a792c513878f7ddb1f7 +0 -0
- .git/refs/heads/iyue +1 -1
- .git/refs/remotes/gitlab/iyue +1 -1
- .git/refs/remotes/origin/iyue +1 -1
- README.md +104 -190
- core/__init__.py +23 -0
- core/info_decoder.py +13 -4
- core/reconstructor.py +25 -16
- generation/__init__.py +17 -0
- generation/proto_generator.py +11 -5
- main.py +59 -56
- models/__init__.py +31 -24
- parsing/__init__.py +22 -0
- parsing/enum_parser.py +10 -2
- parsing/java_parser.py +7 -1
- pyproject.toml +2 -1
- reproto-0.1.4.dist-info/METADATA +210 -0
- {reproto-0.1.2.dist-info → reproto-0.1.4.dist-info}/RECORD +85 -31
- requirements.txt +3 -1
- utils/__init__.py +55 -0
- utils/builtin_proto.py +8 -1
- utils/file_cache.py +8 -1
- utils/report_utils.py +71 -0
- utils/type_index.py +8 -1
- utils/version_checker.py +311 -0
- core/bytecode_parser.py +0 -274
- reproto-0.1.2.dist-info/METADATA +0 -295
- {reproto-0.1.2.dist-info → reproto-0.1.4.dist-info}/WHEEL +0 -0
- {reproto-0.1.2.dist-info → reproto-0.1.4.dist-info}/entry_points.txt +0 -0
core/info_decoder.py
CHANGED
@@ -16,9 +16,19 @@ import re
|
|
16
16
|
from typing import Optional, List, Dict, Tuple
|
17
17
|
from pathlib import Path
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
# 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
|
20
|
+
try:
|
21
|
+
# 相对导入(包环境)
|
22
|
+
from ..models.message_definition import MessageDefinition, FieldDefinition, OneofDefinition
|
23
|
+
from ..utils.logger import get_logger
|
24
|
+
from ..utils.type_utils import type_mapper, naming_converter
|
25
|
+
from ..parsing.java_parser import JavaParser
|
26
|
+
except ImportError:
|
27
|
+
# 绝对导入(开发环境)
|
28
|
+
from models.message_definition import MessageDefinition, FieldDefinition, OneofDefinition
|
29
|
+
from utils.logger import get_logger
|
30
|
+
from utils.type_utils import type_mapper, naming_converter
|
31
|
+
from parsing.java_parser import JavaParser
|
22
32
|
|
23
33
|
|
24
34
|
class InfoDecoder:
|
@@ -40,7 +50,6 @@ class InfoDecoder:
|
|
40
50
|
self.java_source_analyzer = java_source_analyzer
|
41
51
|
|
42
52
|
# 导入JavaParser
|
43
|
-
from parsing.java_parser import JavaParser
|
44
53
|
self.java_parser = JavaParser()
|
45
54
|
|
46
55
|
# Protobuf字段类型映射表
|
core/reconstructor.py
CHANGED
@@ -15,14 +15,31 @@ from pathlib import Path
|
|
15
15
|
from collections import deque
|
16
16
|
from typing import Set, Dict, List, Optional, Tuple
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
from
|
22
|
-
from
|
23
|
-
from
|
24
|
-
from
|
25
|
-
from
|
18
|
+
# 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
|
19
|
+
try:
|
20
|
+
# 相对导入(包环境)
|
21
|
+
from ..parsing.java_parser import JavaParser
|
22
|
+
from ..parsing.enum_parser import EnumParser
|
23
|
+
from .info_decoder import InfoDecoder
|
24
|
+
from ..generation.proto_generator import ProtoGenerator
|
25
|
+
from ..models.message_definition import MessageDefinition, EnumDefinition, EnumValueDefinition
|
26
|
+
from ..utils.logger import get_logger
|
27
|
+
from ..utils.file_cache import get_file_cache
|
28
|
+
from ..utils.type_utils import type_mapper, naming_converter, TypeMapper, NamingConverter
|
29
|
+
from ..utils.builtin_proto import get_builtin_manager
|
30
|
+
from ..utils.type_index import get_type_index
|
31
|
+
except ImportError:
|
32
|
+
# 绝对导入(开发环境)
|
33
|
+
from parsing.java_parser import JavaParser
|
34
|
+
from parsing.enum_parser import EnumParser
|
35
|
+
from core.info_decoder import InfoDecoder
|
36
|
+
from generation.proto_generator import ProtoGenerator
|
37
|
+
from models.message_definition import MessageDefinition, EnumDefinition, EnumValueDefinition
|
38
|
+
from utils.logger import get_logger
|
39
|
+
from utils.file_cache import get_file_cache
|
40
|
+
from utils.type_utils import type_mapper, naming_converter, TypeMapper, NamingConverter
|
41
|
+
from utils.builtin_proto import get_builtin_manager
|
42
|
+
from utils.type_index import get_type_index
|
26
43
|
|
27
44
|
|
28
45
|
class JavaSourceAnalyzer:
|
@@ -359,7 +376,6 @@ class ProtoReconstructor:
|
|
359
376
|
self.info_decoder.java_source_analyzer = self.java_source_analyzer
|
360
377
|
|
361
378
|
# 初始化内置proto管理器
|
362
|
-
from utils.builtin_proto import get_builtin_manager
|
363
379
|
self.builtin_manager = get_builtin_manager(output_dir=str(output_dir))
|
364
380
|
|
365
381
|
# 🚀 性能优化:移除未使用的索引系统,简化代码
|
@@ -404,7 +420,6 @@ class ProtoReconstructor:
|
|
404
420
|
self._generate_all_proto_files()
|
405
421
|
|
406
422
|
# 5. 输出性能统计信息
|
407
|
-
from utils.file_cache import get_file_cache
|
408
423
|
file_cache = get_file_cache()
|
409
424
|
file_cache.print_stats()
|
410
425
|
|
@@ -1269,8 +1284,6 @@ class ProtoReconstructor:
|
|
1269
1284
|
是否为基础字段类型
|
1270
1285
|
"""
|
1271
1286
|
# 🚀 性能优化:使用缓存的类型检查器,避免重复计算
|
1272
|
-
from utils.type_utils import TypeMapper
|
1273
|
-
|
1274
1287
|
# 直接使用统一的基础类型检查,无需额外逻辑
|
1275
1288
|
return TypeMapper.is_java_basic_type(type_name)
|
1276
1289
|
|
@@ -1353,8 +1366,6 @@ class ProtoReconstructor:
|
|
1353
1366
|
实际的完整类型名
|
1354
1367
|
"""
|
1355
1368
|
# 🚀 优化:使用统一的类型检查器
|
1356
|
-
from utils.type_utils import TypeMapper
|
1357
|
-
|
1358
1369
|
if TypeMapper.is_java_basic_type(inferred_type):
|
1359
1370
|
self.logger.debug(f" 跳过基础类型: {inferred_type}")
|
1360
1371
|
return None
|
@@ -1365,7 +1376,6 @@ class ProtoReconstructor:
|
|
1365
1376
|
|
1366
1377
|
try:
|
1367
1378
|
# 使用索引系统进行快速查找,避免文件IO
|
1368
|
-
from utils.type_index import get_type_index
|
1369
1379
|
type_index = get_type_index(self.sources_dir)
|
1370
1380
|
|
1371
1381
|
# 构造可能的完整类名
|
@@ -1523,5 +1533,4 @@ class ProtoReconstructor:
|
|
1523
1533
|
蛇形命名字符串
|
1524
1534
|
"""
|
1525
1535
|
# 🚀 优化:使用统一的命名转换器,避免重复实现
|
1526
|
-
from utils.type_utils import NamingConverter
|
1527
1536
|
return NamingConverter.to_snake_case(camel_str)
|
generation/__init__.py
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
"""
|
2
|
+
代码生成模块
|
3
|
+
|
4
|
+
负责将解析得到的消息定义转换为Protobuf .proto文件
|
5
|
+
"""
|
6
|
+
|
7
|
+
# 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
|
8
|
+
try:
|
9
|
+
# 相对导入(包环境)
|
10
|
+
from .proto_generator import ProtoGenerator
|
11
|
+
except ImportError:
|
12
|
+
# 绝对导入(开发环境)
|
13
|
+
from generation.proto_generator import ProtoGenerator
|
14
|
+
|
15
|
+
__all__ = [
|
16
|
+
'ProtoGenerator'
|
17
|
+
]
|
1
18
|
|
2
19
|
|
3
20
|
|
generation/proto_generator.py
CHANGED
@@ -10,8 +10,17 @@ Author: AI Assistant
|
|
10
10
|
|
11
11
|
import re
|
12
12
|
from typing import Dict, Set, List, Union
|
13
|
-
|
14
|
-
|
13
|
+
|
14
|
+
# 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
|
15
|
+
try:
|
16
|
+
# 相对导入(包环境)
|
17
|
+
from ..models.message_definition import MessageDefinition, FieldDefinition, EnumDefinition, EnumValueDefinition
|
18
|
+
from ..utils.type_utils import type_mapper, naming_converter, field_name_processor
|
19
|
+
from ..utils.logger import get_logger
|
20
|
+
except ImportError:
|
21
|
+
# 绝对导入(开发环境)
|
22
|
+
from models.message_definition import MessageDefinition, FieldDefinition, EnumDefinition, EnumValueDefinition
|
23
|
+
from utils.type_utils import type_mapper, naming_converter, field_name_processor
|
15
24
|
|
16
25
|
|
17
26
|
class ProtoGenerator:
|
@@ -70,7 +79,6 @@ class ProtoGenerator:
|
|
70
79
|
return '\n'.join(lines)
|
71
80
|
|
72
81
|
except Exception as e:
|
73
|
-
from utils.logger import get_logger
|
74
82
|
logger = get_logger("proto_generator")
|
75
83
|
logger.error(f"❌ 生成proto文件失败 {message_def.name if message_def else 'Unknown'}: {e}")
|
76
84
|
raise
|
@@ -118,7 +126,6 @@ class ProtoGenerator:
|
|
118
126
|
return '\n'.join(lines)
|
119
127
|
|
120
128
|
except Exception as e:
|
121
|
-
from utils.logger import get_logger
|
122
129
|
logger = get_logger("proto_generator")
|
123
130
|
logger.error(f"❌ 生成枚举proto文件失败 {enum_def.name if enum_def else 'Unknown'}: {e}")
|
124
131
|
raise
|
@@ -290,7 +297,6 @@ class ProtoGenerator:
|
|
290
297
|
return f' {field_type} {field.name} = {field.tag};'
|
291
298
|
|
292
299
|
except Exception as e:
|
293
|
-
from utils.logger import get_logger
|
294
300
|
logger = get_logger("proto_generator")
|
295
301
|
logger.error(f"❌ 生成字段定义失败 {field.name if field else 'Unknown'}: {e}")
|
296
302
|
raise
|
main.py
CHANGED
@@ -16,17 +16,35 @@ Author: AI Assistant
|
|
16
16
|
|
17
17
|
import sys
|
18
18
|
import argparse
|
19
|
+
import traceback
|
19
20
|
from pathlib import Path
|
20
21
|
|
21
|
-
#
|
22
|
+
# 确保项目根目录在Python路径中
|
22
23
|
import os
|
23
24
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
24
|
-
from core.reconstructor import ProtoReconstructor
|
25
|
-
from utils.logger import setup_logger, get_logger
|
26
25
|
|
26
|
+
# 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
|
27
|
+
try:
|
28
|
+
# 相对导入(包环境)
|
29
|
+
from .core.reconstructor import ProtoReconstructor
|
30
|
+
from .utils.logger import setup_logger, get_logger
|
31
|
+
from .utils.report_utils import print_results_summary
|
32
|
+
from .utils.version_checker import check_version_on_startup
|
33
|
+
except ImportError:
|
34
|
+
# 绝对导入(开发环境)
|
35
|
+
from core.reconstructor import ProtoReconstructor
|
36
|
+
from utils.logger import setup_logger, get_logger
|
37
|
+
from utils.report_utils import print_results_summary
|
38
|
+
from utils.version_checker import check_version_on_startup
|
27
39
|
|
28
|
-
|
29
|
-
|
40
|
+
|
41
|
+
def parse_arguments() -> argparse.Namespace:
|
42
|
+
"""
|
43
|
+
解析命令行参数
|
44
|
+
|
45
|
+
Returns:
|
46
|
+
解析后的命令行参数对象
|
47
|
+
"""
|
30
48
|
parser = argparse.ArgumentParser(
|
31
49
|
description='从JADX反编译的Java源码重构Protobuf .proto文件',
|
32
50
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
@@ -72,8 +90,19 @@ def parse_arguments():
|
|
72
90
|
return parser.parse_args()
|
73
91
|
|
74
92
|
|
75
|
-
def validate_arguments(args):
|
76
|
-
"""
|
93
|
+
def validate_arguments(args: argparse.Namespace) -> tuple[Path, str, Path]:
|
94
|
+
"""
|
95
|
+
验证命令行参数的有效性
|
96
|
+
|
97
|
+
Args:
|
98
|
+
args: 解析后的命令行参数
|
99
|
+
|
100
|
+
Returns:
|
101
|
+
验证后的路径元组: (sources_path, root_class, output_path)
|
102
|
+
|
103
|
+
Raises:
|
104
|
+
SystemExit: 当参数无效时退出程序
|
105
|
+
"""
|
77
106
|
logger = get_logger("main")
|
78
107
|
|
79
108
|
# 验证源码目录
|
@@ -92,13 +121,13 @@ def validate_arguments(args):
|
|
92
121
|
logger.error("应该是完整的类名,如: com.example.Model")
|
93
122
|
sys.exit(1)
|
94
123
|
|
95
|
-
#
|
124
|
+
# 验证输出目录
|
96
125
|
output_path = Path(args.output_dir)
|
97
126
|
if output_path.exists() and not output_path.is_dir():
|
98
127
|
logger.error(f"输出路径存在但不是目录: {output_path}")
|
99
128
|
sys.exit(1)
|
100
129
|
|
101
|
-
#
|
130
|
+
# 创建日志目录
|
102
131
|
log_path = Path(args.log_dir)
|
103
132
|
try:
|
104
133
|
log_path.mkdir(parents=True, exist_ok=True)
|
@@ -109,17 +138,29 @@ def validate_arguments(args):
|
|
109
138
|
return sources_path.resolve(), args.root_class, output_path.resolve()
|
110
139
|
|
111
140
|
|
112
|
-
def main():
|
113
|
-
"""
|
141
|
+
def main() -> None:
|
142
|
+
"""
|
143
|
+
主函数:协调整个重构过程
|
144
|
+
|
145
|
+
处理流程:
|
146
|
+
1. 解析和验证命令行参数
|
147
|
+
2. 初始化日志系统
|
148
|
+
3. 启动版本检测(异步)
|
149
|
+
4. 创建重构器并执行重构
|
150
|
+
5. 输出结果统计信息
|
151
|
+
"""
|
114
152
|
args = None
|
115
153
|
try:
|
116
|
-
#
|
154
|
+
# 解析和验证参数
|
117
155
|
args = parse_arguments()
|
118
156
|
|
119
157
|
# 初始化日志系统
|
120
158
|
setup_logger(args.log_dir)
|
121
159
|
logger = get_logger("main")
|
122
160
|
|
161
|
+
# 启动版本检测(异步,不阻塞主程序)
|
162
|
+
check_version_on_startup()
|
163
|
+
|
123
164
|
# 验证参数
|
124
165
|
sources_dir, root_class, output_dir = validate_arguments(args)
|
125
166
|
|
@@ -130,62 +171,25 @@ def main():
|
|
130
171
|
logger.info(f"📁 日志目录: {args.log_dir}")
|
131
172
|
logger.info(f"🎯 根类: {root_class}")
|
132
173
|
|
133
|
-
#
|
174
|
+
# 创建重构器并执行重构
|
134
175
|
reconstructor = ProtoReconstructor(sources_dir, output_dir)
|
135
176
|
reconstructor._verbose = args.verbose # 传递verbose标志
|
136
177
|
results = reconstructor.reconstruct_from_root(root_class)
|
137
178
|
|
138
|
-
#
|
139
|
-
|
140
|
-
# 统计成功和失败的数量
|
141
|
-
success_count = len(results)
|
142
|
-
failed_count = len(reconstructor.failed_classes) if hasattr(reconstructor, 'failed_classes') else 0
|
143
|
-
total_attempted = success_count + failed_count
|
144
|
-
|
145
|
-
logger.success("✅ 重构完成!")
|
146
|
-
logger.info(f"📊 处理统计: 共尝试处理 {total_attempted} 个类型")
|
147
|
-
|
148
|
-
message_count = sum(1 for r in results.values() if hasattr(r, 'fields'))
|
149
|
-
enum_count = sum(1 for r in results.values() if hasattr(r, 'values'))
|
150
|
-
|
151
|
-
logger.info(f" - ✅ 成功: {success_count} 个 (消息: {message_count}, 枚举: {enum_count})")
|
152
|
-
|
153
|
-
# 显示失败的类
|
154
|
-
if hasattr(reconstructor, 'failed_classes') and reconstructor.failed_classes:
|
155
|
-
logger.warning(f" - ❌ 失败: {failed_count} 个")
|
156
|
-
for failed_class, reason in reconstructor.failed_classes.items():
|
157
|
-
logger.warning(f" • {failed_class}: {reason}")
|
158
|
-
|
159
|
-
# 显示跳过的类
|
160
|
-
if hasattr(reconstructor, 'skipped_classes') and reconstructor.skipped_classes:
|
161
|
-
skipped_count = len(reconstructor.skipped_classes)
|
162
|
-
logger.info(f" - ⏭️ 跳过: {skipped_count} 个 (基础类型或已处理)")
|
163
|
-
if args.verbose:
|
164
|
-
for skipped_class, reason in reconstructor.skipped_classes.items():
|
165
|
-
logger.info(f" • {skipped_class}: {reason}")
|
166
|
-
else:
|
167
|
-
logger.error("❌ 没有生成任何proto文件!")
|
168
|
-
logger.error("请检查:")
|
169
|
-
logger.error(" 1. 根类名是否正确")
|
170
|
-
logger.error(" 2. Java源码目录是否包含对应的文件")
|
171
|
-
logger.error(" 3. 类是否为protobuf消息类")
|
172
|
-
|
173
|
-
# 显示详细的失败信息
|
174
|
-
if hasattr(reconstructor, 'failed_classes') and reconstructor.failed_classes:
|
175
|
-
logger.error("失败的类:")
|
176
|
-
for failed_class, reason in reconstructor.failed_classes.items():
|
177
|
-
logger.error(f" • {failed_class}: {reason}")
|
178
|
-
|
179
|
-
sys.exit(1)
|
179
|
+
# 输出结果统计
|
180
|
+
print_results_summary(reconstructor, results, logger, args.verbose)
|
180
181
|
|
181
182
|
except KeyboardInterrupt:
|
183
|
+
# 处理用户中断
|
182
184
|
if args:
|
183
185
|
logger = get_logger("main")
|
184
186
|
logger.warning("⚠️ 操作被用户中断")
|
185
187
|
else:
|
186
188
|
print("\n⚠️ 操作被用户中断")
|
187
189
|
sys.exit(1)
|
190
|
+
|
188
191
|
except Exception as e:
|
192
|
+
# 处理其他异常
|
189
193
|
if args:
|
190
194
|
logger = get_logger("main")
|
191
195
|
logger.error(f"❌ 重构失败: {e}")
|
@@ -194,7 +198,6 @@ def main():
|
|
194
198
|
else:
|
195
199
|
print(f"\n❌ 重构失败: {e}")
|
196
200
|
if hasattr(args, 'verbose') and args.verbose:
|
197
|
-
import traceback
|
198
201
|
traceback.print_exc()
|
199
202
|
sys.exit(1)
|
200
203
|
|
models/__init__.py
CHANGED
@@ -1,27 +1,34 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
"""
|
2
|
+
模型定义模块
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
name: str
|
8
|
-
type: str
|
9
|
-
tag: int
|
10
|
-
rule: str # "optional", "repeated", or "oneof"
|
4
|
+
包含Protobuf消息、字段、枚举等数据结构的定义
|
5
|
+
所有具体的类定义都在相应的子模块中
|
6
|
+
"""
|
11
7
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
8
|
+
# 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
|
9
|
+
try:
|
10
|
+
# 相对导入(包环境)
|
11
|
+
from .message_definition import (
|
12
|
+
MessageDefinition,
|
13
|
+
FieldDefinition,
|
14
|
+
OneofDefinition,
|
15
|
+
EnumDefinition,
|
16
|
+
EnumValueDefinition
|
17
|
+
)
|
18
|
+
except ImportError:
|
19
|
+
# 绝对导入(开发环境)
|
20
|
+
from models.message_definition import (
|
21
|
+
MessageDefinition,
|
22
|
+
FieldDefinition,
|
23
|
+
OneofDefinition,
|
24
|
+
EnumDefinition,
|
25
|
+
EnumValueDefinition
|
26
|
+
)
|
17
27
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
fields: List[FieldDefinition] = field(default_factory=list)
|
26
|
-
oneofs: Dict[str, OneofDefinition] = field(default_factory=dict)
|
27
|
-
dependencies: Set[str] = field(default_factory=set)
|
28
|
+
__all__ = [
|
29
|
+
'MessageDefinition',
|
30
|
+
'FieldDefinition',
|
31
|
+
'OneofDefinition',
|
32
|
+
'EnumDefinition',
|
33
|
+
'EnumValueDefinition'
|
34
|
+
]
|
parsing/__init__.py
CHANGED
@@ -1,3 +1,25 @@
|
|
1
|
+
"""
|
2
|
+
解析器模块
|
3
|
+
|
4
|
+
包含各种源码解析器:
|
5
|
+
- Java解析器:解析Java源码,提取字段标签和类型信息
|
6
|
+
- 枚举解析器:专门处理Java枚举类的解析
|
7
|
+
"""
|
8
|
+
|
9
|
+
# 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
|
10
|
+
try:
|
11
|
+
# 相对导入(包环境)
|
12
|
+
from .java_parser import JavaParser
|
13
|
+
from .enum_parser import EnumParser
|
14
|
+
except ImportError:
|
15
|
+
# 绝对导入(开发环境)
|
16
|
+
from parsing.java_parser import JavaParser
|
17
|
+
from parsing.enum_parser import EnumParser
|
18
|
+
|
19
|
+
__all__ = [
|
20
|
+
'JavaParser',
|
21
|
+
'EnumParser'
|
22
|
+
]
|
1
23
|
|
2
24
|
|
3
25
|
|
parsing/enum_parser.py
CHANGED
@@ -8,8 +8,16 @@
|
|
8
8
|
import re
|
9
9
|
import os
|
10
10
|
from typing import List, Optional, Dict, Tuple
|
11
|
-
|
12
|
-
|
11
|
+
|
12
|
+
# 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
|
13
|
+
try:
|
14
|
+
# 相对导入(包环境)
|
15
|
+
from ..models.message_definition import EnumDefinition, EnumValueDefinition
|
16
|
+
from ..utils.logger import get_logger
|
17
|
+
except ImportError:
|
18
|
+
# 绝对导入(开发环境)
|
19
|
+
from models.message_definition import EnumDefinition, EnumValueDefinition
|
20
|
+
from utils.logger import get_logger
|
13
21
|
|
14
22
|
|
15
23
|
class EnumParser:
|
parsing/java_parser.py
CHANGED
@@ -11,7 +11,13 @@ import re
|
|
11
11
|
from pathlib import Path
|
12
12
|
from typing import Optional, Tuple, List
|
13
13
|
|
14
|
-
|
14
|
+
# 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
|
15
|
+
try:
|
16
|
+
# 相对导入(包环境)
|
17
|
+
from ..utils.logger import get_logger
|
18
|
+
except ImportError:
|
19
|
+
# 绝对导入(开发环境)
|
20
|
+
from utils.logger import get_logger
|
15
21
|
|
16
22
|
|
17
23
|
class JavaParser:
|
pyproject.toml
CHANGED
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
4
4
|
|
5
5
|
[tool.poetry]
|
6
6
|
name = "reproto"
|
7
|
-
version = "0.1.
|
7
|
+
version = "0.1.4"
|
8
8
|
description = "一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构."
|
9
9
|
readme = "README.md"
|
10
10
|
license = "Proprietary"
|
@@ -37,6 +37,7 @@ packages = [
|
|
37
37
|
[tool.poetry.dependencies]
|
38
38
|
python = ">=3.12,<4.0"
|
39
39
|
loguru = ">=0.7.3"
|
40
|
+
packaging = "^25.0"
|
40
41
|
|
41
42
|
[tool.poetry.scripts]
|
42
43
|
reproto = "main:main"
|