apk-patchx 7.9.2025.1__py3-none-any.whl → 7.9.2025.2__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.
- apk_patchx/__init__.py +1 -1
- apk_patchx/cli.py +2 -2
- apk_patchx/services/adb.py +2 -2
- apk_patchx/services/android_sdk.py +5 -5
- apk_patchx/services/apktool.py +2 -2
- apk_patchx/services/frida.py +2 -2
- apk_patchx/services/patch_dex.py +2 -2
- apk_patchx/services/signing.py +8 -8
- apk_patchx/utils/core.py +2 -2
- {apk_patchx-7.9.2025.1.dist-info → apk_patchx-7.9.2025.2.dist-info}/METADATA +10 -10
- apk_patchx-7.9.2025.2.dist-info/RECORD +22 -0
- apk_patchx-7.9.2025.1.dist-info/RECORD +0 -22
- {apk_patchx-7.9.2025.1.dist-info → apk_patchx-7.9.2025.2.dist-info}/WHEEL +0 -0
- {apk_patchx-7.9.2025.1.dist-info → apk_patchx-7.9.2025.2.dist-info}/entry_points.txt +0 -0
- {apk_patchx-7.9.2025.1.dist-info → apk_patchx-7.9.2025.2.dist-info}/licenses/LICENSE +0 -0
apk_patchx/__init__.py
CHANGED
apk_patchx/cli.py
CHANGED
@@ -14,7 +14,7 @@ from .services.adb import ADBService
|
|
14
14
|
from .services.apktool import ApktoolService
|
15
15
|
from .services.frida import FridaService
|
16
16
|
from .services.signing import SigningService
|
17
|
-
from .utils.core import setup_logging,
|
17
|
+
from .utils.core import setup_logging, get_apk-patchx_home
|
18
18
|
|
19
19
|
colorama.init(autoreset=True)
|
20
20
|
|
@@ -58,7 +58,7 @@ def cli(ctx: click.Context, verbose: bool, version: bool) -> None:
|
|
58
58
|
setup_logging(verbose)
|
59
59
|
|
60
60
|
# Initialize APKPatcher home directory
|
61
|
-
home =
|
61
|
+
home = get_apk-patchx_home()
|
62
62
|
home.mkdir(parents=True, exist_ok=True)
|
63
63
|
|
64
64
|
if verbose:
|
apk_patchx/services/adb.py
CHANGED
@@ -6,7 +6,7 @@ from pathlib import Path
|
|
6
6
|
from typing import List, Optional
|
7
7
|
|
8
8
|
from ..exceptions import ADBError, ToolNotFoundError
|
9
|
-
from ..utils.core import run_command,
|
9
|
+
from ..utils.core import run_command, get_apk-patchx_home
|
10
10
|
from .android_sdk import AndroidSDKService
|
11
11
|
|
12
12
|
|
@@ -29,7 +29,7 @@ class ADBService:
|
|
29
29
|
else:
|
30
30
|
# Use SDK ADB
|
31
31
|
self.sdk_service.ensure_platform_tools()
|
32
|
-
sdk_root =
|
32
|
+
sdk_root = get_apk-patchx_home() / "tools" / "sdk"
|
33
33
|
self._adb_path = sdk_root / "platform-tools" / "adb"
|
34
34
|
|
35
35
|
if not self._adb_path.exists():
|
@@ -7,7 +7,7 @@ from typing import Optional
|
|
7
7
|
from urllib.parse import urljoin
|
8
8
|
|
9
9
|
from ..exceptions import NetworkError, ToolNotFoundError
|
10
|
-
from ..utils.core import run_command,
|
10
|
+
from ..utils.core import run_command, get_apk-patchx_home, download_file
|
11
11
|
|
12
12
|
|
13
13
|
class AndroidSDKService:
|
@@ -15,8 +15,8 @@ class AndroidSDKService:
|
|
15
15
|
|
16
16
|
def __init__(self, verbose: bool = False):
|
17
17
|
self.verbose = verbose
|
18
|
-
self.sdk_root =
|
19
|
-
self.cmdline_tools_dir =
|
18
|
+
self.sdk_root = get_apk-patchx_home() / "tools" / "sdk"
|
19
|
+
self.cmdline_tools_dir = get_apk-patchx_home() / "tools" / "cmdline-tools"
|
20
20
|
|
21
21
|
def ensure_java(self) -> None:
|
22
22
|
"""Ensure Java is available."""
|
@@ -41,7 +41,7 @@ class AndroidSDKService:
|
|
41
41
|
|
42
42
|
# Download command line tools
|
43
43
|
tools_url = "https://dl.google.com/android/repository/commandlinetools-linux-9123335_latest.zip"
|
44
|
-
zip_path =
|
44
|
+
zip_path = get_apk-patchx_home() / "tools" / "commandlinetools.zip"
|
45
45
|
|
46
46
|
if self.verbose:
|
47
47
|
print(f"Downloading Android command line tools...")
|
@@ -51,7 +51,7 @@ class AndroidSDKService:
|
|
51
51
|
# Extract
|
52
52
|
import zipfile
|
53
53
|
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
|
54
|
-
zip_ref.extractall(
|
54
|
+
zip_ref.extractall(get_apk-patchx_home() / "tools")
|
55
55
|
|
56
56
|
zip_path.unlink()
|
57
57
|
|
apk_patchx/services/apktool.py
CHANGED
@@ -5,7 +5,7 @@ from pathlib import Path
|
|
5
5
|
from typing import List, Optional
|
6
6
|
|
7
7
|
from ..exceptions import BuildError, NetworkError, ToolNotFoundError, ValidationError
|
8
|
-
from ..utils.core import run_command,
|
8
|
+
from ..utils.core import run_command, get_apk-patchx_home, download_file
|
9
9
|
from ..utils.versions import get_latest_github_release
|
10
10
|
from .android_sdk import AndroidSDKService
|
11
11
|
|
@@ -27,7 +27,7 @@ class ApktoolService:
|
|
27
27
|
|
28
28
|
def _ensure_apktool(self) -> None:
|
29
29
|
"""Ensure apktool is available."""
|
30
|
-
tools_dir =
|
30
|
+
tools_dir = get_apk-patchx_home() / "tools"
|
31
31
|
tools_dir.mkdir(parents=True, exist_ok=True)
|
32
32
|
|
33
33
|
# Check for existing apktool
|
apk_patchx/services/frida.py
CHANGED
@@ -5,7 +5,7 @@ from pathlib import Path
|
|
5
5
|
from typing import Optional, Dict
|
6
6
|
|
7
7
|
from ..exceptions import FridaPatchError, NetworkError, ValidationError
|
8
|
-
from ..utils.core import run_command,
|
8
|
+
from ..utils.core import run_command, get_apk-patchx_home, download_file
|
9
9
|
from ..utils.versions import get_latest_github_release
|
10
10
|
from .apktool import ApktoolService
|
11
11
|
from .signing import SigningService
|
@@ -75,7 +75,7 @@ class FridaService:
|
|
75
75
|
gadget_name = f"frida-gadget-{version}-{frida_arch}.so"
|
76
76
|
gadget_xz_name = f"{gadget_name}.xz"
|
77
77
|
|
78
|
-
tools_dir =
|
78
|
+
tools_dir = get_apk-patchx_home() / "tools"
|
79
79
|
tools_dir.mkdir(parents=True, exist_ok=True)
|
80
80
|
|
81
81
|
gadget_path = tools_dir / gadget_name
|
apk_patchx/services/patch_dex.py
CHANGED
@@ -5,7 +5,7 @@ from pathlib import Path
|
|
5
5
|
from typing import Optional
|
6
6
|
|
7
7
|
from ..exceptions import FridaPatchError, ToolNotFoundError
|
8
|
-
from ..utils.core import run_command,
|
8
|
+
from ..utils.core import run_command, get_apk-patchx_home, download_file
|
9
9
|
|
10
10
|
|
11
11
|
class DexPatcher:
|
@@ -24,7 +24,7 @@ class DexPatcher:
|
|
24
24
|
|
25
25
|
def _ensure_dexpatch(self) -> None:
|
26
26
|
"""Ensure dexpatch is available."""
|
27
|
-
tools_dir =
|
27
|
+
tools_dir = get_apk-patchx_home() / "tools"
|
28
28
|
tools_dir.mkdir(parents=True, exist_ok=True)
|
29
29
|
|
30
30
|
dexpatch_path = tools_dir / "dexpatch-0.1.jar"
|
apk_patchx/services/signing.py
CHANGED
@@ -5,7 +5,7 @@ from pathlib import Path
|
|
5
5
|
from typing import Optional
|
6
6
|
|
7
7
|
from ..exceptions import SigningError, ToolNotFoundError
|
8
|
-
from ..utils.core import run_command,
|
8
|
+
from ..utils.core import run_command, get_apk-patchx_home
|
9
9
|
from .android_sdk import AndroidSDKService
|
10
10
|
|
11
11
|
|
@@ -21,7 +21,7 @@ class SigningService:
|
|
21
21
|
def keystore_path(self) -> Path:
|
22
22
|
"""Get debug keystore path."""
|
23
23
|
if self._keystore_path is None:
|
24
|
-
keystore_path =
|
24
|
+
keystore_path = get_apk-patchx_home() / "debug.keystore"
|
25
25
|
if not keystore_path.exists():
|
26
26
|
self._generate_debug_keystore(keystore_path)
|
27
27
|
self._keystore_path = keystore_path
|
@@ -35,12 +35,12 @@ class SigningService:
|
|
35
35
|
cmd = [
|
36
36
|
"keytool", "-genkey", "-v",
|
37
37
|
"-keystore", str(keystore_path),
|
38
|
-
"-alias", "
|
38
|
+
"-alias", "apk-patchx_debug",
|
39
39
|
"-keyalg", "RSA",
|
40
40
|
"-keysize", "2048",
|
41
41
|
"-validity", "10000",
|
42
|
-
"-storepass", "
|
43
|
-
"-keypass", "
|
42
|
+
"-storepass", "apk-patchx",
|
43
|
+
"-keypass", "apk-patchx",
|
44
44
|
"-dname", "CN=APKPatcher Debug, OU=Debug, O=APKPatcher, C=US",
|
45
45
|
"-noprompt"
|
46
46
|
]
|
@@ -89,9 +89,9 @@ class SigningService:
|
|
89
89
|
cmd = [
|
90
90
|
str(apksigner), "sign",
|
91
91
|
"--ks", str(self.keystore_path),
|
92
|
-
"--ks-key-alias", "
|
93
|
-
"--ks-pass", "pass:
|
94
|
-
"--key-pass", "pass:
|
92
|
+
"--ks-key-alias", "apk-patchx_debug",
|
93
|
+
"--ks-pass", "pass:apk-patchx",
|
94
|
+
"--key-pass", "pass:apk-patchx",
|
95
95
|
"--out", str(output_path),
|
96
96
|
str(apk_path)
|
97
97
|
]
|
apk_patchx/utils/core.py
CHANGED
@@ -20,9 +20,9 @@ def setup_logging(verbose: bool = False) -> None:
|
|
20
20
|
)
|
21
21
|
|
22
22
|
|
23
|
-
def
|
23
|
+
def get_apk-patchx_home() -> Path:
|
24
24
|
"""Get APKPatcher home directory."""
|
25
|
-
return Path.home() / ".
|
25
|
+
return Path.home() / ".apk-patchx"
|
26
26
|
|
27
27
|
|
28
28
|
def run_command(cmd, capture_output: bool = False, text: bool = True, **kwargs):
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: apk-patchx
|
3
|
-
Version: 7.9.2025.
|
3
|
+
Version: 7.9.2025.2
|
4
4
|
Summary: Android APK manipulation toolkit with Frida gadget injection support
|
5
5
|
Keywords: android,apk,reverse-engineering,frida,patching
|
6
6
|
Author: APKPatcher Contributors
|
@@ -31,7 +31,7 @@ Project-URL: Homepage, https://github.com/kaifcodec/apk-patchx
|
|
31
31
|
Project-URL: Issues, https://github.com/kaifcodec/apk-patchx/issues
|
32
32
|
Project-URL: Repository, https://github.com/kaifcodec/apk-patchx.git
|
33
33
|
|
34
|
-
#
|
34
|
+
# APK-Patchx
|
35
35
|
|
36
36
|
A powerful command-line tool for Android APK manipulation, including Frida gadget injection, APK decoding/building, and package management.
|
37
37
|
|
@@ -46,39 +46,39 @@ A powerful command-line tool for Android APK manipulation, including Frida gadge
|
|
46
46
|
## Installation
|
47
47
|
|
48
48
|
```bash
|
49
|
-
pip install
|
49
|
+
pip install apk-patchx
|
50
50
|
```
|
51
51
|
|
52
52
|
## Usage
|
53
53
|
|
54
54
|
### Pull APK from device
|
55
55
|
```bash
|
56
|
-
|
56
|
+
apk-patchx pull com.example.app
|
57
57
|
```
|
58
58
|
|
59
59
|
### Decode APK
|
60
60
|
```bash
|
61
|
-
|
61
|
+
apk-patchx decode app.apk
|
62
62
|
```
|
63
63
|
|
64
64
|
### Build APK from source
|
65
65
|
```bash
|
66
|
-
|
66
|
+
apk-patchx build app_src/
|
67
67
|
```
|
68
68
|
|
69
69
|
### Patch APK with Frida gadget
|
70
70
|
```bash
|
71
|
-
|
71
|
+
apk-patchx patch app.apk --arch arm64
|
72
72
|
```
|
73
73
|
|
74
74
|
### Rename APK package
|
75
75
|
```bash
|
76
|
-
|
76
|
+
apk-patchx rename app.apk com.newpackage.name
|
77
77
|
```
|
78
78
|
|
79
79
|
### Sign APK
|
80
80
|
```bash
|
81
|
-
|
81
|
+
apk-patchx sign app.apk
|
82
82
|
```
|
83
83
|
|
84
84
|
## Architecture Support
|
@@ -96,7 +96,7 @@ apkpatcher sign app.apk
|
|
96
96
|
|
97
97
|
## Tool Management
|
98
98
|
|
99
|
-
|
99
|
+
APK-Patchx automatically downloads and manages required tools in `~/.apk-patchx/tools/`:
|
100
100
|
|
101
101
|
- apktool
|
102
102
|
- Android SDK build-tools
|
@@ -0,0 +1,22 @@
|
|
1
|
+
apk_patchx/__init__.py,sha256=Tl9ayKdWxawLU-SwIXXcAy31iWz0UrcxYyZtD_UrZfM,345
|
2
|
+
apk_patchx/cli.py,sha256=VPBnG6luNIMv-My4wcBPqmECznqAVsDZuZNgNvGhHoI,9654
|
3
|
+
apk_patchx/exceptions.py,sha256=15lNGnf_3YBLP4IFUdIZgEJxvvbAA7DMETunwtx8Eik,790
|
4
|
+
apk_patchx/services/__init__.py,sha256=uhE0HQWrx7w01_mCfDFpksSie3s5fjkF5GL1sbvkN_o,38
|
5
|
+
apk_patchx/services/adb.py,sha256=ODMtBDZXUtXylICRD98-hWK2y6N9HJr7l4xErHo4htE,3550
|
6
|
+
apk_patchx/services/android_sdk.py,sha256=76ZhPHmKmYS0C9EG23voFelpjhkTzyQGcx-Ul2AhGHU,4874
|
7
|
+
apk_patchx/services/apktool.py,sha256=UAm0SlYu-7kgHyvzZUtjraw9W74rgN8k-yFZWlg3cbk,5211
|
8
|
+
apk_patchx/services/frida.py,sha256=S79rHrJDx45dTO0-JMP5M0-3QJ1BUKpqkrN9oUIpNMo,11718
|
9
|
+
apk_patchx/services/patch_dex.py,sha256=b3ALX8wajMVtvKpFoj8oETWUls0AEURI6BjLoQlMfxE,3890
|
10
|
+
apk_patchx/services/patch_smali.py,sha256=OkdPtvin5cE0_IvHf4EmatIXRuVuXznSemyRMXSJ3m8,4548
|
11
|
+
apk_patchx/services/signing.py,sha256=c1PVnRfWYbOOA7K3bw_IRjwEJcuE8bwZ3ct-eZJKWYY,3484
|
12
|
+
apk_patchx/services/split_merge.py,sha256=7azCN3aEn8P0vfCFKnlmPuTmMwO15JAneD2SFp4CHSc,5429
|
13
|
+
apk_patchx/utils/__init__.py,sha256=0e3XbwXHMW2osRDxWbvsM_OzJN2tg-6tGCK5zMeTGTw,39
|
14
|
+
apk_patchx/utils/core.py,sha256=Rk_zgWcKEWoV57Nzk9iSXZxt0kg_04aRPtxqe9mySgE,2400
|
15
|
+
apk_patchx/utils/manifest.py,sha256=BTUeDUgtzHsfgGSr01-GgloTU9YhANU7M2CyGFNpIiw,4833
|
16
|
+
apk_patchx/utils/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
17
|
+
apk_patchx/utils/versions.py,sha256=mR8Tm6YceqgqioSA80fqO1_GJvNoBcBU9wEzRlIP18w,1762
|
18
|
+
apk_patchx-7.9.2025.2.dist-info/entry_points.txt,sha256=kIhrN6o-ANMa1-Wa5zXmDeMk2_FcDByHgh7UGmXMjCg,50
|
19
|
+
apk_patchx-7.9.2025.2.dist-info/licenses/LICENSE,sha256=DJU-he8Ob3g_K6vuP4KBzG0nYLQtepaQwgOIq_hI8Is,1080
|
20
|
+
apk_patchx-7.9.2025.2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
21
|
+
apk_patchx-7.9.2025.2.dist-info/METADATA,sha256=YL_GBX2yfLRqCp87VVQbS689lhxsMqH2zseh2D4xsuA,2793
|
22
|
+
apk_patchx-7.9.2025.2.dist-info/RECORD,,
|
@@ -1,22 +0,0 @@
|
|
1
|
-
apk_patchx/__init__.py,sha256=m10S0nYjOv4ckmaPbZbXKR_LM1MJ8VJsGRer3TqrU2c,345
|
2
|
-
apk_patchx/cli.py,sha256=Wtol0GEYGcGWe1Bj93vcutBnfguLS3uVpptFlbgoxb4,9654
|
3
|
-
apk_patchx/exceptions.py,sha256=15lNGnf_3YBLP4IFUdIZgEJxvvbAA7DMETunwtx8Eik,790
|
4
|
-
apk_patchx/services/__init__.py,sha256=uhE0HQWrx7w01_mCfDFpksSie3s5fjkF5GL1sbvkN_o,38
|
5
|
-
apk_patchx/services/adb.py,sha256=qI1dFf09U8x-m9C_sxVqMWl8hdPcbI7BtKASge4-7AM,3550
|
6
|
-
apk_patchx/services/android_sdk.py,sha256=N9fk3inVGB6xU2JNY3jXMX5N1z3Ji1ZKHG7hxhpbp4s,4874
|
7
|
-
apk_patchx/services/apktool.py,sha256=TlJC8ck9w85ZU4GFxT9nVAEO-2c5f9xBI8H7dXov7OA,5211
|
8
|
-
apk_patchx/services/frida.py,sha256=SA2OCmVJT2OMT2XrrLDHf2alLkfLe8OdTrOYLZAo7yY,11718
|
9
|
-
apk_patchx/services/patch_dex.py,sha256=CyopPW14rhq_357WP_0CjpLX-4pNc04I0hOkMbavDfc,3890
|
10
|
-
apk_patchx/services/patch_smali.py,sha256=OkdPtvin5cE0_IvHf4EmatIXRuVuXznSemyRMXSJ3m8,4548
|
11
|
-
apk_patchx/services/signing.py,sha256=GwT6mFyJdv0QJTpnUgsJ5tH_JBnqU3vW0Uu242UAQKg,3484
|
12
|
-
apk_patchx/services/split_merge.py,sha256=7azCN3aEn8P0vfCFKnlmPuTmMwO15JAneD2SFp4CHSc,5429
|
13
|
-
apk_patchx/utils/__init__.py,sha256=0e3XbwXHMW2osRDxWbvsM_OzJN2tg-6tGCK5zMeTGTw,39
|
14
|
-
apk_patchx/utils/core.py,sha256=SsBzNWSC50388MTvTq4vNGbG1VRba8BpdE24Hg_Syhk,2400
|
15
|
-
apk_patchx/utils/manifest.py,sha256=BTUeDUgtzHsfgGSr01-GgloTU9YhANU7M2CyGFNpIiw,4833
|
16
|
-
apk_patchx/utils/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
17
|
-
apk_patchx/utils/versions.py,sha256=mR8Tm6YceqgqioSA80fqO1_GJvNoBcBU9wEzRlIP18w,1762
|
18
|
-
apk_patchx-7.9.2025.1.dist-info/entry_points.txt,sha256=kIhrN6o-ANMa1-Wa5zXmDeMk2_FcDByHgh7UGmXMjCg,50
|
19
|
-
apk_patchx-7.9.2025.1.dist-info/licenses/LICENSE,sha256=DJU-he8Ob3g_K6vuP4KBzG0nYLQtepaQwgOIq_hI8Is,1080
|
20
|
-
apk_patchx-7.9.2025.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
21
|
-
apk_patchx-7.9.2025.1.dist-info/METADATA,sha256=KPNnnLQN8q5V9eNNO61sRRYi8T7WSqkan_FEzLrQ0b8,2793
|
22
|
-
apk_patchx-7.9.2025.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|