Compare commits
352 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 10a1dfed68 | |||
| 2687452ee7 | |||
| 5a8e485923 | |||
| 5d9d4e21d0 | |||
| fd7398667e | |||
| 59ef98b315 | |||
| 351c7887c4 | |||
| 183c0e584c | |||
| 725197f615 | |||
| cc27270d98 | |||
| 3e5a81dabf | |||
| 197379e3cf | |||
| 2b6502a5f7 | |||
| 8f72cf9dee | |||
| 79e8cd2ef9 | |||
| 5be8c9623a | |||
| 08fb90285c | |||
| e0e99c862f | |||
| cfb094a275 | |||
| ca58db1975 | |||
| afe2b917f9 | |||
| 5e6eee2f5e | |||
| eb39b5bf69 | |||
| 8230d8239d | |||
| 824aadbce1 | |||
| e12fc939b9 | |||
| 0b043a4a3b | |||
| f974e198d5 | |||
| 8c43f59bd1 | |||
| bd1dcf6f64 | |||
| e0018909dc | |||
| 580c49b59c | |||
| 328736bbab | |||
| a294aa5a40 | |||
| 17289ff3f3 | |||
| 4471de12d5 | |||
| 469ccb6c9c | |||
| bfd2f41c88 | |||
| 6cda22c47e | |||
| 73dbd422a8 | |||
| 6411889613 | |||
| 210390718c | |||
| 5704df951e | |||
| 9e73936f6d | |||
| ddd24ecbd6 | |||
| e50b8a8658 | |||
| 5f242bca2f | |||
| e2784ce65e | |||
| 93fc85fc33 | |||
| 4c389d58fb | |||
| 63e08f4f77 | |||
| 556d01ed74 | |||
| eb670e7cd5 | |||
| 584df30992 | |||
| e89522cfcb | |||
| 9ffedd3cbf | |||
| 7228e182cc | |||
| ecce2c8e18 | |||
| 5f83b05335 | |||
| aa0f62bd58 | |||
| 13420455c7 | |||
| 3b90881083 | |||
| be7ed3a533 | |||
| 4ed20cf3de | |||
| aca3de41b7 | |||
| a5497c56da | |||
| 4d2a745b11 | |||
| b25fd6451b | |||
| 19bd457b65 | |||
| 3e1fc75808 | |||
| 846ef4f5f1 | |||
| d87d8af361 | |||
| 9d31e8c2c8 | |||
| ecd8b45846 | |||
| 8834cbcec2 | |||
| 1ecbb13692 | |||
| 8084d5288b | |||
| 41f3663d4a | |||
| add093dd6e | |||
| cb69d6b541 | |||
| e4a8886af6 | |||
| 7b32dade20 | |||
| 3401402bd6 | |||
| a7480e5bdf | |||
| 95a69334c3 | |||
| 82bee17ca7 | |||
| 61aee3cdcf | |||
| 282a6ba6c0 | |||
| 9ab8ad0013 | |||
| 5953e2feef | |||
| 0f7caefaab | |||
| 48b6736ccf | |||
| f2329a4b57 | |||
| 456b971183 | |||
| 3417aedbe0 | |||
| 6e3bb9a6dd | |||
| 26763b0cfa | |||
| ca05365c16 | |||
| 7581a5c45c | |||
| 7e7de5f653 | |||
| 7ccbac83b2 | |||
| af96daca95 | |||
| 208d14cb9b | |||
| d4fcd90024 | |||
| bcc597ac0a | |||
| 674fc210f5 | |||
| aa5d017c74 | |||
| 012b6f3c07 | |||
| c8bfc38fac | |||
| 6a0e01937a | |||
| 542bc64b80 | |||
| e47ce35b5c | |||
| 7c3280a2ad | |||
| d32a068e9a | |||
| 90f8ba18f3 | |||
| 39219eaf65 | |||
| 9675fa6d85 | |||
| 67a0bb877d | |||
| d8d1c50f00 | |||
| 608dd37522 | |||
| d2f8e42664 | |||
| 6cf1931bbc | |||
| 67667784fd | |||
| 0df16541d4 | |||
| e141b886ef | |||
| 9e00fd2d75 | |||
| a841fe0ce5 | |||
| d7edc9ced2 | |||
| f9cad819b6 | |||
| 02a48151c2 | |||
| 8fddb8d760 | |||
| 0e18c8194c | |||
| aa1078660a | |||
| 33749af569 | |||
| c431d2e90c | |||
| 2dfac5d667 | |||
| de6588a148 | |||
| 05cbb3cb4b | |||
| de415e8232 | |||
| cfec6c9a81 | |||
| 28f15a41ac | |||
| 8513ab4788 | |||
| e4f9e5da21 | |||
| b191d547d0 | |||
| 1d764709f2 | |||
| 7ccf7da0f3 | |||
| 2bed8a468b | |||
| 6d4dc8396d | |||
| 67672a8871 | |||
| e7b942f09b | |||
| f71bd165a8 | |||
| 984735d9a2 | |||
| 3e7ebe157e | |||
| e42e2f3897 | |||
| ae8106d967 | |||
| 462447de6c | |||
| 67a4b79efc | |||
| ba418f7427 | |||
| f28fa25001 | |||
| db8be4b428 | |||
| 7cea4c2959 | |||
| 7def211556 | |||
| 9e81f5b791 | |||
| ec6fd42592 | |||
| 07e4026aba | |||
| 1072739a97 | |||
| de4f176cf7 | |||
| 75e05668ab | |||
| c897d959a3 | |||
| 58314b84e0 | |||
| 906b2ea6d6 | |||
| 926ba9e1e6 | |||
| efc7ec1539 | |||
| 2ab52ee4a3 | |||
| 7bc8fb1d80 | |||
| d4b21606b6 | |||
| 71b18764d4 | |||
| e408c422de | |||
| fa9c063968 | |||
| e1509bc235 | |||
| da7685c40e | |||
| afa73115bc | |||
| 6ef981bd25 | |||
| 353467c461 | |||
| c6184f4eed | |||
| 4a47d23b77 | |||
| c2233ac843 | |||
| a5e3ea133c | |||
| 68f27e1231 | |||
| 2a5312628f | |||
| a5c80a2c73 | |||
| ae20b2167c | |||
| 5e8051b86a | |||
| 08bc04a9b0 | |||
| 9f89c5bab0 | |||
| dfee2d8c93 | |||
| 5eb9b3ba9f | |||
| b8615ec982 | |||
| 926ab509d0 | |||
| 1edcb5b836 | |||
| 165155407d | |||
| 3d02b40128 | |||
| e4559a45b7 | |||
| 91bb1c8838 | |||
| 745863555a | |||
| 684fb02074 | |||
| 2a0f4cd90a | |||
| 83fb485c26 | |||
| ee0fa89598 | |||
| ab629c24f3 | |||
| a45b671961 | |||
| 7725d3c28c | |||
| 041a70daa4 | |||
| 6a00b05eb4 | |||
| 9a66346312 | |||
| cff11abfb3 | |||
| 3ba67d54dd | |||
| 835037d137 | |||
| d1c583e5df | |||
| 3f20b9c9ca | |||
| 37c71f0d57 | |||
| a193ababbc | |||
| b89e192fe5 | |||
| fb896c07d0 | |||
| 91ac7c6c47 | |||
| e965173b14 | |||
| 99378f935e | |||
| b7f208aaff | |||
| 3e696f0da6 | |||
| 3440e4748f | |||
| 2fbc34af87 | |||
| 74ceb1267d | |||
| 18f0d94f47 | |||
| e81e7de8fe | |||
| ee39be3fcc | |||
| 0c0b27c1a0 | |||
| d6f4f3743b | |||
| ddc3df3fec | |||
| 4a63101537 | |||
| ff76f936b1 | |||
| 92f7de3e7f | |||
| ef6ebdbab4 | |||
| 285df8e366 | |||
| 6fede45027 | |||
| 55d2f4a59c | |||
| a436a90c33 | |||
| 2a1170bbfa | |||
| e92b0f780b | |||
| 7b0a5768ac | |||
| 605633331c | |||
| c123c98954 | |||
| 47a776ee66 | |||
| 45bf85bd1b | |||
| 94c586b92f | |||
| 36e0b6240f | |||
| 5bc620271d | |||
| 957696e5b3 | |||
| e69a8f2b72 | |||
| 713378275d | |||
| 1841712c10 | |||
| bb24c0b7b9 | |||
| 094ffbfa57 | |||
| b9eaa4b4b5 | |||
| dd7b84b86b | |||
| 7965234e4e | |||
| 636b093943 | |||
| 8fcceaba36 | |||
| 1880b592f4 | |||
| 8b4717c4b9 | |||
| 056f912e40 | |||
| 1b068f0dbe | |||
| 87b621f8c7 | |||
| deacb7c05f | |||
| 9be1957e9d | |||
| 152ef2e855 | |||
| 026c9145b1 | |||
| 06c222af58 | |||
| 1d250a2dc8 | |||
| 55633e1505 | |||
| 9661e72d6b | |||
| 4408a0d06d | |||
| 8671f87a1a | |||
| 011b46fbc2 | |||
| 63a0a0e028 | |||
| 34270f6236 | |||
| 3a36a79fce | |||
| 2698917d02 | |||
| 974d36c847 | |||
| e0317eb19d | |||
| 4831f51f30 | |||
| 70914c70e2 | |||
| 4f2f98d2f9 | |||
| efefda1104 | |||
| dfb99358dc | |||
| 2e2420bd91 | |||
| 2d1072d511 | |||
| 724bc5f60a | |||
| f18e5b3031 | |||
| 98e4efce0f | |||
| e6dbba208c | |||
| 7accee6cc1 | |||
| 0e7e911cc4 | |||
| 083122d0eb | |||
| 6e3dfdb0f3 | |||
| a4adc2a23c | |||
| c37b71a362 | |||
| 88e9d504c5 | |||
| f2b711e675 | |||
| c360808e36 | |||
| b9febf125c | |||
| 57dd8a798b | |||
| b7e3e3d1f0 | |||
| a49c7e7538 | |||
| d35abe0f9a | |||
| 9454e2ac0e | |||
| d012b58bf9 | |||
| 945afaa509 | |||
| 7c78e39c75 | |||
| 6023bad531 | |||
| 79f21cfe42 | |||
| 28f11f1870 | |||
| ed978d1994 | |||
| 7a00679d5d | |||
| d17ac508f0 | |||
| 60c96318b0 | |||
| e93d4dfac8 | |||
| e7ffba97d1 | |||
| 3cdbb108bc | |||
| 65a5802782 | |||
| 89a973a41e | |||
| 6433fc54c2 | |||
| 480edd3e59 | |||
| b471d96fa0 | |||
| 0c957b21a8 | |||
| fb699cbfe8 | |||
| 903cc5af42 | |||
| 172b15a8d0 | |||
| b9241c02a5 | |||
| 986d6e180e | |||
| ced4f9888f | |||
| 3f105d026b | |||
| 0acfd3f73e | |||
| 884b75b371 | |||
| 0247010ae2 | |||
| 53ad4af6e4 | |||
| 6dc216ee0d | |||
| 1a1746af47 | |||
| 41809f1892 | |||
| e1afd0c7ac | |||
| 9f5ea243e6 | |||
| eec15ff17e | |||
| 8e917167f3 |
@@ -0,0 +1,92 @@
|
||||
name: Bug report
|
||||
description: Report a bug in APK Tool GUI
|
||||
labels: bug
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Prerequisites
|
||||
description: To rule out invalid issues, confirm and check each one of the checkboxes.
|
||||
options:
|
||||
- label: This is not a support issue or a question. For support, questions, or help, see [support links](https://github.com/AndnixSH/APKToolGUI/issues/new/choose).
|
||||
required: true
|
||||
- label: I performed a cursory search of the issue tracker on [APK Tool GUI](https://github.com/AndnixSH/APKToolGUI/issues?q=is%3Aissue) to avoid opening a duplicate issue
|
||||
required: true
|
||||
- label: I am running the latest version of [APK Tool GUI](https://github.com/AndnixSH/APKToolGUI/releases).
|
||||
required: true
|
||||
- label: I have read the [FAQ](https://github.com/AndnixSH/APKToolGUI#faq)
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Describe the bug
|
||||
description: |
|
||||
A clear and concise description of what the bug is.
|
||||
Feel free to upload/attach link to screenshot or video
|
||||
Only place logs in 'Logs' box
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: To Reproduce
|
||||
description: Steps to reproduce the behavior
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Logs
|
||||
description: Please surround the logs with 3 backticks (```) to format it properly
|
||||
placeholder: |
|
||||
Copy and paste the logs here
|
||||
|
||||
This is an example how you should surround the logs with 3 backticks (```)
|
||||
```
|
||||
[12:50:54]java version "19.0.2" 2023-01-17
|
||||
Java(TM) SE Runtime Environment (build 19.0.2+7-44)
|
||||
Java HotSpot(TM) 64-Bit Server VM (build 19.0.2+7-44, mixed mode, sharing)
|
||||
[12:50:55] Apktool version "2.7.0"
|
||||
[12:50:55] Drag & drop is supported
|
||||
[12:50:55] Temp directory: "D:\Temp\ATG\xeaMO"
|
||||
[12:50:55] Parsing APK Info...
|
||||
[12:50:55] Done
|
||||
[12:50:55] Getting devices...
|
||||
[12:50:57] No devices found. Make sure your device is connected to the computer with the adb debugging turned on. If you use an emulator, restart it and wait until it boot up
|
||||
```
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: APK
|
||||
description: If this APK can be freely shared, please upload/attach a link to it. Please warn with "NSFW" where applicable, if the APK or the link contains adult content
|
||||
placeholder: |
|
||||
https://apkcombo.com/downloader/
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: APK Tool GUI version
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Apktool version
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Java version
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Operating system and version
|
||||
placeholder: |
|
||||
(Example: Windows 11 2h22)
|
||||
validations:
|
||||
required: true
|
||||
@@ -0,0 +1,17 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Apktool Issues List
|
||||
url: https://github.com/iBotPeaches/Apktool/issues?q=is%3Aissue
|
||||
about: Check Apktool issues before reporting issue here. Your issue might already exists
|
||||
- name: Apktool forum
|
||||
url: https://github.com/iBotPeaches/Apktool/discussions
|
||||
about: For support, questions or help with Apktool, development and modding
|
||||
- name: Smali Issues List
|
||||
url: https://github.com/JesusFreke/smali/issues?q=is%3Aissue
|
||||
about: Check Baksmali issues before reporting issue here. Your issue might already exists
|
||||
- name: Smali Issues List 2
|
||||
url: https://github.com/google/smali/issues?q=is%3Aissue
|
||||
about: Check Baksmali issues before reporting issue here. Your issue might already exists
|
||||
- name: Android development and modding support forum
|
||||
url: https://forum.xda-developers.com/c/android-development-and-hacking.564/
|
||||
about: For support, questions or help with development and modding'
|
||||
@@ -0,0 +1,23 @@
|
||||
name: Feature request
|
||||
description: Request a feature for APK Tool GUI
|
||||
labels: enhancement
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Prerequisites
|
||||
description: To rule out invalid issues, confirm and check each one of the checkboxes.
|
||||
options:
|
||||
- label: This is not a support issue or a question. For support, questions, or help, see [support links](https://github.com/AndnixSH/APKToolGUI/issues/new/choose).
|
||||
required: true
|
||||
- label: I performed a cursory search of the issue tracker on [APK Tool GUI](https://github.com/AndnixSH/APKToolGUI/issues?q=is%3Aissue) to avoid opening a duplicate issue
|
||||
required: true
|
||||
- label: I have read the [FAQ](https://github.com/AndnixSH/APKToolGUI#faq)
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Describe the feature you'd like
|
||||
description: A clear and concise description of what you want to happen. Not all features will be accepted
|
||||
validations:
|
||||
required: true
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
name: Language suggestion/error
|
||||
description: Suggest a change or report an error of language. Use this form if you can't pull request
|
||||
labels: language
|
||||
body:
|
||||
- type: input
|
||||
attributes:
|
||||
label: Language
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Description
|
||||
description: A clear and concise description of what you want to be changed. You can upload/paste screenshots here. For full translation, please upload zip file of translated files or full project
|
||||
validations:
|
||||
required: true
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "master" ]
|
||||
pull_request:
|
||||
branches: [ "master" ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
name: Checkout Code
|
||||
|
||||
- name: Setup MSBuild Path
|
||||
uses: microsoft/setup-msbuild@v1.3.1
|
||||
|
||||
- name: Setup NuGet
|
||||
uses: NuGet/setup-nuget@v2
|
||||
|
||||
- name: Restore NuGet Packages
|
||||
run: nuget restore APKToolGUI.sln
|
||||
|
||||
- name: Build Application
|
||||
run: msbuild APKToolGUI.sln /p:Configuration=Release
|
||||
|
||||
- name: Create package directory
|
||||
run: mkdir package
|
||||
|
||||
- name: Copy essential files to package
|
||||
shell: pwsh
|
||||
run: |
|
||||
Copy-Item APKToolGUI/bin/Release/APKToolGUI.exe package/
|
||||
Copy-Item changelog.txt package/Changelog.txt
|
||||
|
||||
if (Test-Path APKToolGUI/bin/Release/Resources) {
|
||||
Copy-Item APKToolGUI/bin/Release/Resources package/ -Recurse
|
||||
}
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: APKToolGUI
|
||||
path: package/
|
||||
@@ -1,13 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="..\packages\Costura.Fody.6.0.0\build\Costura.Fody.props" Condition="Exists('..\packages\Costura.Fody.6.0.0\build\Costura.Fody.props')" />
|
||||
<Import Project="..\packages\Resource.Embedder.2.2.0\build\Resource.Embedder.props" Condition="Exists('..\packages\Resource.Embedder.2.2.0\build\Resource.Embedder.props')" />
|
||||
<Import Project="..\packages\Costura.Fody.5.7.0\build\Costura.Fody.props" Condition="Exists('..\packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{AA2C8BC1-ED99-463A-9363-F6A87FB2CF38}</ProjectGuid>
|
||||
<!-- WPF project type GUID first, then C#. Enables XAML markup compilation
|
||||
(via Microsoft.WinFX.targets) alongside the existing WinForms UI during
|
||||
the staged WinForms->WPF conversion. -->
|
||||
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>APKToolGUI</RootNamespace>
|
||||
@@ -45,7 +49,7 @@
|
||||
<DebugSymbols>false</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>D:\Portable Apps\APK Tool GUI\</OutputPath>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
@@ -56,7 +60,7 @@
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>none</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>D:\Portable Apps\APK Tool GUI\</OutputPath>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
@@ -77,11 +81,12 @@
|
||||
<PropertyGroup />
|
||||
<PropertyGroup />
|
||||
<ItemGroup>
|
||||
<Reference Include="Costura, Version=5.7.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll</HintPath>
|
||||
<Reference Include="Costura, Version=6.0.0.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Costura.Fody.6.0.0\lib\netstandard2.0\Costura.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="DotNetZip, Version=1.16.0.0, Culture=neutral, PublicKeyToken=6583c7c814667745, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\DotNetZip.1.16.0\lib\net40\DotNetZip.dll</HintPath>
|
||||
<Reference Include="CustomMarshalers" />
|
||||
<Reference Include="Microsoft.Bcl.HashCode, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Microsoft.Bcl.HashCode.6.0.0\lib\net462\Microsoft.Bcl.HashCode.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Build.Framework" />
|
||||
<Reference Include="Microsoft.Build.Utilities.v4.0" />
|
||||
@@ -91,14 +96,28 @@
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.WindowsAPICodePack, Version=1.1.5.0, Culture=neutral, PublicKeyToken=8985beaab7ea3f04, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Microsoft-WindowsAPICodePack-Core.1.1.5\lib\net48\Microsoft.WindowsAPICodePack.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.WindowsAPICodePack.Shell, Version=1.1.5.0, Culture=neutral, PublicKeyToken=8985beaab7ea3f04, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Microsoft-WindowsAPICodePack-Shell.1.1.5\lib\net48\Microsoft.WindowsAPICodePack.Shell.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Ookii.Dialogs.WinForms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=66aa232afad40158, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Ookii.Dialogs.WinForms.4.0.0\lib\net462\Ookii.Dialogs.WinForms.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="PortableSettingsProvider, Version=0.2.4.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\PortableSettingsProvider.0.2.4\lib\net45\PortableSettingsProvider.dll</HintPath>
|
||||
<Reference Include="OSVersionExt, Version=3.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\OSVersionExt.3.0.0\lib\net462\OSVersionExt.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="ResourceLoader, Version=3.2.4.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\ResourceLoader.3.2.4\lib\netstandard2.0\ResourceLoader.dll</HintPath>
|
||||
<Reference Include="PortableSettingsProvider, Version=0.2.5.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\PortableSettingsProvider.0.2.5\lib\net45\PortableSettingsProvider.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
<Reference Include="ProDotNetZip, Version=1.20.0.0, Culture=neutral, PublicKeyToken=6583c7c814667745, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\ProDotNetZip.1.20.0\lib\netstandard2.0\ProDotNetZip.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="ResourceLoader, Version=3.3.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\ResourceLoader.3.3.1\lib\netstandard2.0\ResourceLoader.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.AppContext, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
@@ -106,8 +125,11 @@
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
|
||||
<Reference Include="System.Buffers, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Buffers.4.6.1\lib\net462\System.Buffers.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Collections.Immutable, Version=9.0.0.10, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Collections.Immutable.9.0.10\lib\net462\System.Collections.Immutable.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.ComponentModel.Composition" />
|
||||
<Reference Include="System.configuration" />
|
||||
@@ -117,15 +139,20 @@
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Data.OracleClient" />
|
||||
<Reference Include="System.Design" />
|
||||
<Reference Include="System.Diagnostics.DiagnosticSource, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.6.0.0\lib\net461\System.Diagnostics.DiagnosticSource.dll</HintPath>
|
||||
<Reference Include="System.Diagnostics.DiagnosticSource, Version=9.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.9.0.10\lib\net462\System.Diagnostics.DiagnosticSource.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Diagnostics.Tracing, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Diagnostics.Tracing.4.3.0\lib\net462\System.Diagnostics.Tracing.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.DirectoryServices" />
|
||||
<Reference Include="System.Formats.Nrbf, Version=9.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Formats.Nrbf.9.0.10\lib\net462\System.Formats.Nrbf.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Globalization.Calendars, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
@@ -136,17 +163,7 @@
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.IO.Compression, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.IO.Compression.FileSystem" />
|
||||
<Reference Include="System.IO.Compression.ZipFile, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.IO.FileSystem, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
@@ -167,9 +184,11 @@
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
|
||||
<Reference Include="System.Management" />
|
||||
<Reference Include="System.Memory, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Memory.4.6.3\lib\net462\System.Memory.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net" />
|
||||
<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
@@ -181,24 +200,27 @@
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Numerics" />
|
||||
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
|
||||
<Reference Include="System.Numerics.Vectors, Version=4.1.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Numerics.Vectors.4.6.1\lib\net462\System.Numerics.Vectors.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Reflection, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Reflection.4.3.0\lib\net462\System.Reflection.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Resources.Extensions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Resources.Extensions.6.0.0\lib\net461\System.Resources.Extensions.dll</HintPath>
|
||||
<Reference Include="System.Reflection.Metadata, Version=9.0.0.10, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Reflection.Metadata.9.0.10\lib\net462\System.Reflection.Metadata.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Resources.Extensions, Version=9.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Resources.Extensions.9.0.10\lib\net462\System.Resources.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime, Version=4.1.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.4.3.1\lib\net462\System.Runtime.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.Extensions, Version=4.1.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.Extensions.4.3.1\lib\net462\System.Runtime.Extensions.dll</HintPath>
|
||||
@@ -216,6 +238,9 @@
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Security" />
|
||||
<Reference Include="System.Security.AccessControl, Version=6.0.0.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Security.AccessControl.6.0.1\lib\net461\System.Security.AccessControl.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
@@ -236,11 +261,23 @@
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Security.Permissions, Version=9.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Security.Permissions.9.0.10\lib\net462\System.Security.Permissions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Security.Principal.Windows, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Security.Principal.Windows.5.0.0\lib\net461\System.Security.Principal.Windows.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.ServiceProcess" />
|
||||
<Reference Include="System.Text.Encoding.CodePages, Version=9.0.0.10, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Text.Encoding.CodePages.9.0.10\lib\net462\System.Text.Encoding.CodePages.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Text.RegularExpressions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Text.RegularExpressions.4.3.1\lib\net463\System.Text.RegularExpressions.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Transactions" />
|
||||
<Reference Include="System.Xaml" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Data" />
|
||||
@@ -253,13 +290,20 @@
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="WindowsBase" />
|
||||
<Reference Include="WindowsFormsIntegration" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="TaskBar\TaskBarJumpList.cs" />
|
||||
<Compile Include="Utils\Log.cs" />
|
||||
<Compile Include="ApkTool\AaptParser.cs" />
|
||||
<Compile Include="ApkTool\ApkFixer.cs" />
|
||||
<Compile Include="ApkTool\Apktool.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ApkTool\ApkEditor.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ApkTool\Smali.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
@@ -269,43 +313,52 @@
|
||||
<Compile Include="ApkTool\Signapk.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ApkTool\Adb.cs" />
|
||||
<Compile Include="ApkTool\Zipalign.cs" />
|
||||
<Compile Include="Handlers\BaksmaliControlEventHandlers.cs" />
|
||||
<Compile Include="Handlers\BuildControlEventHandlers.cs" />
|
||||
<Compile Include="Handlers\DecodeControlEventHandlers.cs" />
|
||||
<Compile Include="Handlers\DragDropHandlers.cs" />
|
||||
<Compile Include="Handlers\FrameworkControlEventHandlers.cs" />
|
||||
<Compile Include="Handlers\SignControlEventHandlers.cs" />
|
||||
<Compile Include="Handlers\SmaliControlEventHandlers.cs" />
|
||||
<Compile Include="Handlers\ZipalignControlEventHandlers.cs" />
|
||||
<Compile Include="Controls\NativeDarkMode.cs" />
|
||||
<Compile Include="Controls\WpfTheme.cs" />
|
||||
<Compile Include="Controls\NumericUpDown.cs" />
|
||||
<Compile Include="Controls\LogView.cs" />
|
||||
<Compile Include="Utils\AdminUtils.cs" />
|
||||
<Compile Include="Utils\ApkIconExtractor.cs" />
|
||||
<Compile Include="Utils\BitmapUtils.cs" />
|
||||
<Compile Include="Utils\CMD.cs" />
|
||||
<Compile Include="Utils\CommonUtils.cs" />
|
||||
<Compile Include="Utils\DirectoryUtils.cs" />
|
||||
<Compile Include="Utils\DragDropUtils.cs" />
|
||||
<Compile Include="Utils\ExplorerContextMenu.cs" />
|
||||
<Compile Include="Forms\FormAboutBox.cs">
|
||||
<SubType>Form</SubType>
|
||||
<Page Include="Forms\AboutWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Compile Include="Forms\AboutWindow.xaml.cs">
|
||||
<DependentUpon>AboutWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\FormAboutBox.Designer.cs">
|
||||
<DependentUpon>FormAboutBox.cs</DependentUpon>
|
||||
<Page Include="Forms\SettingsWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Compile Include="Forms\SettingsWindow.xaml.cs">
|
||||
<DependentUpon>SettingsWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\FormMain.cs">
|
||||
<SubType>Form</SubType>
|
||||
<Page Include="Forms\MainWindow.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Compile Include="Forms\MainWindow.xaml.cs">
|
||||
<DependentUpon>MainWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\FormMain.Designer.cs">
|
||||
<DependentUpon>FormMain.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\FormSettings.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Forms\FormSettings.Designer.cs">
|
||||
<DependentUpon>FormSettings.cs</DependentUpon>
|
||||
<Compile Include="Forms\MainWindow.Logic.cs">
|
||||
<DependentUpon>MainWindow.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Page Include="Themes\Controls.xaml">
|
||||
<Generator>MSBuild:Compile</Generator>
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Compile Include="Java\JarProcess.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Java\JavaUtils.cs" />
|
||||
<Compile Include="Utils\FileUtils.cs" />
|
||||
<Compile Include="Utils\PathUtils.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
@@ -314,31 +367,20 @@
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Language.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Utils\ProcessUtils.cs" />
|
||||
<Compile Include="Utils\StringExt.cs" />
|
||||
<Compile Include="Web\UpdateChecker.cs" />
|
||||
<Compile Include="Utils\ZipUtils.cs" />
|
||||
<Compile Include="Web\WebDownload.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<EmbeddedResource Include="Forms\FormAboutBox.resx">
|
||||
<DependentUpon>FormAboutBox.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\FormAboutBox.ru.resx">
|
||||
<DependentUpon>FormAboutBox.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\FormMain.resx">
|
||||
<DependentUpon>FormMain.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\FormMain.ru.resx">
|
||||
<DependentUpon>FormMain.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\FormSettings.resx">
|
||||
<DependentUpon>FormSettings.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\FormSettings.ru.resx">
|
||||
<DependentUpon>FormSettings.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Languages\Language.de.resx" />
|
||||
<EmbeddedResource Include="Languages\Language.hu.resx" />
|
||||
<EmbeddedResource Include="Languages\Language.pt-BR.resx" />
|
||||
<EmbeddedResource Include="Languages\Language.ru.resx" />
|
||||
<EmbeddedResource Include="Languages\Language.tr.resx" />
|
||||
<EmbeddedResource Include="Languages\Language.zh-CN.resx" />
|
||||
<EmbeddedResource Include="Languages\Language.vi-VN.resx" />
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
@@ -368,21 +410,13 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="android-thin.ico" />
|
||||
<None Include="Resources\apkaio.png" />
|
||||
<None Include="Resources\info.png" />
|
||||
<None Include="Resources\waiting.png" />
|
||||
<None Include="Resources\warning.png" />
|
||||
<None Include="Resources\Error.png" />
|
||||
<None Include="Resources\playstore.png" />
|
||||
<None Include="Resources\apkpure.png" />
|
||||
<None Include="Resources\apkcombo.png" />
|
||||
<None Include="Resources\apkpure.ico" />
|
||||
<None Include="Resources\apkcombo.ico" />
|
||||
<None Include="Resources\playstore-2.png" />
|
||||
<None Include="Resources\playstore.ico" />
|
||||
<None Include="Resources\android-thin.ico" />
|
||||
<None Include="Resources\Done.png" />
|
||||
<None Include="Resources\android.png" />
|
||||
<Resource Include="Resources\android.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include=".NETFramework,Version=v4.0,Profile=Client">
|
||||
@@ -408,22 +442,29 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- NOTE: WPF XAML markup compilation (Microsoft.WinFX.targets, for Page / Resource
|
||||
items) is pulled in automatically because ProjectTypeGuids includes the WPF GUID. -->
|
||||
|
||||
<PropertyGroup>
|
||||
<PreBuildEvent>xcopy "$(ProjectDir)tools" "$(OutDir)Resources" /Y /I /S</PreBuildEvent>
|
||||
<PreBuildEvent>if not exist "$(ProjectDir)\$(OutDir)\Resources" xcopy "$(SolutionDir)\Tools" "$(ProjectDir)\$(OutDir)\Resources" /Y /I /S</PreBuildEvent>
|
||||
</PropertyGroup>
|
||||
<Import Project="..\packages\Fody.6.6.0\build\Fody.targets" Condition="Exists('..\packages\Fody.6.6.0\build\Fody.targets')" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\packages\Fody.6.6.0\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Fody.6.6.0\build\Fody.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Costura.Fody.5.7.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Costura.Fody.5.7.0\build\Costura.Fody.props'))" />
|
||||
<Error Condition="!Exists('..\packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Costura.Fody.5.7.0\build\Costura.Fody.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Resource.Embedder.2.2.0\build\Resource.Embedder.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Resource.Embedder.2.2.0\build\Resource.Embedder.props'))" />
|
||||
<Error Condition="!Exists('..\packages\Costura.Fody.6.0.0\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Costura.Fody.6.0.0\build\Costura.Fody.props'))" />
|
||||
<Error Condition="!Exists('..\packages\Costura.Fody.6.0.0\build\Costura.Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Costura.Fody.6.0.0\build\Costura.Fody.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\Fody.6.9.3\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Fody.6.9.3\build\Fody.targets'))" />
|
||||
<Error Condition="!Exists('..\packages\System.ValueTuple.4.6.1\build\net471\System.ValueTuple.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\System.ValueTuple.4.6.1\build\net471\System.ValueTuple.targets'))" />
|
||||
</Target>
|
||||
<Import Project="..\packages\Costura.Fody.5.7.0\build\Costura.Fody.targets" Condition="Exists('..\packages\Costura.Fody.5.7.0\build\Costura.Fody.targets')" />
|
||||
<Import Project="..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>
|
||||
</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<Import Project="..\packages\Costura.Fody.6.0.0\build\Costura.Fody.targets" Condition="Exists('..\packages\Costura.Fody.6.0.0\build\Costura.Fody.targets')" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
@@ -431,4 +472,6 @@
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
<Import Project="..\packages\Fody.6.9.3\build\Fody.targets" Condition="Exists('..\packages\Fody.6.9.3\build\Fody.targets')" />
|
||||
<Import Project="..\packages\System.ValueTuple.4.6.1\build\net471\System.ValueTuple.targets" Condition="Exists('..\packages\System.ValueTuple.4.6.1\build\net471\System.ValueTuple.targets')" />
|
||||
</Project>
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<PublishUrlHistory>publish\</PublishUrlHistory>
|
||||
@@ -9,6 +9,7 @@
|
||||
<ErrorReportUrlHistory />
|
||||
<FallbackCulture>ru-RU</FallbackCulture>
|
||||
<VerifyUploadedFiles>false</VerifyUploadedFiles>
|
||||
<ProjectView>ShowAllFiles</ProjectView>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<EnableSecurityDebugging>false</EnableSecurityDebugging>
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
using System;
|
||||
using APKToolGUI.Web;
|
||||
using Ionic.Zip;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Documents;
|
||||
|
||||
namespace APKToolGUI.Utils
|
||||
{
|
||||
@@ -12,6 +17,12 @@ namespace APKToolGUI.Utils
|
||||
{
|
||||
public string ApkFile;
|
||||
|
||||
public string RealApkFile;
|
||||
|
||||
public string Armv7ApkFile;
|
||||
|
||||
public string Arm64ApkFile;
|
||||
|
||||
public string AppName;
|
||||
|
||||
public string PackageName;
|
||||
@@ -20,7 +31,11 @@ namespace APKToolGUI.Utils
|
||||
|
||||
public string VersionCode;
|
||||
|
||||
public string SdkVersion;
|
||||
public string MinSdkVersionDetailed;
|
||||
|
||||
public string TargetSdkVersionDetailed;
|
||||
|
||||
public string MinSdkVersion;
|
||||
|
||||
public string TargetSdkVersion;
|
||||
|
||||
@@ -34,6 +49,8 @@ namespace APKToolGUI.Utils
|
||||
|
||||
public string Densities;
|
||||
|
||||
public string NativeCode;
|
||||
|
||||
public string PlayStoreLink;
|
||||
|
||||
public string ApkComboLink;
|
||||
@@ -42,45 +59,76 @@ namespace APKToolGUI.Utils
|
||||
|
||||
public string ApkAioLink;
|
||||
|
||||
public string AppIcon = null;
|
||||
public string ApkGkLink;
|
||||
|
||||
public string ApkSupportLink;
|
||||
|
||||
public string ApkSosLink;
|
||||
|
||||
public string ApkMirrorLink;
|
||||
|
||||
public string ApkDlLink;
|
||||
|
||||
public string FullInfo;
|
||||
|
||||
internal string AppIcon = null;
|
||||
|
||||
internal string AppIcon120 = null;
|
||||
|
||||
internal string AppIcon160 = null;
|
||||
|
||||
internal string AppIcon240 = null;
|
||||
|
||||
internal string AppIcon320 = null;
|
||||
|
||||
internal string AppIcon480 = null;
|
||||
|
||||
internal string AppIcon640 = null;
|
||||
|
||||
internal string AppIcon65534 = null;
|
||||
|
||||
public bool Parse(string file)
|
||||
{
|
||||
bool result = true;
|
||||
|
||||
string info = ParseApkInfo(file);
|
||||
|
||||
FullInfo = info;
|
||||
|
||||
if (!String.IsNullOrEmpty(info))
|
||||
{
|
||||
string[] lines = info.Split(
|
||||
new string[] { "\r\n", "\r", "\n" },
|
||||
StringSplitOptions.None);
|
||||
|
||||
List<string> nativecode = new List<string> { };
|
||||
List<string> nativecode2 = new List<string> { };
|
||||
StringBuilder permissionsBuilder = new StringBuilder();
|
||||
foreach (string line in lines)
|
||||
{
|
||||
switch (line.Split(':')[0])
|
||||
{
|
||||
case "package":
|
||||
PackageName = StringExt.Regex(@"(?<=package: name=\')(.*?)(?=\')", line);
|
||||
VersionName = StringExt.Regex(@"(?<=versionName=\')(.*?)(?=\')", line);
|
||||
VersionCode = StringExt.Regex(@"(?<=versionCode=\')(.*?)(?=\')", line);
|
||||
PackageName = StringExt.RegexExtract(@"(?<=package: name=\')(.*?)(?=\')", line);
|
||||
VersionName = StringExt.RegexExtract(@"(?<=versionName=\')(.*?)(?=\')", line);
|
||||
VersionCode = StringExt.RegexExtract(@"(?<=versionCode=\')(.*?)(?=\')", line);
|
||||
break;
|
||||
case "uses-permission":
|
||||
Permissions += StringExt.Regex(@"(?<=name=\')(.*?)(?=\')", line) + "\n";
|
||||
permissionsBuilder.AppendLine(StringExt.RegexExtract(@"(?<=name=\')(.*?)(?=\')", line));
|
||||
break;
|
||||
case "sdkVersion":
|
||||
SdkVersion += SdkToAndroidVer(StringExt.Regex(@"(?<=sdkVersion:\')(.*?)(?=\')", line));
|
||||
MinSdkVersionDetailed = SdkToAndroidVer(StringExt.RegexExtract(@"(?<=sdkVersion:\')(.*?)(?=\')", line));
|
||||
MinSdkVersion = StringExt.RegexExtract(@"(?<=sdkVersion:\')(.*?)(?=\')", line);
|
||||
break;
|
||||
case "targetSdkVersion":
|
||||
TargetSdkVersion = SdkToAndroidVer(StringExt.Regex(@"(?<=targetSdkVersion:\')(.*?)(?=\')", line));
|
||||
TargetSdkVersionDetailed = SdkToAndroidVer(StringExt.RegexExtract(@"(?<=targetSdkVersion:\')(.*?)(?=\')", line));
|
||||
TargetSdkVersion = StringExt.RegexExtract(@"(?<=targetSdkVersion:\')(.*?)(?=\')", line);
|
||||
break;
|
||||
case "application-label":
|
||||
AppName = StringExt.Regex(@"(?<=application-label:\')(.*?)(?=\')", line);
|
||||
break;
|
||||
case "application":
|
||||
AppIcon = GetIcon(file, StringExt.Regex(@"(?<=icon=\')(.*?)(?=\')", line));
|
||||
AppName = StringExt.RegexExtract(@"(?<=application-label:\')(.*?)(?=\')", line);
|
||||
break;
|
||||
case "launchable-activity":
|
||||
LaunchableActivity = StringExt.Regex(@"(?<=name=\')(.*?)(?=\')", line);
|
||||
LaunchableActivity = StringExt.RegexExtract(@"(?<=name=\')(.*?)(?=\')", line);
|
||||
break;
|
||||
case "supports-screens":
|
||||
var screens = Regex.Matches(line.Split(':')[1], @"(?<= \')(.*?)(?=\')").Cast<Match>().Select(m => m.Value).ToList();
|
||||
@@ -94,17 +142,38 @@ namespace APKToolGUI.Utils
|
||||
var densities = Regex.Matches(line.Split(':')[1], @"(?<= \')(.*?)(?=\')").Cast<Match>().Select(m => m.Value).ToList();
|
||||
Densities = string.Join(", ", densities);
|
||||
break;
|
||||
case "alt-native-code":
|
||||
nativecode2 = Regex.Matches(line.Split(':')[1], @"(?<= \')(.*?)(?=\')").Cast<Match>().Select(m => m.Value).ToList();
|
||||
break;
|
||||
case "native-code":
|
||||
nativecode = Regex.Matches(line.Split(':')[1], @"(?<= \')(.*?)(?=\')").Cast<Match>().Select(m => m.Value).ToList();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Permissions = permissionsBuilder.ToString();
|
||||
List<string> combinedList = nativecode2.Concat(nativecode).ToList();
|
||||
NativeCode += string.Join(", ", combinedList);
|
||||
ApkFile = file;
|
||||
PlayStoreLink = "https://play.google.com/store/apps/details?id=" + PackageName;
|
||||
ApkComboLink = "https://apkcombo.com/a/" + PackageName;
|
||||
ApkPureLink = "https://apkpure.com/a/" + PackageName;
|
||||
ApkAioLink = "https://apkaio.com/app/" + PackageName;
|
||||
ApkSupportLink = "https://apk.support/app/" + PackageName;
|
||||
ApkMirrorLink = "https://www.apkmirror.com/?post_type=app_release&searchtype=apk&s=" + PackageName;
|
||||
ApkGkLink = "https://apkgk.com/" + PackageName + "/download";
|
||||
|
||||
AppIcon120 = StringExt.RegexExtract(@"(?<=application-icon-120:\')(.*?)(?=\')", FullInfo);
|
||||
AppIcon160 = StringExt.RegexExtract(@"(?<=application-icon-160:\')(.*?)(?=\')", FullInfo);
|
||||
AppIcon240 = StringExt.RegexExtract(@"(?<=application-icon-240:\')(.*?)(?=\')", FullInfo);
|
||||
AppIcon320 = StringExt.RegexExtract(@"(?<=application-icon-320:\')(.*?)(?=\')", FullInfo);
|
||||
AppIcon480 = StringExt.RegexExtract(@"(?<=application-icon-480:\')(.*?)(?=\')", FullInfo);
|
||||
AppIcon640 = StringExt.RegexExtract(@"(?<=application-icon-640:\')(.*?)(?=\')", FullInfo);
|
||||
AppIcon65534 = StringExt.RegexExtract(@"(?<=application-icon-65534:\')(.*?)(?=\')", FullInfo);
|
||||
|
||||
result = true;
|
||||
}
|
||||
else
|
||||
result = false;
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -127,99 +196,215 @@ namespace APKToolGUI.Utils
|
||||
return apkinfo;
|
||||
}
|
||||
|
||||
string[] iconFolder = { "mipmap-xxxhdpi-v4", "mipmap-xxhdpi-v4", "mipmap-xhdpi-v4", "mipmap-hdpi-v4", "mipmap-mdpi-v4", "mipmap-xhdpi", "mipmap-hdpi", "drawable-xxxhdpi-v4", "drawable-xxhdpi-v4", "drawable-xhdpi-v4", "drawable-hdpi-v4", "drawable-mdpi-v4" };
|
||||
|
||||
private string GetIcon(string apkPath, string iconPath)
|
||||
// mipmap/drawable density folders to probe when the manifest points at an adaptive XML icon.
|
||||
private static readonly string[] IconPngFolders =
|
||||
{
|
||||
iconPath = iconPath.Replace(".xml", ".png");
|
||||
"mipmap-xxxhdpi-v4", "mipmap-xxhdpi-v4", "mipmap-xhdpi-v4", "mipmap-hdpi-v4", "mipmap-mdpi-v4",
|
||||
"mipmap-xhdpi", "mipmap-hdpi",
|
||||
"drawable-xxxhdpi-v4", "drawable-xxhdpi-v4", "drawable-xhdpi-v4", "drawable-hdpi-v4", "drawable-mdpi-v4"
|
||||
};
|
||||
|
||||
if (iconPath.Contains("anydpi-v26"))
|
||||
// Resolves the launcher icon to raw image bytes in memory — nothing is written to disk.
|
||||
// Resolution order:
|
||||
// 1) Direct raster lookup inside the (base) APK using the aapt-reported icon path.
|
||||
// 2) resources.arsc parse — handles optimized/obfuscated resource names and adaptive
|
||||
// icons (falls back to the foreground-layer raster).
|
||||
// 3) Split-APK fallback — density resources (incl. the launcher icon) usually live in
|
||||
// the config.*dpi.apk splits, not base.apk. When a split folder is supplied, scan it.
|
||||
// Returns the PNG/WebP bytes, or null when no icon could be found.
|
||||
public byte[] GetIconBytes(string apkPath, string splitSearchFolder = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (string folder in iconFolder)
|
||||
{
|
||||
string icon = iconPath.Replace("mipmap-anydpi-v26", folder).Replace("drawable-anydpi-v26", folder);
|
||||
// Pick the largest-density icon aapt reported (precedence: 65534 → 120).
|
||||
string icon = PickPreferredIcon();
|
||||
|
||||
if (ZipUtils.Exists(apkPath, icon))
|
||||
// Adaptive icons are declared as XML; the real raster lives next to it as a PNG.
|
||||
if (Path.GetExtension(icon).Equals(".xml", StringComparison.OrdinalIgnoreCase))
|
||||
icon = icon.Replace(".xml", ".png");
|
||||
|
||||
Debug.WriteLine("Icon: " + icon);
|
||||
|
||||
string[] candidates = BuildIconCandidates(icon);
|
||||
|
||||
// 1) Direct raster lookup inside the (base) APK.
|
||||
byte[] iconBytes = ReadIconFromApk(apkPath, candidates);
|
||||
|
||||
// 2) resources.arsc fallback.
|
||||
if (iconBytes == null)
|
||||
{
|
||||
Debug.WriteLine("Falling back to resources.arsc extraction method");
|
||||
iconBytes = ApkIconExtractor.ExtractIcon(apkPath);
|
||||
}
|
||||
|
||||
// 3) Split-APK fallback: density resources (incl. the launcher icon) usually live
|
||||
// in config.*dpi.apk splits, not base.apk. Scan the extracted splits.
|
||||
if (iconBytes == null && !String.IsNullOrEmpty(splitSearchFolder) && Directory.Exists(splitSearchFolder))
|
||||
{
|
||||
foreach (string split in Directory.GetFiles(splitSearchFolder, "*.apk", SearchOption.AllDirectories))
|
||||
{
|
||||
Debug.WriteLine("Icon path " + icon);
|
||||
return icon;
|
||||
if (String.Equals(split, apkPath, StringComparison.OrdinalIgnoreCase))
|
||||
continue; // base.apk already tried above
|
||||
|
||||
iconBytes = ReadIconFromApk(split, candidates) ?? ApkIconExtractor.ExtractIcon(split);
|
||||
if (iconBytes != null)
|
||||
{
|
||||
Debug.WriteLine("Icon resolved from split: " + Path.GetFileName(split));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return iconPath.Replace("mipmap-anydpi-v26", "mipmap-xhdpi").Replace(".xml", ".png");
|
||||
|
||||
if (iconBytes == null)
|
||||
Debug.WriteLine("Icon not found in " + Path.GetFileName(apkPath));
|
||||
|
||||
return iconBytes;
|
||||
}
|
||||
else
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine("Icon path " + iconPath);
|
||||
return iconPath;
|
||||
Debug.WriteLine("GetIconBytes failed: " + ex.Message);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Highest-density icon wins; fall back through the precedence chain.
|
||||
private string PickPreferredIcon()
|
||||
{
|
||||
foreach (var candidate in new[] { AppIcon65534, AppIcon640, AppIcon480, AppIcon320, AppIcon240, AppIcon160, AppIcon120 })
|
||||
{
|
||||
if (!String.IsNullOrEmpty(candidate))
|
||||
return candidate;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
// Expand the chosen icon path into the set of ZIP entries to probe, resolving
|
||||
// adaptive (v26) icons to their density-specific PNG forms.
|
||||
private static string[] BuildIconCandidates(string icon)
|
||||
{
|
||||
if (String.IsNullOrEmpty(icon))
|
||||
return new string[0];
|
||||
|
||||
if (icon.Contains("anydpi-v26"))
|
||||
return IconPngFolders
|
||||
.Select(p => icon.Replace("mipmap-anydpi-v26", p).Replace("drawable-anydpi-v26", p))
|
||||
.ToArray();
|
||||
|
||||
if (icon.Contains("v26"))
|
||||
return new[] { icon.Replace("v26", "v4"), icon.Replace("-v26", "") };
|
||||
|
||||
return new[] { icon };
|
||||
}
|
||||
|
||||
// Reads the first matching candidate entry from an APK/ZIP into a byte[], or null if none.
|
||||
private static byte[] ReadIconFromApk(string apkFile, string[] candidates)
|
||||
{
|
||||
if (String.IsNullOrEmpty(apkFile) || candidates == null || candidates.Length == 0 || !File.Exists(apkFile))
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
using (ZipFile zip = ZipFile.Read(apkFile))
|
||||
{
|
||||
foreach (var candidate in candidates)
|
||||
{
|
||||
if (String.IsNullOrEmpty(candidate)) continue;
|
||||
var entry = zip[candidate.Replace('\\', '/')];
|
||||
if (entry == null) continue;
|
||||
|
||||
Debug.WriteLine("Icon stream: " + candidate + " from " + Path.GetFileName(apkFile));
|
||||
using (var ms = new MemoryStream())
|
||||
{
|
||||
entry.Extract(ms);
|
||||
return ms.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine("Icon read failed from " + apkFile + ": " + ex.Message);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
//https://apilevels.com/
|
||||
public string SdkToAndroidVer(string sdk)
|
||||
{
|
||||
switch (sdk)
|
||||
{
|
||||
case "36":
|
||||
return sdk + ": Android 16";
|
||||
case "35":
|
||||
return sdk + ": Android 15";
|
||||
case "34":
|
||||
return sdk + ": Android 14";
|
||||
case "33":
|
||||
return sdk + ": Android 13";
|
||||
case "32":
|
||||
return sdk + ": Android 12.0L";
|
||||
case "31":
|
||||
return "31: Android 12.0";
|
||||
return sdk + ": Android 12";
|
||||
case "30":
|
||||
return "30: Android 11.0";
|
||||
return sdk + ": Android 11";
|
||||
case "29":
|
||||
return "29: Android 10.0";
|
||||
return sdk + ": Android 10";
|
||||
case "28":
|
||||
return "28: Android 9.0 (Pie)";
|
||||
return sdk + ": Android 9 (Pie)";
|
||||
case "27":
|
||||
return "27: Android 8.1 (Oreo MR1)";
|
||||
return sdk + ": Android 8.1 (Oreo)";
|
||||
case "26":
|
||||
return "26: Android 8.0 (Oreo)";
|
||||
return sdk + ": Android 8.0 (Oreo)";
|
||||
case "25":
|
||||
return "25: Android 7.1 (Nougat MR1)";
|
||||
return sdk + ": Android 7.1 (Nougat)";
|
||||
case "24":
|
||||
return "24: Android 7.0 (Nougat)";
|
||||
return sdk + ": Android 7.0 (Nougat)";
|
||||
case "23":
|
||||
return "23: Android 6.0 (Marshmallow)";
|
||||
return sdk + ": Android 6 (Marshmallow)";
|
||||
case "22":
|
||||
return "22: Android 5.1 (Lollipop MR1)";
|
||||
return sdk + ": Android 5.1 (Lollipop)";
|
||||
case "21":
|
||||
return "21: Android 5.0 (Lollipop)";
|
||||
return sdk + ": Android 5.0 (Lollipop)";
|
||||
case "20":
|
||||
return "20: Android 4.4W (KitKat Watch)";
|
||||
return sdk + ": Android 4.4W (KitKat Watch)";
|
||||
case "19":
|
||||
return "19: Android 4.4 (KitKat)";
|
||||
return sdk + ": Android 4.4 (KitKat)";
|
||||
case "18":
|
||||
return "18: Android 4.3 (Jelly Bean MR2)";
|
||||
return sdk + ": Android 4.3 (Jelly Bean)";
|
||||
case "17":
|
||||
return "17: Android 4.2 (Jelly Bean MR1)";
|
||||
return sdk + ": Android 4.2 (Jelly Bean)";
|
||||
case "16":
|
||||
return "16: Android 4.1 (Jelly Bean)";
|
||||
return sdk + ": Android 4.1 (Jelly Bean)";
|
||||
case "15":
|
||||
return "15: Android 4.0.3 (Ice Cream Sandwich MR1)";
|
||||
return sdk + ": Android 4.0.3 (Ice Cream Sandwich)";
|
||||
case "14":
|
||||
return "14: Android 4.0 (Ice Cream Sandwich)";
|
||||
return sdk + ": Android 4.0 (Ice Cream Sandwich)";
|
||||
case "13":
|
||||
return "13: Android 3.2 (Honeycomb MR2)";
|
||||
return sdk + ": Android 3.2 (Honeycomb)";
|
||||
case "12":
|
||||
return "12: Android 3.1 (Honeycomb MR1)";
|
||||
return sdk + ": Android 3.1 (Honeycomb)";
|
||||
case "11":
|
||||
return "11: Android 3.0 (Honeycomb)";
|
||||
return sdk + ": Android 3.0 (Honeycomb)";
|
||||
case "10":
|
||||
return "10: Android 2.3.3 Gingerbread MR1";
|
||||
return sdk + ": Android 2.3.3 Gingerbread";
|
||||
case "9":
|
||||
return "9: Android 2.3 (Gingerbread)";
|
||||
return sdk + ": Android 2.3 (Gingerbread)";
|
||||
case "8":
|
||||
return "8: Android 2.2 (Froyo)";
|
||||
return sdk + ": Android 2.2 (Froyo)";
|
||||
case "7":
|
||||
return "7: Android 2.1 (Eclair MR1)";
|
||||
return sdk + ": Android 2.1 (Eclair)";
|
||||
case "6":
|
||||
return "6: Android 2.0.1 (Eclair 0.1)";
|
||||
return sdk + ": Android 2.0.1 (Eclair)";
|
||||
case "5":
|
||||
return "5: Android 2.0 (Eclair)";
|
||||
return sdk + ": Android 2.0 (Eclair)";
|
||||
case "4":
|
||||
return "4: Android 1.6 (Donut)";
|
||||
return sdk + ": Android 1.6 (Donut)";
|
||||
case "3":
|
||||
return "3: Android 1.5 (Cupcake)";
|
||||
return sdk + ": Android 1.5 (Cupcake)";
|
||||
case "2":
|
||||
return "2: Android 1.1 (Base 1.1)";
|
||||
return sdk + ": Android 1.1 (Base 1.1)";
|
||||
case "1":
|
||||
return "1: Android 1.0 (Base)";
|
||||
return sdk + ": Android 1.0 (Base)";
|
||||
default:
|
||||
return sdk;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Utils;
|
||||
using Java;
|
||||
using Microsoft.Build.Framework.XamlTypes;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace APKToolGUI
|
||||
{
|
||||
public class Adb : IDisposable
|
||||
{
|
||||
Process processAdb;
|
||||
private bool disposed = false;
|
||||
|
||||
static class Keys
|
||||
{
|
||||
public const string Devices = " devices -l"; //list connected devices (-l for long output)
|
||||
public const string Serial = " -s"; // use device with given serial (overrides $ANDROID_SERIAL)
|
||||
public const string Vendor = " -i"; //Vendor
|
||||
public const string ApkPath = " -r";
|
||||
public const string Abi = " --abi"; //override platform's default ABI
|
||||
}
|
||||
|
||||
public event DataReceivedEventHandler OutputDataReceived
|
||||
{
|
||||
add { processAdb.OutputDataReceived += value; }
|
||||
remove { processAdb.OutputDataReceived -= value; }
|
||||
}
|
||||
|
||||
public event DataReceivedEventHandler ErrorDataReceived
|
||||
{
|
||||
add { processAdb.ErrorDataReceived += value; }
|
||||
remove { processAdb.ErrorDataReceived -= value; }
|
||||
}
|
||||
|
||||
public event EventHandler Exited;
|
||||
public int ExitCode { get { return processAdb.ExitCode; } }
|
||||
string adbFileName = null;
|
||||
public Adb(string AdbFileName)
|
||||
{
|
||||
adbFileName = AdbFileName;
|
||||
processAdb = new Process();
|
||||
processAdb.EnableRaisingEvents = true;
|
||||
processAdb.StartInfo.FileName = AdbFileName;
|
||||
processAdb.StartInfo.UseShellExecute = false; // Disable shell execution to read output data
|
||||
processAdb.StartInfo.RedirectStandardOutput = true; // Allow output redirection
|
||||
processAdb.StartInfo.RedirectStandardError = true; // Allow error redirection
|
||||
processAdb.StartInfo.CreateNoWindow = true; // Do not create window for the launched program
|
||||
processAdb.Exited += processAdb_Exited;
|
||||
}
|
||||
|
||||
void processAdb_Exited(object sender, EventArgs e)
|
||||
{
|
||||
processAdb.CancelOutputRead();
|
||||
processAdb.CancelErrorRead();
|
||||
if (this.Exited != null)
|
||||
Exited(this, new EventArgs());
|
||||
}
|
||||
|
||||
public void Cancel()
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (var process in Process.GetProcessesByName("adb"))
|
||||
{
|
||||
using (process)
|
||||
{
|
||||
if (process.Id == processAdb.Id)
|
||||
{
|
||||
ProcessUtils.KillAllProcessesSpawnedBy((uint)processAdb.Id);
|
||||
process.Kill();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Adb] Cancel failed: {ex.Message}");
|
||||
// Process termination failure is not critical, so continue
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (!disposed)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
if (processAdb != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!processAdb.HasExited)
|
||||
{
|
||||
processAdb.Kill();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Adb] Error disposing process: {ex.Message}");
|
||||
}
|
||||
finally
|
||||
{
|
||||
processAdb.Dispose();
|
||||
processAdb = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
disposed = true;
|
||||
}
|
||||
}
|
||||
|
||||
~Adb()
|
||||
{
|
||||
Dispose(false);
|
||||
}
|
||||
|
||||
public int Install(string device, string inputApk)
|
||||
{
|
||||
Regex regex = new Regex(@"^(\S+)\s+.*model:(\w+).*");
|
||||
Match mdevice = regex.Match(device);
|
||||
|
||||
string setVendor = null, abi = null;
|
||||
if (Settings.Default.Adb_SetVendor)
|
||||
setVendor = $"{Keys.Vendor} com.android.vending {Keys.ApkPath}";
|
||||
if (Settings.Default.Adb_SetOverrideAbi)
|
||||
{
|
||||
switch (Settings.Default.Adb_OverrideAbi)
|
||||
{
|
||||
case 0:
|
||||
abi = Keys.Abi + " arm64-v8a";
|
||||
break;
|
||||
case 1:
|
||||
abi = Keys.Abi + " armeabi-v7a";
|
||||
break;
|
||||
case 2:
|
||||
abi = Keys.Abi + " x86";
|
||||
break;
|
||||
case 3:
|
||||
abi = Keys.Abi + " x86_64";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
string args = String.Format($"{Keys.Serial} {mdevice.Groups[1].Value} install {setVendor} {abi} \"{inputApk}\"");
|
||||
|
||||
Log.d("ADB: " + adbFileName + " " + args);
|
||||
Debug.WriteLine("Adb: " + args);
|
||||
|
||||
processAdb.EnableRaisingEvents = false;
|
||||
processAdb.StartInfo.Arguments = args;
|
||||
processAdb.Start();
|
||||
processAdb.BeginOutputReadLine();
|
||||
processAdb.BeginErrorReadLine();
|
||||
processAdb.WaitForExit();
|
||||
|
||||
return ExitCode;
|
||||
}
|
||||
|
||||
public string GetDevices()
|
||||
{
|
||||
Log.d("ADB: " + adbFileName + " " + Keys.Devices);
|
||||
|
||||
using (Process process = new Process())
|
||||
{
|
||||
process.EnableRaisingEvents = true;
|
||||
process.StartInfo.FileName = adbFileName;
|
||||
process.StartInfo.UseShellExecute = false;
|
||||
process.StartInfo.RedirectStandardOutput = true;
|
||||
process.StartInfo.RedirectStandardError = true;
|
||||
process.StartInfo.CreateNoWindow = true;
|
||||
process.EnableRaisingEvents = false;
|
||||
process.StartInfo.Arguments = Keys.Devices;
|
||||
process.Start();
|
||||
string devices = process.StandardOutput.ReadToEnd();
|
||||
process.WaitForExit();
|
||||
return devices;
|
||||
}
|
||||
}
|
||||
|
||||
public void KillProcess()
|
||||
{
|
||||
foreach (var process in Process.GetProcessesByName("adb"))
|
||||
{
|
||||
using (process)
|
||||
{
|
||||
process.Kill();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,243 @@
|
||||
using System;
|
||||
using Java;
|
||||
using System.Diagnostics;
|
||||
using APKToolGUI.Properties;
|
||||
using System.IO;
|
||||
using APKToolGUI.Utils;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace APKToolGUI
|
||||
{
|
||||
public class ApkEditor : JarProcess, IDisposable
|
||||
{
|
||||
private bool disposed = false;
|
||||
|
||||
public new event ApkEditorExitedEventHandler Exited;
|
||||
|
||||
string _jarPath;
|
||||
public ApkEditor(string javaPath, string jarPath)
|
||||
: base(javaPath, jarPath)
|
||||
{
|
||||
this._jarPath = jarPath;
|
||||
base.Exited += ApkEditor_Exited;
|
||||
OutputDataReceived += ApkEditor_OutputDataReceived;
|
||||
ErrorDataReceived += ApkEditor_ErrorDataReceived; //Output makes process way slower
|
||||
}
|
||||
|
||||
ApkEditorDataReceivedEventHandler onApkEditorOutputDataRecieved;
|
||||
ApkEditorDataReceivedEventHandler onApkEditorErrorDataRecieved;
|
||||
|
||||
public event ApkEditorDataReceivedEventHandler ApkEditorOutputDataRecieved
|
||||
{
|
||||
add
|
||||
{
|
||||
onApkEditorOutputDataRecieved += value;
|
||||
}
|
||||
remove
|
||||
{
|
||||
onApkEditorOutputDataRecieved -= value;
|
||||
}
|
||||
}
|
||||
public event ApkEditorDataReceivedEventHandler ApkEditorErrorDataRecieved
|
||||
{
|
||||
add
|
||||
{
|
||||
onApkEditorErrorDataRecieved += value;
|
||||
}
|
||||
remove
|
||||
{
|
||||
onApkEditorErrorDataRecieved -= value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void ApkEditor_ErrorDataReceived(object sender, DataReceivedEventArgs e)
|
||||
{
|
||||
if (onApkEditorErrorDataRecieved != null && e.Data != null)
|
||||
onApkEditorErrorDataRecieved(this, new ApkEditorDataReceivedEventArgs(e.Data));
|
||||
}
|
||||
|
||||
private void ApkEditor_OutputDataReceived(object sender, DataReceivedEventArgs e)
|
||||
{
|
||||
if (onApkEditorOutputDataRecieved != null && e.Data != null)
|
||||
onApkEditorOutputDataRecieved(this, new ApkEditorDataReceivedEventArgs(e.Data));
|
||||
}
|
||||
|
||||
void ApkEditor_Exited(object sender, EventArgs e)
|
||||
{
|
||||
if (Exited != null)
|
||||
Exited(this, new ApkEditorExitedEventArgs(ExitCode));
|
||||
}
|
||||
public void Cancel()
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (var process in Process.GetProcessesByName("java"))
|
||||
{
|
||||
using (process)
|
||||
{
|
||||
if (process.Id == Id)
|
||||
{
|
||||
ProcessUtils.KillAllProcessesSpawnedBy((uint)Id);
|
||||
process.Kill();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (InvalidOperationException ex)
|
||||
{
|
||||
Debug.WriteLine($"[ApkEditor] Process already exited: {ex.Message}");
|
||||
}
|
||||
catch (System.ComponentModel.Win32Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[ApkEditor] Failed to access process: {ex.Message}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[ApkEditor] Failed to cancel process: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
public int Merge(string input, string output)
|
||||
{
|
||||
string inputFile = String.Format("-i \"{0}\"", input);
|
||||
string keyOutputDir = String.Format("-o \"{0}\"", output);
|
||||
|
||||
string args = String.Format("m {0} {1} -f", inputFile, keyOutputDir);
|
||||
|
||||
Log.d("ApkEditor CMD: " + _jarPath + " " + args);
|
||||
|
||||
Start(args);
|
||||
|
||||
BeginOutputReadLine();
|
||||
BeginErrorReadLine();
|
||||
|
||||
WaitForExit();
|
||||
|
||||
CancelOutputRead();
|
||||
CancelErrorRead();
|
||||
return ExitCode;
|
||||
}
|
||||
|
||||
public int Decompile(string input, string output)
|
||||
{
|
||||
string inputFile = String.Format("-i \"{0}\"", input);
|
||||
string keyOutputDir = String.Format("-o \"{0}\"", output);
|
||||
|
||||
string args = String.Format("d {0} {1} -f", inputFile, keyOutputDir);
|
||||
|
||||
Log.d("ApkEditor CMD: " + _jarPath + " " + args);
|
||||
|
||||
Start(args);
|
||||
|
||||
BeginOutputReadLine();
|
||||
BeginErrorReadLine();
|
||||
|
||||
WaitForExit();
|
||||
|
||||
CancelOutputRead();
|
||||
CancelErrorRead();
|
||||
return ExitCode;
|
||||
}
|
||||
|
||||
public int Build(string input, string output)
|
||||
{
|
||||
string inputFile = String.Format("-i \"{0}\"", input);
|
||||
string keyOutputDir = String.Format("-o \"{0}\"", output);
|
||||
|
||||
string args = String.Format("b {0} {1} -f", inputFile, keyOutputDir);
|
||||
|
||||
Log.d("ApkEditor CMD: " + _jarPath + " " + args);
|
||||
|
||||
Start(args);
|
||||
|
||||
BeginOutputReadLine();
|
||||
BeginErrorReadLine();
|
||||
|
||||
WaitForExit();
|
||||
|
||||
CancelOutputRead();
|
||||
CancelErrorRead();
|
||||
return ExitCode;
|
||||
}
|
||||
public string GetVersion()
|
||||
{
|
||||
using (JarProcess jar = new JarProcess(JavaPath, JarPath))
|
||||
{
|
||||
jar.EnableRaisingEvents = false;
|
||||
jar.Start("-version");
|
||||
|
||||
//APKEditor always print as errors as usual :)
|
||||
string version = jar.StandardOutput.ReadToEnd();
|
||||
version += jar.StandardError.ReadToEnd();
|
||||
jar.WaitForExit(3000);
|
||||
return version.Replace("\r\n", "");
|
||||
}
|
||||
}
|
||||
|
||||
public new void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
protected new virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (!disposed)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
try
|
||||
{
|
||||
Cancel();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[ApkEditor] Error during disposal: {ex.Message}");
|
||||
}
|
||||
finally
|
||||
{
|
||||
base.Dispose();
|
||||
}
|
||||
}
|
||||
disposed = true;
|
||||
}
|
||||
}
|
||||
|
||||
~ApkEditor()
|
||||
{
|
||||
Dispose(false);
|
||||
}
|
||||
}
|
||||
|
||||
public class ApkEditorExitedEventArgs : EventArgs
|
||||
{
|
||||
public ApkEditorExitedEventArgs(int exitCode)
|
||||
{
|
||||
ExitCode = exitCode;
|
||||
}
|
||||
|
||||
public int ExitCode { get; private set; }
|
||||
}
|
||||
|
||||
public delegate void ApkEditorExitedEventHandler(object sender, ApkEditorExitedEventArgs e);
|
||||
|
||||
public delegate void ApkEditorDataReceivedEventHandler(Object sender, ApkEditorDataReceivedEventArgs e);
|
||||
|
||||
public class ApkEditorDataReceivedEventArgs : EventArgs
|
||||
{
|
||||
string message;
|
||||
|
||||
public ApkEditorDataReceivedEventArgs(string _data)
|
||||
{
|
||||
message = _data;
|
||||
}
|
||||
public String Message
|
||||
{
|
||||
get
|
||||
{
|
||||
return message;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,63 +1,115 @@
|
||||
|
||||
|
||||
using APKToolGUI.Utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace APKToolGUI.ApkTool
|
||||
{
|
||||
public class ApkFixer
|
||||
{
|
||||
public static bool FixAndroidManifest(string path)
|
||||
public static bool FixAndroidManifest(string decompilePath)
|
||||
{
|
||||
string manifestPath = Path.Combine(path, "AndroidManifest.xml");
|
||||
if (File.Exists(manifestPath))
|
||||
string manifestPath = Path.Combine(decompilePath, "AndroidManifest.xml");
|
||||
if (!File.Exists(manifestPath))
|
||||
return false;
|
||||
|
||||
try
|
||||
{
|
||||
string text = File.ReadAllText(manifestPath);
|
||||
text = text.Replace("android:isSplitRequired=\"true\"", "");
|
||||
text = text.Replace("android:extractNativeLibs=\"false\"", "");
|
||||
text = text.Replace("android:useEmbeddedDex=\"true\"", "");
|
||||
File.WriteAllText(Path.Combine(path, "AndroidManifest.xml"), text);
|
||||
string manifestText = File.ReadAllText(manifestPath);
|
||||
manifestText = manifestText.Replace("\\ ", "\\u003");
|
||||
manifestText = manifestText.Replace("android:isSplitRequired=\"true\"", "");
|
||||
manifestText = manifestText.Replace("android:extractNativeLibs=\"false\"", "");
|
||||
manifestText = manifestText.Replace("android:useEmbeddedDex=\"true\"", "");
|
||||
manifestText = manifestText.Replace("android:manageSpace=\"true\"", "");
|
||||
manifestText = manifestText.Replace("android:localeConfig=\"@xml/locales_config\"", "");
|
||||
manifestText = manifestText.Replace("STAMP_TYPE_DISTRIBUTION_APK", "STAMP_TYPE_STANDALONE_APK");
|
||||
manifestText = Regex.Replace(manifestText, @"\s*android:requiredSplitTypes=""[^""]*""", "");
|
||||
manifestText = Regex.Replace(manifestText, @"\s*android:splitTypes=""[^""]*""", "");
|
||||
|
||||
File.WriteAllText(manifestPath, manifestText);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
catch (IOException ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"[ApkFixer] Failed to fix AndroidManifest.xml: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
catch (UnauthorizedAccessException ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"[ApkFixer] Access denied to AndroidManifest.xml: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"[ApkFixer] Unexpected error fixing AndroidManifest.xml: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool FixApktoolYml(string decompilePath)
|
||||
{
|
||||
string ymlPath = Path.Combine(decompilePath, "apktool.yml");
|
||||
if (!File.Exists(ymlPath))
|
||||
return false;
|
||||
|
||||
try
|
||||
{
|
||||
string yml = File.ReadAllText(ymlPath);
|
||||
yml = yml.Replace("sparseResources: true", "sparseResources: false");
|
||||
|
||||
File.WriteAllText(ymlPath, yml);
|
||||
return true;
|
||||
}
|
||||
catch (IOException ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"[ApkFixer] Failed to fix apktool.yml: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
catch (UnauthorizedAccessException ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"[ApkFixer] Access denied to apktool.yml: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"[ApkFixer] Unexpected error fixing apktool.yml: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool RemoveApkToolDummies(string path)
|
||||
{
|
||||
string resPath = Path.Combine(path, "res", "values");
|
||||
if (Directory.Exists(resPath))
|
||||
if (!Directory.Exists(resPath))
|
||||
return false;
|
||||
|
||||
try
|
||||
{
|
||||
DirectoryUtils.ReplaceinFilesRegex(resPath, "(.*(?:APKTOOL_DUMMY).*)", "");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool ChangeSdkTo29(string path)
|
||||
{
|
||||
string ymlPath = Path.Combine(path, "apktool.yml");
|
||||
if (File.Exists(ymlPath))
|
||||
catch (IOException ex)
|
||||
{
|
||||
string[] Manifest = File.ReadAllLines(ymlPath);
|
||||
string yml = "";
|
||||
foreach (string s in Manifest)
|
||||
{
|
||||
int sdk = 30;
|
||||
int.TryParse(StringExt.Regex(@"(?<= targetSdkVersion: \')(.*?)(?=\')", s), out sdk);
|
||||
if (sdk >= 30)
|
||||
{
|
||||
yml += " targetSdkVersion: '29'\n";
|
||||
return true;
|
||||
}
|
||||
yml += s + "\n";
|
||||
}
|
||||
File.WriteAllText(ymlPath, yml);
|
||||
System.Diagnostics.Debug.WriteLine($"[ApkFixer] Failed to remove APKTOOL_DUMMY: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
catch (UnauthorizedAccessException ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"[ApkFixer] Access denied while removing APKTOOL_DUMMY: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"[ApkFixer] Unexpected error removing APKTOOL_DUMMY: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,54 +2,130 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
using System.Windows.Forms;
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Utils;
|
||||
using Java;
|
||||
|
||||
namespace APKToolGUI
|
||||
{
|
||||
public class Apktool : JarProcess
|
||||
public class Apktool : JarProcess, IDisposable
|
||||
{
|
||||
enum ApktoolActionType
|
||||
private bool disposed = false;
|
||||
private static readonly Regex ApktoolVersionRegex = new Regex(@"v?(?<version>\d+\.\d+\.\d+)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
public Version ParsedVersion { get; private set; }
|
||||
public string Version { get; private set; }
|
||||
|
||||
public Apktool(string javaPath, string jarPath) : base(javaPath, jarPath)
|
||||
{
|
||||
Decompile,
|
||||
Build,
|
||||
InstallFramework,
|
||||
ClearFramework,
|
||||
Null
|
||||
Exited += Apktool_Exited;
|
||||
OutputDataReceived += Apktool_OutputDataReceived;
|
||||
ErrorDataReceived += Apktool_ErrorDataReceived;
|
||||
|
||||
string apktoolVersion = GetVersion();
|
||||
string apktoolVersionOld = GetVersionOld();
|
||||
if (!String.IsNullOrWhiteSpace(apktoolVersion) && !Regex.IsMatch(apktoolVersion, @"\r\n?|\n"))
|
||||
Version = apktoolVersion;
|
||||
else if (!String.IsNullOrWhiteSpace(apktoolVersionOld) && !Regex.IsMatch(apktoolVersionOld, @"\r\n?|\n"))
|
||||
Version = apktoolVersionOld;
|
||||
|
||||
ParsedVersion = ParseVersion(Version);
|
||||
|
||||
Debug.WriteLine($"[Apktool] Parsed version: {ParsedVersion}");
|
||||
}
|
||||
|
||||
//Note: I don't use some features and don't use any framework related since I make it simple for game modding purposes
|
||||
static class DecompileKeys
|
||||
{
|
||||
public const string NoSource = " -s"; //Do not decode sources.
|
||||
public const string NoResource = " -r"; //Do not decode resources.
|
||||
public const string NoDebugInfo = " -b"; //don't write out debug info (.local, .param, .line, etc.)
|
||||
public const string Force = " -f"; //Skip changes detection and build all files.
|
||||
public const string FrameworkPath = " -p"; //Uses framework files located in <dir>.
|
||||
public const string KeepBrokenResource = " -k"; //Use if there was an error and some resources were dropped
|
||||
public const string MatchOriginal = " -m"; //Keeps files to closest to original as possible. Prevents rebuild.
|
||||
public const string OutputDir = " -o"; //The name of folder that gets written. Default is apk.out
|
||||
public const string OnlyMainClasses = " -only-main-classes"; //Only disassemble the main dex classes (classes[0-9]*.dex) in the root.
|
||||
public const string ApiLevel = " -api"; //The numeric api-level of the file to generate, e.g. 14 for ICS.
|
||||
//Do not decode sources.
|
||||
public const string NoSource = "-s";
|
||||
|
||||
//Do not decode resources.
|
||||
public const string NoResource = "-r";
|
||||
|
||||
//don't write out debug info (.local, .param, .line, etc.)
|
||||
//The -b flag has been removed from APKtool 3.0.1 and later versions,
|
||||
//but the --no-debug-info flag is supported in all versions.
|
||||
public const string NoDebugInfo = "--no-debug-info";
|
||||
|
||||
//Skip changes detection and build all files.
|
||||
public const string Force = "-f";
|
||||
|
||||
//Uses framework files located in <dir>.
|
||||
public const string FrameworkPath = "-p";
|
||||
|
||||
//Use if there was an error and some resources were dropped
|
||||
public const string KeepBrokenResource = "--keep-broken-res";
|
||||
|
||||
//Keeps files to closest to original as possible. Prevents rebuild.
|
||||
public const string MatchOriginal = "--match-original";
|
||||
|
||||
//The name of folder that gets written. Default is apk.out
|
||||
public const string OutputDir = "-o";
|
||||
|
||||
//Only disassemble the main dex classes (classes[0-9]*.dex) in the root.
|
||||
public const string OnlyMainClasses = "--only-main-classes";
|
||||
|
||||
//The numeric api-level of the file to generate, e.g. 14 for ICS.
|
||||
public const string ApiLevel = "-api";
|
||||
|
||||
// Sets the number of threads to use.
|
||||
public const string Jobs = "-j";
|
||||
}
|
||||
|
||||
static class BuildKeys
|
||||
{
|
||||
public const string ForceAll = " -f"; //Skip changes detection and build all files.
|
||||
public const string CopyOriginal = " -c"; //opies original AndroidManifest.xml and META-INF. See project page for more info.
|
||||
public const string Aapt = " -a"; //Loads aapt from specified location.
|
||||
public const string FrameworkPath = " -p"; //Uses framework files located in <dir>.
|
||||
public const string OutputAppPath = " -o"; // The name of apk that gets written. Default is dist/name.apk
|
||||
public const string NoCrunch = " -nc"; // Disable crunching of resource files during the build step.
|
||||
public const string ApiLevel = " -api"; //The numeric api-level of the file to generate, e.g. 14 for ICS.
|
||||
//Skip changes detection and build all files.
|
||||
public const string ForceAll = "-f";
|
||||
|
||||
//opies original AndroidManifest.xml and META-INF. See project page for more info.
|
||||
public const string CopyOriginal = "--copy-original";
|
||||
|
||||
//Loads aapt from specified location.
|
||||
public const string Aapt = "-a";
|
||||
|
||||
//Uses framework files located in <dir>.
|
||||
public const string FrameworkPath = "-p";
|
||||
|
||||
// The name of apk that gets written. Default is dist/name.apk
|
||||
public const string OutputAppPath = "-o";
|
||||
|
||||
// Disable crunching of resource files during the build step.
|
||||
public const string NoCrunch = "--no-crunch";
|
||||
|
||||
//The numeric api-level of the file to generate, e.g. 14 for ICS.
|
||||
public const string ApiLevel = "-api";
|
||||
|
||||
//Upgrades apktool to use experimental aapt2 binary.
|
||||
public const string UseAapt2 = "--use-aapt2";
|
||||
|
||||
//Add a generic Network Security Configuration file in the output APK
|
||||
public const string NetSecConf = "--net-sec-conf";
|
||||
|
||||
// Sets the number of threads to use.
|
||||
public const string Jobs = "-j";
|
||||
}
|
||||
|
||||
static class InstallFrameworkKeys
|
||||
{
|
||||
public const string FrameDir = " -p"; //Stores framework files into <dir>.
|
||||
public const string Tag = " -t"; //Tag frameworks using <tag>.
|
||||
//Stores framework files into <dir>.
|
||||
public const string FrameDir = "-p";
|
||||
|
||||
//Tag frameworks using <tag>.
|
||||
public const string Tag = "-t";
|
||||
}
|
||||
|
||||
static class EmptyFrameworkKeys
|
||||
{
|
||||
//Stores framework files into <dir>.
|
||||
public const string FrameDir = "-p";
|
||||
|
||||
//Force delete destination directory.
|
||||
public const string ForceDelete = "-f";
|
||||
|
||||
//Include all framework files regardless of tag. (3.0.1+)
|
||||
public const string All = "-a";
|
||||
}
|
||||
|
||||
ApktoolDataReceivedEventHandler onApktoolOutputDataRecieved;
|
||||
@@ -78,13 +154,6 @@ namespace APKToolGUI
|
||||
}
|
||||
}
|
||||
|
||||
public Apktool(string javaPath, string jarPath) : base(javaPath, jarPath)
|
||||
{
|
||||
Exited += Apktool_Exited;
|
||||
OutputDataReceived += Apktool_OutputDataReceived;
|
||||
ErrorDataReceived += Apktool_ErrorDataReceived;
|
||||
}
|
||||
|
||||
private void Apktool_ErrorDataReceived(object sender, DataReceivedEventArgs e)
|
||||
{
|
||||
if (onApktoolErrorDataRecieved != null && e.Data != null)
|
||||
@@ -105,7 +174,7 @@ namespace APKToolGUI
|
||||
|
||||
public int Decompile(string inputPath, string outputDir)
|
||||
{
|
||||
string keyNoSrc = null, keyNoRes = null, keyForce = null, keyFramePath = null, keyMatchOriginal = null, keyOutputDir = null, onlyMainClasses = null, noDebugInfo = null, keyKeepBrokenRes = null, apiLevel = null;
|
||||
string keyNoSrc = null, keyNoRes = null, keyForce = null, keyFramePath = null, keyMatchOriginal = null, keyOutputDir = null, onlyMainClasses = null, noDebugInfo = null, keyKeepBrokenRes = null, apiLevel = null, jobs = null;
|
||||
|
||||
if (Settings.Default.Decode_NoSrc)
|
||||
keyNoSrc = DecompileKeys.NoSource;
|
||||
@@ -117,17 +186,23 @@ namespace APKToolGUI
|
||||
keyKeepBrokenRes = DecompileKeys.KeepBrokenResource;
|
||||
if (Settings.Default.Decode_MatchOriginal)
|
||||
keyMatchOriginal = DecompileKeys.MatchOriginal;
|
||||
if (Settings.Default.Decode_OnlyMainClasses)
|
||||
if (Settings.Default.Decode_OnlyMainClasses && !Settings.Default.Decode_NoSrc && IsVersionAtMost("2.12.1"))
|
||||
onlyMainClasses = DecompileKeys.OnlyMainClasses;
|
||||
if (Settings.Default.Decode_NoDebugInfo)
|
||||
noDebugInfo = DecompileKeys.NoDebugInfo;
|
||||
if (Settings.Default.Decode_UseFramework)
|
||||
keyFramePath = String.Format("{0} \"{1}\"", DecompileKeys.FrameworkPath, Settings.Default.Decode_FrameDir);
|
||||
keyFramePath = String.Format("{0} \"{1}\"", DecompileKeys.FrameworkPath, Settings.Default.Framework_FrameDir);
|
||||
else
|
||||
keyFramePath = String.Format("{0} \"{1}\"", DecompileKeys.FrameworkPath, Program.STANDALONE_FRAMEWORK_DIR);
|
||||
if (Settings.Default.Decode_SetApiLevel)
|
||||
apiLevel = String.Format("{0} {1}", DecompileKeys.ApiLevel, Settings.Default.Decode_ApiLevel);
|
||||
if (Settings.Default.Decode_SetJobs)
|
||||
jobs = String.Format("{0} {1}", DecompileKeys.Jobs, Settings.Default.Decode_Jobs);
|
||||
keyOutputDir = String.Format("{0} \"{1}\"", DecompileKeys.OutputDir, outputDir);
|
||||
|
||||
string args = String.Format("d{0}{1}{2}{3}{4}{5}{6}{7}{8}{9} \"{10}\"", keyNoSrc, keyNoRes, keyForce, onlyMainClasses, noDebugInfo, keyMatchOriginal, keyFramePath, keyKeepBrokenRes, keyOutputDir, apiLevel, inputPath);
|
||||
string args = String.Format($"d {keyNoSrc} {keyNoRes} {keyForce} {onlyMainClasses} {noDebugInfo} {keyMatchOriginal} {keyFramePath} {keyKeepBrokenRes} {apiLevel} {jobs} {keyOutputDir} \"{inputPath}\"");
|
||||
|
||||
Log.d("Apktool CMD: " + JarPath + " " + args);
|
||||
|
||||
Start(args);
|
||||
BeginOutputReadLine();
|
||||
@@ -136,11 +211,10 @@ namespace APKToolGUI
|
||||
return ExitCode;
|
||||
}
|
||||
|
||||
public int Build(string outputFile)
|
||||
public int Build(string inputFolder, string outputFile)
|
||||
{
|
||||
string decApkDir = Settings.Default.Build_InputDir;
|
||||
string keyForceAll = null, keyAapt = null, keyCopyOriginal = null, noCrunch = null, keyFramePath = null, keyOutputAppPath = null, apiLevel = null, jobs = null, useAapt2 = null, netSecConf = null;
|
||||
|
||||
string keyForceAll = null, keyAapt = null, keyCopyOriginal = null, noCrunch = null, keyFramePath = null, keyOutputAppPath = null, apiLevel = null;
|
||||
if (Settings.Default.Build_ForceAll)
|
||||
keyForceAll = BuildKeys.ForceAll;
|
||||
if (Settings.Default.Build_CopyOriginal)
|
||||
@@ -150,12 +224,22 @@ namespace APKToolGUI
|
||||
if (Settings.Default.Build_UseAapt)
|
||||
keyAapt = String.Format("{0} \"{1}\"", BuildKeys.Aapt, Settings.Default.Build_AaptPath);
|
||||
if (Settings.Default.Build_UseFramework)
|
||||
keyFramePath = String.Format("{0} \"{1}\"", BuildKeys.FrameworkPath, Settings.Default.Build_FrameDir);
|
||||
keyFramePath = String.Format("{0} \"{1}\"", BuildKeys.FrameworkPath, Settings.Default.Framework_FrameDir);
|
||||
else
|
||||
keyFramePath = String.Format("{0} \"{1}\"", BuildKeys.FrameworkPath, Program.STANDALONE_FRAMEWORK_DIR);
|
||||
if (Settings.Default.Build_SetApiLevel)
|
||||
apiLevel = String.Format("{0} {1}", DecompileKeys.ApiLevel, Settings.Default.Build_ApiLevel);
|
||||
apiLevel = String.Format("{0} {1}", BuildKeys.ApiLevel, Settings.Default.Build_ApiLevel);
|
||||
if (Settings.Default.Build_SetJobs)
|
||||
jobs = String.Format("{0} {1}", BuildKeys.Jobs, Settings.Default.Build_Jobs);
|
||||
if (Settings.Default.Build_UseAapt2)
|
||||
useAapt2 = BuildKeys.UseAapt2;
|
||||
if (Settings.Default.Build_NetSecConf)
|
||||
netSecConf = BuildKeys.NetSecConf;
|
||||
keyOutputAppPath = String.Format("{0} \"{1}\"", BuildKeys.OutputAppPath, outputFile);
|
||||
|
||||
string args = String.Format("b{0}{1}{2}{3}{4}{5}{6} \"{7}\"", keyForceAll, keyAapt, keyCopyOriginal, noCrunch, keyFramePath, keyOutputAppPath, apiLevel, decApkDir);
|
||||
string args = String.Format($"b {keyForceAll} {keyAapt} {keyCopyOriginal} {noCrunch} {keyFramePath} {apiLevel} {jobs} {useAapt2} {netSecConf} {keyOutputAppPath} \"{inputFolder}\"");
|
||||
|
||||
Log.d("Apktool CMD: " + JarPath + " " + args);
|
||||
|
||||
Start(args);
|
||||
BeginOutputReadLine();
|
||||
@@ -169,12 +253,14 @@ namespace APKToolGUI
|
||||
string inputPath = Settings.Default.InstallFramework_InputFramePath;
|
||||
string keyFrameDir = null, keyTag = null;
|
||||
|
||||
if (Settings.Default.InstallFramework_UseFrameDir)
|
||||
keyFrameDir = String.Format("{0} \"{1}\"", InstallFrameworkKeys.FrameDir, Settings.Default.InstallFramework_FrameDir);
|
||||
if (Settings.Default.Framework_UseFrameDir)
|
||||
keyFrameDir = String.Format("{0} \"{1}\"", InstallFrameworkKeys.FrameDir, Settings.Default.Framework_FrameDir);
|
||||
if (Settings.Default.InstallFramework_UseTag)
|
||||
keyTag = String.Format("{0} \"{1}\"", InstallFrameworkKeys.Tag, Settings.Default.InstallFramework_Tag);
|
||||
|
||||
string args = String.Format("if{0}{1} \"{2}\"", keyFrameDir, keyTag, inputPath);
|
||||
string args = String.Format($"if {keyFrameDir} {keyTag} \"{inputPath}\"");
|
||||
|
||||
Log.d("Apktool CMD: " + JarPath + " " + args);
|
||||
|
||||
Start(args);
|
||||
BeginOutputReadLine();
|
||||
@@ -185,7 +271,17 @@ namespace APKToolGUI
|
||||
|
||||
public int ClearFramework()
|
||||
{
|
||||
string args = String.Format("empty-framework-dir --force");
|
||||
string keyFramePath = null;
|
||||
if (Settings.Default.Decode_UseFramework)
|
||||
keyFramePath = String.Format("{0} \"{1}\"", InstallFrameworkKeys.FrameDir, Settings.Default.Framework_FrameDir);
|
||||
else
|
||||
keyFramePath = String.Format("{0} \"{1}\"", DecompileKeys.FrameworkPath, Program.STANDALONE_FRAMEWORK_DIR);
|
||||
|
||||
string args = String.Format($"empty-framework-dir {EmptyFrameworkKeys.ForceDelete} {keyFramePath}");
|
||||
if (IsVersionAtLeast("3.0.1"))
|
||||
args = String.Format($"clean-frameworks {EmptyFrameworkKeys.All} {keyFramePath}");
|
||||
|
||||
Log.d("Apktool CMD: " + JarPath + " " + args);
|
||||
|
||||
Start(args);
|
||||
BeginOutputReadLine();
|
||||
@@ -194,7 +290,54 @@ namespace APKToolGUI
|
||||
return ExitCode;
|
||||
}
|
||||
|
||||
public bool IsVersionAtLeast(string minimumVersion)
|
||||
{
|
||||
if (String.IsNullOrWhiteSpace(minimumVersion))
|
||||
throw new ArgumentException("Minimum version cannot be null or empty.", nameof(minimumVersion));
|
||||
|
||||
return ParsedVersion.CompareTo(new Version(minimumVersion)) >= 0;
|
||||
}
|
||||
|
||||
public bool IsVersionAtMost(string maximumVersion)
|
||||
{
|
||||
if (String.IsNullOrWhiteSpace(maximumVersion))
|
||||
throw new ArgumentException("Maximum version cannot be null or empty.", nameof(maximumVersion));
|
||||
|
||||
return ParsedVersion.CompareTo(new Version(maximumVersion)) <= 0;
|
||||
}
|
||||
|
||||
private static Version ParseVersion(string rawVersion)
|
||||
{
|
||||
if (String.IsNullOrWhiteSpace(rawVersion))
|
||||
return null;
|
||||
|
||||
Match match = ApktoolVersionRegex.Match(rawVersion.Trim());
|
||||
if (!match.Success)
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
return new Version(match.Groups["version"].Value);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public string GetVersion()
|
||||
{
|
||||
using (JarProcess apktoolJar = new JarProcess(JavaPath, JarPath))
|
||||
{
|
||||
apktoolJar.EnableRaisingEvents = false;
|
||||
apktoolJar.Start("version");
|
||||
string version = apktoolJar.StandardOutput.ReadToEnd();
|
||||
apktoolJar.WaitForExit(3000);
|
||||
return version.Replace("\r\n", "");
|
||||
}
|
||||
}
|
||||
|
||||
public string GetVersionOld()
|
||||
{
|
||||
using (JarProcess apktoolJar = new JarProcess(JavaPath, JarPath))
|
||||
{
|
||||
@@ -205,6 +348,70 @@ namespace APKToolGUI
|
||||
return version.Replace("\r\n", "");
|
||||
}
|
||||
}
|
||||
|
||||
public void Cancel()
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (var process in Process.GetProcessesByName("java"))
|
||||
{
|
||||
using (process)
|
||||
{
|
||||
if (process.Id == Id)
|
||||
{
|
||||
ProcessUtils.KillAllProcessesSpawnedBy((uint)Id);
|
||||
process.Kill();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (InvalidOperationException ex)
|
||||
{
|
||||
Debug.WriteLine($"[Apktool] Process already exited: {ex.Message}");
|
||||
}
|
||||
catch (System.ComponentModel.Win32Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Apktool] Failed to access process: {ex.Message}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Apktool] Failed to cancel process: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
public new void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
protected new virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (!disposed)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
try
|
||||
{
|
||||
Cancel();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Apktool] Error during disposal: {ex.Message}");
|
||||
}
|
||||
finally
|
||||
{
|
||||
base.Dispose();
|
||||
}
|
||||
}
|
||||
disposed = true;
|
||||
}
|
||||
}
|
||||
|
||||
~Apktool()
|
||||
{
|
||||
Dispose(false);
|
||||
}
|
||||
}
|
||||
|
||||
public delegate void ApktoolDataReceivedEventHandler(Object sender, ApktoolDataReceivedEventArgs e);
|
||||
@@ -251,7 +458,7 @@ namespace APKToolGUI
|
||||
message = mCol[0].Groups[2].Value;
|
||||
break;
|
||||
case "I":
|
||||
eventType = ApktoolEventType.Information;
|
||||
eventType = ApktoolEventType.None;
|
||||
message = mCol[0].Groups[2].Value;
|
||||
break;
|
||||
case "Error":
|
||||
@@ -278,9 +485,20 @@ namespace APKToolGUI
|
||||
|
||||
public enum ApktoolEventType
|
||||
{
|
||||
Information,
|
||||
None,
|
||||
Success,
|
||||
Infomation,
|
||||
Warning,
|
||||
Error,
|
||||
Unknown
|
||||
}
|
||||
|
||||
enum ApktoolActionType
|
||||
{
|
||||
Decompile,
|
||||
Build,
|
||||
InstallFramework,
|
||||
ClearFramework,
|
||||
Null
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,16 +3,21 @@ using Java;
|
||||
using System.Diagnostics;
|
||||
using APKToolGUI.Properties;
|
||||
using System.IO;
|
||||
using APKToolGUI.Utils;
|
||||
|
||||
namespace APKToolGUI
|
||||
{
|
||||
public class Baksmali : JarProcess
|
||||
public class Baksmali : JarProcess, IDisposable
|
||||
{
|
||||
private bool disposed = false;
|
||||
|
||||
public new event BaksmaliExitedEventHandler Exited;
|
||||
|
||||
string _jarPath;
|
||||
public Baksmali(string javaPath, string jarPath)
|
||||
: base(javaPath, jarPath)
|
||||
{
|
||||
_jarPath = jarPath;
|
||||
base.Exited += Baksmali_Exited;
|
||||
OutputDataReceived += Baksmali_OutputDataReceived;
|
||||
ErrorDataReceived += Baksmali_ErrorDataReceived;
|
||||
@@ -63,12 +68,45 @@ namespace APKToolGUI
|
||||
Exited(this, new BaksmaliExitedEventArgs(ExitCode));
|
||||
}
|
||||
|
||||
public int Disassemble(string output)
|
||||
public void Cancel()
|
||||
{
|
||||
string inputFile = String.Format("\"{0}\"", Settings.Default.Baksmali_InputDexFile);
|
||||
try
|
||||
{
|
||||
foreach (var process in Process.GetProcessesByName("java"))
|
||||
{
|
||||
using (process)
|
||||
{
|
||||
if (process.Id == Id)
|
||||
{
|
||||
ProcessUtils.KillAllProcessesSpawnedBy((uint)Id);
|
||||
process.Kill();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (InvalidOperationException ex)
|
||||
{
|
||||
Debug.WriteLine($"[Baksmali] Process already exited: {ex.Message}");
|
||||
}
|
||||
catch (System.ComponentModel.Win32Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Baksmali] Failed to access process: {ex.Message}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Baksmali] Failed to cancel process: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
public int Disassemble(string input, string output)
|
||||
{
|
||||
string inputFile = String.Format("\"{0}\"", input);
|
||||
string keyOutputDir = String.Format("-o \"{0}\"", output);
|
||||
|
||||
string args = String.Format("d {0} {1}", inputFile, keyOutputDir);
|
||||
|
||||
Log.v("Baksmali CMD: " + _jarPath + " " + args);
|
||||
|
||||
Start(args);
|
||||
BeginOutputReadLine();
|
||||
BeginErrorReadLine();
|
||||
@@ -77,6 +115,40 @@ namespace APKToolGUI
|
||||
CancelErrorRead();
|
||||
return ExitCode;
|
||||
}
|
||||
|
||||
public new void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
protected new virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (!disposed)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
try
|
||||
{
|
||||
Cancel();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Baksmali] Error during disposal: {ex.Message}");
|
||||
}
|
||||
finally
|
||||
{
|
||||
base.Dispose();
|
||||
}
|
||||
}
|
||||
disposed = true;
|
||||
}
|
||||
}
|
||||
|
||||
~Baksmali()
|
||||
{
|
||||
Dispose(false);
|
||||
}
|
||||
}
|
||||
|
||||
public class BaksmaliExitedEventArgs : EventArgs
|
||||
|
||||
@@ -2,11 +2,15 @@
|
||||
using Java;
|
||||
using System.Diagnostics;
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Utils;
|
||||
using System.IO.Packaging;
|
||||
|
||||
namespace APKToolGUI
|
||||
{
|
||||
public class Signapk : JarProcess
|
||||
public class Signapk : JarProcess, IDisposable
|
||||
{
|
||||
private bool disposed = false;
|
||||
|
||||
public new event SignapkExitedEventHandler Exited;
|
||||
|
||||
private string lastSourceApk;
|
||||
@@ -39,9 +43,11 @@ namespace APKToolGUI
|
||||
}
|
||||
}
|
||||
|
||||
string _jarPath;
|
||||
public Signapk(string javaPath, string jarPath)
|
||||
: base(javaPath, jarPath)
|
||||
{
|
||||
_jarPath = jarPath;
|
||||
Exited += Signapk_Exited;
|
||||
OutputDataReceived += Signapk_OutputDataReceived;
|
||||
ErrorDataReceived += Signapk_ErrorDataReceived;
|
||||
@@ -65,6 +71,36 @@ namespace APKToolGUI
|
||||
Exited(this, new SignapkExitedEventArgs(base.ExitCode, lastSourceApk, lastOutApk));
|
||||
}
|
||||
|
||||
public void Cancel()
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (var process in Process.GetProcessesByName("java"))
|
||||
{
|
||||
using (process)
|
||||
{
|
||||
if (process.Id == Id)
|
||||
{
|
||||
ProcessUtils.KillAllProcessesSpawnedBy((uint)Id);
|
||||
process.Kill();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (InvalidOperationException ex)
|
||||
{
|
||||
Debug.WriteLine($"[Signapk] Process already exited: {ex.Message}");
|
||||
}
|
||||
catch (System.ComponentModel.Win32Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Signapk] Failed to access process: {ex.Message}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Signapk] Failed to cancel process: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
public int Sign(string input, string output)
|
||||
{
|
||||
lastSourceApk = input;
|
||||
@@ -73,14 +109,17 @@ namespace APKToolGUI
|
||||
//--key : pk file | --cert : pem
|
||||
string key = String.Format("--key \"{0}\" --cert \"{1}\"", Settings.Default.Sign_PrivateKey, Settings.Default.Sign_PublicKey);
|
||||
if (Settings.Default.Sign_UseKeystoreFile)
|
||||
key = String.Format("--ks \"{0}\" --ks-pass pass:{1}", Settings.Default.Sign_KeystoreFilePath, Settings.Default.Sign_KeystorePassword);
|
||||
{
|
||||
string keyPassword = String.IsNullOrEmpty(Settings.Default.Sign_KeyPassword) ? Settings.Default.Sign_KeystorePassword : Settings.Default.Sign_KeyPassword;
|
||||
key = String.Format("--ks \"{0}\" --ks-pass pass:{1} --key-pass pass:{2}", Settings.Default.Sign_KeystoreFilePath, Settings.Default.Sign_KeystorePassword, keyPassword);
|
||||
}
|
||||
|
||||
string alias = String.Format("--ks-key-alias CERT");
|
||||
if (Settings.Default.Sign_SetAlias)
|
||||
alias = String.Format("--ks-key-alias {0}", Settings.Default.Sign_Alias);
|
||||
|
||||
string outputDir = null;
|
||||
if (Settings.Default.Sign_UseOutputDir)
|
||||
if (Settings.Default.Sign_UseOutputDir || !Settings.Default.Sign_OverwriteInputFile)
|
||||
outputDir = String.Format("--out \"{0}\"", output);
|
||||
|
||||
string v1 = null;
|
||||
@@ -108,6 +147,9 @@ namespace APKToolGUI
|
||||
v4 = "--v4-signing-enabled false";
|
||||
|
||||
string args = String.Format("sign {0} {1} {2} {3} {4} {5} {6} \"{7}\"", key, alias, v1, v2, v3, v4, outputDir, lastSourceApk);
|
||||
|
||||
Log.v("Signapk CMD: " + _jarPath + " " + args);
|
||||
|
||||
Start(args);
|
||||
BeginOutputReadLine();
|
||||
BeginErrorReadLine();
|
||||
@@ -116,6 +158,53 @@ namespace APKToolGUI
|
||||
CancelErrorRead();
|
||||
return ExitCode;
|
||||
}
|
||||
|
||||
public string GetSignature(string apkFile)
|
||||
{
|
||||
using (JarProcess apktoolJar = new JarProcess(JavaPath, JarPath))
|
||||
{
|
||||
apktoolJar.EnableRaisingEvents = false;
|
||||
apktoolJar.Start($"verify --print-certs \"{apkFile}\"");
|
||||
string version = apktoolJar.StandardOutput.ReadToEnd();
|
||||
version += apktoolJar.StandardError.ReadToEnd();
|
||||
apktoolJar.WaitForExit();
|
||||
return version;
|
||||
}
|
||||
}
|
||||
|
||||
public new void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
protected new virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (!disposed)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
try
|
||||
{
|
||||
Cancel();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Signapk] Error during disposal: {ex.Message}");
|
||||
}
|
||||
finally
|
||||
{
|
||||
base.Dispose();
|
||||
}
|
||||
}
|
||||
disposed = true;
|
||||
}
|
||||
}
|
||||
|
||||
~Signapk()
|
||||
{
|
||||
Dispose(false);
|
||||
}
|
||||
}
|
||||
|
||||
public delegate void SignapkExitedEventHandler(object sender, SignapkExitedEventArgs e);
|
||||
|
||||
@@ -3,16 +3,21 @@ using Java;
|
||||
using System.Diagnostics;
|
||||
using APKToolGUI.Properties;
|
||||
using System.IO;
|
||||
using APKToolGUI.Utils;
|
||||
|
||||
namespace APKToolGUI
|
||||
{
|
||||
public class Smali : JarProcess
|
||||
public class Smali : JarProcess, IDisposable
|
||||
{
|
||||
private bool disposed = false;
|
||||
|
||||
public new event SmaliExitedEventHandler Exited;
|
||||
|
||||
string _jarPath;
|
||||
public Smali(string javaPath, string jarPath)
|
||||
: base(javaPath, jarPath)
|
||||
{
|
||||
_jarPath = jarPath;
|
||||
base.Exited += Smali_Exited;
|
||||
}
|
||||
|
||||
@@ -60,12 +65,45 @@ namespace APKToolGUI
|
||||
Exited(this, new SmaliExitedEventArgs(ExitCode));
|
||||
}
|
||||
|
||||
public int Assemble(string output)
|
||||
public void Cancel()
|
||||
{
|
||||
string inputFile = String.Format("\"{0}\"", Settings.Default.Smali_InputDir);
|
||||
try
|
||||
{
|
||||
foreach (var process in Process.GetProcessesByName("java"))
|
||||
{
|
||||
using (process)
|
||||
{
|
||||
if (process.Id == Id)
|
||||
{
|
||||
ProcessUtils.KillAllProcessesSpawnedBy((uint)Id);
|
||||
process.Kill();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (InvalidOperationException ex)
|
||||
{
|
||||
Debug.WriteLine($"[Smali] Process already exited: {ex.Message}");
|
||||
}
|
||||
catch (System.ComponentModel.Win32Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Smali] Failed to access process: {ex.Message}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Smali] Failed to cancel process: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
public int Assemble(string input, string output)
|
||||
{
|
||||
string inputFile = String.Format("\"{0}\"", input);
|
||||
string keyOutputDir = String.Format("-o \"{0}\"", output);
|
||||
|
||||
string args = String.Format("a {0} {1}", inputFile, keyOutputDir);
|
||||
|
||||
Log.v("Smali CMD: " + _jarPath + " " + args);
|
||||
|
||||
Start(args);
|
||||
BeginOutputReadLine();
|
||||
BeginErrorReadLine();
|
||||
@@ -74,6 +112,40 @@ namespace APKToolGUI
|
||||
CancelErrorRead();
|
||||
return ExitCode;
|
||||
}
|
||||
|
||||
public new void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
protected new virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (!disposed)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
try
|
||||
{
|
||||
Cancel();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Smali] Error during disposal: {ex.Message}");
|
||||
}
|
||||
finally
|
||||
{
|
||||
base.Dispose();
|
||||
}
|
||||
}
|
||||
disposed = true;
|
||||
}
|
||||
}
|
||||
|
||||
~Smali()
|
||||
{
|
||||
Dispose(false);
|
||||
}
|
||||
}
|
||||
|
||||
public class SmaliExitedEventArgs : EventArgs
|
||||
|
||||
@@ -6,9 +6,11 @@ using System.IO;
|
||||
|
||||
namespace APKToolGUI
|
||||
{
|
||||
public class Zipalign
|
||||
public class Zipalign : IDisposable
|
||||
{
|
||||
Process processZipalign;
|
||||
private bool disposed = false;
|
||||
|
||||
static class Keys
|
||||
{
|
||||
public const string CheckOnly = " -c";
|
||||
@@ -30,15 +32,17 @@ namespace APKToolGUI
|
||||
public event EventHandler Exited;
|
||||
public int ExitCode { get { return processZipalign.ExitCode; } }
|
||||
|
||||
string _zipalignFileName;
|
||||
public Zipalign(string zipalignFileName)
|
||||
{
|
||||
_zipalignFileName = zipalignFileName;
|
||||
processZipalign = new Process();
|
||||
processZipalign.EnableRaisingEvents = true;
|
||||
processZipalign.StartInfo.FileName = zipalignFileName;
|
||||
processZipalign.StartInfo.UseShellExecute = false; //отключаем использование оболочки, чтобы можно было читать данные вывода
|
||||
processZipalign.StartInfo.RedirectStandardOutput = true; // разрешаем перенаправление данных вывода
|
||||
processZipalign.StartInfo.RedirectStandardError = true; // разрешаем перенаправление данных вывода
|
||||
processZipalign.StartInfo.CreateNoWindow = true; //запрещаем создавать окно для запускаемой программы
|
||||
processZipalign.StartInfo.UseShellExecute = false; // Disable shell execution to read output data
|
||||
processZipalign.StartInfo.RedirectStandardOutput = true; // Allow output redirection
|
||||
processZipalign.StartInfo.RedirectStandardError = true; // Allow error redirection
|
||||
processZipalign.StartInfo.CreateNoWindow = true; // Do not create window for the launched program
|
||||
processZipalign.Exited += processZipalign_Exited;
|
||||
}
|
||||
|
||||
@@ -50,6 +54,70 @@ namespace APKToolGUI
|
||||
Exited(this, new EventArgs());
|
||||
}
|
||||
|
||||
public void Cancel()
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (var process in Process.GetProcessesByName("zipalign"))
|
||||
{
|
||||
using (process)
|
||||
{
|
||||
if (process.Id == processZipalign.Id)
|
||||
{
|
||||
ProcessUtils.KillAllProcessesSpawnedBy((uint)processZipalign.Id);
|
||||
process.Kill();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Zipalign] Cancel failed: {ex.Message}");
|
||||
// Process termination failure is not critical, so continue
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
protected virtual void Dispose(bool disposing)
|
||||
{
|
||||
if (!disposed)
|
||||
{
|
||||
if (disposing)
|
||||
{
|
||||
if (processZipalign != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!processZipalign.HasExited)
|
||||
{
|
||||
processZipalign.Kill();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Zipalign] Error disposing process: {ex.Message}");
|
||||
}
|
||||
finally
|
||||
{
|
||||
processZipalign.Dispose();
|
||||
processZipalign = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
disposed = true;
|
||||
}
|
||||
}
|
||||
|
||||
~Zipalign()
|
||||
{
|
||||
Dispose(false);
|
||||
}
|
||||
|
||||
public int Align(string input, string output)
|
||||
{
|
||||
string keyCheckOnly = null, keyVerbose = null, keyRecompress = null, keyOverwriteOutputFile = null, keyOutputFile = null;
|
||||
@@ -76,7 +144,7 @@ namespace APKToolGUI
|
||||
|
||||
string args = String.Format("{0}{1}{2}{3} {4} \"{5}\" {6}", keyCheckOnly, keyOverwriteOutputFile, keyVerbose, keyRecompress, Settings.Default.Zipalign_AlignmentInBytes, input, keyOutputFile);
|
||||
|
||||
Debug.WriteLine("Zipalign: " + args);
|
||||
Log.v("Zipalign: " + _zipalignFileName + " " + args);
|
||||
|
||||
processZipalign.StartInfo.Arguments = args;
|
||||
processZipalign.Start();
|
||||
@@ -84,11 +152,63 @@ namespace APKToolGUI
|
||||
processZipalign.BeginErrorReadLine();
|
||||
processZipalign.WaitForExit();
|
||||
|
||||
//if (!Settings.Default.Zipalign_CheckOnly && Settings.Default.Zipalign_OverwriteOutputFile)
|
||||
//{
|
||||
File.Delete(output);
|
||||
File.Move(PathUtils.GetDirectoryNameWithoutExtension(output) + "_align_temp.apk", output);
|
||||
//}
|
||||
// Handle temp file (only when not in CheckOnly mode)
|
||||
if (!Settings.Default.Zipalign_CheckOnly)
|
||||
{
|
||||
string tempFile = PathUtils.GetDirectoryNameWithoutExtension(output) + "_align_temp.apk";
|
||||
|
||||
try
|
||||
{
|
||||
// 1. Delete output file
|
||||
if (File.Exists(output))
|
||||
{
|
||||
File.Delete(output);
|
||||
Debug.WriteLine($"[Zipalign] Deleted existing output: {output}");
|
||||
}
|
||||
|
||||
// 2. Check temp file existence and move
|
||||
if (File.Exists(tempFile))
|
||||
{
|
||||
File.Move(tempFile, output);
|
||||
Debug.WriteLine($"[Zipalign] Moved temp file to output: {tempFile} -> {output}");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine($"[Zipalign] Warning: Temp file not found: {tempFile}");
|
||||
return 1; // Return failure code
|
||||
}
|
||||
}
|
||||
catch (IOException ex)
|
||||
{
|
||||
Debug.WriteLine($"[Zipalign] Failed to process output file: {ex.Message}");
|
||||
|
||||
// Attempt to cleanup temp file
|
||||
try
|
||||
{
|
||||
if (File.Exists(tempFile))
|
||||
{
|
||||
File.Delete(tempFile);
|
||||
Debug.WriteLine($"[Zipalign] Cleaned up temp file: {tempFile}");
|
||||
}
|
||||
}
|
||||
catch (Exception cleanupEx)
|
||||
{
|
||||
Debug.WriteLine($"[Zipalign] Failed to cleanup temp file: {cleanupEx.Message}");
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
catch (UnauthorizedAccessException ex)
|
||||
{
|
||||
Debug.WriteLine($"[Zipalign] Access denied: {ex.Message}");
|
||||
return 1;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[Zipalign] Unexpected error processing output: {ex.Message}");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return ExitCode;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,989 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Controls.Primitives;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace APKToolGUI.Controls
|
||||
{
|
||||
/// <summary>
|
||||
/// A virtualized, monospace, console-style log view that replaces the old <see cref="RichTextBox"/>.
|
||||
///
|
||||
/// Why it exists: RichTextBox renders a FlowDocument, which is NOT UI-virtualized — every line is a live
|
||||
/// layout element and any change re-measures the whole document on the UI thread (O(total lines)), which
|
||||
/// froze the GUI once the log held thousands of lines. This control keeps lines in a ring buffer and only
|
||||
/// draws the visual rows currently on screen (OnRender + FormattedText), so cost is O(visible).
|
||||
///
|
||||
/// Monospace (Consolas) makes the geometry trivial: column = (x - padding) / charWidth, and the word-wrap
|
||||
/// column is just viewportWidth / charWidth. Word wrap turns one logical line into several "visual rows";
|
||||
/// selection is stored in logical (line, column) coordinates so it survives re-wrapping on resize.
|
||||
///
|
||||
/// It implements <see cref="IScrollInfo"/> so a host <see cref="ScrollViewer"/> (CanContentScroll=True)
|
||||
/// drives scrolling and the scrollbars.
|
||||
/// </summary>
|
||||
public sealed class LogView : FrameworkElement, IScrollInfo
|
||||
{
|
||||
/// <summary>One coloured (optionally clickable) run of text within a line.</summary>
|
||||
public sealed class Segment
|
||||
{
|
||||
public string Text;
|
||||
public Brush Foreground;
|
||||
public bool Bold;
|
||||
public Action OnClick; // null => plain text; non-null => hyperlink
|
||||
|
||||
public Segment(string text, Brush foreground = null, bool bold = false, Action onClick = null)
|
||||
{
|
||||
Text = text ?? string.Empty;
|
||||
Foreground = foreground;
|
||||
Bold = bold;
|
||||
OnClick = onClick;
|
||||
}
|
||||
}
|
||||
|
||||
private sealed class Line
|
||||
{
|
||||
public readonly Segment[] Segments;
|
||||
public readonly int Length; // total character count across segments
|
||||
|
||||
// Wrap cache: start column of each visual row, for the wrap width it was computed at.
|
||||
public int[] RowStarts;
|
||||
public int WrapCols = int.MinValue;
|
||||
|
||||
public Line(Segment[] segments)
|
||||
{
|
||||
Segments = segments;
|
||||
int len = 0;
|
||||
for (int i = 0; i < segments.Length; i++)
|
||||
len += segments[i].Text.Length;
|
||||
Length = len;
|
||||
}
|
||||
|
||||
public string GetText()
|
||||
{
|
||||
if (Segments.Length == 1)
|
||||
return Segments[0].Text;
|
||||
StringBuilder sb = new StringBuilder(Length);
|
||||
for (int i = 0; i < Segments.Length; i++)
|
||||
sb.Append(Segments[i].Text);
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
// Bounded scrollback. Lines are trimmed from the front once the buffer grows past MaxLines + TrimSlack,
|
||||
// in one bulk RemoveRange so trimming is amortised O(1) per line.
|
||||
public const int MaxLines = 32767;
|
||||
private const int TrimSlack = 4096;
|
||||
|
||||
// Tab stop width in characters. Tabs are expanded to spaces on input so the buffer is truly fixed-width
|
||||
// (a raw '\t' renders as a wide gap that desyncs the charWidth-based geometry). 8 matches the tab stops
|
||||
// the existing log strings were authored for (e.g. AaptParser's "App name:\t\t" → column 24).
|
||||
private const int TabSize = 8;
|
||||
|
||||
private const double LeftPadding = 3.0;
|
||||
private static readonly int[] SingleRow = new int[] { 0 };
|
||||
|
||||
private readonly List<Line> _lines = new List<Line>();
|
||||
|
||||
// Wrap/visual-row layout (rebuilt lazily; kept live incrementally on append).
|
||||
private bool _wrapText = true;
|
||||
private readonly List<int> _rowOffsets = new List<int>(); // _rowOffsets[i] = visual rows before line i
|
||||
private int _totalRows;
|
||||
private int _maxLineLen;
|
||||
private bool _layoutBuilt;
|
||||
private bool _layoutDirty;
|
||||
private int _layoutWrapCols = int.MinValue;
|
||||
private readonly List<int> _wrapScratch = new List<int>();
|
||||
|
||||
// Cached font metrics (recomputed when font/dpi changes). Monospace => one char width fits all.
|
||||
private Typeface _typeface;
|
||||
private Typeface _boldTypeface;
|
||||
private double _charWidth;
|
||||
private double _lineHeight;
|
||||
private double _pixelsPerDip = 1.0;
|
||||
private bool _metricsValid;
|
||||
|
||||
// Selection, expressed as (line, column) caret positions. Anchor is where the drag began.
|
||||
private struct Pos
|
||||
{
|
||||
public int Line;
|
||||
public int Col;
|
||||
public Pos(int line, int col) { Line = line; Col = col; }
|
||||
public int CompareTo(Pos o)
|
||||
{
|
||||
if (Line != o.Line) return Line < o.Line ? -1 : 1;
|
||||
if (Col != o.Col) return Col < o.Col ? -1 : 1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
private Pos _selAnchor;
|
||||
private Pos _selCaret;
|
||||
private bool _hasSelection;
|
||||
private bool _selecting; // mouse drag in progress
|
||||
private Point _mouseDownPoint; // to distinguish click from drag (hyperlinks)
|
||||
|
||||
// One active search highlight (logical line/col/length), or _searchLine < 0 for none.
|
||||
private int _searchLine = -1;
|
||||
private int _searchCol;
|
||||
private int _searchLen;
|
||||
|
||||
// Auto-scroll: stay pinned to the bottom unless the user scrolls up.
|
||||
private bool _stickToBottom = true;
|
||||
|
||||
private static readonly Brush SelectionBrush = new SolidColorBrush(Color.FromArgb(120, 51, 153, 255));
|
||||
private static readonly Brush SearchBrush = new SolidColorBrush(Color.FromRgb(38, 79, 120));
|
||||
private static readonly Brush LinkBrush = new SolidColorBrush(Color.FromRgb(60, 166, 255)); // old #FF3CA6FF
|
||||
|
||||
static LogView()
|
||||
{
|
||||
SelectionBrush.Freeze();
|
||||
SearchBrush.Freeze();
|
||||
LinkBrush.Freeze();
|
||||
}
|
||||
|
||||
public LogView()
|
||||
{
|
||||
Focusable = true;
|
||||
ClipToBounds = true;
|
||||
Cursor = Cursors.IBeam;
|
||||
TextOptions.SetTextFormattingMode(this, TextFormattingMode.Display);
|
||||
SnapsToDevicePixels = true;
|
||||
FocusVisualStyle = null;
|
||||
|
||||
// Routed commands so Ctrl+C / Ctrl+A work via the command system (in addition to OnKeyDown),
|
||||
// and so the context menu items can bind to them and show their gestures.
|
||||
CommandBindings.Add(new CommandBinding(ApplicationCommands.Copy,
|
||||
(s, e) => { CopySelection(); e.Handled = true; },
|
||||
(s, e) => { e.CanExecute = HasSelection; }));
|
||||
CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll,
|
||||
(s, e) => { SelectAll(); e.Handled = true; },
|
||||
(s, e) => { e.CanExecute = _lines.Count > 0; }));
|
||||
|
||||
BuildContextMenu();
|
||||
}
|
||||
|
||||
private void BuildContextMenu()
|
||||
{
|
||||
ContextMenu menu = new ContextMenu();
|
||||
|
||||
MenuItem copy = new MenuItem { Header = "Copy", Command = ApplicationCommands.Copy, CommandTarget = this };
|
||||
MenuItem copyAll = new MenuItem { Header = "Copy all" };
|
||||
copyAll.Click += (s, e) => CopyAll();
|
||||
MenuItem selectAll = new MenuItem { Header = "Select all", Command = ApplicationCommands.SelectAll, CommandTarget = this };
|
||||
|
||||
menu.Items.Add(copy);
|
||||
menu.Items.Add(copyAll);
|
||||
menu.Items.Add(new Separator());
|
||||
menu.Items.Add(selectAll);
|
||||
ContextMenu = menu;
|
||||
}
|
||||
|
||||
/// <summary>When true (default), long lines wrap to the viewport width; when false they're one row each.</summary>
|
||||
public bool WrapText
|
||||
{
|
||||
get { return _wrapText; }
|
||||
set
|
||||
{
|
||||
if (_wrapText == value) return;
|
||||
_wrapText = value;
|
||||
_canHScroll = !value;
|
||||
_layoutDirty = true;
|
||||
InvalidateMeasure();
|
||||
InvalidateVisual();
|
||||
}
|
||||
}
|
||||
|
||||
#region Appearance dependency properties
|
||||
|
||||
public static readonly DependencyProperty FontFamilyProperty = DependencyProperty.Register(
|
||||
nameof(FontFamily), typeof(FontFamily), typeof(LogView),
|
||||
new FrameworkPropertyMetadata(new FontFamily("Consolas"),
|
||||
FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender,
|
||||
OnFontChanged));
|
||||
|
||||
public static readonly DependencyProperty FontSizeProperty = DependencyProperty.Register(
|
||||
nameof(FontSize), typeof(double), typeof(LogView),
|
||||
new FrameworkPropertyMetadata(13.0,
|
||||
FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender,
|
||||
OnFontChanged));
|
||||
|
||||
public static readonly DependencyProperty ForegroundProperty = DependencyProperty.Register(
|
||||
nameof(Foreground), typeof(Brush), typeof(LogView),
|
||||
new FrameworkPropertyMetadata(Brushes.White, FrameworkPropertyMetadataOptions.AffectsRender));
|
||||
|
||||
public static readonly DependencyProperty BackgroundProperty = DependencyProperty.Register(
|
||||
nameof(Background), typeof(Brush), typeof(LogView),
|
||||
new FrameworkPropertyMetadata(Brushes.Transparent, FrameworkPropertyMetadataOptions.AffectsRender));
|
||||
|
||||
public FontFamily FontFamily { get { return (FontFamily)GetValue(FontFamilyProperty); } set { SetValue(FontFamilyProperty, value); } }
|
||||
public double FontSize { get { return (double)GetValue(FontSizeProperty); } set { SetValue(FontSizeProperty, value); } }
|
||||
public Brush Foreground { get { return (Brush)GetValue(ForegroundProperty); } set { SetValue(ForegroundProperty, value); } }
|
||||
public Brush Background { get { return (Brush)GetValue(BackgroundProperty); } set { SetValue(BackgroundProperty, value); } }
|
||||
|
||||
private static void OnFontChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
LogView v = (LogView)d;
|
||||
v._metricsValid = false;
|
||||
v._layoutDirty = true;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Metrics
|
||||
|
||||
private void EnsureMetrics()
|
||||
{
|
||||
if (_metricsValid)
|
||||
return;
|
||||
|
||||
FontFamily family = FontFamily ?? new FontFamily("Consolas");
|
||||
_typeface = new Typeface(family, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal);
|
||||
_boldTypeface = new Typeface(family, FontStyles.Normal, FontWeights.Bold, FontStretches.Normal);
|
||||
|
||||
try { _pixelsPerDip = VisualTreeHelper.GetDpi(this).PixelsPerDip; }
|
||||
catch { _pixelsPerDip = 1.0; }
|
||||
|
||||
FormattedText probe = MakeText("0", _typeface, Brushes.White);
|
||||
_charWidth = probe.WidthIncludingTrailingWhitespace;
|
||||
if (_charWidth <= 0) _charWidth = FontSize * 0.6;
|
||||
_lineHeight = Math.Ceiling(probe.Height);
|
||||
if (_lineHeight <= 0) _lineHeight = Math.Ceiling(FontSize * 1.4);
|
||||
|
||||
_metricsValid = true;
|
||||
}
|
||||
|
||||
private FormattedText MakeText(string text, Typeface tf, Brush brush)
|
||||
{
|
||||
return new FormattedText(text, CultureInfo.CurrentUICulture, FlowDirection.LeftToRight,
|
||||
tf, FontSize, brush ?? Foreground ?? Brushes.White, _pixelsPerDip);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Wrap / visual-row layout
|
||||
|
||||
private int ComputeWrapCols()
|
||||
{
|
||||
if (!_wrapText || _charWidth <= 0)
|
||||
return int.MaxValue; // one row per line
|
||||
double avail = _viewport.Width - LeftPadding * 2;
|
||||
if (avail < _charWidth)
|
||||
return _viewport.Width <= 0 ? int.MaxValue : 1;
|
||||
return Math.Max(1, (int)Math.Floor(avail / _charWidth));
|
||||
}
|
||||
|
||||
private int[] WrapLine(Line line, int wrapCols)
|
||||
{
|
||||
if (wrapCols <= 0 || line.Length <= wrapCols)
|
||||
return SingleRow;
|
||||
|
||||
string t = line.GetText();
|
||||
int n = t.Length;
|
||||
List<int> rows = _wrapScratch;
|
||||
rows.Clear();
|
||||
rows.Add(0);
|
||||
int pos = 0;
|
||||
while (pos + wrapCols < n)
|
||||
{
|
||||
int limit = pos + wrapCols;
|
||||
int br = -1;
|
||||
for (int k = limit; k > pos; k--)
|
||||
if (t[k] == ' ') { br = k; break; }
|
||||
|
||||
int next = (br > pos) ? br + 1 : limit; // break after the space, else hard break
|
||||
if (next <= pos) next = pos + 1;
|
||||
rows.Add(next);
|
||||
pos = next;
|
||||
}
|
||||
return rows.ToArray();
|
||||
}
|
||||
|
||||
private void EnsureWrapped(Line line, int wrapCols)
|
||||
{
|
||||
if (line.RowStarts != null && line.WrapCols == wrapCols)
|
||||
return;
|
||||
line.RowStarts = WrapLine(line, wrapCols);
|
||||
line.WrapCols = wrapCols;
|
||||
}
|
||||
|
||||
private void EnsureLayout()
|
||||
{
|
||||
EnsureMetrics();
|
||||
int wrapCols = ComputeWrapCols();
|
||||
if (_layoutBuilt && !_layoutDirty && wrapCols == _layoutWrapCols)
|
||||
return;
|
||||
|
||||
_rowOffsets.Clear();
|
||||
int total = 0;
|
||||
int maxLen = 0;
|
||||
for (int i = 0; i < _lines.Count; i++)
|
||||
{
|
||||
_rowOffsets.Add(total);
|
||||
Line ln = _lines[i];
|
||||
EnsureWrapped(ln, wrapCols);
|
||||
total += ln.RowStarts.Length;
|
||||
if (ln.Length > maxLen) maxLen = ln.Length;
|
||||
}
|
||||
_totalRows = total;
|
||||
_maxLineLen = maxLen;
|
||||
_layoutWrapCols = wrapCols;
|
||||
_layoutDirty = false;
|
||||
_layoutBuilt = true;
|
||||
}
|
||||
|
||||
private void RowToLine(int visualRow, out int line, out int rowInLine)
|
||||
{
|
||||
int count = _lines.Count;
|
||||
int lo = 0, hi = count - 1, ans = 0;
|
||||
while (lo <= hi)
|
||||
{
|
||||
int mid = (lo + hi) >> 1;
|
||||
if (_rowOffsets[mid] <= visualRow) { ans = mid; lo = mid + 1; }
|
||||
else hi = mid - 1;
|
||||
}
|
||||
line = ans;
|
||||
rowInLine = visualRow - _rowOffsets[ans];
|
||||
}
|
||||
|
||||
private static void RowRange(Line line, int rowInLine, out int start, out int end)
|
||||
{
|
||||
start = line.RowStarts[rowInLine];
|
||||
end = (rowInLine + 1 < line.RowStarts.Length) ? line.RowStarts[rowInLine + 1] : line.Length;
|
||||
}
|
||||
|
||||
private double ExtentWidthValue
|
||||
{
|
||||
get { return _wrapText ? _viewport.Width : (LeftPadding * 2 + _maxLineLen * _charWidth); }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public log API
|
||||
|
||||
public void AppendLine(string text, Brush color = null, bool bold = false)
|
||||
{
|
||||
AddSegments(new[] { new Segment(text ?? string.Empty, color, bold) });
|
||||
}
|
||||
|
||||
public void AppendSegments(IList<Segment> segments)
|
||||
{
|
||||
if (segments == null || segments.Count == 0) { AddSegments(new[] { new Segment(string.Empty) }); return; }
|
||||
Segment[] arr = new Segment[segments.Count];
|
||||
for (int i = 0; i < segments.Count; i++) arr[i] = segments[i];
|
||||
AddSegments(arr);
|
||||
}
|
||||
|
||||
public void SetText(string text)
|
||||
{
|
||||
Clear();
|
||||
AppendLine(text);
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
_lines.Clear();
|
||||
_rowOffsets.Clear();
|
||||
_totalRows = 0;
|
||||
_maxLineLen = 0;
|
||||
_layoutBuilt = false;
|
||||
_layoutDirty = true;
|
||||
_hasSelection = false;
|
||||
_selecting = false;
|
||||
_searchLine = -1;
|
||||
_stickToBottom = true;
|
||||
_offset = new Vector(0, 0);
|
||||
InvalidateMeasure();
|
||||
InvalidateVisual();
|
||||
if (ScrollOwner != null) ScrollOwner.InvalidateScrollInfo();
|
||||
}
|
||||
|
||||
public string GetText()
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < _lines.Count; i++)
|
||||
{
|
||||
if (i > 0) sb.Append("\r\n");
|
||||
sb.Append(_lines[i].GetText());
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
public int LineCount { get { return _lines.Count; } }
|
||||
|
||||
public string GetLineText(int index)
|
||||
{
|
||||
return (index >= 0 && index < _lines.Count) ? _lines[index].GetText() : string.Empty;
|
||||
}
|
||||
|
||||
private static string StripCr(string s)
|
||||
{
|
||||
return s.IndexOf('\r') >= 0 ? s.Replace("\r", string.Empty) : s;
|
||||
}
|
||||
|
||||
// Single normalization point for ALL appends (plain text, bold, and hyperlink lines, whether they
|
||||
// arrive via the batched RichBox pipeline or directly). Splits embedded '\n' into separate visual
|
||||
// lines (otherwise FormattedText would draw several lines stacked inside one row's height — the
|
||||
// "overlapping text" bug), strips '\r', and expands tabs.
|
||||
private void AddSegments(Segment[] segments)
|
||||
{
|
||||
bool hasNl = false;
|
||||
for (int i = 0; i < segments.Length; i++)
|
||||
if (segments[i].Text.IndexOf('\n') >= 0) { hasNl = true; break; }
|
||||
|
||||
if (!hasNl)
|
||||
{
|
||||
AddLine(new Line(ExpandTabs(StripCrSegments(segments))));
|
||||
return;
|
||||
}
|
||||
|
||||
List<Segment> cur = new List<Segment>();
|
||||
for (int i = 0; i < segments.Length; i++)
|
||||
{
|
||||
Segment s = segments[i];
|
||||
string[] parts = s.Text.Split('\n');
|
||||
for (int p = 0; p < parts.Length; p++)
|
||||
{
|
||||
if (p > 0)
|
||||
{
|
||||
AddLine(new Line(ExpandTabs(cur.ToArray())));
|
||||
cur.Clear();
|
||||
}
|
||||
string piece = StripCr(parts[p]);
|
||||
if (piece.Length > 0)
|
||||
cur.Add(new Segment(piece, s.Foreground, s.Bold, s.OnClick));
|
||||
}
|
||||
}
|
||||
AddLine(new Line(ExpandTabs(cur.ToArray())));
|
||||
}
|
||||
|
||||
private static Segment[] StripCrSegments(Segment[] segments)
|
||||
{
|
||||
bool hasCr = false;
|
||||
for (int i = 0; i < segments.Length; i++)
|
||||
if (segments[i].Text.IndexOf('\r') >= 0) { hasCr = true; break; }
|
||||
if (!hasCr) return segments;
|
||||
|
||||
Segment[] result = new Segment[segments.Length];
|
||||
for (int i = 0; i < segments.Length; i++)
|
||||
{
|
||||
Segment s = segments[i];
|
||||
result[i] = s.Text.IndexOf('\r') >= 0
|
||||
? new Segment(StripCr(s.Text), s.Foreground, s.Bold, s.OnClick)
|
||||
: s;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static Segment[] ExpandTabs(Segment[] segments)
|
||||
{
|
||||
bool hasTab = false;
|
||||
for (int i = 0; i < segments.Length; i++)
|
||||
if (segments[i].Text.IndexOf('\t') >= 0) { hasTab = true; break; }
|
||||
if (!hasTab) return segments;
|
||||
|
||||
Segment[] result = new Segment[segments.Length];
|
||||
int col = 0;
|
||||
for (int i = 0; i < segments.Length; i++)
|
||||
{
|
||||
Segment s = segments[i];
|
||||
if (s.Text.IndexOf('\t') < 0) { result[i] = s; col += s.Text.Length; continue; }
|
||||
|
||||
StringBuilder sb = new StringBuilder(s.Text.Length + 8);
|
||||
for (int c = 0; c < s.Text.Length; c++)
|
||||
{
|
||||
char ch = s.Text[c];
|
||||
if (ch == '\t')
|
||||
{
|
||||
int spaces = TabSize - (col % TabSize);
|
||||
sb.Append(' ', spaces);
|
||||
col += spaces;
|
||||
}
|
||||
else { sb.Append(ch); col++; }
|
||||
}
|
||||
result[i] = new Segment(sb.ToString(), s.Foreground, s.Bold, s.OnClick);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private void AddLine(Line line)
|
||||
{
|
||||
_lines.Add(line);
|
||||
|
||||
if (_lines.Count > MaxLines + TrimSlack)
|
||||
{
|
||||
int remove = _lines.Count - MaxLines;
|
||||
_lines.RemoveRange(0, remove);
|
||||
ShiftAfterTrim(remove);
|
||||
_layoutDirty = true; // front removed: rebuild prefix table
|
||||
}
|
||||
|
||||
if (line.Length > _maxLineLen) _maxLineLen = line.Length;
|
||||
|
||||
// Keep the visual-row layout live incrementally when it's valid, so autoscroll and the scrollbar
|
||||
// stay correct without an O(n) rebuild per line. Otherwise mark it for a lazy rebuild.
|
||||
if (_layoutBuilt && !_layoutDirty)
|
||||
{
|
||||
_rowOffsets.Add(_totalRows);
|
||||
EnsureWrapped(line, _layoutWrapCols);
|
||||
_totalRows += line.RowStarts.Length;
|
||||
}
|
||||
else
|
||||
{
|
||||
_layoutDirty = true;
|
||||
}
|
||||
|
||||
InvalidateMeasure();
|
||||
InvalidateVisual();
|
||||
if (ScrollOwner != null) ScrollOwner.InvalidateScrollInfo();
|
||||
|
||||
// Pin to the bottom immediately using the live row count.
|
||||
if (_stickToBottom && !HasSelection && _viewport.Height > 0 && _lineHeight > 0)
|
||||
{
|
||||
EnsureLayout();
|
||||
double maxY = Math.Max(0, _totalRows * _lineHeight - _viewport.Height);
|
||||
if (Math.Abs(maxY - _offset.Y) > 0.001)
|
||||
{
|
||||
_offset.Y = maxY;
|
||||
if (ScrollOwner != null) ScrollOwner.InvalidateScrollInfo();
|
||||
InvalidateVisual();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ShiftAfterTrim(int removedLines)
|
||||
{
|
||||
if (_searchLine >= 0)
|
||||
{
|
||||
_searchLine -= removedLines;
|
||||
if (_searchLine < 0) _searchLine = -1;
|
||||
}
|
||||
if (_hasSelection)
|
||||
{
|
||||
_selAnchor.Line -= removedLines;
|
||||
_selCaret.Line -= removedLines;
|
||||
if (_selAnchor.Line < 0 || _selCaret.Line < 0)
|
||||
_hasSelection = false;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Search support
|
||||
|
||||
public void SetSearchHighlight(int line, int col, int length)
|
||||
{
|
||||
_searchLine = line;
|
||||
_searchCol = col;
|
||||
_searchLen = length;
|
||||
InvalidateVisual();
|
||||
}
|
||||
|
||||
public void ClearSearchHighlight()
|
||||
{
|
||||
_searchLine = -1;
|
||||
InvalidateVisual();
|
||||
}
|
||||
|
||||
/// <summary>Scroll so the given logical line sits roughly in the middle of the viewport.</summary>
|
||||
public void ScrollLineIntoView(int line)
|
||||
{
|
||||
if (line < 0) return;
|
||||
EnsureLayout();
|
||||
if (line >= _rowOffsets.Count) return;
|
||||
double target = _rowOffsets[line] * _lineHeight - _viewport.Height / 2;
|
||||
SetVerticalOffset(target);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Rendering
|
||||
|
||||
protected override void OnRender(DrawingContext dc)
|
||||
{
|
||||
EnsureLayout();
|
||||
|
||||
double w = RenderSize.Width, h = RenderSize.Height;
|
||||
dc.DrawRectangle(Background ?? Brushes.Transparent, null, new Rect(0, 0, w, h));
|
||||
|
||||
if (_lines.Count == 0 || _lineHeight <= 0 || _totalRows == 0)
|
||||
return;
|
||||
|
||||
int firstRow = (int)Math.Floor(_offset.Y / _lineHeight);
|
||||
int lastRow = (int)Math.Ceiling((_offset.Y + h) / _lineHeight);
|
||||
if (firstRow < 0) firstRow = 0;
|
||||
if (lastRow > _totalRows) lastRow = _totalRows;
|
||||
|
||||
Pos selLo = default(Pos), selHi = default(Pos);
|
||||
bool hasSel = _hasSelection && _selAnchor.CompareTo(_selCaret) != 0;
|
||||
if (hasSel)
|
||||
{
|
||||
if (_selAnchor.CompareTo(_selCaret) <= 0) { selLo = _selAnchor; selHi = _selCaret; }
|
||||
else { selLo = _selCaret; selHi = _selAnchor; }
|
||||
}
|
||||
|
||||
double baseX = LeftPadding - _offset.X;
|
||||
|
||||
int line, rowInLine;
|
||||
RowToLine(firstRow, out line, out rowInLine);
|
||||
|
||||
for (int vr = firstRow; vr < lastRow; vr++)
|
||||
{
|
||||
// Advance to the line owning this visual row.
|
||||
while (line < _lines.Count - 1 && vr >= _rowOffsets[line] + _lines[line].RowStarts.Length)
|
||||
{
|
||||
line++;
|
||||
rowInLine = 0;
|
||||
}
|
||||
rowInLine = vr - _rowOffsets[line];
|
||||
|
||||
Line ln = _lines[line];
|
||||
int rs, re;
|
||||
RowRange(ln, rowInLine, out rs, out re);
|
||||
double y = vr * _lineHeight - _offset.Y;
|
||||
|
||||
// Selection highlight (logical columns intersected with this row).
|
||||
if (hasSel && line >= selLo.Line && line <= selHi.Line)
|
||||
{
|
||||
int from = (line == selLo.Line) ? selLo.Col : 0;
|
||||
int to = (line == selHi.Line) ? selHi.Col : ln.Length;
|
||||
int a = Math.Max(from, rs), b = Math.Min(to, re);
|
||||
if (b > a)
|
||||
dc.DrawRectangle(SelectionBrush, null,
|
||||
new Rect(baseX + (a - rs) * _charWidth, y, (b - a) * _charWidth, _lineHeight));
|
||||
}
|
||||
|
||||
// Search highlight.
|
||||
if (_searchLine == line && _searchLen > 0)
|
||||
{
|
||||
int a = Math.Max(_searchCol, rs), b = Math.Min(_searchCol + _searchLen, re);
|
||||
if (b > a)
|
||||
dc.DrawRectangle(SearchBrush, null,
|
||||
new Rect(baseX + (a - rs) * _charWidth, y, (b - a) * _charWidth, _lineHeight));
|
||||
}
|
||||
|
||||
// Text: draw each segment piece that overlaps this row's [rs, re).
|
||||
Segment[] segs = ln.Segments;
|
||||
int segCol = 0;
|
||||
for (int s = 0; s < segs.Length; s++)
|
||||
{
|
||||
Segment seg = segs[s];
|
||||
int segStart = segCol;
|
||||
int segEnd = segCol + seg.Text.Length;
|
||||
segCol = segEnd;
|
||||
|
||||
int a = Math.Max(segStart, rs), b = Math.Min(segEnd, re);
|
||||
if (b <= a) continue;
|
||||
|
||||
string sub = seg.Text.Substring(a - segStart, b - a);
|
||||
bool isLink = seg.OnClick != null;
|
||||
Brush brush = isLink ? LinkBrush : (seg.Foreground ?? Foreground ?? Brushes.White);
|
||||
Typeface tf = seg.Bold ? _boldTypeface : _typeface;
|
||||
|
||||
double x = baseX + (a - rs) * _charWidth;
|
||||
dc.DrawText(MakeText(sub, tf, brush), new Point(x, y));
|
||||
|
||||
if (isLink)
|
||||
{
|
||||
double uy = y + _lineHeight - 1.5;
|
||||
dc.DrawLine(new Pen(brush, 1.0), new Point(x, uy), new Point(x + (b - a) * _charWidth, uy));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override Size MeasureOverride(Size availableSize)
|
||||
{
|
||||
EnsureMetrics();
|
||||
double vw = double.IsInfinity(availableSize.Width) ? 0 : availableSize.Width;
|
||||
double vh = double.IsInfinity(availableSize.Height) ? 0 : availableSize.Height;
|
||||
_viewport = new Size(vw, vh);
|
||||
EnsureLayout();
|
||||
VerifyScrollData(_viewport, new Size(ExtentWidthValue, _totalRows * _lineHeight));
|
||||
return new Size(vw, vh);
|
||||
}
|
||||
|
||||
protected override Size ArrangeOverride(Size finalSize)
|
||||
{
|
||||
EnsureMetrics();
|
||||
_viewport = finalSize;
|
||||
EnsureLayout();
|
||||
VerifyScrollData(finalSize, new Size(ExtentWidthValue, _totalRows * _lineHeight));
|
||||
return finalSize;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Mouse / keyboard interaction
|
||||
|
||||
private bool PointToLineCol(Point p, out int line, out int col)
|
||||
{
|
||||
line = 0; col = 0;
|
||||
EnsureLayout();
|
||||
if (_lines.Count == 0 || _lineHeight <= 0 || _totalRows == 0)
|
||||
return false;
|
||||
|
||||
int vr = (int)Math.Floor((p.Y + _offset.Y) / _lineHeight);
|
||||
if (vr < 0) vr = 0;
|
||||
if (vr >= _totalRows) vr = _totalRows - 1;
|
||||
|
||||
int rowInLine;
|
||||
RowToLine(vr, out line, out rowInLine);
|
||||
int rs, re;
|
||||
RowRange(_lines[line], rowInLine, out rs, out re);
|
||||
|
||||
int colInRow = (int)Math.Round((p.X - LeftPadding + _offset.X) / _charWidth);
|
||||
if (colInRow < 0) colInRow = 0;
|
||||
col = rs + colInRow;
|
||||
if (col > re) col = re;
|
||||
if (col > _lines[line].Length) col = _lines[line].Length;
|
||||
return true;
|
||||
}
|
||||
|
||||
private Pos PointToPos(Point p)
|
||||
{
|
||||
int line, col;
|
||||
PointToLineCol(p, out line, out col);
|
||||
return new Pos(line, col);
|
||||
}
|
||||
|
||||
private Action HitTestLink(Point p)
|
||||
{
|
||||
EnsureLayout();
|
||||
if (_lines.Count == 0 || _lineHeight <= 0 || _totalRows == 0)
|
||||
return null;
|
||||
|
||||
int vr = (int)Math.Floor((p.Y + _offset.Y) / _lineHeight);
|
||||
if (vr < 0 || vr >= _totalRows) return null;
|
||||
|
||||
int line, rowInLine;
|
||||
RowToLine(vr, out line, out rowInLine);
|
||||
int rs, re;
|
||||
RowRange(_lines[line], rowInLine, out rs, out re);
|
||||
|
||||
int colInRow = (int)Math.Floor((p.X - LeftPadding + _offset.X) / _charWidth);
|
||||
if (colInRow < 0) return null;
|
||||
int col = rs + colInRow;
|
||||
if (col >= re || col >= _lines[line].Length) return null;
|
||||
|
||||
int segCol = 0;
|
||||
Segment[] segs = _lines[line].Segments;
|
||||
for (int s = 0; s < segs.Length; s++)
|
||||
{
|
||||
int len = segs[s].Text.Length;
|
||||
if (col >= segCol && col < segCol + len)
|
||||
return segs[s].OnClick;
|
||||
segCol += len;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
protected override void OnMouseMove(MouseEventArgs e)
|
||||
{
|
||||
base.OnMouseMove(e);
|
||||
Point p = e.GetPosition(this);
|
||||
|
||||
if (_selecting && e.LeftButton == MouseButtonState.Pressed)
|
||||
{
|
||||
_selCaret = PointToPos(p);
|
||||
_hasSelection = true;
|
||||
if (p.Y < 0) SetVerticalOffset(_offset.Y - _lineHeight);
|
||||
else if (p.Y > RenderSize.Height) SetVerticalOffset(_offset.Y + _lineHeight);
|
||||
InvalidateVisual();
|
||||
return;
|
||||
}
|
||||
|
||||
Cursor = HitTestLink(p) != null ? Cursors.Hand : Cursors.IBeam;
|
||||
}
|
||||
|
||||
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
|
||||
{
|
||||
base.OnMouseLeftButtonDown(e);
|
||||
Keyboard.Focus(this);
|
||||
_mouseDownPoint = e.GetPosition(this);
|
||||
_selAnchor = _selCaret = PointToPos(_mouseDownPoint);
|
||||
_hasSelection = false;
|
||||
_selecting = true;
|
||||
CaptureMouse();
|
||||
InvalidateVisual();
|
||||
}
|
||||
|
||||
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
|
||||
{
|
||||
base.OnMouseLeftButtonUp(e);
|
||||
_selecting = false;
|
||||
ReleaseMouseCapture();
|
||||
|
||||
Point p = e.GetPosition(this);
|
||||
double moved = Math.Abs(p.X - _mouseDownPoint.X) + Math.Abs(p.Y - _mouseDownPoint.Y);
|
||||
if (moved < 3)
|
||||
{
|
||||
Action onClick = HitTestLink(p);
|
||||
if (onClick != null)
|
||||
{
|
||||
try { onClick(); }
|
||||
catch (Exception ex) { Debug.WriteLine("LogView link click error: " + ex); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnMouseWheel(MouseWheelEventArgs e)
|
||||
{
|
||||
base.OnMouseWheel(e);
|
||||
double lines = e.Delta / 120.0 * 3.0;
|
||||
SetVerticalOffset(_offset.Y - lines * _lineHeight);
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
protected override void OnKeyDown(KeyEventArgs e)
|
||||
{
|
||||
base.OnKeyDown(e);
|
||||
bool ctrl = (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control;
|
||||
if (ctrl && e.Key == Key.C) { CopySelection(); e.Handled = true; }
|
||||
else if (ctrl && e.Key == Key.A) { SelectAll(); e.Handled = true; }
|
||||
else if (e.Key == Key.PageDown) { PageDown(); e.Handled = true; }
|
||||
else if (e.Key == Key.PageUp) { PageUp(); e.Handled = true; }
|
||||
else if (e.Key == Key.Home && ctrl) { ScrollToHome(); e.Handled = true; }
|
||||
else if (e.Key == Key.End && ctrl) { ScrollToEnd(); e.Handled = true; }
|
||||
}
|
||||
|
||||
public void SelectAll()
|
||||
{
|
||||
if (_lines.Count == 0) return;
|
||||
_selAnchor = new Pos(0, 0);
|
||||
_selCaret = new Pos(_lines.Count - 1, _lines[_lines.Count - 1].Length);
|
||||
_hasSelection = true;
|
||||
InvalidateVisual();
|
||||
}
|
||||
|
||||
public bool HasSelection { get { return _hasSelection && _selAnchor.CompareTo(_selCaret) != 0; } }
|
||||
|
||||
public void CopySelection()
|
||||
{
|
||||
string text = GetSelectedText();
|
||||
if (string.IsNullOrEmpty(text)) return;
|
||||
try { Clipboard.SetText(text); }
|
||||
catch (Exception ex) { Debug.WriteLine("LogView copy error: " + ex); }
|
||||
}
|
||||
|
||||
/// <summary>Copy the entire log to the clipboard (regardless of selection).</summary>
|
||||
public void CopyAll()
|
||||
{
|
||||
string text = GetText();
|
||||
if (string.IsNullOrEmpty(text)) return;
|
||||
try { Clipboard.SetText(text); }
|
||||
catch (Exception ex) { Debug.WriteLine("LogView copy-all error: " + ex); }
|
||||
}
|
||||
|
||||
private string GetSelectedText()
|
||||
{
|
||||
if (!HasSelection) return string.Empty;
|
||||
Pos lo, hi;
|
||||
if (_selAnchor.CompareTo(_selCaret) <= 0) { lo = _selAnchor; hi = _selCaret; }
|
||||
else { lo = _selCaret; hi = _selAnchor; }
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = lo.Line; i <= hi.Line && i < _lines.Count; i++)
|
||||
{
|
||||
string t = _lines[i].GetText();
|
||||
int from = (i == lo.Line) ? Math.Min(lo.Col, t.Length) : 0;
|
||||
int to = (i == hi.Line) ? Math.Min(hi.Col, t.Length) : t.Length;
|
||||
if (to > from) sb.Append(t.Substring(from, to - from));
|
||||
if (i != hi.Line) sb.Append("\r\n");
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IScrollInfo
|
||||
|
||||
private Vector _offset;
|
||||
private Size _viewport;
|
||||
private Size _extent;
|
||||
private bool _canHScroll;
|
||||
private bool _canVScroll = true;
|
||||
|
||||
public bool CanVerticallyScroll { get { return _canVScroll; } set { _canVScroll = value; } }
|
||||
public bool CanHorizontallyScroll { get { return _canHScroll; } set { _canHScroll = value; } }
|
||||
|
||||
public double ExtentWidth { get { return _extent.Width; } }
|
||||
public double ExtentHeight { get { return _extent.Height; } }
|
||||
public double ViewportWidth { get { return _viewport.Width; } }
|
||||
public double ViewportHeight { get { return _viewport.Height; } }
|
||||
public double HorizontalOffset { get { return _offset.X; } }
|
||||
public double VerticalOffset { get { return _offset.Y; } }
|
||||
public ScrollViewer ScrollOwner { get; set; }
|
||||
|
||||
private void VerifyScrollData(Size viewport, Size extent)
|
||||
{
|
||||
bool changed = viewport != _viewport || extent != _extent;
|
||||
_viewport = viewport;
|
||||
_extent = extent;
|
||||
|
||||
double maxY = Math.Max(0, _extent.Height - _viewport.Height);
|
||||
double maxX = Math.Max(0, _extent.Width - _viewport.Width);
|
||||
// Stay pinned to the bottom as new rows extend the document — unless the user scrolled up or is
|
||||
// holding a selection (don't yank content out from under a drag-select).
|
||||
bool pin = _stickToBottom && !HasSelection;
|
||||
double cy = pin ? maxY : Math.Min(Math.Max(0, _offset.Y), maxY);
|
||||
double cx = Math.Min(Math.Max(0, _offset.X), maxX);
|
||||
if (cy != _offset.Y || cx != _offset.X) { _offset.X = cx; _offset.Y = cy; changed = true; }
|
||||
|
||||
if (changed && ScrollOwner != null)
|
||||
ScrollOwner.InvalidateScrollInfo();
|
||||
}
|
||||
|
||||
public void SetVerticalOffset(double offset)
|
||||
{
|
||||
double maxY = Math.Max(0, _extent.Height - _viewport.Height);
|
||||
if (offset > maxY) offset = maxY;
|
||||
if (offset < 0) offset = 0;
|
||||
_stickToBottom = offset >= maxY - 0.5;
|
||||
if (Math.Abs(offset - _offset.Y) < 0.001) return;
|
||||
_offset.Y = offset;
|
||||
if (ScrollOwner != null) ScrollOwner.InvalidateScrollInfo();
|
||||
InvalidateVisual();
|
||||
}
|
||||
|
||||
public void SetHorizontalOffset(double offset)
|
||||
{
|
||||
double maxX = Math.Max(0, _extent.Width - _viewport.Width);
|
||||
if (offset > maxX) offset = maxX;
|
||||
if (offset < 0) offset = 0;
|
||||
if (Math.Abs(offset - _offset.X) < 0.001) return;
|
||||
_offset.X = offset;
|
||||
if (ScrollOwner != null) ScrollOwner.InvalidateScrollInfo();
|
||||
InvalidateVisual();
|
||||
}
|
||||
|
||||
public void LineUp() { SetVerticalOffset(_offset.Y - _lineHeight); }
|
||||
public void LineDown() { SetVerticalOffset(_offset.Y + _lineHeight); }
|
||||
public void LineLeft() { SetHorizontalOffset(_offset.X - _charWidth); }
|
||||
public void LineRight() { SetHorizontalOffset(_offset.X + _charWidth); }
|
||||
public void PageUp() { SetVerticalOffset(_offset.Y - _viewport.Height); }
|
||||
public void PageDown() { SetVerticalOffset(_offset.Y + _viewport.Height); }
|
||||
public void PageLeft() { SetHorizontalOffset(_offset.X - _viewport.Width); }
|
||||
public void PageRight() { SetHorizontalOffset(_offset.X + _viewport.Width); }
|
||||
public void MouseWheelUp() { SetVerticalOffset(_offset.Y - 3 * _lineHeight); }
|
||||
public void MouseWheelDown() { SetVerticalOffset(_offset.Y + 3 * _lineHeight); }
|
||||
public void MouseWheelLeft() { SetHorizontalOffset(_offset.X - 3 * _charWidth); }
|
||||
public void MouseWheelRight() { SetHorizontalOffset(_offset.X + 3 * _charWidth); }
|
||||
|
||||
public Rect MakeVisible(Visual visual, Rect rectangle) { return rectangle; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Scroll helpers (RichTextBox-compatible names)
|
||||
|
||||
public void ScrollToEnd() { SetVerticalOffset(double.MaxValue); }
|
||||
public void ScrollToHome() { SetVerticalOffset(0); }
|
||||
public void ScrollToVerticalOffset(double offset) { SetVerticalOffset(offset); }
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,278 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows.Forms;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace APKToolGUI.Controls
|
||||
{
|
||||
/// <summary>
|
||||
/// Application theme selection.
|
||||
/// <para>
|
||||
/// The integer values intentionally match the stored <c>Settings.Default.Theme</c>
|
||||
/// values and the order of the theme combo box (0 = Auto, 1 = Light, 2 = Dark),
|
||||
/// so existing config files keep working. This is a drop-in replacement for the
|
||||
/// former <c>Dark.Net.Theme</c> enum.
|
||||
/// </para>
|
||||
/// </summary>
|
||||
public enum Theme
|
||||
{
|
||||
Auto = 0,
|
||||
Light = 1,
|
||||
Dark = 2
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Self-contained dark mode support for Windows 10 (1809 / build 17763 and newer)
|
||||
/// and Windows 11, written from scratch to replace the external <c>DarkNet</c> package.
|
||||
///
|
||||
/// <list type="bullet">
|
||||
/// <item>Immersive dark title bars via <c>DwmSetWindowAttribute</c>.</item>
|
||||
/// <item>Dark Win32 popup/menu rendering via the undocumented uxtheme app-mode ordinals.</item>
|
||||
/// <item>Dark scroll bars and combo box drop-downs via <c>SetWindowTheme</c>.</item>
|
||||
/// </list>
|
||||
///
|
||||
/// All methods are safe no-ops on operating systems that do not support these APIs,
|
||||
/// so callers do not need to guard them with an OS-version check.
|
||||
/// </summary>
|
||||
public static class NativeDarkMode
|
||||
{
|
||||
#region Native interop
|
||||
|
||||
[DllImport("dwmapi.dll")]
|
||||
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attribute, ref int pvAttribute, int cbAttribute);
|
||||
|
||||
[DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
|
||||
private static extern int SetWindowTheme(IntPtr hWnd, string pszSubAppName, string pszSubIdList);
|
||||
|
||||
// uxtheme.dll ordinal #135:
|
||||
// Windows 10 1809 -> AllowDarkModeForApp(bool)
|
||||
// Windows 10 1903+ -> SetPreferredAppMode(PreferredAppMode)
|
||||
[DllImport("uxtheme.dll", EntryPoint = "#135")]
|
||||
private static extern int SetPreferredAppMode(int preferredAppMode);
|
||||
|
||||
[DllImport("uxtheme.dll", EntryPoint = "#135")]
|
||||
private static extern bool AllowDarkModeForApp(bool allow);
|
||||
|
||||
// uxtheme.dll ordinal #136: FlushMenuThemes()
|
||||
[DllImport("uxtheme.dll", EntryPoint = "#136")]
|
||||
private static extern void FlushMenuThemes();
|
||||
|
||||
// RtlGetVersion always returns the true OS version, unlike Environment.OSVersion
|
||||
// / GetVersionEx which "lie" (report Windows 8 / 6.2) when the app has no manifest
|
||||
// declaring Windows 10 compatibility - which is exactly this project's case.
|
||||
[DllImport("ntdll.dll")]
|
||||
private static extern int RtlGetVersion(ref RTL_OSVERSIONINFOEX versionInfo);
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
private struct RTL_OSVERSIONINFOEX
|
||||
{
|
||||
internal uint dwOSVersionInfoSize;
|
||||
internal uint dwMajorVersion;
|
||||
internal uint dwMinorVersion;
|
||||
internal uint dwBuildNumber;
|
||||
internal uint dwPlatformId;
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
|
||||
internal string szCSDVersion;
|
||||
}
|
||||
|
||||
// DwmSetWindowAttribute "use immersive dark mode" attribute id.
|
||||
// It moved from 19 to 20 in Windows 10 build 19041 (20H1); we try the new
|
||||
// one first and fall back to the old one for 1809 / 1903 / 1909.
|
||||
private const int DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19;
|
||||
private const int DWMWA_USE_IMMERSIVE_DARK_MODE = 20;
|
||||
|
||||
private enum PreferredAppMode
|
||||
{
|
||||
Default = 0,
|
||||
AllowDark = 1,
|
||||
ForceDark = 2,
|
||||
ForceLight = 3
|
||||
}
|
||||
|
||||
private const int BUILD_1809 = 17763; // earliest build exposing the dark mode ordinals
|
||||
private const int BUILD_1903 = 18362; // ordinal #135 becomes SetPreferredAppMode(int)
|
||||
private const int BUILD_20H1 = 19041; // DWM immersive dark mode attribute becomes 20
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// The true OS version, queried once via <c>RtlGetVersion</c> so it is correct
|
||||
/// even though this app has no Windows 10 compatibility manifest embedded.
|
||||
/// </summary>
|
||||
private static readonly Version _osVersion = GetRealOSVersion();
|
||||
|
||||
private static Version GetRealOSVersion()
|
||||
{
|
||||
try
|
||||
{
|
||||
var info = new RTL_OSVERSIONINFOEX
|
||||
{
|
||||
dwOSVersionInfoSize = (uint)Marshal.SizeOf(typeof(RTL_OSVERSIONINFOEX))
|
||||
};
|
||||
if (RtlGetVersion(ref info) == 0) // STATUS_SUCCESS
|
||||
return new Version((int)info.dwMajorVersion, (int)info.dwMinorVersion, (int)info.dwBuildNumber);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// ntdll unavailable - fall back to the (possibly lying) framework value.
|
||||
}
|
||||
return Environment.OSVersion.Version;
|
||||
}
|
||||
|
||||
private static int WindowsBuild => _osVersion.Build;
|
||||
|
||||
/// <summary>
|
||||
/// True when the running OS is Windows 10 1809 or newer, where the dark mode
|
||||
/// APIs used here exist.
|
||||
/// </summary>
|
||||
public static bool IsSupported =>
|
||||
_osVersion.Major >= 10 &&
|
||||
WindowsBuild >= BUILD_1809;
|
||||
|
||||
/// <summary>
|
||||
/// Sets the process-wide app mode so that Win32 popup menus, context menus and
|
||||
/// common controls render dark. Call this once, before any window is created.
|
||||
/// Mirrors <c>DarkNet.SetCurrentProcessTheme</c>.
|
||||
/// </summary>
|
||||
public static void SetProcessTheme(Theme theme)
|
||||
{
|
||||
if (!IsSupported)
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
bool dark = EffectiveIsDark(theme);
|
||||
if (WindowsBuild >= BUILD_1903)
|
||||
SetPreferredAppMode((int)(dark ? PreferredAppMode.ForceDark : PreferredAppMode.ForceLight));
|
||||
else
|
||||
AllowDarkModeForApp(dark);
|
||||
FlushMenuThemes();
|
||||
}
|
||||
catch
|
||||
{
|
||||
// These ordinals are undocumented; ignore failures on unexpected builds.
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Applies (or removes) the immersive dark title bar on a form. Safe to call
|
||||
/// before the window handle exists - it is applied as soon as the handle is
|
||||
/// created and re-applied once the window is shown. Mirrors
|
||||
/// <c>DarkNet.SetWindowThemeForms</c>.
|
||||
/// </summary>
|
||||
public static void ApplyTheme(Form form, Theme theme)
|
||||
{
|
||||
if (form == null || !IsSupported)
|
||||
return;
|
||||
|
||||
bool dark = EffectiveIsDark(theme);
|
||||
|
||||
if (form.IsHandleCreated)
|
||||
UseImmersiveDarkTitleBar(form.Handle, dark);
|
||||
else
|
||||
form.HandleCreated += (s, e) => UseImmersiveDarkTitleBar(form.Handle, dark);
|
||||
|
||||
// Some builds only honour the attribute once the window is actually visible.
|
||||
form.Shown += (s, e) => UseImmersiveDarkTitleBar(form.Handle, dark);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Applies (or removes) the immersive dark title bar on a WPF window. Safe to
|
||||
/// call before the native handle exists - it is applied on
|
||||
/// <c>SourceInitialized</c>, which fires before the window is shown.
|
||||
/// </summary>
|
||||
public static void ApplyTheme(System.Windows.Window window, Theme theme)
|
||||
{
|
||||
if (window == null || !IsSupported)
|
||||
return;
|
||||
|
||||
bool dark = EffectiveIsDark(theme);
|
||||
var helper = new System.Windows.Interop.WindowInteropHelper(window);
|
||||
|
||||
if (helper.Handle != IntPtr.Zero)
|
||||
UseImmersiveDarkTitleBar(helper.Handle, dark);
|
||||
else
|
||||
window.SourceInitialized += (s, e) =>
|
||||
UseImmersiveDarkTitleBar(new System.Windows.Interop.WindowInteropHelper(window).Handle, dark);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Toggles the immersive dark mode title bar for an arbitrary window handle.
|
||||
/// </summary>
|
||||
public static void UseImmersiveDarkTitleBar(IntPtr handle, bool enabled)
|
||||
{
|
||||
if (handle == IntPtr.Zero || !IsSupported)
|
||||
return;
|
||||
|
||||
int useImmersiveDarkMode = enabled ? 1 : 0;
|
||||
int attribute = WindowsBuild >= BUILD_20H1
|
||||
? DWMWA_USE_IMMERSIVE_DARK_MODE
|
||||
: DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1;
|
||||
|
||||
if (DwmSetWindowAttribute(handle, attribute, ref useImmersiveDarkMode, sizeof(int)) != 0)
|
||||
{
|
||||
// Fall back to the other attribute id if the first one was not accepted.
|
||||
int fallback = attribute == DWMWA_USE_IMMERSIVE_DARK_MODE
|
||||
? DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1
|
||||
: DWMWA_USE_IMMERSIVE_DARK_MODE;
|
||||
DwmSetWindowAttribute(handle, fallback, ref useImmersiveDarkMode, sizeof(int));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gives a control dark-themed scroll bars / drop-downs. Use
|
||||
/// <c>"DarkMode_Explorer"</c> for scroll bars and lists, <c>"DarkMode_CFD"</c>
|
||||
/// for combo boxes. Safe to call before the handle exists.
|
||||
/// </summary>
|
||||
public static void UseDarkControlTheme(Control control, string subAppName = "DarkMode_Explorer")
|
||||
{
|
||||
if (control == null || !IsSupported)
|
||||
return;
|
||||
|
||||
if (control.IsHandleCreated)
|
||||
SetWindowTheme(control.Handle, subAppName, null);
|
||||
else
|
||||
control.HandleCreated += (s, e) => SetWindowTheme(control.Handle, subAppName, null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resolves a <see cref="Theme"/> to an effective dark/light decision,
|
||||
/// reading the Windows personalization setting for <see cref="Theme.Auto"/>.
|
||||
/// Mirrors <c>DarkNet.EffectiveCurrentProcessThemeIsDark</c>.
|
||||
/// </summary>
|
||||
public static bool EffectiveIsDark(Theme theme)
|
||||
{
|
||||
switch (theme)
|
||||
{
|
||||
case Theme.Dark:
|
||||
return true;
|
||||
case Theme.Light:
|
||||
return false;
|
||||
default:
|
||||
return IsSystemUsingDarkMode();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reads whether the current user has selected the dark app theme in Windows.
|
||||
/// </summary>
|
||||
public static bool IsSystemUsingDarkMode()
|
||||
{
|
||||
try
|
||||
{
|
||||
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(
|
||||
@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"))
|
||||
{
|
||||
// AppsUseLightTheme: 0 = dark, 1 = light (absent means light).
|
||||
if (key?.GetValue("AppsUseLightTheme") is int appsUseLightTheme)
|
||||
return appsUseLightTheme == 0;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Registry unavailable - assume light.
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Controls.Primitives;
|
||||
|
||||
namespace APKToolGUI.Controls
|
||||
{
|
||||
/// <summary>
|
||||
/// Small themed numeric up/down control (WPF has no built-in equivalent of the
|
||||
/// WinForms NumericUpDown). Templated in Themes/Controls.xaml.
|
||||
/// </summary>
|
||||
[TemplatePart(Name = "PART_TextBox", Type = typeof(TextBox))]
|
||||
[TemplatePart(Name = "PART_Up", Type = typeof(RepeatButton))]
|
||||
[TemplatePart(Name = "PART_Down", Type = typeof(RepeatButton))]
|
||||
public class NumericUpDown : Control
|
||||
{
|
||||
private TextBox _textBox;
|
||||
private bool _updating;
|
||||
|
||||
static NumericUpDown()
|
||||
{
|
||||
DefaultStyleKeyProperty.OverrideMetadata(typeof(NumericUpDown),
|
||||
new FrameworkPropertyMetadata(typeof(NumericUpDown)));
|
||||
}
|
||||
|
||||
public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register(
|
||||
"Minimum", typeof(int), typeof(NumericUpDown), new PropertyMetadata(0, OnRangeChanged));
|
||||
|
||||
public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register(
|
||||
"Maximum", typeof(int), typeof(NumericUpDown), new PropertyMetadata(100, OnRangeChanged));
|
||||
|
||||
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
|
||||
"Value", typeof(int), typeof(NumericUpDown),
|
||||
new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnValueChanged));
|
||||
|
||||
public int Minimum { get { return (int)GetValue(MinimumProperty); } set { SetValue(MinimumProperty, value); } }
|
||||
public int Maximum { get { return (int)GetValue(MaximumProperty); } set { SetValue(MaximumProperty, value); } }
|
||||
public int Value { get { return (int)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } }
|
||||
|
||||
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
var n = (NumericUpDown)d;
|
||||
int clamped = n.Clamp((int)e.NewValue);
|
||||
if (clamped != (int)e.NewValue) { n.Value = clamped; return; }
|
||||
n.UpdateText();
|
||||
}
|
||||
|
||||
private static void OnRangeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
||||
{
|
||||
var n = (NumericUpDown)d;
|
||||
n.Value = n.Clamp(n.Value);
|
||||
}
|
||||
|
||||
private int Clamp(int v)
|
||||
{
|
||||
if (v < Minimum) return Minimum;
|
||||
if (v > Maximum) return Maximum;
|
||||
return v;
|
||||
}
|
||||
|
||||
public override void OnApplyTemplate()
|
||||
{
|
||||
base.OnApplyTemplate();
|
||||
|
||||
if (_textBox != null) _textBox.TextChanged -= TextBox_TextChanged;
|
||||
_textBox = GetTemplateChild("PART_TextBox") as TextBox;
|
||||
if (_textBox != null) _textBox.TextChanged += TextBox_TextChanged;
|
||||
|
||||
var up = GetTemplateChild("PART_Up") as RepeatButton;
|
||||
var down = GetTemplateChild("PART_Down") as RepeatButton;
|
||||
if (up != null) up.Click += (s, e) => Value = Clamp(Value + 1);
|
||||
if (down != null) down.Click += (s, e) => Value = Clamp(Value - 1);
|
||||
|
||||
UpdateText();
|
||||
}
|
||||
|
||||
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
|
||||
{
|
||||
if (_updating) return;
|
||||
int v;
|
||||
if (int.TryParse(_textBox.Text, out v))
|
||||
Value = Clamp(v);
|
||||
}
|
||||
|
||||
private void UpdateText()
|
||||
{
|
||||
if (_textBox == null) return;
|
||||
_updating = true;
|
||||
_textBox.Text = Value.ToString();
|
||||
_updating = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace APKToolGUI.Controls
|
||||
{
|
||||
/// <summary>
|
||||
/// Shared dark/light palette for the WPF windows. Fills the <c>DynamicResource</c>
|
||||
/// brush keys consumed by <c>Themes/Controls.xaml</c> and the window XAML, so every
|
||||
/// converted window themes consistently. The dark palette mirrors the WinForms
|
||||
/// <see cref="DarkTheme"/> colors used by the not-yet-converted forms.
|
||||
/// </summary>
|
||||
public static class WpfTheme
|
||||
{
|
||||
/// <summary>
|
||||
/// Applies the dark or light palette to a window/element's resource dictionary.
|
||||
/// The merged <c>Themes/Controls.xaml</c> styles pick these up via DynamicResource.
|
||||
/// </summary>
|
||||
public static void Apply(FrameworkElement target, bool dark)
|
||||
{
|
||||
if (dark)
|
||||
{
|
||||
Set(target, "WindowBackground", 32, 32, 32);
|
||||
Set(target, "PrimaryText", 255, 255, 255);
|
||||
Set(target, "SecondaryText", 160, 160, 160);
|
||||
Set(target, "PanelBackground", 64, 64, 64); // text input background
|
||||
Set(target, "ControlBackground", 51, 51, 51); // combo / checkbox box
|
||||
Set(target, "PanelBorder", 90, 90, 90);
|
||||
Set(target, "Accent", 0, 120, 215);
|
||||
Set(target, "LinkText", 30, 144, 255); // DodgerBlue
|
||||
Set(target, "ButtonBackground", 51, 51, 51);
|
||||
Set(target, "ButtonBorder", 155, 155, 155);
|
||||
Set(target, "ButtonHover", 61, 61, 61);
|
||||
Set(target, "ButtonPressed", 42, 42, 42);
|
||||
Set(target, "ScrollTrack", 45, 45, 45);
|
||||
Set(target, "ScrollThumb", 85, 85, 85);
|
||||
Set(target, "TabBackground", 45, 45, 45); // unselected tab
|
||||
Set(target, "MenuBar", 32, 32, 32);
|
||||
Set(target, "MenuPopup", 43, 43, 43);
|
||||
Set(target, "MenuHighlight", 61, 61, 61);
|
||||
Set(target, "LogBackground", 30, 30, 30);
|
||||
}
|
||||
else
|
||||
{
|
||||
Set(target, "WindowBackground", 240, 240, 240);
|
||||
Set(target, "PrimaryText", 0, 0, 0);
|
||||
Set(target, "SecondaryText", 105, 105, 105); // DimGray
|
||||
Set(target, "PanelBackground", 255, 255, 255);
|
||||
Set(target, "ControlBackground", 255, 255, 255);
|
||||
Set(target, "PanelBorder", 171, 173, 179);
|
||||
Set(target, "Accent", 0, 120, 215);
|
||||
Set(target, "LinkText", 30, 144, 255);
|
||||
Set(target, "ButtonBackground", 225, 225, 225);
|
||||
Set(target, "ButtonBorder", 173, 173, 173);
|
||||
Set(target, "ButtonHover", 229, 241, 251);
|
||||
Set(target, "ButtonPressed", 204, 228, 247);
|
||||
Set(target, "ScrollTrack", 240, 240, 240);
|
||||
Set(target, "ScrollThumb", 180, 180, 180);
|
||||
Set(target, "TabBackground", 224, 224, 224);
|
||||
Set(target, "MenuBar", 240, 240, 240);
|
||||
Set(target, "MenuPopup", 250, 250, 250);
|
||||
Set(target, "MenuHighlight", 204, 228, 247);
|
||||
Set(target, "LogBackground", 255, 255, 255);
|
||||
}
|
||||
}
|
||||
|
||||
private static void Set(FrameworkElement target, string key, byte r, byte g, byte b)
|
||||
{
|
||||
var brush = new SolidColorBrush(Color.FromRgb(r, g, b));
|
||||
brush.Freeze();
|
||||
target.Resources[key] = brush;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
|
||||
<Costura />
|
||||
<Costura DisableCompression='true' />
|
||||
</Weavers>
|
||||
@@ -29,12 +29,27 @@
|
||||
</xs:element>
|
||||
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged32Assemblies" type="xs:string">
|
||||
<xs:annotation>
|
||||
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with line breaks.</xs:documentation>
|
||||
<xs:documentation>Obsolete, use UnmanagedWinX86Assemblies instead</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element minOccurs="0" maxOccurs="1" name="UnmanagedWinX86Assemblies" type="xs:string">
|
||||
<xs:annotation>
|
||||
<xs:documentation>A list of unmanaged X86 (32 bit) assembly names to include, delimited with line breaks.</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged64Assemblies" type="xs:string">
|
||||
<xs:annotation>
|
||||
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with line breaks.</xs:documentation>
|
||||
<xs:documentation>Obsolete, use UnmanagedWinX64Assemblies instead.</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element minOccurs="0" maxOccurs="1" name="UnmanagedWinX64Assemblies" type="xs:string">
|
||||
<xs:annotation>
|
||||
<xs:documentation>A list of unmanaged X64 (64 bit) assembly names to include, delimited with line breaks.</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element minOccurs="0" maxOccurs="1" name="UnmanagedWinArm64Assemblies" type="xs:string">
|
||||
<xs:annotation>
|
||||
<xs:documentation>A list of unmanaged Arm64 (64 bit) assembly names to include, delimited with line breaks.</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element minOccurs="0" maxOccurs="1" name="PreloadOrder" type="xs:string">
|
||||
@@ -73,6 +88,11 @@
|
||||
<xs:documentation>As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off.</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="DisableEventSubscription" type="xs:boolean">
|
||||
<xs:annotation>
|
||||
<xs:documentation>The attach method no longer subscribes to the `AppDomain.AssemblyResolve` (.NET 4.x) and `AssemblyLoadContext.Resolving` (.NET 6.0+) events.</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="LoadAtModuleInit" type="xs:boolean">
|
||||
<xs:annotation>
|
||||
<xs:documentation>Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code.</xs:documentation>
|
||||
@@ -105,12 +125,27 @@
|
||||
</xs:attribute>
|
||||
<xs:attribute name="Unmanaged32Assemblies" type="xs:string">
|
||||
<xs:annotation>
|
||||
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with |.</xs:documentation>
|
||||
<xs:documentation>Obsolete, use UnmanagedWinX86Assemblies instead</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="UnmanagedWinX86Assemblies" type="xs:string">
|
||||
<xs:annotation>
|
||||
<xs:documentation>A list of unmanaged X86 (32 bit) assembly names to include, delimited with |.</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="Unmanaged64Assemblies" type="xs:string">
|
||||
<xs:annotation>
|
||||
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with |.</xs:documentation>
|
||||
<xs:documentation>Obsolete, use UnmanagedWinX64Assemblies instead</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="UnmanagedWinX64Assemblies" type="xs:string">
|
||||
<xs:annotation>
|
||||
<xs:documentation>A list of unmanaged X64 (64 bit) assembly names to include, delimited with |.</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="UnmanagedWinArm64Assemblies" type="xs:string">
|
||||
<xs:annotation>
|
||||
<xs:documentation>A list of unmanaged Arm64 (64 bit) assembly names to include, delimited with |.</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="PreloadOrder" type="xs:string">
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
<Window x:Class="APKToolGUI.Forms.AboutWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
Title="About"
|
||||
Width="528" Height="320"
|
||||
MinWidth="420" MinHeight="260"
|
||||
ResizeMode="NoResize"
|
||||
ShowInTaskbar="False"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
UseLayoutRounding="True"
|
||||
TextOptions.TextFormattingMode="Display"
|
||||
FontFamily="Segoe UI" FontSize="12"
|
||||
Background="{DynamicResource WindowBackground}"
|
||||
Foreground="{DynamicResource PrimaryText}">
|
||||
|
||||
<!--
|
||||
WPF replacement for the former WinForms FormAboutBox.
|
||||
Shared dark/light control styles are merged from Themes/Controls.xaml; the
|
||||
actual colours are filled in by WpfTheme.Apply(this, dark) in the code-behind.
|
||||
-->
|
||||
<Window.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="pack://application:,,,/Themes/Controls.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</Window.Resources>
|
||||
|
||||
<Grid Margin="12">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Image Grid.Column="0"
|
||||
Width="219" Height="259"
|
||||
VerticalAlignment="Top"
|
||||
Stretch="Uniform"
|
||||
Margin="0,0,12,0"
|
||||
Source="pack://application:,,,/Resources/android.png"/>
|
||||
|
||||
<Grid Grid.Column="1">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<TextBlock x:Name="productNameText" Grid.Row="0"
|
||||
FontSize="16" FontWeight="SemiBold"
|
||||
TextWrapping="Wrap" Margin="0,4"/>
|
||||
<TextBlock x:Name="versionText" Grid.Row="1" TextWrapping="Wrap" Margin="0,4"/>
|
||||
<TextBlock x:Name="copyrightText" Grid.Row="2" TextWrapping="Wrap" Margin="0,4"/>
|
||||
<TextBlock Grid.Row="3" Margin="0,4">
|
||||
<Hyperlink x:Name="repoLink" Click="RepoLink_Click"
|
||||
Foreground="{DynamicResource LinkText}">
|
||||
<Run x:Name="repoLinkText"/>
|
||||
</Hyperlink>
|
||||
</TextBlock>
|
||||
|
||||
<TextBox x:Name="descriptionText" Grid.Row="4" Margin="0,6"
|
||||
IsReadOnly="True" TextWrapping="Wrap" IsTabStop="False"
|
||||
Padding="4"
|
||||
VerticalScrollBarVisibility="Auto"
|
||||
Background="{DynamicResource PanelBackground}"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
BorderBrush="{DynamicResource PanelBorder}"/>
|
||||
|
||||
<Button x:Name="okButton" Grid.Row="5"
|
||||
HorizontalAlignment="Right" MinWidth="84" Margin="0,4,0,0"
|
||||
IsDefault="True" IsCancel="True"
|
||||
Click="OkButton_Click"/>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Window>
|
||||
@@ -0,0 +1,115 @@
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Windows;
|
||||
using APKToolGUI.Controls;
|
||||
using APKToolGUI.Properties;
|
||||
// Alias the resource class: a bare "Language" would otherwise bind to the inherited
|
||||
// FrameworkElement.Language property (System.Windows.Markup.XmlLanguage).
|
||||
using Lang = APKToolGUI.Languages.Language;
|
||||
|
||||
namespace APKToolGUI.Forms
|
||||
{
|
||||
/// <summary>
|
||||
/// WPF replacement for the former WinForms <c>FormAboutBox</c>. Behaviour is kept
|
||||
/// identical: the product name, version, copyright and description come from the
|
||||
/// assembly attributes, the title / version / copyright / link captions are
|
||||
/// localised, and the title bar follows the app's dark/light theme.
|
||||
/// </summary>
|
||||
public partial class AboutWindow : Window
|
||||
{
|
||||
private const string RepoUrl = "https://github.com/AndnixSH/APKToolGUI";
|
||||
|
||||
public AboutWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
Theme theme = (Theme)Settings.Default.Theme;
|
||||
WpfTheme.Apply(this, Program.IsDarkTheme());
|
||||
|
||||
// Our own immersive dark title bar (replaces DarkNet), now for WPF windows.
|
||||
NativeDarkMode.ApplyTheme(this, theme);
|
||||
|
||||
ApplyLocalizedText();
|
||||
}
|
||||
|
||||
private void ApplyLocalizedText()
|
||||
{
|
||||
var rm = Lang.ResourceManager;
|
||||
|
||||
Title = String.Format("{0} {1}", Lang.About, AssemblyTitle);
|
||||
productNameText.Text = AssemblyProduct;
|
||||
versionText.Text = String.Format("{0} {1}", rm.GetString("AboutVersion"), AssemblyVersion);
|
||||
copyrightText.Text = String.Format("{0} {1}", rm.GetString("AboutCopyright"), AssemblyCopyright);
|
||||
repoLinkText.Text = rm.GetString("AboutGithubRepo");
|
||||
descriptionText.Text = AssemblyDescription;
|
||||
okButton.Content = rm.GetString("AboutOK");
|
||||
}
|
||||
|
||||
private void RepoLink_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
System.Diagnostics.Process.Start(RepoUrl);
|
||||
}
|
||||
|
||||
private void OkButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
#region Assembly attribute accessors
|
||||
|
||||
public string AssemblyTitle
|
||||
{
|
||||
get
|
||||
{
|
||||
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
|
||||
if (attributes.Length > 0)
|
||||
{
|
||||
AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
|
||||
if (titleAttribute.Title != "")
|
||||
return titleAttribute.Title;
|
||||
}
|
||||
return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
|
||||
}
|
||||
}
|
||||
|
||||
public string AssemblyVersion
|
||||
{
|
||||
get { return Assembly.GetExecutingAssembly().GetName().Version.ToString(); }
|
||||
}
|
||||
|
||||
public string AssemblyDescription
|
||||
{
|
||||
get
|
||||
{
|
||||
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
|
||||
if (attributes.Length == 0)
|
||||
return "";
|
||||
return ((AssemblyDescriptionAttribute)attributes[0]).Description;
|
||||
}
|
||||
}
|
||||
|
||||
public string AssemblyProduct
|
||||
{
|
||||
get
|
||||
{
|
||||
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
|
||||
if (attributes.Length == 0)
|
||||
return "";
|
||||
return ((AssemblyProductAttribute)attributes[0]).Product;
|
||||
}
|
||||
}
|
||||
|
||||
public string AssemblyCopyright
|
||||
{
|
||||
get
|
||||
{
|
||||
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
|
||||
if (attributes.Length == 0)
|
||||
return "";
|
||||
return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -1,127 +0,0 @@
|
||||
namespace APKToolGUI
|
||||
{
|
||||
partial class FormAboutBox
|
||||
{
|
||||
/// <summary>
|
||||
/// Требуется переменная конструктора.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Освободить все используемые ресурсы.
|
||||
/// </summary>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Код, автоматически созданный конструктором форм Windows
|
||||
|
||||
/// <summary>
|
||||
/// Обязательный метод для поддержки конструктора - не изменяйте
|
||||
/// содержимое данного метода при помощи редактора кода.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormAboutBox));
|
||||
this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
|
||||
this.logoPictureBox = new System.Windows.Forms.PictureBox();
|
||||
this.labelProductName = new System.Windows.Forms.Label();
|
||||
this.labelVersion = new System.Windows.Forms.Label();
|
||||
this.labelCopyright = new System.Windows.Forms.Label();
|
||||
this.okButton = new System.Windows.Forms.Button();
|
||||
this.textBoxDescription = new System.Windows.Forms.TextBox();
|
||||
this.linkLabel1 = new System.Windows.Forms.LinkLabel();
|
||||
this.tableLayoutPanel.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// tableLayoutPanel
|
||||
//
|
||||
resources.ApplyResources(this.tableLayoutPanel, "tableLayoutPanel");
|
||||
this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0);
|
||||
this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0);
|
||||
this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1);
|
||||
this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2);
|
||||
this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5);
|
||||
this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4);
|
||||
this.tableLayoutPanel.Controls.Add(this.linkLabel1, 1, 3);
|
||||
this.tableLayoutPanel.Name = "tableLayoutPanel";
|
||||
//
|
||||
// logoPictureBox
|
||||
//
|
||||
resources.ApplyResources(this.logoPictureBox, "logoPictureBox");
|
||||
this.logoPictureBox.Name = "logoPictureBox";
|
||||
this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6);
|
||||
this.logoPictureBox.TabStop = false;
|
||||
//
|
||||
// labelProductName
|
||||
//
|
||||
resources.ApplyResources(this.labelProductName, "labelProductName");
|
||||
this.labelProductName.Name = "labelProductName";
|
||||
//
|
||||
// labelVersion
|
||||
//
|
||||
resources.ApplyResources(this.labelVersion, "labelVersion");
|
||||
this.labelVersion.Name = "labelVersion";
|
||||
//
|
||||
// labelCopyright
|
||||
//
|
||||
resources.ApplyResources(this.labelCopyright, "labelCopyright");
|
||||
this.labelCopyright.Name = "labelCopyright";
|
||||
//
|
||||
// okButton
|
||||
//
|
||||
resources.ApplyResources(this.okButton, "okButton");
|
||||
this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.okButton.Name = "okButton";
|
||||
//
|
||||
// textBoxDescription
|
||||
//
|
||||
resources.ApplyResources(this.textBoxDescription, "textBoxDescription");
|
||||
this.textBoxDescription.Name = "textBoxDescription";
|
||||
this.textBoxDescription.ReadOnly = true;
|
||||
this.textBoxDescription.TabStop = false;
|
||||
//
|
||||
// linkLabel1
|
||||
//
|
||||
resources.ApplyResources(this.linkLabel1, "linkLabel1");
|
||||
this.linkLabel1.Name = "linkLabel1";
|
||||
this.linkLabel1.TabStop = true;
|
||||
this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
|
||||
//
|
||||
// FormAboutBox
|
||||
//
|
||||
this.AcceptButton = this.okButton;
|
||||
resources.ApplyResources(this, "$this");
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.tableLayoutPanel);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||
this.MaximizeBox = false;
|
||||
this.MinimizeBox = false;
|
||||
this.Name = "FormAboutBox";
|
||||
this.ShowIcon = false;
|
||||
this.ShowInTaskbar = false;
|
||||
this.tableLayoutPanel.ResumeLayout(false);
|
||||
this.tableLayoutPanel.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
|
||||
private System.Windows.Forms.PictureBox logoPictureBox;
|
||||
private System.Windows.Forms.Label labelProductName;
|
||||
private System.Windows.Forms.Label labelVersion;
|
||||
private System.Windows.Forms.Label labelCopyright;
|
||||
private System.Windows.Forms.TextBox textBoxDescription;
|
||||
private System.Windows.Forms.Button okButton;
|
||||
private System.Windows.Forms.LinkLabel linkLabel1;
|
||||
}
|
||||
}
|
||||
@@ -1,109 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace APKToolGUI
|
||||
{
|
||||
partial class FormAboutBox : Form
|
||||
{
|
||||
public FormAboutBox()
|
||||
{
|
||||
InitializeComponent();
|
||||
this.Text = String.Format("{0} {1}", this.Text, AssemblyTitle);
|
||||
this.labelProductName.Text = AssemblyProduct;
|
||||
this.labelVersion.Text = String.Format("{0} {1}", labelVersion.Text, AssemblyVersion);
|
||||
this.labelCopyright.Text = String.Format("{0} {1}", this.labelCopyright.Text, AssemblyCopyright);// AssemblyCopyright;
|
||||
//this.labelCompanyName.Text = AssemblyCompany;
|
||||
this.textBoxDescription.Text = AssemblyDescription;
|
||||
}
|
||||
|
||||
#region Методы доступа к атрибутам сборки
|
||||
|
||||
public string AssemblyTitle
|
||||
{
|
||||
get
|
||||
{
|
||||
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
|
||||
if (attributes.Length > 0)
|
||||
{
|
||||
AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
|
||||
if (titleAttribute.Title != "")
|
||||
{
|
||||
return titleAttribute.Title;
|
||||
}
|
||||
}
|
||||
return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
|
||||
}
|
||||
}
|
||||
|
||||
public string AssemblyVersion
|
||||
{
|
||||
get
|
||||
{
|
||||
return Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
public string AssemblyDescription
|
||||
{
|
||||
get
|
||||
{
|
||||
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
|
||||
if (attributes.Length == 0)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
return ((AssemblyDescriptionAttribute)attributes[0]).Description;
|
||||
}
|
||||
}
|
||||
|
||||
public string AssemblyProduct
|
||||
{
|
||||
get
|
||||
{
|
||||
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
|
||||
if (attributes.Length == 0)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
return ((AssemblyProductAttribute)attributes[0]).Product;
|
||||
}
|
||||
}
|
||||
|
||||
public string AssemblyCopyright
|
||||
{
|
||||
get
|
||||
{
|
||||
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
|
||||
if (attributes.Length == 0)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
|
||||
}
|
||||
}
|
||||
|
||||
public string AssemblyCompany
|
||||
{
|
||||
get
|
||||
{
|
||||
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
|
||||
if (attributes.Length == 0)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
return ((AssemblyCompanyAttribute)attributes[0]).Company;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
|
||||
{
|
||||
System.Diagnostics.Process.Start("https://github.com/AndnixSH/APKToolGUI");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,624 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="tableLayoutPanel.ColumnCount" type="System.Int32, mscorlib">
|
||||
<value>2</value>
|
||||
</data>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="logoPictureBox.BackgroundImageLayout" type="System.Windows.Forms.ImageLayout, System.Windows.Forms">
|
||||
<value>Center</value>
|
||||
</data>
|
||||
<data name="logoPictureBox.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||
<value>Fill</value>
|
||||
</data>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="logoPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAYAAABS3GwHAAAABGdBTUEAALGPC/xhBQAAMeRJREFUeF7t
|
||||
XQd4VMUWXnkmEHpCkwDSAgTSe9tAVJ4oClIMUqT33ntLozwFfc8CIooFQbpKEekiSDGht5AEkBbpKC1A
|
||||
SObNP/fO5ma5C0nY7N7dzPm+/1s+cvfuvTP/f+acM3Pn6oQJEyZMmDBhwoQJEyZMmDBhwp7NCHlOR2KK
|
||||
RZNl/wKitsU8nx/w7+Ec7FzChGnOFCQHaQOS5jkYSGtuk38Hv8EFIsQhzHJm5NHzQnKQVX92hnNUakz1
|
||||
qLQZbo1PxXlFnk4IbpyS0LhJ2rSXGqfGvwqwf9P/Y3+jx+BYfAffxTnk05k24+sSohBmFpOJBY8r/89j
|
||||
9uqh90vpU2bU0Z+Kb9o4LaFr5KmEKY1TE76MTEtYF5kWv4t+Hqf/f4F+3qTIoHhIkUWRTUFk4N/4P/wN
|
||||
x9yUv3NcPsc6dk6cm/4Gfgu/id+WL+MxyzVKCBOWZ6OEMZDHyKLOxJRonBLfsPGp+DbUc8dQYi6hOExx
|
||||
mQIE5oRWR2p83qH2/Rzgt/Cb+O0luBZ9WkLrqDPT3XGN8uUazCBiIQZhqiZ7+scIAjFQUkWmTnu38amE
|
||||
T2VvfINCjZRAtj41HuR8xJAanwv4W15g/D0Gej7pb7lGDmPQa4vfxa6VXjOuXe2exMggjBmIYOzpA9Jj
|
||||
SkamTY9AuEEJtYXiqoJgSoCYmfhkxE2JzwYiU6j3LkTw31EIhV0D/VS7Rlz7Fulepkfg3uTbZKZ2/8Ls
|
||||
3WiCKIUDOYkiEs0mqdPDaBgRTz3sXkqa+woScTCycbKrkdOaMIgixaQg7uPecI+411zJtUqbCLM340O/
|
||||
wpBIUu84jGI7I0huwrBQRquEfxoMgpDvQXFfwH12z/Te0QZyczBjbSTCI/uxx4Z56uUap8W/TEnwFQUS
|
||||
SSUxDF5ejVS2DHZPPFzKfc9og6/QJsoR4LF2E2ZjRr0YG9ZlY7E9TQxpCLDViADZ9kp6UzCIwSihZm1D
|
||||
20iZK4jqka2ZUagTkhpTNvJUfH/a2QeVnU0hVVZsMLwxF9i9yxUmRbsQtJU+NWFA01Mzy8nNKEIjzRtP
|
||||
5GTDJBEjflrCMUXnwuNJnk+FEEUZshiMR4VjaEPlhJtIljVokneSO4V+RqTEdYxMm5ak6EhB/DzCIASp
|
||||
zeT2m5akP5XQQdnGIj/QgtGOUHp9tp7mVMKGnI5jnUgTW0H8/IIJgbcdb0/atmhjubnFaGBNUxI/Inmq
|
||||
qzRTm/DA0FnM46t3rkA+IY0IvF0foK3R5nLz5+oLYYVtRl5ffzKhM+2UM4oOEqFOIUARGvF2PoO2l7tB
|
||||
jAaWMGXcGX46oaY+LX6pokOkCR+VzhMwH1gbK6pG6AP0hdwtufpImBlN6fUjT8a1p42fzjuBQoQ7lkbu
|
||||
0SAdfSJ3jwiJzGqKigPq0rSx5yoaXoQ7VoRxWKRPm/YZnzvIVZkTVjDLFfKciAujjXyINzaF8PpagXI0
|
||||
SE04GHYkJlzuNhESFdRyJbopcX1o4942EB/lTbWOELAaFGuNIIjbEcem9JW7T4RE+TVDg5GYYpGnEmbL
|
||||
xBde3xaQIwIScSL2A92yaDYCCBHk0XhDhR2LcaHD6Y8K8ktr3NUaXUBbkNYXSSI4NvWngG0jKyr7VpgJ
|
||||
M5D/6FQ3xVIGNKYob9oYDOVSKgL9idh9gTvHNFD2sTClKSa39CfiAmjYc1omv4j3bRjycgoWEkWciDkT
|
||||
tmtMMPqY9bWoEMmmKHNGnox9hTbWFTQYxUMR8tgJUtl2LxgJroTtHdsMfS3KpDA0gLzGPCI5viX1/HcE
|
||||
+e0UOSK4E7p7fBup/2nfF1kR5Hj+5/QnY1vTxsGGUFLYI8hvn5ArRBHHYzJCd49th74vsiOBHPM/p0+N
|
||||
bSHIX4TARXB0akbI76PbggNFLjHm5I9Ijn2JNkbOBJcgf9EAF8HhKXeCt45ETlB0RMDJH3ooxl+flnBJ
|
||||
kL+IAiKgn2EHJ1/2/3lEKDhh9yLgNyjV+RPSZPKLhLeogibG+pNxJGz/pNMBawa5Kzlid8ZLnfrD45z1
|
||||
qQmJgvwCDLIIQhMn7vdb1r2Skiv2YznbaTynT4lfKZNfhD0CEigXIo7HkNDd436iHJHIbzdbsOSUuJ6j
|
||||
N/ueTH5Mk4sZXgEGecY4K+LIVBKyfdT/wBXGGHsoj/Kkl95kd5n8kgBUGkKg6EJeTk3CD04mQVuHDwBn
|
||||
bD4f4OQPPzo5iJL+b5n8j9QaQEAA3JDygQn/BKwZoAd3bFYEPJEJ+XlwWZro7JPJL+J+gScjNT5TfyKW
|
||||
hOwcc8jjg2gXSiEb3IQLsZsUv9G4P44/wyvIL5A3UBGEH55CgraN+AocUvDJNkx++cJzEcemtpPJD4i4
|
||||
XyBP4PlAaNIE4r9uQDdwKU9vy9SCycPVcyF7xlSnN3HO4P1VblRAwCQQCiUjFBp90WtBR7zEwwbygZxh
|
||||
qhi9ie8M5Behj0BBQLmDUChw87DllFPy/ICGQyFe9Yk4HvuOTH7M9Il6v0CBwOYH6GdoIg2F1vTvDm5p
|
||||
dhTICX0mVKGkP2nw/kY3JSCQL8hVoaBfR6V5ftq9BjimTRFI218UizgZ+4FMfrGLg4B5QLkUdmAS8d84
|
||||
9DNwjG+1ohnjoY/+2OQQxWONouojYBagKoQJspDdY+/6LO3xErgWMK+PRqpCcr2fAonvTzL5RegjYF7I
|
||||
cwOBG4dtoFxjDlcTCbEc+xcLPzqlrUx+kfgKmB08IQ7ZPY74rujTFZyz/gyxtGT1ueofRDtFpsTtEt5f
|
||||
oFBBRwGsGA3aPDSpYo+IMuCeVZdNy3FYMf2xmB7C+wsUNtgokEpHgT0YBfoOBfc8YqIdGRktbrL391g2
|
||||
oDS9uP2yADS90rNp2kzS5vT/SLO091T/XlTRJCWBvHlqNml1+r/kpdTpqsdoBpRjGAVoLnD0xXFvOIOD
|
||||
VqkKce8fdsQ2vD9I/8PNRJKVlUV23U4lbU9/pHpcUcSg89+Sc/evkYxHD8i8q1vJK6kzVI/TAgyjAM0F
|
||||
vJf0GQYOWr4iJHv/Wt2iStAL2i0LQNOxf8+zX5CrD28xAWRmPWJiUDuuqOGV1Jnk+L2LrF2AC/evk85/
|
||||
fqZ6rGZAuYZRIOCXIfsrRjSQcgFLjgJy3b9Y+CHbqfx0oZ168cENQ0fffXSfdP1znuqxRQWNaegz89Ia
|
||||
Q5sAZ+9fJZ3+nKN6vFbAK0LBO8cQr0W9sVq0mOVmh3Pq/s/rT8attQXvDzRJnUa+v74rV2f/djuZvJb2
|
||||
vurxRQEdzsxhhFe2CdoIbaV2vKZAORd+aDLxXzdoC+UiEmHLzAvw2D80cXwEvQj2Ymq2flvtIjUGJMCX
|
||||
H/xt6GzEvPF//ah6rL2jSco0svzGHvKIhoO8PdA2aCO147UGPjsctH3kQ48FnbG7nIUqQlKs9a+I47Gf
|
||||
yN7fZp7xRbXjsytbyINHmYZOT76XTlqc+kD1eHtG33MLyDU5JwLQJmgbtJHa8ZoE1gglTSS+q/p/A04W
|
||||
eh7AY/+gDQNq6FPiztqaAABUgw7ePWvoeCTE317bYVsd/4x4OXUGSbxzytAGwMG7f9peeRgl0eMxJGDT
|
||||
0Ivu01vXBzcLtSIkC+Bf4Ycn462NuABDQmJLmHBxOUuCeeffeHibxcNqx9obkPhOTl9BHmbljIJ3aFtM
|
||||
uLhM9Xgtw1AS3TWWeC/uMRrcLLxkWCp9Ag765Lj1sgBsctnDq2n/IZv/OWIgALD65j7mGdWOtycgxj96
|
||||
73yue99E2+LftE3Ujtc85GTYb82gbZSbToyjhbE8gnv/kB0jA2gC8g/z/jaS/KoBHv92ZoaBBPj3eBv0
|
||||
gvnF19d+y5X44r47nPlU9VhbAE+GA7cOv+0+p0MTcLRwwiApwXhefzhmnOz9bX69/5Ibu1kOwMmAONhm
|
||||
PWEegLkQZRUM9442UDvWpkC5GLp3PPFZ3GcGOGr+ZDhGCn+qR4c50fBnmywAm9/hLfr0x+RUxmUDIe4/
|
||||
ekg+uLyexclqx9sysLxh/d8Hc3n/tIxL5G17WBJCuRh+ZArxXz1wj0uIW1lwVeaseYyHP0G/jgyyh/CH
|
||||
ozHFjL/W5CqLXnhwnbQ784nq8U8DhINKSvSZj0mPs/PJ0PMLyXuX1pFF138n6/4+QLbeOkZ2304lh++e
|
||||
JakZf7GZaSw9OHkvneyno8/vt0+y3AT5yIJrv7I5ikHnv6Geex6L3bFsQe1384JRF75nAuf3+YD+e/pf
|
||||
q1kbqB1vS+BhUMCW4bcbfBj9Mrhq1jBIPtnz4Qcnj5C9f7YtVn/U0PzULJJ457SBGMBiNhv69FEApVOQ
|
||||
sh0l/PRLq8mam/vJ3jtpjNxXHv6TS1gFBapV6VQox+9dIDupQDBTO+7iUrZ6E0l7XkarN+ixf9DrUp4X
|
||||
19k8bZbq8bYGxkXKSSyQ8/qmRxy4aj4ByOEPhaP+ROxqWQB2tcEtvCxmhTk5MEE0+Py3qscCmDgbc2EJ
|
||||
I2MqDSMemoHo+cU9KoykO6fI3KtbSP9zXz9xdPjf5Q25xIh7HUC/o3aszQJhEKpBP/TH0gipGmSOMIiH
|
||||
P14r+9ehP8R3erMrAcCT//L3oVzx8e7bKbnWxoP0EMqyG3vY+plbmfcMx1oTSGQxj3GMjhAfX9lEup39
|
||||
PFcij9Dprwc3DcfjHn+muYDdTfxRTuqTY0nghqHpdSY39wJnzTIK8PAnZM+Yt2Xy20X8b4zeZ7/MRRTE
|
||||
yBPTl5PX094n/7m0lhygMbpy8kyrwJLvrbeOk+EXvmNC+O76zlzCRjiFpeFqbWDLYJxMjSfBv40iDed1
|
||||
6AXOPvvaIKyui4nCCOAYfnjKTFkAdkd+jk+pB1WS6Tr1rMq5AlvDlQf/kDuZuUX78ZWNqvduF0A5NHEC
|
||||
8f6ux1xwlnH3mVaIygvfKEroj8dulgVgV+GPEm1puIAno5SEsSecpffW2kZWe+YXqAKBm9g6xW9Vv12U
|
||||
s6UZdyUHXjCT4//nGy3s6UZ/xC7jfw5UVb64uo3F02rksQdgRJt/dSu7V7U2sHkgD0A5dP2Q9Npjm/mA
|
||||
u8+UB8hfdsDbvOnJ8WI7m1z89iQgTka9HfV/5aywvQL3iHuN++sH0vQZ5hW0CLkcimcEshp+8E57cPdZ
|
||||
8gC+/ZxjWNLEUTgxE4HKD9sqMBP80819j8XJRQF3aG7z480k+5gJliGHQVlYHer5ZZdp4K7M4QLkAaih
|
||||
RrH4qUT44alfygKwi/AHT0MNO/8d+dPoccCiiNMZl8mQ8wvtoizK84CwfROJ9+JeeKdACcbhAs0HSF96
|
||||
Hk/dRxyP2WEvAnjj1CwW6/+deVeVEEURNzPvsNzgddo2am1mK+ACwI4Rviv7JpX1qI6X7BVUAMz7O3jO
|
||||
bl+DntguEmBs/LT91glW41cjQlEG1glhrVLLUx+qtp3NgHIUQvBfNzi9do+XGoDDuj4B+U+Eefzvu3ZA
|
||||
eGRq/G0IwJYnwHqenU9O3Lug2vkCOThy9xzpZsPbxfAJscBNw+/UjW3xOjhckET4uVox3UrQz+JB20cb
|
||||
XndkixUgxLZY93I64wp5pNLhArmBWWMsk+537iubzAt4JQgzwu6fdugLDlcfHo21QflKhLkASoTuHTec
|
||||
CcBGN70F+ZUbYgnkDefvXye9zn6p2qZahpwHZKMS5DHvXawMLVEgAbgNfr04/XQK3z9xNvP+Nhj+TE1f
|
||||
yZYlq3WwwNOBp8ew9FqtbbUKWQBsSUSjr7p+AQ7LXM6fAHQBLHEoFX5o8vdsBLChBBhD98gLi8hVQf5n
|
||||
BhYIYhS1lafkeCUo/OBk4rO451pwWOZyPgQQzdYA4UulI47FbIIAIlLibGYE6H72czqE2++aHksD+VOn
|
||||
M3NV21qLQLSCRyR9l/f5nXIYj0g6yJzOo8krQHV1nMtFnIj9w5YE0PHMHLbbm1pHChQch++es5lZYwiA
|
||||
Om7is6LvEV2V0pUZl/NVCpUEULzGoH+76pPjjtuKALC2Zc/ttCKxpsfSQJtuu3XMJvZOAlf1ybHE/8eB
|
||||
aZVa+ruBy/kRwHNy3bR4nfg36+mTY9kWiFoXAB4JXHR9p2rnCZgPn1/dqvm3yDABYDLs50EXq3UL8gWX
|
||||
85MIcwGUcP+4kxc90WWtCwA7G2A7E+VzvQKFAzwgpPUdtTlXA34Zcq3mwFfCwGW8zAXcBsGfZoYSqPuc
|
||||
jgH0RDe1LgBsQYIlvmodJmB+nKFJMXIttb7QAhhXMRu8Yeg/tYY1jQKXCyQA72+7h0SmJtzBybQqAKzn
|
||||
32e0rYlA4WPH7WTN5gMGAWwefq/OuGZNweV8CUA+uKTngu5YB5ShVQHgTSZ4jlf50Pez4GHmQ3Lun8vk
|
||||
2LUzDBduXbHKlifmwr2H98mfty6Rozf+JMk3z5FLd2+QR4/M1FZZmWyzAC0ul2BcpVFL4Jbh92uNbv4a
|
||||
uIxdDcFtEPxp9pw8dVzSe2G3SDoCPNSqALBjmrmWOdzMuEXmHPyRvLV6IglfOpCELR1A2qydQr49vpER
|
||||
Se07Wkb6nWtk+sHvyVtbYkjEuuGkyfrR5N3t75EN5xNJpplEjW0l3yngLnqFCS6AoC0jMutMaPYGuOza
|
||||
p0VJcBsEf5oVMwjgq26R+tT4B1oUQFTqdPLbrROqHZNfgBAjfv2UeC3sjh0FcrCoB/Fd3IuM3fm56ve0
|
||||
Cgi23bZpxH/1ABkDDQhbN4zMS16n+r2CYO31faTxSfU+shZyRoBhD40EkKfnAorJIVApj3ld9HQEuKc1
|
||||
AaDqgzUq5tqyJOlSMgn5vt9j5Ofw+743OXAlVfW7WsSas7tVye+/RsLLG8aSv+6ap2hw88Ft0i95PolM
|
||||
jlPtK2vAMAJsHpFRc/RrzcFlOQTKmwDkg0u5f9YhjJ5Qc0kwXnCBvS3VOiS/QP7w333LiY8J8nsv7snw
|
||||
ftJS1e9rDfD+o/+Yb5L8QNC6IWTVn+abM9mQvo80SZxCIrEOR6W/LA3GVcrZwE3D7tUY/fKr4LJri4C8
|
||||
jwBcAA0+aB9IQ6AbWhPA5PSVZpvtffjoIYnd/fUTyQ+M2jGXZNhALnDz/m3Sf9dHJsnvv3YQCVg7mHxy
|
||||
YrXq9wsCPGHXL+lTErp7rCZEwAUQsGHo39X6vYzdovMnAB4C1Y9704fe0F9amgfAc6t/GL3g7VmAEWDu
|
||||
wZ+I7yJKdBPkBxL++I7mCtpfYnE/8wGZmPS1SfIDGAGWnN6m+v2CYstfB4h+y2iCF1VYOxziXA34efDV
|
||||
F7uE6MHlfIVAXAC1h77UIOJE7BktCWDixeVm38Yk+fo5VvUxRX5gz1/HVL+rRWxLP2SS/MBLG8eS83eu
|
||||
qH63oLhBR56+iZ8g7JBEYMWRAFzFUgi/1QMvVG3lFQAu50sAutfdMBFWqmpzv5r64zHHtCIAbGeSVAiT
|
||||
XhgF5h9ZS0KXUREYET9gSV8yadcCs5UOLQHMXUw98B0JXTf0MfI32TiafG9m78/xS3oSE0DgluEkdM84
|
||||
q4mACeBELPFd2T+1Qmi9huCyLqoWnHoeBSA/DENRKfzo1L1aEQB2cL5XSOt97j7MID+l7SCt1k5iQgih
|
||||
ePWnMWTB0fXk+j3be7AGucA3qZvIG1umkIj1Ixna/zaTbErfX2jzGn8/uENa7IgjgZupCCjCEidYJRxi
|
||||
y6GPTiXeS3sfphyuxrjs4YH1bfkSAJKGimGHJmvigZioVLzafy/11uqNb05co4Q/d+syE4Xa320JGA0u
|
||||
37tJLty5WuijGHKkj1PWkqDNw0kQHQUAS4dDCH3YAzGHpxCvhT3wQEwlxmWJ03kSAGbLntd5VMLuuhXD
|
||||
kiYs0oIA2p7+SOzkZgM4cOMUabp9kkEAQVtHkNA/LCcCLoCw/ZOIx/wua8Bhmct4xiVvSyEo2I5w9LNC
|
||||
yO9jZkEAOKnaD1oKSH7FtibaB0qiPRM/ksmfA+pILSICCIDyNSuE5iCNPumwAByWuZwvAfzL5fUQPEvp
|
||||
ErBhiLQxrhW3RcED2VuM3uwuoF0s/HNrLvJjFGAjgQXCIVkA2cE7RpP6s97GBrkuzk0DyoHTMrefakwA
|
||||
laI8MGw4+y7p3UkSAD25lTbGwrOoWIOu1tgC2sOhm6dJk1/H5SI/w7aRUmJciCLgG2MFbh2eXXfym4PA
|
||||
YXkEyJ8AqrzqjSpQebf3WjehqrLqu4HHX1xG7hbBLcxtFVcz/iE9k2gYpCS/AoUZDjGOYhZ47eBbNfpG
|
||||
vgUOy848XwIopgurjomDcq7RgQ30x2NPQwDWSoSXXN+l2tAC2gTmVd4/uUqV/MF0FAj+lY4EhZQYszmA
|
||||
5Fjiu6LfBUp8PA9cThfgypdB5EkAsGI6NzYZhjygatiBSdvkMMgqm2PhJdFqDS2gXWy8tF+d/BwQwb6J
|
||||
ZhWBHP+z94R5ft01kXL3RcbhWnmfBOOGg9m+QPSzSujusV8wAVhhdzi8ptSWZmEFJFy7/w8J3jrSJPk5
|
||||
ws0oAi4AlF095nZcAe7KHM7zJBg3HOzgHFAHX67sv37waGkESMi2dCI84sJi1QYW0D7a7JnxRPIHbx/F
|
||||
dnE2V04gJ8DZOG/9Ga1ngrsyh/M8CcYNsRKfC6joMad9S5pcsCfDLJ0IG7+7V8B2MPrIV6bJzwXARDCa
|
||||
hO+f9MwiYNykjpo67Ie1hr/SFdx1CXFDGJ/nOQBuTABy9uxSvUOId8SxmFM4uSUTYTz0vv7vg6qNK6B9
|
||||
fHlmk2nPrwQVABPBM4RDCH8gACyC81nW53zlV93Dwd38ToJxw8H/0lVnlaDyFNVowvKLFAZZLhFufmoW
|
||||
STTj2n8By2LDpX1Ev31snsgPhOwcU2AR8PgfSyA8v+yCNUA1GXddWQUozyVQbjgYMVNx+UVjVYM2D58p
|
||||
CcByeQDe3J6SITa6tVX8cSOF/Pv3KaYFoCT/DhkQwYH8h0OG+J9+333225+DszJ3Uc0El/MlABi+5FjO
|
||||
60Vn+lml0bzOHan3z7RkHtDpz7nk0oObqo0roH2cvnOJtNoz/YnEz0V+WQBA2P78jQSMk5SbgRuGPKo5
|
||||
4t8DwVlZAPmuAHHDlxzkJKJSpWhf34ijUy2aB+BlbZhVvPMgo9CAJc8ChYDMDJJ+7zppn/h+bvIbCUCN
|
||||
/Ay/528kgADYlug0/nd+qW4EOFvQChA3DBnPsxiqTJkK9N81QneNW2VJAbx+8j22w8GI7Z8aMHL7nBz8
|
||||
psRc09jxmSpG7VTgdyXmkVG7TGD3549hNLCHY34O9ipA70MdX+Qg0QhJXz6GMfuMsF+BAwtUMZbhqxwc
|
||||
VODQ16oYd9gEjnzzdBwFviVjj35NXvl9cv7JbxDBWII3vTxNBDwBxmuRPD57dzPlak3GWSn+z3cCzA1f
|
||||
QvJQokx914r009V3Wf/RGGZYGGShPCDi8BS89Fh106onPcPL4fN9rxwsUWBp7xwsy4Hv8j45WNFXHSv7
|
||||
5YLfKgV+6J+DHxX4aYABOXv2mN66RPkYo/+6HAT8PDgH6xX4ZYhJBG4YmoONCuDxRQ75KS7AsJbfaEkz
|
||||
n9QyhslSpwni54n8ABUAXnb3tBKpHP+za3GLaYH6v2tptxfwIAxmgPOdAHPDl1geUN63FipBL2Cn3Yjj
|
||||
sVcsOQoAaABfSi5NkB8Q5DfAJPmfIIA8k59j95NHAr7+h7b7jSrtQ1uCq3LuyuP/AgkAxvIAmgFgPgCK
|
||||
qhW6Z/xGCICOAhZdFhF+YLIkAkF+7ZNfSfxnJT8dARhMiMBQ/kyaSDznd9lFOVqXcVXibIHjf25QDmIo
|
||||
J3lIqeG7tM8E9qNWWBYRcYiGQ1wEKqTnKBTyK4gvyF/IYY8x+SlCd49jO01IiXEOJ3j5EztRuMW2nAWO
|
||||
ylzFHFaB439u+DJiKD4f4Fq9X1RUxJEpVntrDMIhvx+oCFSIDxQK+QFBfgNMkv8JAnhm8nNABNQRchGw
|
||||
8AdboKzoe71Ka/83wdEy7tVQtEH9v8Dxv9JYHqBzcUE5FG/cqx20fdRq/uNKcloKGAlAOEH+x2E18iuJ
|
||||
X4jk5wg/NJnok+Xqz16s/uy0jXIT4U9lnXPBVoCaMh4GlSxVu3IV+vmi5+edButp0oFRwFKTYsZAPAiy
|
||||
CfLnoKiQH4THkueww5MZ93Dvdcc0mwxulqpV6QVwleKZwx9uPAwqoateloVB5QNr+tGkIxnlUGuNAgAP
|
||||
hwT57T/syUV+ihAgaUIWhODzbY8zZRtVDwE3ddXYnNUzlT/VTAqDdLoyJWtUdKWftf1+GPCxXhoFrCYA
|
||||
APMEIJ9Zya8gviC/lRLeJ5CfCYASP5QKAO1dP77lQnBS5iZWf5ot/OFmCINK162CPKBG9QFRr4UdmvS3
|
||||
NcMgDlQG/CjZhOdXwJLkNxJAYZMfXh/eH6VRz6+733qhjd/b4KQcops1/OHGw6DiuvLly+tKloTS3AI2
|
||||
DP1Bj1EgJS6TlUZVyGkpsJzgJzoSCPLbP/nh/RMnZPrTtnKf2XYTuEhp76orz5bum636Y2wYUjCxUFpO
|
||||
NGq5xbboTLPxR1oYBYCII1OJPyVigcivIL4gvzbDHpDf4P3pp/fCnlk1eoYPABdLVixZFdyUOWrW8Icb
|
||||
D4OcdGVZMlydon7QpuG/6qVcwCo7RhgDM8Ygm/D8hUD+JwjAYuTHZ+L4R4EbhxH3We3+oBx0Z1wso0Py
|
||||
a5bJL1OGkxqSYafqFbDtdJ16s9r2Q01WK6MAgIkSkE6Q337CHqX3D/1jAvH5vjep3qfJaHDQqZoLnLEy
|
||||
+S0UAcD4KIAl0lghWoPCPWjzsF2YjdPKKACgOmQQgRrpAQXxBfm1HfYw8lOEJU5g3r/hrOgDlHuNGAdL
|
||||
y1ugF6L354aTS8mwTlfOydUFAqjrNqPNgLB9E7MtuUw6L2DhECWeKvkBQX4DTJL/CQKwJPkZEidkM++/
|
||||
qGd29b6Nx4J7Tq7O2PwKM7+FlvwaG0+GS+lKl4bycAEN/dcP3ooncjAKWLsipAQbCdREIMhvgEnyK4lv
|
||||
bfJT4sP7B6wfQtz/03Y35Ry8/4uy98c+toWW/BobHwUw21Zejr/c6o5t1oVe6AOQTiu5AAdyggBKPkF+
|
||||
2yR/GCV/aNLErNA944n3190eVOsW2g+cc3JxQgSC0qfZZ36fZnwUKM1GgRIlatF/u/ut7L8C+zKyFXoa
|
||||
GgUAzBOAkIL8eSC/sQCsTH4uAP81g0iDhLd+Adco5WvJ3l9Z+rSYAPBDSDiUo0Ddqh3CXgv5bdRlfXKs
|
||||
VdcImQKbJ1g3ODfxBfnzRHxrkR+hD8iPF154fPbutQpN3duAa0bev9CTX2PDj0FxKDtBgRVLVClXh342
|
||||
8Jjf+cNQ7PVohQdm8gIspQb5BPllmCK/kQCsQX4mAJr4hiVNyPZZ1ofUHtMM+/00KF65HJY9owoJ7hV6
|
||||
6dOU4Qd5LlBOV8EJ8wJ1HcqX8qGdvT/8yBRKOOsvkVADEwElpCC/AlokPz6TJmbint1nRx9zKOmAl17X
|
||||
1bk4IeJA5cfisb/S+CggVYR0ugp8FKg17rVudMh6qKehkNYSYg68RxZkzEV8Qf5cxLc2+UP3TWQL3ry+
|
||||
6vbQtWsINrtqIHMMs77Kyo9VBADjowCbF6B4QVeuOIanhl7fdPsa+7RoMSHmwAx2ICVekSb/EwRgLfIz
|
||||
AdCwBwJA1c5tSotl4JSubHE3xjEL1/2fZnwUwEyci87ZCfMC9RwqlvMPWDPwqLxMQlNzA0pgnoCJoCiS
|
||||
X0l8LZGfOk4a9z9CG7h/GJ3iUMEpGJzSlS+BDW+xDg1c497f6sZHAbZGiKJy8UploVT3WsNe7hb068gM
|
||||
LJPQYlWIA9WhgF+GFl3yK4ivBfKz0Ieey/OLrvdf6BjUH1yinKoHbskcA9c04f254UJQiuLbqVctXrFM
|
||||
ffrZyGPeux/jZvQIhTRYFeKIQDhESVgkyP8EAViT/HiFKg99fJb0IXXGvf4lOFS8THFwCcudwa1CXfFZ
|
||||
UMPF5EqI5eEKF+7ts7zvb1A2NtPSaigEYCSQRCAT3x7JryS+1sgvhz6Y8Ko/ozWWOvswDpVnE62aSXxN
|
||||
GS6IJ8TYQqUKD4UqRDVsSolyju3sZaU3TeYVLCfYOEyQXw0WIH/glhGk4UcdLjqH1GwO7hSXEl886ghO
|
||||
aSbxNWVQpjIUcqWhUAP62ajOuOb9aGfeQ/lRy/kAgHkCENKuyG8sAI2Rn8X99NweX3TJqNZVPxKckbmD
|
||||
x2+VoY8mEl9T9ngopNNVd6xQBk/teDac3e4/NCkmSIq1Oj/AAaEyEdgD+U0QX0vkR93fe2FPUnvEqx+B
|
||||
K45lHKUnvWwg9DE2ZSjEqkJssZwjuyGvRvM6LcKrMWkuoMmlEkqwcGjzcPshv5EArE1+BinpzfZZ2ofU
|
||||
nfzGKnBE58gWu9Vm3JE4pPnQx9hwoRiupGUSmLyQYrmGFD7e33bbgnc5RZyM1XRlCJBEQHMCQX6zk59V
|
||||
fPZPyvJd1Z/Un9Z6J+WGL+NI7gkvqyx2e1bDxfJQCJMW2KvdkA+UrVUl1Pv7XvtCaANqPSkG8KAPiGmz
|
||||
5FcQXyvkZ9g38ZEfzbEavNf2SJkXnfXgRvEyxXncD84oJ7xsSgAwLgK+YlSZD3hUiKrf1GdZnxQ0mE2I
|
||||
gI4EIKVNkP8JAtAS+dnTXbOjTzsH1nwdnHCsUBoRAo/7rbrS01yGC1fmA+wRSkeX0niczdO1lW8r3xV9
|
||||
z6OhIk/GZaoRT0vAPAEIaTOeX4PkZ+XOfZMyMfPe8L/t011eaYRd3TxlTmAZDThik3G/KcMN8HyAb7Fe
|
||||
07GKsyf99HrhneBoKoJ0mxHBUVkEKqTn0AT5FcTXCvklz0/JT9ul0X/bX6r8pm8ncMCxSikvcELmBjjC
|
||||
4354f5s3HgrhhlDLRWKDiY1aXASuHYI7+C7rkx5CG9UmwqEjNByiRNQU+Z8gAO2Qn4Y91PM3+rD95cot
|
||||
fDqj72XyY6aXJ73Ker/Ne39uXARIaPgkGW64tqNzaUkE0UHv+C7tcx6NTkn2SPPVITYS5BaB1civJL4G
|
||||
yY9qD8jP9vL8sF26wfNLfY9yJ7jAJ7tsNul9milFwCtDWOBUm44E8ALelV/3auWzqGcK5gkikm2gRKoQ
|
||||
gSD/4+SXlzdkh+yflOW3eiBpMOvtUy5RDRDzeztWLuWNvpc5YPMVn7yamghQ8qrjWNkZDeJdIbROU68F
|
||||
3fYFbRtBIk7EZmt+xlgOh6xCfmMBaIz8bIZ338Rs7MDRYEabQy7etV5DHztULoVFbniyS1nutPmKT16N
|
||||
iwA3jClu9tYZijqOziwe9Haq7BLmMa/TViRL8LJa2nJRDfpjMSSIktOi5DdBfK2QHwvbcCz28KwX23KH
|
||||
U+UyEehb2sdwdJz86HtwoMiQnxtuFCUuYxEYcgIHBwd/99lvL8Y2JmwVqcZFgBIpiGlx8hsJwNrkZ6Dk
|
||||
x0y/1zfdSZ2JzVegL9GnsoND2GNMfrsod+bX1EQg5QQ5IvCl3uM9/1UD7qHx2fMEWn6ohougCJKfhTxI
|
||||
drGkedNw4vF554xaQ5t+iD5EXzqWduQJL/q4yJOfm7EIeGJcS1fasZHO0ZGJoGb/qIHe3/U8i7xAnxyX
|
||||
reXl1AiHmAgKm/wK4muC/Ij3qQDwWKn7f9udr9opbBgjv6POi/WlVOrkCa8gv8LQAMrEmJdIa+qKF2+A
|
||||
fYZoQ/q4BLs185jTcYcyJNLqaMBGAkpSs5L/CQKwFvmlXdskr4/f8F7Ui9SLb7XLObBmc/QZ7TsIAEtf
|
||||
MMnFS5282iPIrzBjEfDJMrbDhJw4edNG9XOLbTnHd3nfu4gx9SfjsrQ6GuiP0pHgt1Hm9/xaIj/1+mEU
|
||||
WNPjMa/z3dojXv2c9hHifZ7s4kF29CH6En3KyV+kEt68mlIEfMYY60KwB6QbrxBBBK6dQnp4ze9yFA3P
|
||||
tl1Jjc/U4mjAwiGIwFzkVxDfWuRnxGfbFU7MDPl9DPFZ0pvU/0+b41Xb+fdG36CPHEs5oq+wpBl9hz7k
|
||||
M7yC/E8xLgK+dgiLorAHJHsdE40lPeSQyNfBySm4/ozW3/gt63cvmBJAr9Fd6FDGzRFBPsn/BAFYmvwg
|
||||
PhNAEvX6SRPZqliPee9muI1/fZGDk0Mo65NSDj7oI9ZXUp+h79CHyrU9gvxPMaUIsCIQy2J5hQiJVH2e
|
||||
F8DjVO8S2osOv/vx1BY6BiGR1sIijAQgar7IryS+FsiP/fmxSzO9FryUvMHMNgertvbrhz5gfYF4X9oF
|
||||
hCe76DP0HfpQkD+fxkWgrBAhgUIsyUIi6mk8DaOBg0NgvSktPvL+tscl7OjANuZFkqyhEUFNBFonv/Q2
|
||||
durxE2mSS7/vu6ofafS/9pdqDnnlU9rmwaztJa+PEicPedBH6CtlpUeQv4CGRkMD8rwAS2V5SISasqFK
|
||||
ROFXsbFby/rvv73KZ2nvO3j4Hk9yQQRaEQLCIS4Ck+Q3FoCFyQ/SM+BtjPD69P+xT4/n/C533Ca98VOF
|
||||
sLqt0NaszWnbow/kvuAhD/qIx/ui0mMG46MBzwswrKKWjLIaKgxuOkfkBiXRKRgN/F07Bvds+FH7bb4r
|
||||
+j1kC+uoELQyIuiPx1ICj3m651cQ3xLkz0X8xPFsGQPifM8F3R7Wi31re9W2/n3QtqyNaVtT345YH14f
|
||||
fYC+QJ+gb0S8XwjGRcBDIl4qVY4G9VnprRQTARNCtV6Rwxp93GGP38r+mWxEkNcVcSFYa5c6Fg5Rwpok
|
||||
v5EACpP8IZz8MvHxTEbAusHE++vumfWntd5b7d3QEZz4aFvHUo4obyLWV3p9XuIUIU8hGxcChlflaMBz
|
||||
g7p0NGjIwqJSpSACjAoBEELDD9/5zWdpnwwsUZBKpwlspam1xMBE8LssAguTn5EeSJyQJYU6E7KDd44m
|
||||
vj/2J55fdMmoH99qh0z8ALkNaXvSWN+R7eqB7e95rK/0+qLEaSFTGw0Qd+JBalQfMOuIsKgRKhOs86RO
|
||||
9HftENzLfWbb1d7fdr+GhzMQ8+rl8ilDSny2JYXAwiGIQIX45iY/PDvDH+OzGfEpcP+BW4cTvH6o0dyO
|
||||
190mv7mmamtWz4fHl+N8Fu5gKQPCHbQt2hhtjTYXXt9KhobmQuDlUl4pwsQLhmaU4+pJ+UFuIVR4uX7r
|
||||
elNbzPP87N1kvx8GZCE8kifUDCESF0NhCwL5CQiLXMXc5Me2M4z0e8dlU+KD8I+wbgfzJn5rBxHvhT0e
|
||||
NZgVfbL2yH/Pp8lta7SN3EZ8GQPifMzmoi3RpmhbXuExLm8K8lvBuAjggYzDIjxgzfMDLgTm0bgQnJzL
|
||||
RLzYr8kY9/ffXu/5Tbf0AEoKkIOVUSUxSCNDIQsC4VDobojg2cgfjE+J9Nk0xMmSSc88PZaO+P88hHgv
|
||||
7kUazemY7ja1xXrXLqFjnco4RRiIj7aRQh1OfB7noy2Nwx3h9TVkytEAQzLKcJiB5PkB9pqRRgSdTsoR
|
||||
ypVEp/M8wb9icJ03aw9rmtDgg+gtXAwYGcL2T2JhEhWDNNOsMkKYQxQIhyCCvJI/mAPE3z02O3jPuCwa
|
||||
6jwC8VlySz0/rh8ThBLpO6W7xbXc8mLfJtPL+9VoaSA92gBtAeJLO/dxj48248RHW6JN0baiwqNRQ4c8
|
||||
SQh8RJByBNSvSzl6S17PkDCDFP4VQ2u3fHFI05gGM9qs85jfOdV3Rb+7ARuGUuKNYStRGeGNBIHZZzVh
|
||||
GEON/BzSSDCOjULw2I9jdDYlfFbQ7nFZwRQhu8c+AvFZmIPv/TqKBFAvj/dqeX3V7a77B9GpdSe/ua5G
|
||||
r8i48oG13qL3hqRWIj6qZYjvpaoOavk8xld6fFPEF+TXsD1NCIhjkcihfo01K/WRMOuoB1QTQ+nqFaOq
|
||||
tQ/oV2d8808aznp7MwThs7T3LSzLxoQWvC3yB+x4LYdNQDYFxJETQsngSzVM4kQsC11AdICGNhzZLLwB
|
||||
0akY8Aim/y+U7D/0Z48den7R9Zb7h+1S68W+tRkztS+08utfulr5l/h9sHsC6Us6UNIbwhyUM9EGaAu0
|
||||
CdpGEN9OzJQQEMeibo1KBiZweHgkjQo0V2BioGFByUrlpRAhRxABJV4oH/VCK99uNQe9ElcvvuXihh++
|
||||
s93j884nfRf3vOa/sv89rFAN3DKcxvKjmDjC9k1kAsEzAhHHY6Sqk8poYBglqJDCD05i4QuWdcCj4yET
|
||||
nxX9iDclOvXs9zzmvnvNfXa7k/Xi39peZ8xri+HhKzXz6o5ro9cYKF8ru/aSEDW9F5n0qOZwb8/DHLQB
|
||||
2gJtgrYRxLczMxYCT5Z5+VQ5KqC+nSMGxMRymFSyYjmQiovBMEJQBJao5ByJsMm1feDAmkObxteZ8Mac
|
||||
BgltVjScHb3ZY07HvR7zOh/1/KJLqve33c9Sb33Bd0nvS77L+lylodU1v5X9r7F/L+1zyWdJ7wveC3ue
|
||||
9VzQNdVzbqcj9d9rs7deTMtNbuPfWF5zyMtzavTSJ7zQ2n9g+cAab5WoVLoxfltxHfy6fEsips8JbxDX
|
||||
K0mPe1R6e17O5MmtIL6dmlIIqGCojQpYwYj4FwThIwMmfpAYutPRwVMSBA2TIAqMECUNVSWlKDgQc4Ok
|
||||
wSWcy0SWdavazNn/xRYu4XXauujdol2iGr7DgH/T/8PfcAyOxXfk7/K4XQnp92g4wzw8/UR4wwjvqMPC
|
||||
NDyFhWvGtXNPj3vCveEe1by9sqojiG/nxoWgHBVQ1zYWA7wkQgQkhoiTlYKQRgiETI6OXlgmwIRRsVxg
|
||||
yaoVA5k44IlzCyR/wHcRikFsVcsFOlQsGSgRXX7WVorjuYdXEh7XimvGteMejEmPe1V6e058YUXMuLcD
|
||||
AfiooBQDJnwQImDyB3EyFwS29UAogaoJauUgHkIMJJUgIzwwiIkH+z1lgfiw3ILNRcjzEbkg/T8/jn0H
|
||||
38U5pHPhnDg3fgO/hd/Eb+MacC24Jk54XCuuGdeOezAmvfD2wh4zU2JAiMBzBi4IPkJgIRjCChAPIQa8
|
||||
LsgIDwxiwhuDpKi0cJFwwGMrofwbjsV38F2cA+fCOXFu/AZ+C7+J38Y1cA/PCc9jely7IL2wfJtSDGqC
|
||||
4CMEiIawAmVDEBBeF4klPDCICW8MkmIyDoTlQuGA1waU/8ePw3fwXZwD58I5cW78Bn4Lv4nfxjVwD69G
|
||||
eEF6Yc9knDzGglATBbwuyMjFAW8MknKRwEPzEUQN/O+c3AD36Py8+A01sqsRHhAmzOymJBgnnbEwuDg4
|
||||
QFgOEFgNymOU3+XnMyY6oLwWYcKsYkoSKqEkqjE4mdVIbQy1cwPCnsl0uv8DRYFFJOEP/tsAAAAASUVO
|
||||
RK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="logoPictureBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>3, 3</value>
|
||||
</data>
|
||||
<data name="logoPictureBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>219, 259</value>
|
||||
</data>
|
||||
<data name="logoPictureBox.SizeMode" type="System.Windows.Forms.PictureBoxSizeMode, System.Windows.Forms">
|
||||
<value>CenterImage</value>
|
||||
</data>
|
||||
<data name="logoPictureBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>12</value>
|
||||
</data>
|
||||
<data name=">>logoPictureBox.Name" xml:space="preserve">
|
||||
<value>logoPictureBox</value>
|
||||
</data>
|
||||
<data name=">>logoPictureBox.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>logoPictureBox.Parent" xml:space="preserve">
|
||||
<value>tableLayoutPanel</value>
|
||||
</data>
|
||||
<data name=">>logoPictureBox.ZOrder" xml:space="preserve">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="labelProductName.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||
<value>Fill</value>
|
||||
</data>
|
||||
<data name="labelProductName.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>231, 0</value>
|
||||
</data>
|
||||
<data name="labelProductName.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>6, 0, 3, 0</value>
|
||||
</data>
|
||||
<data name="labelProductName.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>256, 26</value>
|
||||
</data>
|
||||
<data name="labelProductName.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>19</value>
|
||||
</data>
|
||||
<data name="labelProductName.Text" xml:space="preserve">
|
||||
<value>Product Name</value>
|
||||
</data>
|
||||
<data name="labelProductName.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
|
||||
<value>MiddleLeft</value>
|
||||
</data>
|
||||
<data name=">>labelProductName.Name" xml:space="preserve">
|
||||
<value>labelProductName</value>
|
||||
</data>
|
||||
<data name=">>labelProductName.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>labelProductName.Parent" xml:space="preserve">
|
||||
<value>tableLayoutPanel</value>
|
||||
</data>
|
||||
<data name=">>labelProductName.ZOrder" xml:space="preserve">
|
||||
<value>1</value>
|
||||
</data>
|
||||
<data name="labelVersion.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||
<value>Fill</value>
|
||||
</data>
|
||||
<data name="labelVersion.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>231, 26</value>
|
||||
</data>
|
||||
<data name="labelVersion.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>6, 0, 3, 0</value>
|
||||
</data>
|
||||
<data name="labelVersion.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>256, 26</value>
|
||||
</data>
|
||||
<data name="labelVersion.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="labelVersion.Text" xml:space="preserve">
|
||||
<value>Version</value>
|
||||
</data>
|
||||
<data name="labelVersion.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
|
||||
<value>MiddleLeft</value>
|
||||
</data>
|
||||
<data name=">>labelVersion.Name" xml:space="preserve">
|
||||
<value>labelVersion</value>
|
||||
</data>
|
||||
<data name=">>labelVersion.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>labelVersion.Parent" xml:space="preserve">
|
||||
<value>tableLayoutPanel</value>
|
||||
</data>
|
||||
<data name=">>labelVersion.ZOrder" xml:space="preserve">
|
||||
<value>2</value>
|
||||
</data>
|
||||
<data name="labelCopyright.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||
<value>Fill</value>
|
||||
</data>
|
||||
<data name="labelCopyright.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>231, 52</value>
|
||||
</data>
|
||||
<data name="labelCopyright.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>6, 0, 3, 0</value>
|
||||
</data>
|
||||
<data name="labelCopyright.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>256, 26</value>
|
||||
</data>
|
||||
<data name="labelCopyright.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>21</value>
|
||||
</data>
|
||||
<data name="labelCopyright.Text" xml:space="preserve">
|
||||
<value>Copyright</value>
|
||||
</data>
|
||||
<data name="labelCopyright.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
|
||||
<value>MiddleLeft</value>
|
||||
</data>
|
||||
<data name=">>labelCopyright.Name" xml:space="preserve">
|
||||
<value>labelCopyright</value>
|
||||
</data>
|
||||
<data name=">>labelCopyright.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>labelCopyright.Parent" xml:space="preserve">
|
||||
<value>tableLayoutPanel</value>
|
||||
</data>
|
||||
<data name=">>labelCopyright.ZOrder" xml:space="preserve">
|
||||
<value>3</value>
|
||||
</data>
|
||||
<data name="okButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||
<value>Bottom, Right</value>
|
||||
</data>
|
||||
<data name="okButton.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>412, 239</value>
|
||||
</data>
|
||||
<data name="okButton.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>75, 23</value>
|
||||
</data>
|
||||
<data name="okButton.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>24</value>
|
||||
</data>
|
||||
<data name="okButton.Text" xml:space="preserve">
|
||||
<value>&ОК</value>
|
||||
</data>
|
||||
<data name=">>okButton.Name" xml:space="preserve">
|
||||
<value>okButton</value>
|
||||
</data>
|
||||
<data name=">>okButton.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>okButton.Parent" xml:space="preserve">
|
||||
<value>tableLayoutPanel</value>
|
||||
</data>
|
||||
<data name=">>okButton.ZOrder" xml:space="preserve">
|
||||
<value>4</value>
|
||||
</data>
|
||||
<data name="textBoxDescription.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||
<value>Fill</value>
|
||||
</data>
|
||||
<data name="textBoxDescription.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>231, 107</value>
|
||||
</data>
|
||||
<data name="textBoxDescription.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>6, 3, 3, 3</value>
|
||||
</data>
|
||||
<data name="textBoxDescription.Multiline" type="System.Boolean, mscorlib">
|
||||
<value>True</value>
|
||||
</data>
|
||||
<data name="textBoxDescription.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">
|
||||
<value>Both</value>
|
||||
</data>
|
||||
<data name="textBoxDescription.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>256, 126</value>
|
||||
</data>
|
||||
<data name="textBoxDescription.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>23</value>
|
||||
</data>
|
||||
<data name="textBoxDescription.Text" xml:space="preserve">
|
||||
<value>Description</value>
|
||||
</data>
|
||||
<data name=">>textBoxDescription.Name" xml:space="preserve">
|
||||
<value>textBoxDescription</value>
|
||||
</data>
|
||||
<data name=">>textBoxDescription.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>textBoxDescription.Parent" xml:space="preserve">
|
||||
<value>tableLayoutPanel</value>
|
||||
</data>
|
||||
<data name=">>textBoxDescription.ZOrder" xml:space="preserve">
|
||||
<value>5</value>
|
||||
</data>
|
||||
<data name="linkLabel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||
<value>Fill</value>
|
||||
</data>
|
||||
<data name="linkLabel1.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>231, 78</value>
|
||||
</data>
|
||||
<data name="linkLabel1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>6, 0, 3, 0</value>
|
||||
</data>
|
||||
<data name="linkLabel1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>256, 26</value>
|
||||
</data>
|
||||
<data name="linkLabel1.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>25</value>
|
||||
</data>
|
||||
<data name="linkLabel1.Text" xml:space="preserve">
|
||||
<value>Page</value>
|
||||
</data>
|
||||
<data name="linkLabel1.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
|
||||
<value>MiddleLeft</value>
|
||||
</data>
|
||||
<data name=">>linkLabel1.Name" xml:space="preserve">
|
||||
<value>linkLabel1</value>
|
||||
</data>
|
||||
<data name=">>linkLabel1.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>linkLabel1.Parent" xml:space="preserve">
|
||||
<value>tableLayoutPanel</value>
|
||||
</data>
|
||||
<data name=">>linkLabel1.ZOrder" xml:space="preserve">
|
||||
<value>6</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||
<value>Fill</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>9, 9</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel.RowCount" type="System.Int32, mscorlib">
|
||||
<value>6</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>490, 265</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name=">>tableLayoutPanel.Name" xml:space="preserve">
|
||||
<value>tableLayoutPanel</value>
|
||||
</data>
|
||||
<data name=">>tableLayoutPanel.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>tableLayoutPanel.Parent" xml:space="preserve">
|
||||
<value>$this</value>
|
||||
</data>
|
||||
<data name=">>tableLayoutPanel.ZOrder" xml:space="preserve">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanel.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
|
||||
<value><?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="logoPictureBox" Row="0" RowSpan="6" Column="0" ColumnSpan="1" /><Control Name="labelProductName" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="labelVersion" Row="1" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="labelCopyright" Row="2" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="okButton" Row="5" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="textBoxDescription" Row="4" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="linkLabel1" Row="3" RowSpan="1" Column="1" ColumnSpan="1" /></Controls><Columns Styles="Percent,46,0039,Percent,53,9961" /><Rows Styles="Percent,10,Percent,10,Percent,10,Percent,10,Percent,50,Percent,10" /></TableLayoutSettings></value>
|
||||
</data>
|
||||
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
|
||||
<value>6, 13</value>
|
||||
</data>
|
||||
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
||||
<value>508, 283</value>
|
||||
</data>
|
||||
<data name="$this.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>9, 9, 9, 9</value>
|
||||
</data>
|
||||
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
|
||||
<value>CenterParent</value>
|
||||
</data>
|
||||
<data name="$this.Text" xml:space="preserve">
|
||||
<value>About</value>
|
||||
</data>
|
||||
<data name=">>$this.Name" xml:space="preserve">
|
||||
<value>FormAboutBox</value>
|
||||
</data>
|
||||
<data name=">>$this.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,138 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="labelProductName.Text" xml:space="preserve">
|
||||
<value>Название продукта</value>
|
||||
</data>
|
||||
<data name="labelVersion.Text" xml:space="preserve">
|
||||
<value>Версия</value>
|
||||
</data>
|
||||
<data name="labelCopyright.Text" xml:space="preserve">
|
||||
<value>Авторские права</value>
|
||||
</data>
|
||||
<data name="linkLabel1.Text" xml:space="preserve">
|
||||
<value>Сайт</value>
|
||||
</data>
|
||||
<data name="textBoxDescription.Text" xml:space="preserve">
|
||||
<value>Описание</value>
|
||||
</data>
|
||||
<data name="$this.Text" xml:space="preserve">
|
||||
<value>О программе</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,278 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="checkBox_DECODE_UseFramework.Text" xml:space="preserve">
|
||||
<value>Использовать файлы фремворка из:</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_Force.Text" xml:space="preserve">
|
||||
<value>Перезаписывать файлы в каталоге назначения</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoRes.Text" xml:space="preserve">
|
||||
<value>Не декомпилировать ресурсы</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoSrc.Text" xml:space="preserve">
|
||||
<value>Не декомпилировать исходный код</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_UseAapt.Text" xml:space="preserve">
|
||||
<value>Использовать aapt.exe из</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_ForceAll.Text" xml:space="preserve">
|
||||
<value>Пропустить определение изменений и построить все файлы</value>
|
||||
</data>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="radioButtonFileZipalign.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>57, 18</value>
|
||||
</data>
|
||||
<data name="ColumnTime.HeaderText" xml:space="preserve">
|
||||
<value>Время</value>
|
||||
</data>
|
||||
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="ColumnTime.Width" type="System.Int32, mscorlib">
|
||||
<value>65</value>
|
||||
</data>
|
||||
<data name="ColumnMessage.HeaderText" xml:space="preserve">
|
||||
<value>Сообщение</value>
|
||||
</data>
|
||||
<data name="clearLogToolStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>171, 22</value>
|
||||
</data>
|
||||
<data name="clearLogToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Очистить журнал</value>
|
||||
</data>
|
||||
<data name="contextMenuStripLog.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>172, 26</value>
|
||||
</data>
|
||||
<data name="menuItemSettings.Text" xml:space="preserve">
|
||||
<value>Настройки</value>
|
||||
</data>
|
||||
<data name="menuItemExit.Text" xml:space="preserve">
|
||||
<value>Выход</value>
|
||||
</data>
|
||||
<data name="menuItemFile.Text" xml:space="preserve">
|
||||
<value>Файл</value>
|
||||
</data>
|
||||
<data name="menuItemCheckUpdate.Text" xml:space="preserve">
|
||||
<value>Проверить обновление</value>
|
||||
</data>
|
||||
<data name="menuItemAbout.Text" xml:space="preserve">
|
||||
<value>О программе</value>
|
||||
</data>
|
||||
<data name="menuItemHelp.Text" xml:space="preserve">
|
||||
<value>Справка</value>
|
||||
</data>
|
||||
<data name="button_BUILD_Build.Text" xml:space="preserve">
|
||||
<value>Собрать</value>
|
||||
</data>
|
||||
<data name="button_DECODE_Decode.Text" xml:space="preserve">
|
||||
<value>Декомпилировать</value>
|
||||
</data>
|
||||
<data name="tabPageZipAlign.Text" xml:space="preserve">
|
||||
<value>Выравнивание</value>
|
||||
</data>
|
||||
<data name="tabPageSign.Text" xml:space="preserve">
|
||||
<value>Подпись</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelStateText.Text" xml:space="preserve">
|
||||
<value>Загрузка...</value>
|
||||
</data>
|
||||
<data name="openFileDialogSignApk.Title" xml:space="preserve">
|
||||
<value>Выберите файл для подписи</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_CopyOriginal.Text" xml:space="preserve">
|
||||
<value>Копировать оригинальный AndroidManifest.xml и папку META-INF в построенный apk</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_UseFramework.Text" xml:space="preserve">
|
||||
<value>Использовать файлы фремворка из:</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_KeepBrokenRes.Text" xml:space="preserve">
|
||||
<value>Сохранить испорченные ресурсы</value>
|
||||
</data>
|
||||
<data name="tabPageBuild.Text" xml:space="preserve">
|
||||
<value>Сборка</value>
|
||||
</data>
|
||||
<data name="tabPageDecode.Text" xml:space="preserve">
|
||||
<value>Декомпиляция</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_OutputDirectory.Text" xml:space="preserve">
|
||||
<value>Декомпилировать в каталог:</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_OutputAppPath.Text" xml:space="preserve">
|
||||
<value>Сохранить файл как:</value>
|
||||
</data>
|
||||
<data name="tabPageInstallFramework.Text" xml:space="preserve">
|
||||
<value>Установка фреймворков</value>
|
||||
</data>
|
||||
<data name="groupBox_BUILD_Options.Text" xml:space="preserve">
|
||||
<value>Опции</value>
|
||||
</data>
|
||||
<data name="groupBox_DECODE_Options.Text" xml:space="preserve">
|
||||
<value>Опции</value>
|
||||
</data>
|
||||
<data name="groupBox_IF_Options.Text" xml:space="preserve">
|
||||
<value>Опции</value>
|
||||
</data>
|
||||
<data name="button_IF_InstallFramework.Text" xml:space="preserve">
|
||||
<value>Установить</value>
|
||||
</data>
|
||||
<data name="button_ZIPALIGN_Align.Text" xml:space="preserve">
|
||||
<value>Выровнять</value>
|
||||
</data>
|
||||
<data name="label_ZIPALIGN_OutputFile.Text" xml:space="preserve">
|
||||
<value>Сохранить файл как:</value>
|
||||
</data>
|
||||
<data name="groupBox_ZIPALIGN_Options.Text" xml:space="preserve">
|
||||
<value>Опции</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_OverwriteOutputFile.Text" xml:space="preserve">
|
||||
<value>Перезаписать выходной файл, если он существует</value>
|
||||
</data>
|
||||
<data name="button_SIGN_Sign.Text" xml:space="preserve">
|
||||
<value>Подписать</value>
|
||||
</data>
|
||||
<data name="checkBox_IF_FramePath.Text" xml:space="preserve">
|
||||
<value>Устанавливать фреймворк в каталог:</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_Recompress.Text" xml:space="preserve">
|
||||
<value>Перепаковать с использованием алгоритма Zopfli</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_VerboseOutput.Text" xml:space="preserve">
|
||||
<value>Подробный вывод</value>
|
||||
</data>
|
||||
<data name="label_ZIPALIGN_AlignmentBytes.Text" xml:space="preserve">
|
||||
<value>Выравнивание (в байтах), например, '4' для 32-битного выравнивания</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_MatchOriginal.Text" xml:space="preserve">
|
||||
<value>Сохранять файлы близко к оригиналу, насколько это возможно. Предотвращает ребилд.</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_CheckAlignment.Text" xml:space="preserve">
|
||||
<value>Только проверить выравнивание (не модифицирует файл)</value>
|
||||
</data>
|
||||
<data name="groupBox_SIGN_Options.Text" xml:space="preserve">
|
||||
<value>Опции</value>
|
||||
</data>
|
||||
<data name="label_SIGN_OutputFile.Text" xml:space="preserve">
|
||||
<value>Сохранить файл как:</value>
|
||||
</data>
|
||||
<data name="label_SIGN_PrivateKey.Text" xml:space="preserve">
|
||||
<value>Закрытый ключ</value>
|
||||
</data>
|
||||
<data name="label_SIGN_PublicKey.Text" xml:space="preserve">
|
||||
<value>Открытый ключ</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,240 +0,0 @@
|
||||
namespace APKToolGUI
|
||||
{
|
||||
partial class FormSettings
|
||||
{
|
||||
/// <summary>
|
||||
/// Требуется переменная конструктора.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Освободить все используемые ресурсы.
|
||||
/// </summary>
|
||||
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Код, автоматически созданный конструктором форм Windows
|
||||
|
||||
/// <summary>
|
||||
/// Обязательный метод для поддержки конструктора - не изменяйте
|
||||
/// содержимое данного метода при помощи редактора кода.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormSettings));
|
||||
this.tabControl1 = new System.Windows.Forms.TabControl();
|
||||
this.tabPage1 = new System.Windows.Forms.TabPage();
|
||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||
this.groupBoxJava = new System.Windows.Forms.GroupBox();
|
||||
this.labelCustomJavaLocation = new System.Windows.Forms.Label();
|
||||
this.buttonCustomJavaLocation = new System.Windows.Forms.Button();
|
||||
this.groupBoxLanguage = new System.Windows.Forms.GroupBox();
|
||||
this.comboBox1 = new System.Windows.Forms.ComboBox();
|
||||
this.groupBoxContextMenu = new System.Windows.Forms.GroupBox();
|
||||
this.labelAdminRights = new System.Windows.Forms.Label();
|
||||
this.buttonAddContextMenu = new System.Windows.Forms.Button();
|
||||
this.buttonRemoveContextMenu = new System.Windows.Forms.Button();
|
||||
this.buttonCancel = new System.Windows.Forms.Button();
|
||||
this.buttonОК = new System.Windows.Forms.Button();
|
||||
this.checkBox1 = new System.Windows.Forms.CheckBox();
|
||||
this.checkBoxCheckUpdateStartup = new System.Windows.Forms.CheckBox();
|
||||
this.textBoxCustomJavaLocation = new System.Windows.Forms.TextBox();
|
||||
this.ignoreOutputContextMenuBox = new System.Windows.Forms.CheckBox();
|
||||
this.tabControl1.SuspendLayout();
|
||||
this.tabPage1.SuspendLayout();
|
||||
this.groupBox1.SuspendLayout();
|
||||
this.groupBoxJava.SuspendLayout();
|
||||
this.groupBoxLanguage.SuspendLayout();
|
||||
this.groupBoxContextMenu.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// tabControl1
|
||||
//
|
||||
resources.ApplyResources(this.tabControl1, "tabControl1");
|
||||
this.tabControl1.Controls.Add(this.tabPage1);
|
||||
this.tabControl1.Name = "tabControl1";
|
||||
this.tabControl1.SelectedIndex = 0;
|
||||
//
|
||||
// tabPage1
|
||||
//
|
||||
this.tabPage1.Controls.Add(this.groupBox1);
|
||||
this.tabPage1.Controls.Add(this.groupBoxJava);
|
||||
this.tabPage1.Controls.Add(this.groupBoxLanguage);
|
||||
this.tabPage1.Controls.Add(this.groupBoxContextMenu);
|
||||
resources.ApplyResources(this.tabPage1, "tabPage1");
|
||||
this.tabPage1.Name = "tabPage1";
|
||||
this.tabPage1.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// groupBox1
|
||||
//
|
||||
resources.ApplyResources(this.groupBox1, "groupBox1");
|
||||
this.groupBox1.Controls.Add(this.checkBox1);
|
||||
this.groupBox1.Controls.Add(this.checkBoxCheckUpdateStartup);
|
||||
this.groupBox1.Name = "groupBox1";
|
||||
this.groupBox1.TabStop = false;
|
||||
//
|
||||
// groupBoxJava
|
||||
//
|
||||
resources.ApplyResources(this.groupBoxJava, "groupBoxJava");
|
||||
this.groupBoxJava.Controls.Add(this.labelCustomJavaLocation);
|
||||
this.groupBoxJava.Controls.Add(this.textBoxCustomJavaLocation);
|
||||
this.groupBoxJava.Controls.Add(this.buttonCustomJavaLocation);
|
||||
this.groupBoxJava.Name = "groupBoxJava";
|
||||
this.groupBoxJava.TabStop = false;
|
||||
//
|
||||
// labelCustomJavaLocation
|
||||
//
|
||||
resources.ApplyResources(this.labelCustomJavaLocation, "labelCustomJavaLocation");
|
||||
this.labelCustomJavaLocation.Name = "labelCustomJavaLocation";
|
||||
//
|
||||
// buttonCustomJavaLocation
|
||||
//
|
||||
resources.ApplyResources(this.buttonCustomJavaLocation, "buttonCustomJavaLocation");
|
||||
this.buttonCustomJavaLocation.Name = "buttonCustomJavaLocation";
|
||||
this.buttonCustomJavaLocation.UseVisualStyleBackColor = true;
|
||||
this.buttonCustomJavaLocation.Click += new System.EventHandler(this.buttonCustomJavaLocation_Click);
|
||||
//
|
||||
// groupBoxLanguage
|
||||
//
|
||||
resources.ApplyResources(this.groupBoxLanguage, "groupBoxLanguage");
|
||||
this.groupBoxLanguage.Controls.Add(this.comboBox1);
|
||||
this.groupBoxLanguage.Name = "groupBoxLanguage";
|
||||
this.groupBoxLanguage.TabStop = false;
|
||||
//
|
||||
// comboBox1
|
||||
//
|
||||
resources.ApplyResources(this.comboBox1, "comboBox1");
|
||||
this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.comboBox1.FormattingEnabled = true;
|
||||
this.comboBox1.Name = "comboBox1";
|
||||
//
|
||||
// groupBoxContextMenu
|
||||
//
|
||||
resources.ApplyResources(this.groupBoxContextMenu, "groupBoxContextMenu");
|
||||
this.groupBoxContextMenu.Controls.Add(this.ignoreOutputContextMenuBox);
|
||||
this.groupBoxContextMenu.Controls.Add(this.labelAdminRights);
|
||||
this.groupBoxContextMenu.Controls.Add(this.buttonAddContextMenu);
|
||||
this.groupBoxContextMenu.Controls.Add(this.buttonRemoveContextMenu);
|
||||
this.groupBoxContextMenu.Name = "groupBoxContextMenu";
|
||||
this.groupBoxContextMenu.TabStop = false;
|
||||
//
|
||||
// labelAdminRights
|
||||
//
|
||||
resources.ApplyResources(this.labelAdminRights, "labelAdminRights");
|
||||
this.labelAdminRights.Name = "labelAdminRights";
|
||||
//
|
||||
// buttonAddContextMenu
|
||||
//
|
||||
resources.ApplyResources(this.buttonAddContextMenu, "buttonAddContextMenu");
|
||||
this.buttonAddContextMenu.Name = "buttonAddContextMenu";
|
||||
this.buttonAddContextMenu.UseVisualStyleBackColor = true;
|
||||
this.buttonAddContextMenu.Click += new System.EventHandler(this.buttonAddContextMenu_Click);
|
||||
//
|
||||
// buttonRemoveContextMenu
|
||||
//
|
||||
resources.ApplyResources(this.buttonRemoveContextMenu, "buttonRemoveContextMenu");
|
||||
this.buttonRemoveContextMenu.Name = "buttonRemoveContextMenu";
|
||||
this.buttonRemoveContextMenu.UseVisualStyleBackColor = true;
|
||||
this.buttonRemoveContextMenu.Click += new System.EventHandler(this.buttonRemoveContextMenu_Click);
|
||||
//
|
||||
// buttonCancel
|
||||
//
|
||||
resources.ApplyResources(this.buttonCancel, "buttonCancel");
|
||||
this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.buttonCancel.Name = "buttonCancel";
|
||||
this.buttonCancel.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// buttonОК
|
||||
//
|
||||
resources.ApplyResources(this.buttonОК, "buttonОК");
|
||||
this.buttonОК.Name = "buttonОК";
|
||||
this.buttonОК.UseVisualStyleBackColor = true;
|
||||
this.buttonОК.Click += new System.EventHandler(this.buttonОК_Click);
|
||||
//
|
||||
// checkBox1
|
||||
//
|
||||
resources.ApplyResources(this.checkBox1, "checkBox1");
|
||||
this.checkBox1.Checked = global::APKToolGUI.Properties.Settings.Default.ClearLogBeforeAction;
|
||||
this.checkBox1.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "ClearLogBeforeAction", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkBox1.Name = "checkBox1";
|
||||
this.checkBox1.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBoxCheckUpdateStartup
|
||||
//
|
||||
resources.ApplyResources(this.checkBoxCheckUpdateStartup, "checkBoxCheckUpdateStartup");
|
||||
this.checkBoxCheckUpdateStartup.Checked = global::APKToolGUI.Properties.Settings.Default.CheckForUpdateAtStartup;
|
||||
this.checkBoxCheckUpdateStartup.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
this.checkBoxCheckUpdateStartup.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "CheckForUpdateAtStartup", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkBoxCheckUpdateStartup.Name = "checkBoxCheckUpdateStartup";
|
||||
this.checkBoxCheckUpdateStartup.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// textBoxCustomJavaLocation
|
||||
//
|
||||
resources.ApplyResources(this.textBoxCustomJavaLocation, "textBoxCustomJavaLocation");
|
||||
this.textBoxCustomJavaLocation.BackColor = System.Drawing.SystemColors.Window;
|
||||
this.textBoxCustomJavaLocation.DataBindings.Add(new System.Windows.Forms.Binding("Text", global::APKToolGUI.Properties.Settings.Default, "JavaExe", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.textBoxCustomJavaLocation.Name = "textBoxCustomJavaLocation";
|
||||
this.textBoxCustomJavaLocation.Text = global::APKToolGUI.Properties.Settings.Default.JavaExe;
|
||||
//
|
||||
// ignoreOutputContextMenuBox
|
||||
//
|
||||
resources.ApplyResources(this.ignoreOutputContextMenuBox, "ignoreOutputContextMenuBox");
|
||||
this.ignoreOutputContextMenuBox.Checked = global::APKToolGUI.Properties.Settings.Default.IgnoreOutputDirContextMenu;
|
||||
this.ignoreOutputContextMenuBox.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "IgnoreOutputDirContextMenu", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.ignoreOutputContextMenuBox.Name = "ignoreOutputContextMenuBox";
|
||||
this.ignoreOutputContextMenuBox.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// FormSettings
|
||||
//
|
||||
resources.ApplyResources(this, "$this");
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.buttonCancel);
|
||||
this.Controls.Add(this.buttonОК);
|
||||
this.Controls.Add(this.tabControl1);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||
this.MaximizeBox = false;
|
||||
this.MinimizeBox = false;
|
||||
this.Name = "FormSettings";
|
||||
this.Load += new System.EventHandler(this.FormSettings_Load);
|
||||
this.tabControl1.ResumeLayout(false);
|
||||
this.tabPage1.ResumeLayout(false);
|
||||
this.groupBox1.ResumeLayout(false);
|
||||
this.groupBox1.PerformLayout();
|
||||
this.groupBoxJava.ResumeLayout(false);
|
||||
this.groupBoxJava.PerformLayout();
|
||||
this.groupBoxLanguage.ResumeLayout(false);
|
||||
this.groupBoxContextMenu.ResumeLayout(false);
|
||||
this.groupBoxContextMenu.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.TabControl tabControl1;
|
||||
private System.Windows.Forms.TabPage tabPage1;
|
||||
private System.Windows.Forms.GroupBox groupBoxJava;
|
||||
private System.Windows.Forms.GroupBox groupBoxLanguage;
|
||||
private System.Windows.Forms.ComboBox comboBox1;
|
||||
private System.Windows.Forms.GroupBox groupBoxContextMenu;
|
||||
private System.Windows.Forms.Label labelAdminRights;
|
||||
private System.Windows.Forms.Button buttonAddContextMenu;
|
||||
private System.Windows.Forms.Button buttonRemoveContextMenu;
|
||||
private System.Windows.Forms.Button buttonCancel;
|
||||
private System.Windows.Forms.Button buttonОК;
|
||||
private System.Windows.Forms.TextBox textBoxCustomJavaLocation;
|
||||
private System.Windows.Forms.Button buttonCustomJavaLocation;
|
||||
private System.Windows.Forms.Label labelCustomJavaLocation;
|
||||
private System.Windows.Forms.GroupBox groupBox1;
|
||||
private System.Windows.Forms.CheckBox checkBoxCheckUpdateStartup;
|
||||
private System.Windows.Forms.CheckBox checkBox1;
|
||||
private System.Windows.Forms.CheckBox ignoreOutputContextMenuBox;
|
||||
}
|
||||
}
|
||||
@@ -1,162 +0,0 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.IO;
|
||||
using APKToolGUI.Languages;
|
||||
using APKToolGUI.Utils;
|
||||
|
||||
namespace APKToolGUI
|
||||
{
|
||||
public partial class FormSettings : Form
|
||||
{
|
||||
public FormSettings()
|
||||
{
|
||||
InitializeComponent();
|
||||
if (!AdminUtils.IsAdministrator())
|
||||
{
|
||||
SetButtonShield(buttonAddContextMenu, true);
|
||||
SetButtonShield(buttonRemoveContextMenu, true);
|
||||
}
|
||||
}
|
||||
|
||||
#region GUI
|
||||
|
||||
private void FormSettings_Load(object sender, EventArgs e)
|
||||
{
|
||||
LoadSettings();
|
||||
}
|
||||
|
||||
private void buttonОК_Click(object sender, EventArgs e)
|
||||
{
|
||||
SaveSettings();
|
||||
this.Close();
|
||||
}
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||||
public static extern IntPtr SendMessage(HandleRef hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
private static void SetButtonShield(Button btn, bool showShield)
|
||||
{
|
||||
// BCM_SETSHIELD = 0x0000160C
|
||||
SendMessage(new HandleRef(btn, btn.Handle), 0x160C, IntPtr.Zero, showShield ? new IntPtr(1) : IntPtr.Zero);
|
||||
}
|
||||
|
||||
private void buttonAddContextMenu_Click(object sender, EventArgs e)
|
||||
{
|
||||
if(MessageBox.Show(Language.DoYouRealyWantToInstallCM, Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
|
||||
RunAsAdmin(Application.ExecutablePath, "ccm");
|
||||
}
|
||||
|
||||
private void buttonRemoveContextMenu_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (MessageBox.Show(Language.DoYouRealyWantToRemoveCM, Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
|
||||
RunAsAdmin(Application.ExecutablePath, "rcm");
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private void LoadSettings()
|
||||
{
|
||||
//textBox1.Font = Properties.Settings.Default.FontLogMainWindow;
|
||||
//textBox2.Font = Properties.Settings.Default.FontLogContextMenuWindow;
|
||||
//textBox1.Text = textBox1.Font.Name + ", " + textBox1.Font.Size;
|
||||
//textBox2.Text = textBox2.Font.Name + ", " + textBox2.Font.Size;
|
||||
|
||||
String sysLang = Language.SystemLanguage;
|
||||
comboBox1.Items.Add(sysLang);
|
||||
comboBox1.Items.Add(System.Globalization.CultureInfo.GetCultureInfo("ru"));
|
||||
comboBox1.Items.Add(System.Globalization.CultureInfo.GetCultureInfo("en"));
|
||||
//comboBox1.Items.Add(System.Globalization.CultureInfo.GetCultureInfo("uk"));
|
||||
//comboBox1.Items.Add(System.Globalization.CultureInfo.GetCultureInfo("ru-RU"));
|
||||
//comboBox1.Items.Add(System.Globalization.CultureInfo.GetCultureInfo("en-US"));
|
||||
//comboBox1.Items.Add(System.Globalization.CultureInfo.GetCultureInfo("uk-UA"));
|
||||
|
||||
comboBox1.DisplayMember = "NativeName"; // <= System.Globalization.CultureInfo.GetCultureInfo("ru-RU").NativeName
|
||||
comboBox1.ValueMember = "Name"; // <= System.Globalization.CultureInfo.GetCultureInfo("ru-RU").Name
|
||||
|
||||
// Если в настройках есть язык, выбираем его в списке.
|
||||
String _culture = Properties.Settings.Default.Culture;
|
||||
if (_culture.Equals("Auto"))
|
||||
comboBox1.SelectedItem = sysLang;
|
||||
else
|
||||
{
|
||||
var qwe = System.Globalization.CultureInfo.GetCultureInfo(_culture);
|
||||
comboBox1.SelectedItem = qwe;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void SaveSettings()
|
||||
{
|
||||
//Properties.Settings.Default.FontLogMainWindow = textBox1.Font;
|
||||
//Properties.Settings.Default.FontLogContextMenuWindow = textBox2.Font;
|
||||
|
||||
if (Language.SystemLanguage.Equals(comboBox1.SelectedItem.ToString()))
|
||||
Properties.Settings.Default.Culture = "Auto";
|
||||
else
|
||||
Properties.Settings.Default.Culture = comboBox1.SelectedItem.ToString();
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
|
||||
public static void RunAsAdmin(string aFileName, string anArguments)
|
||||
{
|
||||
System.Diagnostics.ProcessStartInfo processInfo = new System.Diagnostics.ProcessStartInfo();
|
||||
|
||||
processInfo.FileName = aFileName;
|
||||
processInfo.Arguments = anArguments;
|
||||
processInfo.UseShellExecute = true;
|
||||
processInfo.Verb = "runas"; // здесь вся соль
|
||||
|
||||
try
|
||||
{
|
||||
System.Diagnostics.Process.Start(processInfo);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageBox.Show(e.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
//private void button1_Click(object sender, EventArgs e)
|
||||
//{
|
||||
// FontDialog fontDialog1 = new FontDialog();
|
||||
// fontDialog1.Font = textBox1.Font;
|
||||
// if (fontDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
|
||||
// {
|
||||
// textBox1.Text = fontDialog1.Font.Name + ", " + fontDialog1.Font.Size;
|
||||
// textBox1.Font = fontDialog1.Font;
|
||||
// }
|
||||
//}
|
||||
|
||||
//private void button2_Click(object sender, EventArgs e)
|
||||
//{
|
||||
// FontDialog fontDialog1 = new FontDialog();
|
||||
// fontDialog1.Font = textBox2.Font;
|
||||
// if (fontDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
|
||||
// {
|
||||
// textBox2.Text = fontDialog1.Font.Name + ", " + fontDialog1.Font.Size;
|
||||
// textBox2.Font = fontDialog1.Font;
|
||||
// }
|
||||
//}
|
||||
|
||||
private void buttonCustomJavaLocation_Click(object sender, EventArgs e)
|
||||
{
|
||||
using(OpenFileDialog openJavaExe = new OpenFileDialog())
|
||||
{
|
||||
openJavaExe.Filter = "java.exe|java.exe";
|
||||
if (openJavaExe.ShowDialog() == System.Windows.Forms.DialogResult.OK)
|
||||
textBoxCustomJavaLocation.Text = Program.GetPortablePath(openJavaExe.FileName);
|
||||
}
|
||||
|
||||
//OpenFileDialog openJavaExe = new OpenFileDialog()
|
||||
//{
|
||||
// Multiselect = false,
|
||||
// Filter = "java.exe|java.exe"
|
||||
//};
|
||||
//if (openJavaExe.ShowDialog() == System.Windows.Forms.DialogResult.OK)
|
||||
//{
|
||||
// textBoxCustomJavaLocation.Text = openJavaExe.FileName;
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,678 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="tabControl1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||
<value>Top, Bottom, Left, Right</value>
|
||||
</data>
|
||||
<data name="groupBox1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||
<value>Top, Left, Right</value>
|
||||
</data>
|
||||
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="checkBox1.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>True</value>
|
||||
</data>
|
||||
<data name="checkBox1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="checkBox1.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>9, 42</value>
|
||||
</data>
|
||||
<data name="checkBox1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>132, 17</value>
|
||||
</data>
|
||||
<data name="checkBox1.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>1</value>
|
||||
</data>
|
||||
<data name="checkBox1.Text" xml:space="preserve">
|
||||
<value>Clear log before action</value>
|
||||
</data>
|
||||
<data name=">>checkBox1.Name" xml:space="preserve">
|
||||
<value>checkBox1</value>
|
||||
</data>
|
||||
<data name=">>checkBox1.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>checkBox1.Parent" xml:space="preserve">
|
||||
<value>groupBox1</value>
|
||||
</data>
|
||||
<data name=">>checkBox1.ZOrder" xml:space="preserve">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="checkBoxCheckUpdateStartup.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>True</value>
|
||||
</data>
|
||||
<data name="checkBoxCheckUpdateStartup.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="checkBoxCheckUpdateStartup.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>9, 19</value>
|
||||
</data>
|
||||
<data name="checkBoxCheckUpdateStartup.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>160, 17</value>
|
||||
</data>
|
||||
<data name="checkBoxCheckUpdateStartup.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="checkBoxCheckUpdateStartup.Text" xml:space="preserve">
|
||||
<value>Check for updates at startup</value>
|
||||
</data>
|
||||
<data name=">>checkBoxCheckUpdateStartup.Name" xml:space="preserve">
|
||||
<value>checkBoxCheckUpdateStartup</value>
|
||||
</data>
|
||||
<data name=">>checkBoxCheckUpdateStartup.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>checkBoxCheckUpdateStartup.Parent" xml:space="preserve">
|
||||
<value>groupBox1</value>
|
||||
</data>
|
||||
<data name=">>checkBoxCheckUpdateStartup.ZOrder" xml:space="preserve">
|
||||
<value>1</value>
|
||||
</data>
|
||||
<data name="groupBox1.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>6, 206</value>
|
||||
</data>
|
||||
<data name="groupBox1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>447, 65</value>
|
||||
</data>
|
||||
<data name="groupBox1.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>12</value>
|
||||
</data>
|
||||
<data name="groupBox1.Text" xml:space="preserve">
|
||||
<value>Other</value>
|
||||
</data>
|
||||
<data name=">>groupBox1.Name" xml:space="preserve">
|
||||
<value>groupBox1</value>
|
||||
</data>
|
||||
<data name=">>groupBox1.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>groupBox1.Parent" xml:space="preserve">
|
||||
<value>tabPage1</value>
|
||||
</data>
|
||||
<data name=">>groupBox1.ZOrder" xml:space="preserve">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="groupBoxJava.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||
<value>Top, Left, Right</value>
|
||||
</data>
|
||||
<data name="labelCustomJavaLocation.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="labelCustomJavaLocation.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>6, 17</value>
|
||||
</data>
|
||||
<data name="labelCustomJavaLocation.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>183, 23</value>
|
||||
</data>
|
||||
<data name="labelCustomJavaLocation.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>6</value>
|
||||
</data>
|
||||
<data name="labelCustomJavaLocation.Text" xml:space="preserve">
|
||||
<value>Custom Java location</value>
|
||||
</data>
|
||||
<data name="labelCustomJavaLocation.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
|
||||
<value>MiddleRight</value>
|
||||
</data>
|
||||
<data name=">>labelCustomJavaLocation.Name" xml:space="preserve">
|
||||
<value>labelCustomJavaLocation</value>
|
||||
</data>
|
||||
<data name=">>labelCustomJavaLocation.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>labelCustomJavaLocation.Parent" xml:space="preserve">
|
||||
<value>groupBoxJava</value>
|
||||
</data>
|
||||
<data name=">>labelCustomJavaLocation.ZOrder" xml:space="preserve">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="textBoxCustomJavaLocation.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||
<value>Top, Left, Right</value>
|
||||
</data>
|
||||
<data name="textBoxCustomJavaLocation.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>195, 18</value>
|
||||
</data>
|
||||
<data name="textBoxCustomJavaLocation.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>222, 20</value>
|
||||
</data>
|
||||
<data name="textBoxCustomJavaLocation.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>5</value>
|
||||
</data>
|
||||
<data name="textBoxCustomJavaLocation.WordWrap" type="System.Boolean, mscorlib">
|
||||
<value>False</value>
|
||||
</data>
|
||||
<data name=">>textBoxCustomJavaLocation.Name" xml:space="preserve">
|
||||
<value>textBoxCustomJavaLocation</value>
|
||||
</data>
|
||||
<data name=">>textBoxCustomJavaLocation.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>textBoxCustomJavaLocation.Parent" xml:space="preserve">
|
||||
<value>groupBoxJava</value>
|
||||
</data>
|
||||
<data name=">>textBoxCustomJavaLocation.ZOrder" xml:space="preserve">
|
||||
<value>1</value>
|
||||
</data>
|
||||
<data name="buttonCustomJavaLocation.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||
<value>Top, Right</value>
|
||||
</data>
|
||||
<data name="buttonCustomJavaLocation.FlatStyle" type="System.Windows.Forms.FlatStyle, System.Windows.Forms">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="buttonCustomJavaLocation.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="buttonCustomJavaLocation.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>418, 17</value>
|
||||
</data>
|
||||
<data name="buttonCustomJavaLocation.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>23, 20</value>
|
||||
</data>
|
||||
<data name="buttonCustomJavaLocation.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>4</value>
|
||||
</data>
|
||||
<data name="buttonCustomJavaLocation.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name=">>buttonCustomJavaLocation.Name" xml:space="preserve">
|
||||
<value>buttonCustomJavaLocation</value>
|
||||
</data>
|
||||
<data name=">>buttonCustomJavaLocation.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>buttonCustomJavaLocation.Parent" xml:space="preserve">
|
||||
<value>groupBoxJava</value>
|
||||
</data>
|
||||
<data name=">>buttonCustomJavaLocation.ZOrder" xml:space="preserve">
|
||||
<value>2</value>
|
||||
</data>
|
||||
<data name="groupBoxJava.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>6, 153</value>
|
||||
</data>
|
||||
<data name="groupBoxJava.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>447, 47</value>
|
||||
</data>
|
||||
<data name="groupBoxJava.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>11</value>
|
||||
</data>
|
||||
<data name="groupBoxJava.Text" xml:space="preserve">
|
||||
<value>Java</value>
|
||||
</data>
|
||||
<data name=">>groupBoxJava.Name" xml:space="preserve">
|
||||
<value>groupBoxJava</value>
|
||||
</data>
|
||||
<data name=">>groupBoxJava.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>groupBoxJava.Parent" xml:space="preserve">
|
||||
<value>tabPage1</value>
|
||||
</data>
|
||||
<data name=">>groupBoxJava.ZOrder" xml:space="preserve">
|
||||
<value>1</value>
|
||||
</data>
|
||||
<data name="groupBoxLanguage.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||
<value>Top, Left, Right</value>
|
||||
</data>
|
||||
<data name="comboBox1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||
<value>Top, Left, Right</value>
|
||||
</data>
|
||||
<data name="comboBox1.FlatStyle" type="System.Windows.Forms.FlatStyle, System.Windows.Forms">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="comboBox1.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>129, 19</value>
|
||||
</data>
|
||||
<data name="comboBox1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>312, 21</value>
|
||||
</data>
|
||||
<data name="comboBox1.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>2</value>
|
||||
</data>
|
||||
<data name=">>comboBox1.Name" xml:space="preserve">
|
||||
<value>comboBox1</value>
|
||||
</data>
|
||||
<data name=">>comboBox1.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>comboBox1.Parent" xml:space="preserve">
|
||||
<value>groupBoxLanguage</value>
|
||||
</data>
|
||||
<data name=">>comboBox1.ZOrder" xml:space="preserve">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="groupBoxLanguage.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>6, 6</value>
|
||||
</data>
|
||||
<data name="groupBoxLanguage.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>447, 47</value>
|
||||
</data>
|
||||
<data name="groupBoxLanguage.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>8</value>
|
||||
</data>
|
||||
<data name="groupBoxLanguage.Text" xml:space="preserve">
|
||||
<value>Language</value>
|
||||
</data>
|
||||
<data name=">>groupBoxLanguage.Name" xml:space="preserve">
|
||||
<value>groupBoxLanguage</value>
|
||||
</data>
|
||||
<data name=">>groupBoxLanguage.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>groupBoxLanguage.Parent" xml:space="preserve">
|
||||
<value>tabPage1</value>
|
||||
</data>
|
||||
<data name=">>groupBoxLanguage.ZOrder" xml:space="preserve">
|
||||
<value>2</value>
|
||||
</data>
|
||||
<data name="groupBoxContextMenu.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||
<value>Top, Left, Right</value>
|
||||
</data>
|
||||
<data name="ignoreOutputContextMenuBox.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>True</value>
|
||||
</data>
|
||||
<data name="ignoreOutputContextMenuBox.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="ignoreOutputContextMenuBox.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>6, 45</value>
|
||||
</data>
|
||||
<data name="ignoreOutputContextMenuBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>238, 17</value>
|
||||
</data>
|
||||
<data name="ignoreOutputContextMenuBox.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>3</value>
|
||||
</data>
|
||||
<data name="ignoreOutputContextMenuBox.Text" xml:space="preserve">
|
||||
<value>Use default output directory for context menu</value>
|
||||
</data>
|
||||
<data name=">>ignoreOutputContextMenuBox.Name" xml:space="preserve">
|
||||
<value>ignoreOutputContextMenuBox</value>
|
||||
</data>
|
||||
<data name=">>ignoreOutputContextMenuBox.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>ignoreOutputContextMenuBox.Parent" xml:space="preserve">
|
||||
<value>groupBoxContextMenu</value>
|
||||
</data>
|
||||
<data name=">>ignoreOutputContextMenuBox.ZOrder" xml:space="preserve">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="labelAdminRights.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||
<value>Top, Left, Right</value>
|
||||
</data>
|
||||
<data name="labelAdminRights.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="labelAdminRights.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>3, 18</value>
|
||||
</data>
|
||||
<data name="labelAdminRights.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>260, 23</value>
|
||||
</data>
|
||||
<data name="labelAdminRights.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>2</value>
|
||||
</data>
|
||||
<data name="labelAdminRights.Text" xml:space="preserve">
|
||||
<value>Administrator rights required</value>
|
||||
</data>
|
||||
<data name="labelAdminRights.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
|
||||
<value>MiddleLeft</value>
|
||||
</data>
|
||||
<data name=">>labelAdminRights.Name" xml:space="preserve">
|
||||
<value>labelAdminRights</value>
|
||||
</data>
|
||||
<data name=">>labelAdminRights.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>labelAdminRights.Parent" xml:space="preserve">
|
||||
<value>groupBoxContextMenu</value>
|
||||
</data>
|
||||
<data name=">>labelAdminRights.ZOrder" xml:space="preserve">
|
||||
<value>1</value>
|
||||
</data>
|
||||
<data name="buttonAddContextMenu.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||
<value>Top, Right</value>
|
||||
</data>
|
||||
<data name="buttonAddContextMenu.FlatStyle" type="System.Windows.Forms.FlatStyle, System.Windows.Forms">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="buttonAddContextMenu.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="buttonAddContextMenu.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>269, 18</value>
|
||||
</data>
|
||||
<data name="buttonAddContextMenu.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>83, 23</value>
|
||||
</data>
|
||||
<data name="buttonAddContextMenu.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="buttonAddContextMenu.Text" xml:space="preserve">
|
||||
<value>Install</value>
|
||||
</data>
|
||||
<data name="buttonAddContextMenu.TextImageRelation" type="System.Windows.Forms.TextImageRelation, System.Windows.Forms">
|
||||
<value>ImageBeforeText</value>
|
||||
</data>
|
||||
<data name=">>buttonAddContextMenu.Name" xml:space="preserve">
|
||||
<value>buttonAddContextMenu</value>
|
||||
</data>
|
||||
<data name=">>buttonAddContextMenu.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>buttonAddContextMenu.Parent" xml:space="preserve">
|
||||
<value>groupBoxContextMenu</value>
|
||||
</data>
|
||||
<data name=">>buttonAddContextMenu.ZOrder" xml:space="preserve">
|
||||
<value>2</value>
|
||||
</data>
|
||||
<data name="buttonRemoveContextMenu.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||
<value>Top, Right</value>
|
||||
</data>
|
||||
<data name="buttonRemoveContextMenu.FlatStyle" type="System.Windows.Forms.FlatStyle, System.Windows.Forms">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="buttonRemoveContextMenu.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="buttonRemoveContextMenu.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>358, 18</value>
|
||||
</data>
|
||||
<data name="buttonRemoveContextMenu.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>83, 23</value>
|
||||
</data>
|
||||
<data name="buttonRemoveContextMenu.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>1</value>
|
||||
</data>
|
||||
<data name="buttonRemoveContextMenu.Text" xml:space="preserve">
|
||||
<value>Uninstall</value>
|
||||
</data>
|
||||
<data name=">>buttonRemoveContextMenu.Name" xml:space="preserve">
|
||||
<value>buttonRemoveContextMenu</value>
|
||||
</data>
|
||||
<data name=">>buttonRemoveContextMenu.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>buttonRemoveContextMenu.Parent" xml:space="preserve">
|
||||
<value>groupBoxContextMenu</value>
|
||||
</data>
|
||||
<data name=">>buttonRemoveContextMenu.ZOrder" xml:space="preserve">
|
||||
<value>3</value>
|
||||
</data>
|
||||
<data name="groupBoxContextMenu.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>6, 59</value>
|
||||
</data>
|
||||
<data name="groupBoxContextMenu.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>447, 74</value>
|
||||
</data>
|
||||
<data name="groupBoxContextMenu.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>9</value>
|
||||
</data>
|
||||
<data name="groupBoxContextMenu.Text" xml:space="preserve">
|
||||
<value>Context menu</value>
|
||||
</data>
|
||||
<data name=">>groupBoxContextMenu.Name" xml:space="preserve">
|
||||
<value>groupBoxContextMenu</value>
|
||||
</data>
|
||||
<data name=">>groupBoxContextMenu.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>groupBoxContextMenu.Parent" xml:space="preserve">
|
||||
<value>tabPage1</value>
|
||||
</data>
|
||||
<data name=">>groupBoxContextMenu.ZOrder" xml:space="preserve">
|
||||
<value>3</value>
|
||||
</data>
|
||||
<data name="tabPage1.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>4, 22</value>
|
||||
</data>
|
||||
<data name="tabPage1.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>3, 3, 3, 3</value>
|
||||
</data>
|
||||
<data name="tabPage1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>459, 278</value>
|
||||
</data>
|
||||
<data name="tabPage1.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="tabPage1.Text" xml:space="preserve">
|
||||
<value>General</value>
|
||||
</data>
|
||||
<data name=">>tabPage1.Name" xml:space="preserve">
|
||||
<value>tabPage1</value>
|
||||
</data>
|
||||
<data name=">>tabPage1.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>tabPage1.Parent" xml:space="preserve">
|
||||
<value>tabControl1</value>
|
||||
</data>
|
||||
<data name=">>tabPage1.ZOrder" xml:space="preserve">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="tabControl1.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>0, 1</value>
|
||||
</data>
|
||||
<data name="tabControl1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>467, 304</value>
|
||||
</data>
|
||||
<data name="tabControl1.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>1</value>
|
||||
</data>
|
||||
<data name=">>tabControl1.Name" xml:space="preserve">
|
||||
<value>tabControl1</value>
|
||||
</data>
|
||||
<data name=">>tabControl1.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>tabControl1.Parent" xml:space="preserve">
|
||||
<value>$this</value>
|
||||
</data>
|
||||
<data name=">>tabControl1.ZOrder" xml:space="preserve">
|
||||
<value>2</value>
|
||||
</data>
|
||||
<data name="buttonCancel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||
<value>Bottom, Right</value>
|
||||
</data>
|
||||
<data name="buttonCancel.FlatStyle" type="System.Windows.Forms.FlatStyle, System.Windows.Forms">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="buttonCancel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="buttonCancel.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>385, 311</value>
|
||||
</data>
|
||||
<data name="buttonCancel.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>75, 23</value>
|
||||
</data>
|
||||
<data name="buttonCancel.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>4</value>
|
||||
</data>
|
||||
<data name="buttonCancel.Text" xml:space="preserve">
|
||||
<value>Cancel</value>
|
||||
</data>
|
||||
<data name=">>buttonCancel.Name" xml:space="preserve">
|
||||
<value>buttonCancel</value>
|
||||
</data>
|
||||
<data name=">>buttonCancel.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>buttonCancel.Parent" xml:space="preserve">
|
||||
<value>$this</value>
|
||||
</data>
|
||||
<data name=">>buttonCancel.ZOrder" xml:space="preserve">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="buttonОК.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||
<value>Bottom, Right</value>
|
||||
</data>
|
||||
<data name="buttonОК.FlatStyle" type="System.Windows.Forms.FlatStyle, System.Windows.Forms">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="buttonОК.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="buttonОК.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>304, 311</value>
|
||||
</data>
|
||||
<data name="buttonОК.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>75, 23</value>
|
||||
</data>
|
||||
<data name="buttonОК.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>5</value>
|
||||
</data>
|
||||
<data name="buttonОК.Text" xml:space="preserve">
|
||||
<value>ОК</value>
|
||||
</data>
|
||||
<data name=">>buttonОК.Name" xml:space="preserve">
|
||||
<value>buttonОК</value>
|
||||
</data>
|
||||
<data name=">>buttonОК.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>buttonОК.Parent" xml:space="preserve">
|
||||
<value>$this</value>
|
||||
</data>
|
||||
<data name=">>buttonОК.ZOrder" xml:space="preserve">
|
||||
<value>1</value>
|
||||
</data>
|
||||
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>True</value>
|
||||
</metadata>
|
||||
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
|
||||
<value>6, 13</value>
|
||||
</data>
|
||||
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
||||
<value>466, 339</value>
|
||||
</data>
|
||||
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
|
||||
<value>CenterParent</value>
|
||||
</data>
|
||||
<data name="$this.Text" xml:space="preserve">
|
||||
<value>Settings</value>
|
||||
</data>
|
||||
<data name=">>$this.Name" xml:space="preserve">
|
||||
<value>FormSettings</value>
|
||||
</data>
|
||||
<data name=">>$this.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,166 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="checkBox1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>288, 17</value>
|
||||
</data>
|
||||
<data name="checkBox1.Text" xml:space="preserve">
|
||||
<value>Очищать журнал событий перед каждой операцией</value>
|
||||
</data>
|
||||
<data name="checkBoxCheckUpdateStartup.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>276, 17</value>
|
||||
</data>
|
||||
<data name="checkBoxCheckUpdateStartup.Text" xml:space="preserve">
|
||||
<value>Проверять обновление при запуске (раз в сутки)</value>
|
||||
</data>
|
||||
<data name="groupBox1.Text" xml:space="preserve">
|
||||
<value>Прочее</value>
|
||||
</data>
|
||||
<data name="labelCustomJavaLocation.Text" xml:space="preserve">
|
||||
<value>Пользовательское расположение</value>
|
||||
</data>
|
||||
<data name="buttonCustomJavaLocation.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>23, 22</value>
|
||||
</data>
|
||||
<data name="groupBoxLanguage.Text" xml:space="preserve">
|
||||
<value>Язык</value>
|
||||
</data>
|
||||
<data name="labelAdminRights.Text" xml:space="preserve">
|
||||
<value>Требуются права администратора</value>
|
||||
</data>
|
||||
<data name="buttonAddContextMenu.Text" xml:space="preserve">
|
||||
<value>Установить</value>
|
||||
</data>
|
||||
<data name="buttonRemoveContextMenu.Text" xml:space="preserve">
|
||||
<value>Удалить</value>
|
||||
</data>
|
||||
<data name="groupBoxContextMenu.Text" xml:space="preserve">
|
||||
<value>Контекстное меню</value>
|
||||
</data>
|
||||
<data name="tabPage1.Text" xml:space="preserve">
|
||||
<value>Общие</value>
|
||||
</data>
|
||||
<data name="buttonCancel.Text" xml:space="preserve">
|
||||
<value>Отмена</value>
|
||||
</data>
|
||||
<data name="$this.Text" xml:space="preserve">
|
||||
<value>Настройки</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,726 @@
|
||||
<Window x:Class="APKToolGUI.Forms.MainWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:ctrl="clr-namespace:APKToolGUI.Controls"
|
||||
Title="APK Tool GUI"
|
||||
Width="641" Height="686"
|
||||
MinWidth="560" MinHeight="560"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
UseLayoutRounding="True" TextOptions.TextFormattingMode="Display"
|
||||
FontFamily="Segoe UI" FontSize="12"
|
||||
Background="{DynamicResource WindowBackground}"
|
||||
Foreground="{DynamicResource PrimaryText}">
|
||||
|
||||
<!-- Main application window. Shared dark/light control styles are merged from
|
||||
Themes/Controls.xaml; the actual colours are applied via WpfTheme.Apply in the code-behind. -->
|
||||
<Window.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="pack://application:,,,/Themes/Controls.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</Window.Resources>
|
||||
|
||||
<DockPanel LastChildFill="True">
|
||||
|
||||
<!-- ===== Menu ===== -->
|
||||
<Menu DockPanel.Dock="Top">
|
||||
<MenuItem x:Name="menuFile" Header="File">
|
||||
<MenuItem x:Name="menuNewInstance" Header="New instance" Click="NewInstance_Click"/>
|
||||
<MenuItem x:Name="menuSaveLog" Header="Save log to file" Click="SaveLog_Click"/>
|
||||
<Separator/>
|
||||
<MenuItem x:Name="menuOpenTemp" Header="Open temp folder" Click="OpenTempFolder_Click"/>
|
||||
<MenuItem x:Name="menuClearTemp" Header="Clear temp folder" Click="ClearTempFolder_Click"/>
|
||||
<Separator/>
|
||||
<MenuItem x:Name="menuExit" Header="Exit" Click="Exit_Click"/>
|
||||
</MenuItem>
|
||||
<MenuItem x:Name="menuSettings" Header="Settings">
|
||||
<MenuItem x:Name="menuUseApkEditor" Header="Use APKEditor for decompiling" IsCheckable="True"/>
|
||||
<MenuItem x:Name="menuOpenSettings" Header="Open settings..." Click="OpenSettings_Click"/>
|
||||
</MenuItem>
|
||||
<MenuItem x:Name="menuHelp" Header="Help">
|
||||
<MenuItem x:Name="menuCheckUpdate" Header="Check for update" Click="CheckUpdate_Click"/>
|
||||
<MenuItem x:Name="menuReportIssue" Header="Report an issue" Click="ReportIssue_Click"/>
|
||||
<MenuItem x:Name="menuApktoolIssues" Header="Apktool issue tracker" Click="ApktoolIssues_Click"/>
|
||||
<MenuItem x:Name="menuBaksmaliIssues" Header="Baksmali issue tracker" Click="BaksmaliIssues_Click"/>
|
||||
<MenuItem x:Name="menuAbout" Header="About" Click="About_Click"/>
|
||||
</MenuItem>
|
||||
</Menu>
|
||||
|
||||
<!-- ===== Status bar ===== -->
|
||||
<StatusBar DockPanel.Dock="Bottom">
|
||||
<StatusBarItem>
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<Image x:Name="statusIcon" Width="16" Height="16" Margin="2,0,6,0" VerticalAlignment="Center"/>
|
||||
<TextBlock x:Name="statusText" VerticalAlignment="Center" Text="Ready"/>
|
||||
</StackPanel>
|
||||
</StatusBarItem>
|
||||
<StatusBarItem HorizontalAlignment="Right">
|
||||
<ProgressBar x:Name="progressBar" Width="170" Height="14" Visibility="Collapsed"/>
|
||||
</StatusBarItem>
|
||||
</StatusBar>
|
||||
|
||||
<!-- ===== Tabs over log (resizable split) ===== -->
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="3*" MinHeight="220"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="180" MinHeight="100"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<TabControl x:Name="tabControlMain" Grid.Row="0">
|
||||
<TabItem x:Name="tabMain" Header="Main">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="3">
|
||||
<StackPanel>
|
||||
<!-- Decompile input -->
|
||||
<TextBlock x:Name="label1" Text="APK/XAPK/APKS/ZIP/APKM File:" Margin="0,0,0,3"/>
|
||||
<Grid Margin="0,0,0,5">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBox x:Name="textBox_DECODE_InputAppPath" Grid.Column="0" Height="25" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_DECODE_BrowseInputAppPath" Grid.Column="1" Content="..." Width="34" Height="25" Margin="6,0,0,0"/>
|
||||
<Button x:Name="button_DECODE_Decode" Grid.Column="2" Content="Decompile" Width="118" Height="25" Margin="6,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
<!-- Compile input -->
|
||||
<TextBlock x:Name="label2" Text="Decompiled APK folder:" Margin="0,0,0,3"/>
|
||||
<Grid Margin="0,0,0,5">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBox x:Name="textBox_BUILD_InputProjectDir" Grid.Column="0" Height="25" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_BUILD_BrowseInputProjectDir" Grid.Column="1" Content="..." Width="34" Height="25" Margin="6,0,0,0"/>
|
||||
<Button x:Name="button_BUILD_Build" Grid.Column="2" Content="Compile" Width="118" Height="25" Margin="6,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
<!-- Zipalign input -->
|
||||
<TextBlock x:Name="label3" Text="APK file to align:" Margin="0,0,0,3"/>
|
||||
<Grid Margin="0,0,0,5">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBox x:Name="textBox_ZIPALIGN_InputFile" Grid.Column="0" Height="25" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_ZIPALIGN_BrowseInputFile" Grid.Column="1" Content="..." Width="34" Height="25" Margin="6,0,0,0"/>
|
||||
<Button x:Name="button_ZIPALIGN_Align" Grid.Column="2" Content="Align" Width="118" Height="25" Margin="6,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
<!-- Sign input -->
|
||||
<TextBlock x:Name="label4" Text="APK File to sign:" Margin="0,0,0,3"/>
|
||||
<Grid Margin="0,0,0,5">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBox x:Name="textBox_SIGN_InputFile" Grid.Column="0" Height="25" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_SIGN_BrowseInputFile" Grid.Column="1" Content="..." Width="34" Height="25" Margin="6,0,0,0"/>
|
||||
<Button x:Name="button_SIGN_Sign" Grid.Column="2" Content="Sign" Width="118" Height="25" Margin="6,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
<!-- Merge split APK input -->
|
||||
<TextBlock x:Name="splitApkTxt" Text="Merge split APK into single APK:" Margin="0,0,0,3"/>
|
||||
<Grid Margin="0,0,0,5">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBox x:Name="splitApkPathTxtBox" Grid.Column="0" Height="25" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="selSplitApkBtn" Grid.Column="1" Content="..." Width="34" Height="25" Margin="6,0,0,0"/>
|
||||
<Button x:Name="mergeApkBtn" Grid.Column="2" Content="Merge" Width="118" Height="25" Margin="6,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
<!-- Shortcut buttons (3 x 3) -->
|
||||
<UniformGrid Columns="3" Rows="3">
|
||||
<UniformGrid.Resources>
|
||||
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
|
||||
<Setter Property="Margin" Value="3"/>
|
||||
<Setter Property="Height" Value="30"/>
|
||||
</Style>
|
||||
</UniformGrid.Resources>
|
||||
<Button x:Name="decOutOpenDirBtn" Content="Decompile output location"/>
|
||||
<Button x:Name="decApkOpenDirBtn" Content="Decompiled APK location"/>
|
||||
<Button x:Name="alignApkOpenDirBtn" Content="Zipalign APK location"/>
|
||||
<Button x:Name="compileOutputOpenDirBtn" Content="Compile output location"/>
|
||||
<Button x:Name="comApkOpenDir" Content="Compiled APK location"/>
|
||||
<Button x:Name="signApkOpenDirBtn" Content="Sign APK location"/>
|
||||
<Button x:Name="openAndroidMainfestBtn" Content="AndroidManifest.xml"/>
|
||||
<Button x:Name="openApktoolYmlBtn" Content="Apktool.yml"/>
|
||||
<Button x:Name="button_OpenMainActivity" Content="Main activity smali"/>
|
||||
</UniformGrid>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</TabItem>
|
||||
<TabItem x:Name="tabApkInfo" Header="APK Info">
|
||||
<TabControl x:Name="tabControl1" Margin="3" BorderThickness="0" Background="Transparent">
|
||||
<TabItem x:Name="basicInfoTabPage" Header="Basic info">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="10">
|
||||
<StackPanel>
|
||||
<!-- File + icon -->
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<StackPanel Grid.Column="0">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label x:Name="label17" Grid.Column="0" Content="File:" Padding="0" VerticalAlignment="Center" Margin="0,0,8,0"/>
|
||||
<TextBox x:Name="fileTxtBox" Grid.Column="1" Height="24" IsReadOnly="True" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="selApkFileInfoBtn" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,0,0,0"/>
|
||||
</Grid>
|
||||
<Grid Margin="0,3,0,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Label x:Name="label7" Grid.Row="0" Grid.Column="0" Content="App name:" Padding="0" VerticalAlignment="Center" Margin="0,4,8,4"/>
|
||||
<TextBox x:Name="appTxtBox" Grid.Row="0" Grid.Column="1" Height="24" IsReadOnly="True" VerticalContentAlignment="Center" Margin="0,4"/>
|
||||
<Label x:Name="label9" Grid.Row="1" Grid.Column="0" Content="Package name:" Padding="0" VerticalAlignment="Center" Margin="0,4,8,4"/>
|
||||
<TextBox x:Name="packNameTxtBox" Grid.Row="1" Grid.Column="1" Height="24" IsReadOnly="True" VerticalContentAlignment="Center" Margin="0,4"/>
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
<Border Grid.Column="1" Width="88" Height="88" Margin="12,0,0,0" VerticalAlignment="Top"
|
||||
Background="{DynamicResource PanelBackground}" BorderBrush="{DynamicResource PanelBorder}" BorderThickness="1">
|
||||
<Image x:Name="apkIconPicBox" Stretch="Uniform" Margin="2"/>
|
||||
</Border>
|
||||
</Grid>
|
||||
|
||||
<!-- Links -->
|
||||
<Label x:Name="label19" Content="Links:" Padding="0" Margin="0,3,0,3"/>
|
||||
<UniformGrid Columns="3" Rows="2">
|
||||
<UniformGrid.Resources>
|
||||
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
|
||||
<Setter Property="Margin" Value="3"/>
|
||||
<Setter Property="Height" Value="28"/>
|
||||
</Style>
|
||||
</UniformGrid.Resources>
|
||||
<Button x:Name="psLinkBtn" Content="Play Store"/>
|
||||
<Button x:Name="apkComboLinkBtn" Content="ApkCombo"/>
|
||||
<Button x:Name="apkPureLinkBtn" Content="ApkPure"/>
|
||||
<Button x:Name="apkGkLinkBtn" Content="ApkGk"/>
|
||||
<Button x:Name="apkSupportLinkBtn" Content="Apk.support"/>
|
||||
<Button x:Name="apkMirrorLinkBtn" Content="Apk Mirror"/>
|
||||
</UniformGrid>
|
||||
|
||||
<!-- Fields -->
|
||||
<Grid Margin="0,3,0,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Label x:Name="label31" Grid.Row="0" Grid.Column="0" Content="Launch activity:" Padding="0" VerticalAlignment="Center" Margin="0,4,8,4"/>
|
||||
<TextBox x:Name="launchActivityTxtBox" Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="3" Height="24" IsReadOnly="True" VerticalContentAlignment="Center" Margin="0,4"/>
|
||||
|
||||
<Label x:Name="label8" Grid.Row="1" Grid.Column="0" Content="Version:" Padding="0" VerticalAlignment="Center" Margin="0,4,8,4"/>
|
||||
<TextBox x:Name="verTxtBox" Grid.Row="1" Grid.Column="1" Height="24" IsReadOnly="True" VerticalContentAlignment="Center" Margin="0,4,16,4"/>
|
||||
<Label x:Name="label10" Grid.Row="1" Grid.Column="2" Content="Build:" Padding="0" VerticalAlignment="Center" Margin="0,4,8,4"/>
|
||||
<TextBox x:Name="buildTxtBox" Grid.Row="1" Grid.Column="3" Height="24" IsReadOnly="True" VerticalContentAlignment="Center" Margin="0,4"/>
|
||||
|
||||
<Label x:Name="label11" Grid.Row="2" Grid.Column="0" Content="Min. SDK" Padding="0" VerticalAlignment="Center" Margin="0,4,8,4"/>
|
||||
<TextBox x:Name="minSdkTxtBox" Grid.Row="2" Grid.Column="1" Height="24" IsReadOnly="True" VerticalContentAlignment="Center" Margin="0,4,16,4"/>
|
||||
<Label x:Name="label12" Grid.Row="2" Grid.Column="2" Content="Target SDK:" Padding="0" VerticalAlignment="Center" Margin="0,4,8,4"/>
|
||||
<TextBox x:Name="targetSdkTxtBox" Grid.Row="2" Grid.Column="3" Height="24" IsReadOnly="True" VerticalContentAlignment="Center" Margin="0,4"/>
|
||||
|
||||
<Label x:Name="label13" Grid.Row="3" Grid.Column="0" Content="Screen sizes: " Padding="0" VerticalAlignment="Center" Margin="0,4,8,4"/>
|
||||
<TextBox x:Name="screenTxtBox" Grid.Row="3" Grid.Column="1" Height="24" IsReadOnly="True" VerticalContentAlignment="Center" Margin="0,4,16,4"/>
|
||||
<Label x:Name="label30" Grid.Row="3" Grid.Column="2" Content="Architectures:" Padding="0" VerticalAlignment="Center" Margin="0,4,8,4"/>
|
||||
<TextBox x:Name="archSdkTxtBox" Grid.Row="3" Grid.Column="3" Height="24" IsReadOnly="True" VerticalContentAlignment="Center" Margin="0,4"/>
|
||||
|
||||
<Label x:Name="label14" Grid.Row="4" Grid.Column="0" Content="Densities: " Padding="0" VerticalAlignment="Center" Margin="0,4,8,4"/>
|
||||
<TextBox x:Name="densityTxtBox" Grid.Row="4" Grid.Column="1" Grid.ColumnSpan="3" Height="24" IsReadOnly="True" VerticalContentAlignment="Center" Margin="0,4"/>
|
||||
</Grid>
|
||||
|
||||
<Label x:Name="label18" Content="Locals: " Padding="0" Margin="0,10,0,2"/>
|
||||
<RichTextBox x:Name="localsTxtBox" Height="64" IsReadOnly="True" VerticalScrollBarVisibility="Auto"/>
|
||||
|
||||
<Label x:Name="label15" Content="Permissions: " Padding="0" Margin="0,10,0,2"/>
|
||||
<RichTextBox x:Name="permTxtBox" Height="120" IsReadOnly="True" VerticalScrollBarVisibility="Auto"/>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</TabItem>
|
||||
<TabItem x:Name="tabPage3" Header="AAPT dump">
|
||||
<RichTextBox x:Name="fullInfoTextBox" Margin="3" IsReadOnly="True"
|
||||
VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
|
||||
FontFamily="Consolas"/>
|
||||
</TabItem>
|
||||
<TabItem x:Name="signatureTabPage" Header="Signature">
|
||||
<RichTextBox x:Name="sigTxtBox" Margin="3" IsReadOnly="True"
|
||||
VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
|
||||
FontFamily="Consolas"/>
|
||||
</TabItem>
|
||||
</TabControl>
|
||||
</TabItem>
|
||||
<TabItem x:Name="tabDecode" Header="Decode">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="10">
|
||||
<GroupBox x:Name="groupBox_DECODE_Options" Header="Options">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<CheckBox x:Name="decSetApiLvlChkBox" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Margin="0,4"
|
||||
Content="Set API level of the file to generate, e.g. 14 for ICS."/>
|
||||
<ctrl:NumericUpDown x:Name="decApiLvlUpDown" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Right" Width="70" Margin="0,4"
|
||||
Minimum="0" Maximum="35"/>
|
||||
|
||||
<CheckBox x:Name="checkBox_DECODE_NoSrc" Grid.Row="1" Grid.ColumnSpan="3" Margin="0,4" Content="Do not decode sources."/>
|
||||
<CheckBox x:Name="checkBox_DECODE_NoRes" Grid.Row="2" Grid.ColumnSpan="3" Margin="0,4" Content="Do not decode resources."/>
|
||||
<CheckBox x:Name="checkBox_DECODE_Force" Grid.Row="3" Grid.ColumnSpan="3" Margin="0,4" Content="Force delete destination directory."/>
|
||||
<CheckBox x:Name="checkBox_DECODE_KeepBrokenRes" Grid.Row="4" Grid.ColumnSpan="3" Margin="0,4" Content="Keep broken resource."/>
|
||||
<CheckBox x:Name="checkBox_DECODE_MatchOriginal" Grid.Row="5" Grid.ColumnSpan="3" Margin="0,4" Content="Keeps files to closest to original as possible. Prevents rebuild."/>
|
||||
|
||||
<CheckBox x:Name="checkBox_DECODE_UseFramework" Grid.Row="6" Grid.Column="0" VerticalAlignment="Center" Margin="0,4"
|
||||
Content="Uses framework files located in:"/>
|
||||
<TextBox x:Name="textBox_DECODE_FrameDir" Grid.Row="6" Grid.Column="1" Width="236" Height="24" Margin="10,4,0,4" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_DECODE_BrowseFrameDir" Grid.Row="6" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,4,0,4"/>
|
||||
|
||||
<CheckBox x:Name="checkBox_DECODE_OutputDirectory" Grid.Row="7" Grid.Column="0" VerticalAlignment="Center" Margin="0,4"
|
||||
Content="Output directory:"/>
|
||||
<TextBox x:Name="textBox_DECODE_OutputDirectory" Grid.Row="7" Grid.Column="1" Width="236" Height="24" Margin="10,4,0,4" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_DECODE_BrowseOutputDirectory" Grid.Row="7" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,4,0,4"/>
|
||||
|
||||
<CheckBox x:Name="checkBox_DECODE_OnlyMainClasses" Grid.Row="8" Grid.ColumnSpan="3" Margin="0,4" Content="Only disassemble the main dex classes (classes[0-9]*.dex) in the root. (<2.12.1)"/>
|
||||
<CheckBox x:Name="checkBox_DECODE_FixError" Grid.Row="9" Grid.ColumnSpan="3" Margin="0,4" Content="Fix ApkTool errors after decompile"/>
|
||||
<CheckBox x:Name="checkBox_DECODE_NoDebugInfo" Grid.Row="10" Grid.ColumnSpan="3" Margin="0,4" Content="Don't write out debug info (.local, .param, .line, etc.)"/>
|
||||
<CheckBox x:Name="checkBox7" Grid.Row="11" Grid.ColumnSpan="3" Margin="0,4" Content="Don't parse APK info when selecting APK for decompiling"/>
|
||||
|
||||
<CheckBox x:Name="checkBox3" Grid.Row="12" Grid.Column="0" VerticalAlignment="Center" Margin="0,4" Content="Set the number of threads to use."/>
|
||||
<ctrl:NumericUpDown x:Name="decJobsLvlUpDown" Grid.Row="12" Grid.Column="1" HorizontalAlignment="Right" Width="70" Margin="0,4" Minimum="1" Maximum="64"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</ScrollViewer>
|
||||
</TabItem>
|
||||
<TabItem x:Name="tabBuild" Header="Build">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="10">
|
||||
<GroupBox x:Name="groupBox_BUILD_Options" Header="Options">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<CheckBox x:Name="buildSetApiLvlChkBox" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Margin="0,4"
|
||||
Content="Set API level of the file to generate, e.g. 14 for ICS."/>
|
||||
<ctrl:NumericUpDown x:Name="buildApiLvlUpDown" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Right" Width="70" Margin="0,4" Minimum="0" Maximum="35"/>
|
||||
|
||||
<CheckBox x:Name="checkBox_BUILD_ForceAll" Grid.Row="1" Grid.ColumnSpan="3" Margin="0,4" Content="Skip changes detection and build all files."/>
|
||||
|
||||
<CheckBox x:Name="checkBox_BUILD_UseAapt" Grid.Row="2" Grid.Column="0" VerticalAlignment="Center" Margin="0,4" Content="Uses aapt.exe located in:"/>
|
||||
<TextBox x:Name="textBox_BUILD_AaptPath" Grid.Row="2" Grid.Column="1" Width="236" Height="24" Margin="10,4,0,4" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_BUILD_BrowseAaptPath" Grid.Row="2" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,4,0,4"/>
|
||||
|
||||
<CheckBox x:Name="checkBox_BUILD_UseFramework" Grid.Row="3" Grid.Column="0" VerticalAlignment="Center" Margin="0,4" Content="Uses framework files located in:"/>
|
||||
<TextBox x:Name="textBox_BUILD_FrameDir" Grid.Row="3" Grid.Column="1" Width="236" Height="24" Margin="10,4,0,4" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_BUILD_BrowseFrameDir" Grid.Row="3" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,4,0,4"/>
|
||||
|
||||
<CheckBox x:Name="checkBox_BUILD_OutputAppPath" Grid.Row="4" Grid.Column="0" VerticalAlignment="Center" Margin="0,4" Content="APK output directory:"/>
|
||||
<TextBox x:Name="textBox_BUILD_OutputAppPath" Grid.Row="4" Grid.Column="1" Width="236" Height="24" Margin="10,4,0,4" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_BUILD_BrowseOutputAppPath" Grid.Row="4" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,4,0,4"/>
|
||||
|
||||
<CheckBox x:Name="checkBox_BUILD_NoCrunch" Grid.Row="5" Grid.ColumnSpan="3" Margin="0,4" Content="Disable crunching of resource files during the build step."/>
|
||||
<CheckBox x:Name="checkBox_BUILD_NetSecConf" Grid.Row="6" Grid.ColumnSpan="3" Margin="0,4" Content="Add a generic Network Security Configuration file in the output APK"/>
|
||||
<CheckBox x:Name="zipalignAfterBuildChkBox" Grid.Row="7" Grid.ColumnSpan="3" Margin="0,4" Content="Zipalign after build"/>
|
||||
<CheckBox x:Name="signAfterBuildChkBox" Grid.Row="8" Grid.ColumnSpan="3" Margin="0,4" Content="Sign after build / zipalign"/>
|
||||
<CheckBox x:Name="createUnsignApkChkBox" Grid.Row="9" Grid.ColumnSpan="3" Margin="0,4" Content="Create unsigned APK with original signature after build"/>
|
||||
<CheckBox x:Name="useAapt2ChkBox" Grid.Row="10" Grid.ColumnSpan="3" Margin="0,4" Content="Use aapt2 (Upgrades apktool to use experimental aapt2 binary.) (< 2.11.1)"/>
|
||||
<CheckBox x:Name="checkBox_BUILD_CopyOriginal" Grid.Row="11" Grid.ColumnSpan="3" Margin="0,4" Content="Copy original AndroidManifest.xml and META-INF folder"/>
|
||||
|
||||
<CheckBox x:Name="checkBox4" Grid.Row="12" Grid.Column="0" VerticalAlignment="Center" Margin="0,4" Content="Set the number of threads to use."/>
|
||||
<ctrl:NumericUpDown x:Name="comJobsLvlUpDown" Grid.Row="12" Grid.Column="1" HorizontalAlignment="Right" Width="70" Margin="0,4" Minimum="1" Maximum="64"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</ScrollViewer>
|
||||
</TabItem>
|
||||
<TabItem x:Name="tabSign" Header="Sign">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="10">
|
||||
<GroupBox x:Name="groupBox_SIGN_Options" Header="Options">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<TextBlock x:Name="label22" Grid.Row="0" Grid.ColumnSpan="3" TextWrapping="Wrap" Margin="0,0,0,8"
|
||||
Foreground="{DynamicResource SecondaryText}"
|
||||
Text="It is strongly recommended that you use your own key, created via Android Studio or other tools"/>
|
||||
|
||||
<Label x:Name="label_SIGN_PublicKey" Grid.Row="1" Grid.Column="0" Content="Public key:" Padding="0" VerticalAlignment="Center" Margin="0,4,10,4"/>
|
||||
<TextBox x:Name="textBox_SIGN_PublicKey" Grid.Row="1" Grid.Column="1" Height="24" Margin="0,4" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_SIGN_BrowsePublicKey" Grid.Row="1" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,4,0,4"/>
|
||||
|
||||
<Label x:Name="label_SIGN_PrivateKey" Grid.Row="2" Grid.Column="0" Content="Private key:" Padding="0" VerticalAlignment="Center" Margin="0,4,10,4"/>
|
||||
<TextBox x:Name="textBox_SIGN_PrivateKey" Grid.Row="2" Grid.Column="1" Height="24" Margin="0,4" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_SIGN_BrowsePrivateKey" Grid.Row="2" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,4,0,4"/>
|
||||
|
||||
<CheckBox x:Name="useAliasChkBox" Grid.Row="3" Grid.Column="0" Content="Alias:" VerticalAlignment="Center" Margin="0,4,10,4"/>
|
||||
<TextBox x:Name="aliasTxtBox" Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2" Height="24" Margin="0,4" VerticalContentAlignment="Center"/>
|
||||
|
||||
<CheckBox x:Name="useKeyStoreChkBox" Grid.Row="4" Grid.ColumnSpan="3" Content="Use keystore" Margin="0,6,0,4"/>
|
||||
|
||||
<Label x:Name="label20" Grid.Row="5" Grid.Column="0" Content="keystore/jks file:" Padding="0" VerticalAlignment="Center" Margin="0,4,10,4"/>
|
||||
<TextBox x:Name="keyStoreFileTxtBox" Grid.Row="5" Grid.Column="1" Height="24" Margin="0,4" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="selectKeyStoreFileBtn" Grid.Row="5" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,4,0,4"/>
|
||||
|
||||
<Label x:Name="label21" Grid.Row="6" Grid.Column="0" Content="Password:" Padding="0" VerticalAlignment="Center" Margin="0,4,10,4"/>
|
||||
<PasswordBox x:Name="textBox3" Grid.Row="6" Grid.Column="1" Grid.ColumnSpan="2" Height="24" Margin="0,4" VerticalContentAlignment="Center"/>
|
||||
|
||||
<Label x:Name="label23" Grid.Row="7" Grid.Column="0" Content="Private key password:" Padding="0" VerticalAlignment="Center" Margin="0,4,10,4"/>
|
||||
<PasswordBox x:Name="textBox4" Grid.Row="7" Grid.Column="1" Grid.ColumnSpan="2" Height="24" Margin="0,4" VerticalContentAlignment="Center"/>
|
||||
|
||||
<CheckBox x:Name="useSigningOutputDir" Grid.Row="8" Grid.Column="0" Content="APK output directory:" VerticalAlignment="Center" Margin="0,4,10,4"/>
|
||||
<TextBox x:Name="textBox_SIGN_OutputFile" Grid.Row="8" Grid.Column="1" Height="24" Margin="0,4" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_SIGN_BrowseOutputFile" Grid.Row="8" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,4,0,4"/>
|
||||
|
||||
<Grid Grid.Row="9" Grid.ColumnSpan="3" Margin="0,6,0,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label x:Name="label24" Grid.Column="0" Content="Scheme v1:" Padding="0" VerticalAlignment="Center" Margin="0,0,8,0"/>
|
||||
<ComboBox x:Name="schemev1ComboBox" Grid.Column="1" Margin="0,0,16,0">
|
||||
<ComboBoxItem>Default</ComboBoxItem>
|
||||
<ComboBoxItem>True</ComboBoxItem>
|
||||
<ComboBoxItem>False</ComboBoxItem>
|
||||
</ComboBox>
|
||||
<Label x:Name="label25" Grid.Column="2" Content="Scheme v2:" Padding="0" VerticalAlignment="Center" Margin="0,0,8,0"/>
|
||||
<ComboBox x:Name="schemev2ComboBox" Grid.Column="3">
|
||||
<ComboBoxItem>Default</ComboBoxItem>
|
||||
<ComboBoxItem>True</ComboBoxItem>
|
||||
<ComboBoxItem>False</ComboBoxItem>
|
||||
</ComboBox>
|
||||
</Grid>
|
||||
<Grid Grid.Row="10" Grid.ColumnSpan="3" Margin="0,6,0,0">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label x:Name="label26" Grid.Column="0" Content="Scheme v3:" Padding="0" VerticalAlignment="Center" Margin="0,0,8,0"/>
|
||||
<ComboBox x:Name="schemev3ComboBox" Grid.Column="1" Margin="0,0,16,0">
|
||||
<ComboBoxItem>Default</ComboBoxItem>
|
||||
<ComboBoxItem>True</ComboBoxItem>
|
||||
<ComboBoxItem>False</ComboBoxItem>
|
||||
</ComboBox>
|
||||
<Label x:Name="label27" Grid.Column="2" Content="Scheme v4:" Padding="0" VerticalAlignment="Center" Margin="0,0,8,0"/>
|
||||
<ComboBox x:Name="schemev4ComboBox" Grid.Column="3">
|
||||
<ComboBoxItem>Default</ComboBoxItem>
|
||||
<ComboBoxItem>True</ComboBoxItem>
|
||||
<ComboBoxItem>False</ComboBoxItem>
|
||||
</ComboBox>
|
||||
</Grid>
|
||||
|
||||
<CheckBox x:Name="autoDelIdsigChkBox" Grid.Row="11" Grid.ColumnSpan="3" Margin="0,8,0,4" Content="Auto delete idsig file"/>
|
||||
<CheckBox x:Name="checkBox1" Grid.Row="12" Grid.ColumnSpan="3" Margin="0,4" Content="Overwrite input file"/>
|
||||
<CheckBox x:Name="checkBox2" Grid.Row="13" Grid.ColumnSpan="3" Margin="0,4" Content="Install APK after signing (Make sure the device is selected in ADB tab first)"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</ScrollViewer>
|
||||
</TabItem>
|
||||
<TabItem x:Name="tabZipalign" Header="Zip align">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="10">
|
||||
<GroupBox x:Name="groupBox_ZIPALIGN_Options" Header="Options">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Label x:Name="label_ZIPALIGN_AlignmentBytes" Grid.Row="0" Grid.Column="0" Padding="0" VerticalAlignment="Center" Margin="0,4"
|
||||
Content="Alignment in bytes, e.g. '4' provides 32-bit alignment"/>
|
||||
<ctrl:NumericUpDown x:Name="numericUpDown_ZIPALIGN_AlignmentBytes" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Right" Width="70" Margin="0,4" Minimum="1" Maximum="64"/>
|
||||
|
||||
<CheckBox x:Name="checkBox_ZIPALIGN_CheckAlignment" Grid.Row="1" Grid.ColumnSpan="3" Margin="0,4" Content="Check alignment only (does not modify file)"/>
|
||||
<CheckBox x:Name="checkBox_ZIPALIGN_VerboseOutput" Grid.Row="2" Grid.ColumnSpan="3" Margin="0,4" Content="Verbose output"/>
|
||||
<CheckBox x:Name="checkBox_ZIPALIGN_Recompress" Grid.Row="3" Grid.ColumnSpan="3" Margin="0,4" Content="Recompress using Zopfli"/>
|
||||
<CheckBox x:Name="checkBox_ZIPALIGN_OverwriteOutputFile" Grid.Row="4" Grid.ColumnSpan="3" Margin="0,4" Content="Overwrite existing output file"/>
|
||||
<CheckBox x:Name="signAfterZipalignChkBox" Grid.Row="5" Grid.ColumnSpan="3" Margin="0,4" Content="Sign after zipalign"/>
|
||||
|
||||
<CheckBox x:Name="zipalignOutputDirChkBox" Grid.Row="6" Grid.Column="0" VerticalAlignment="Center" Margin="0,4" Content="APK output directory:"/>
|
||||
<TextBox x:Name="textBox_ZIPALIGN_OutputFile" Grid.Row="6" Grid.Column="1" Width="236" Height="24" Margin="10,4,0,4" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_ZIPALIGN_BrowseOutputFile" Grid.Row="6" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,4,0,4"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</ScrollViewer>
|
||||
</TabItem>
|
||||
<TabItem x:Name="tabFramework" Header="Framework">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="10">
|
||||
<StackPanel>
|
||||
<GroupBox x:Name="groupBox_IF_Options" Header="Install Framework">
|
||||
<StackPanel>
|
||||
<Grid Margin="0,4">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<CheckBox x:Name="checkBox_IF_FramePath" Grid.Column="0" VerticalAlignment="Center" Margin="0,0,10,0" Content="Stores framework files into:"/>
|
||||
<TextBox x:Name="textBox_IF_FrameDir" Grid.Column="1" Height="24" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_IF_BrowseFrameDir" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,0,0,0"/>
|
||||
</Grid>
|
||||
<Grid Margin="0,4">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<CheckBox x:Name="checkBox_IF_Tag" Grid.Column="0" VerticalAlignment="Center" Margin="0,0,10,0" Content="Tag frameworks using:"/>
|
||||
<TextBox x:Name="textBox_IF_Tag" Grid.Column="1" Height="24" VerticalContentAlignment="Center"/>
|
||||
</Grid>
|
||||
<Grid Margin="0,4,0,4">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBox x:Name="textBox_IF_InputFramePath" Grid.Column="0" Height="24" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="button_IF_BrowseInputFramePath" Grid.Column="1" Content="..." Width="34" Height="24" Margin="6,0,0,0"/>
|
||||
<Button x:Name="button_IF_InstallFramework" Grid.Column="2" Content="Install" Width="90" Height="24" Margin="6,0,0,0"/>
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
|
||||
<GroupBox x:Name="groupBox1" Header="Options">
|
||||
<StackPanel>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<CheckBox x:Name="clearFwBeforeDecodeChkBox" Grid.Column="0" VerticalAlignment="Center" Margin="0,4" Content="Clear framework before decompiling"/>
|
||||
<Button x:Name="clearFwBtn" Grid.Column="1" Content="Clear framework" Height="26" Padding="10,0" Margin="6,4,0,4"/>
|
||||
</Grid>
|
||||
<Button x:Name="openFwFolderBtn" HorizontalAlignment="Left" Content="Open framework folder" Height="26" Padding="10,0" Margin="0,8,0,4"/>
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</TabItem>
|
||||
<TabItem x:Name="tabBaksmali" Header="Baksmali">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" Padding="10">
|
||||
<StackPanel>
|
||||
<GroupBox x:Name="bakSmaliGroupBox" Header="Baksmali">
|
||||
<StackPanel>
|
||||
<Grid Margin="0,4">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<CheckBox x:Name="baksmaliUseOutputChkBox" Grid.Column="0" VerticalAlignment="Center" Margin="0,0,10,0" Content="Folder output directory:"/>
|
||||
<TextBox x:Name="baksmaliBrowseOutputTxtBox" Grid.Column="1" Height="24" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="baksmaliBrowseOutputBtn" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,0,0,0"/>
|
||||
</Grid>
|
||||
<Label x:Name="label28" Content="Dex to decompile:" Padding="0" Margin="0,8,0,2"/>
|
||||
<Grid Margin="0,2,0,4">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBox x:Name="baksmaliBrowseInputDexTxtBox" Grid.Column="0" Height="24" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="baksmaliBrowseInputDexBtn" Grid.Column="1" Content="..." Width="34" Height="24" Margin="6,0,0,0"/>
|
||||
<Button x:Name="decSmaliBtn" Grid.Column="2" Content="Decompile" Width="100" Height="24" Margin="6,0,0,0"/>
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
|
||||
<GroupBox x:Name="smaliGroupBox" Header="Smali">
|
||||
<StackPanel>
|
||||
<Grid Margin="0,4">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<CheckBox x:Name="smaliUseOutputChkBox" Grid.Column="0" VerticalAlignment="Center" Margin="0,0,10,0" Content="Dex output directory:"/>
|
||||
<TextBox x:Name="smaliBrowseOutputTxtBox" Grid.Column="1" Height="24" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="smaliBrowseOutputBtn" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,0,0,0"/>
|
||||
</Grid>
|
||||
<Label x:Name="label29" Content="Smali folder to compile:" Padding="0" Margin="0,8,0,2"/>
|
||||
<Grid Margin="0,2,0,4">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBox x:Name="smaliBrowseInputDirTxtBox" Grid.Column="0" Height="24" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="smaliBrowseInputDirBtn" Grid.Column="1" Content="..." Width="34" Height="24" Margin="6,0,0,0"/>
|
||||
<Button x:Name="comSmaliBtn" Grid.Column="2" Content="Compile" Width="100" Height="24" Margin="6,0,0,0"/>
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
</GroupBox>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</TabItem>
|
||||
<TabItem x:Name="tabAdb" Header="ADB">
|
||||
<Grid Margin="10">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="0,4">
|
||||
<TextBlock x:Name="label33" Text="Selected device: " VerticalAlignment="Center"/>
|
||||
<TextBlock x:Name="selAdbDeviceLbl" VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
|
||||
<CheckBox x:Name="setVendorChkBox" Grid.Row="1" Margin="0,6" Content="Set vendor to Play Store (com.android.vending)"/>
|
||||
|
||||
<StackPanel Grid.Row="2" Orientation="Horizontal" Margin="0,6">
|
||||
<CheckBox x:Name="overrideAbiCheckBox" VerticalAlignment="Center" Content="Override platform's default ABI: "/>
|
||||
<ComboBox x:Name="overrideAbiComboBox" Width="150" Margin="8,0,0,0">
|
||||
<ComboBoxItem>arm64-v8a</ComboBoxItem>
|
||||
<ComboBoxItem>armeabi-v7a</ComboBoxItem>
|
||||
<ComboBoxItem>x86</ComboBoxItem>
|
||||
<ComboBoxItem>x86_64</ComboBoxItem>
|
||||
</ComboBox>
|
||||
</StackPanel>
|
||||
|
||||
<Grid Grid.Row="3" Margin="0,6">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock x:Name="label32" Grid.Column="0" Text="Selected APK: " VerticalAlignment="Center" Margin="0,0,8,0"/>
|
||||
<TextBox x:Name="apkPathAdbTxtBox" Grid.Column="1" Height="24" VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="selApkAdbBtn" Grid.Column="2" Content="..." Width="34" Height="24" Margin="6,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
<Grid Grid.Row="4" Margin="0,8">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Button x:Name="killAdbBtn" Grid.Column="0" Content="Kill adb process" Height="28" Padding="10,0"/>
|
||||
<Button x:Name="refreshDevicesBtn" Grid.Column="1" Content="Refresh" Height="28" Padding="14,0" Margin="8,0,0,0"/>
|
||||
<Button x:Name="installApkBtn" Grid.Column="3" Content="Install APK" Height="28" Padding="12,0"/>
|
||||
</Grid>
|
||||
|
||||
<ListBox x:Name="devicesListBox" Grid.Row="5" Margin="0,4,0,0"/>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
</TabControl>
|
||||
|
||||
<GridSplitter Grid.Row="1" Height="5" HorizontalAlignment="Stretch"
|
||||
VerticalAlignment="Center" Margin="0,3" ResizeBehavior="PreviousAndNext"/>
|
||||
|
||||
<!-- Virtualized, console-style log: replaces the slow FlowDocument RichTextBox.
|
||||
LogView implements IScrollInfo, so the host ScrollViewer (CanContentScroll=True)
|
||||
drives the themed scroll bars. -->
|
||||
<Border Grid.Row="2" BorderBrush="{DynamicResource PanelBorder}" BorderThickness="1"
|
||||
Background="{DynamicResource LogBackground}">
|
||||
<ScrollViewer CanContentScroll="True" Focusable="False"
|
||||
VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
|
||||
<ctrl:LogView x:Name="logTxtBox"
|
||||
FontFamily="Consolas" FontSize="12"
|
||||
Foreground="{DynamicResource PrimaryText}"
|
||||
Background="{DynamicResource LogBackground}">
|
||||
<ctrl:LogView.ContextMenu>
|
||||
<ContextMenu>
|
||||
<MenuItem x:Name="menuLogCopy" Header="Copy" InputGestureText="Ctrl+C" Click="LogCopy_Click"/>
|
||||
<MenuItem x:Name="menuLogCopyAll" Header="Copy all" Click="LogCopyAll_Click"/>
|
||||
<Separator/>
|
||||
<MenuItem x:Name="menuLogClear" Header="Clear log" Click="LogClear_Click"/>
|
||||
</ContextMenu>
|
||||
</ctrl:LogView.ContextMenu>
|
||||
</ctrl:LogView>
|
||||
</ScrollViewer>
|
||||
</Border>
|
||||
</Grid>
|
||||
</DockPanel>
|
||||
</Window>
|
||||
@@ -0,0 +1,521 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Media;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Interop;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
using APKToolGUI.ApkTool;
|
||||
using APKToolGUI.Controls;
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Utils;
|
||||
using Ionic.Zip;
|
||||
using Java;
|
||||
using Microsoft.WindowsAPICodePack.Taskbar;
|
||||
using Ookii.Dialogs.WinForms;
|
||||
using Lang = APKToolGUI.Languages.Language;
|
||||
using WinForms = System.Windows.Forms;
|
||||
using DColor = System.Drawing.Color;
|
||||
using Res = APKToolGUI.Properties.Resources;
|
||||
|
||||
namespace APKToolGUI.Forms
|
||||
{
|
||||
/// <summary>
|
||||
/// The main application window. This file holds the constructor, settings bindings,
|
||||
/// event wiring, window lifecycle and menu; <c>MainWindow.Logic.cs</c> holds the
|
||||
/// apktool operation logic, the control event handlers, localization and drag-drop.
|
||||
/// </summary>
|
||||
public partial class MainWindow : Window
|
||||
{
|
||||
internal Adb adb;
|
||||
internal ApkEditor apkeditor;
|
||||
internal Apktool apktool;
|
||||
internal Signapk signapk;
|
||||
internal Baksmali baksmali;
|
||||
internal Smali smali;
|
||||
internal Zipalign zipalign;
|
||||
internal UpdateChecker updateCheker;
|
||||
internal AaptParser aapt;
|
||||
|
||||
private bool IgnoreOutputDirContextMenu;
|
||||
private bool isRunning;
|
||||
private string javaPath;
|
||||
private readonly System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
|
||||
private string lastStartedDate;
|
||||
private System.Drawing.Bitmap previousApkIcon;
|
||||
private IntPtr _hwnd = IntPtr.Zero;
|
||||
|
||||
internal static MainWindow Instance { get; private set; }
|
||||
|
||||
public MainWindow()
|
||||
{
|
||||
Instance = this;
|
||||
Program.SetLanguage();
|
||||
|
||||
InitializeComponent();
|
||||
|
||||
Theme theme = (Theme)Settings.Default.Theme;
|
||||
WpfTheme.Apply(this, Program.IsDarkTheme());
|
||||
NativeDarkMode.ApplyTheme(this, theme);
|
||||
|
||||
Title = "APK Tool GUI - v" + WinForms.Application.ProductVersion;
|
||||
menuUseApkEditor.IsChecked = Settings.Default.UseApkeditor;
|
||||
|
||||
Log.Output = ToLog;
|
||||
ApplyLocalization();
|
||||
aapt = new AaptParser();
|
||||
|
||||
// Validate stored paths (mirrors the old FormMain constructor)
|
||||
if (!File.Exists(Settings.Default.Decode_InputAppPath)) Settings.Default.Decode_InputAppPath = "";
|
||||
if (!Directory.Exists(Settings.Default.Build_InputDir)) Settings.Default.Build_InputDir = "";
|
||||
if (!File.Exists(Settings.Default.Sign_InputFile)) Settings.Default.Sign_InputFile = "";
|
||||
if (!File.Exists(Settings.Default.Zipalign_InputFile)) Settings.Default.Zipalign_InputFile = "";
|
||||
if (!File.Exists(Settings.Default.Sign_PrivateKey) || String.IsNullOrEmpty(Settings.Default.Sign_PrivateKey)) Settings.Default.Sign_PrivateKey = Program.SIGNAPK_KEYPRIVATE;
|
||||
if (!File.Exists(Settings.Default.Sign_PublicKey) || String.IsNullOrEmpty(Settings.Default.Sign_PublicKey)) Settings.Default.Sign_PublicKey = Program.SIGNAPK_KEYPUBLIC;
|
||||
|
||||
BindSettings();
|
||||
|
||||
schemev1ComboBox.SelectedIndex = Clamp(Settings.Default.Sign_Schemev1, schemev1ComboBox.Items.Count);
|
||||
schemev2ComboBox.SelectedIndex = Clamp(Settings.Default.Sign_Schemev2, schemev2ComboBox.Items.Count);
|
||||
schemev3ComboBox.SelectedIndex = Clamp(Settings.Default.Sign_Schemev3, schemev3ComboBox.Items.Count);
|
||||
schemev4ComboBox.SelectedIndex = (Settings.Default.Sign_Schemev4 >= 0 && Settings.Default.Sign_Schemev4 < schemev4ComboBox.Items.Count) ? Settings.Default.Sign_Schemev4 : 2;
|
||||
overrideAbiComboBox.SelectedIndex = Clamp(Settings.Default.Adb_OverrideAbi, overrideAbiComboBox.Items.Count);
|
||||
|
||||
WireEvents();
|
||||
|
||||
Loaded += MainWindow_Loaded;
|
||||
Closing += MainWindow_Closing;
|
||||
Activated += (s, e) => { if (!isRunning && _hwnd != IntPtr.Zero) TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress, _hwnd); };
|
||||
}
|
||||
|
||||
private static int Clamp(int value, int count)
|
||||
{
|
||||
return (value >= 0 && value < count) ? value : 0;
|
||||
}
|
||||
|
||||
#region Settings bindings
|
||||
|
||||
private void BindSettings()
|
||||
{
|
||||
BindText(textBox_DECODE_InputAppPath, "Decode_InputAppPath");
|
||||
BindChecked(checkBox_DECODE_NoSrc, "Decode_NoSrc");
|
||||
BindChecked(checkBox_DECODE_NoRes, "Decode_NoRes");
|
||||
BindChecked(checkBox_DECODE_Force, "Decode_Force");
|
||||
BindChecked(checkBox_DECODE_KeepBrokenRes, "Decode_KeepBrokenRes");
|
||||
BindChecked(checkBox_DECODE_MatchOriginal, "Decode_MatchOriginal");
|
||||
BindChecked(checkBox_DECODE_OnlyMainClasses, "Decode_OnlyMainClasses");
|
||||
BindChecked(checkBox_DECODE_NoDebugInfo, "Decode_NoDebugInfo");
|
||||
BindChecked(checkBox_DECODE_FixError, "Decode_FixError");
|
||||
BindChecked(checkBox7, "Decode_DontParseApkInfo");
|
||||
BindChecked(checkBox_DECODE_UseFramework, "Decode_UseFramework");
|
||||
BindChecked(checkBox_DECODE_OutputDirectory, "Decode_UseOutputDir");
|
||||
BindText(textBox_DECODE_FrameDir, "Framework_FrameDir");
|
||||
BindText(textBox_DECODE_OutputDirectory, "Decode_OutputDir");
|
||||
BindChecked(decSetApiLvlChkBox, "Decode_SetApiLevel");
|
||||
BindValue(decApiLvlUpDown, "Decode_ApiLevel");
|
||||
BindChecked(checkBox3, "Decode_SetJobs");
|
||||
BindValue(decJobsLvlUpDown, "Decode_Jobs");
|
||||
BindEnabled(textBox_DECODE_FrameDir, "Decode_UseFramework");
|
||||
BindEnabled(button_DECODE_BrowseFrameDir, "Decode_UseFramework");
|
||||
BindEnabled(textBox_DECODE_OutputDirectory, "Decode_UseOutputDir");
|
||||
BindEnabled(button_DECODE_BrowseOutputDirectory, "Decode_UseOutputDir");
|
||||
|
||||
BindText(textBox_BUILD_InputProjectDir, "Build_InputDir");
|
||||
BindChecked(checkBox_BUILD_ForceAll, "Build_ForceAll");
|
||||
BindChecked(checkBox_BUILD_UseAapt, "Build_UseAapt");
|
||||
BindText(textBox_BUILD_AaptPath, "Build_AaptPath");
|
||||
BindChecked(checkBox_BUILD_UseFramework, "Build_UseFramework");
|
||||
BindText(textBox_BUILD_FrameDir, "Framework_FrameDir");
|
||||
BindChecked(checkBox_BUILD_OutputAppPath, "Build_UseOutputAppPath");
|
||||
BindText(textBox_BUILD_OutputAppPath, "Build_OutputAppPath");
|
||||
BindChecked(checkBox_BUILD_NoCrunch, "Build_NoCrunch");
|
||||
BindChecked(checkBox_BUILD_NetSecConf, "Build_NetSecConf");
|
||||
BindChecked(zipalignAfterBuildChkBox, "Build_ZipalignAfterBuild");
|
||||
BindChecked(signAfterBuildChkBox, "Build_SignAfterBuild");
|
||||
BindChecked(createUnsignApkChkBox, "Build_CreateUnsignedApk");
|
||||
BindChecked(useAapt2ChkBox, "Build_UseAapt2");
|
||||
BindChecked(checkBox_BUILD_CopyOriginal, "Build_CopyOriginal");
|
||||
BindChecked(buildSetApiLvlChkBox, "Build_SetApiLevel");
|
||||
BindValue(buildApiLvlUpDown, "Build_ApiLevel");
|
||||
BindChecked(checkBox4, "Build_SetJobs");
|
||||
BindValue(comJobsLvlUpDown, "Build_Jobs");
|
||||
BindEnabled(textBox_BUILD_AaptPath, "Build_UseAapt");
|
||||
BindEnabled(button_BUILD_BrowseAaptPath, "Build_UseAapt");
|
||||
BindEnabled(textBox_BUILD_FrameDir, "Build_UseFramework");
|
||||
BindEnabled(button_BUILD_BrowseFrameDir, "Build_UseFramework");
|
||||
BindEnabled(textBox_BUILD_OutputAppPath, "Build_UseOutputAppPath");
|
||||
BindEnabled(button_BUILD_BrowseOutputAppPath, "Build_UseOutputAppPath");
|
||||
|
||||
BindText(textBox_SIGN_InputFile, "Sign_InputFile");
|
||||
BindText(textBox_SIGN_PublicKey, "Sign_PublicKey");
|
||||
BindText(textBox_SIGN_PrivateKey, "Sign_PrivateKey");
|
||||
BindChecked(useAliasChkBox, "Sign_SetAlias");
|
||||
BindText(aliasTxtBox, "Sign_Alias");
|
||||
BindChecked(useKeyStoreChkBox, "Sign_UseKeystoreFile");
|
||||
BindText(keyStoreFileTxtBox, "Sign_KeystoreFilePath");
|
||||
// textBox3 / textBox4 are PasswordBoxes (masked); synced to Settings in WireEvents
|
||||
// (PasswordBox.Password is not a bindable DependencyProperty).
|
||||
BindChecked(useSigningOutputDir, "Sign_UseOutputDir");
|
||||
BindText(textBox_SIGN_OutputFile, "Sign_OutputDir");
|
||||
BindChecked(autoDelIdsigChkBox, "AutoDeleteIdsigFile");
|
||||
BindChecked(checkBox1, "Sign_OverwriteInputFile");
|
||||
BindChecked(checkBox2, "Sign_InstallApkAfterSign");
|
||||
|
||||
BindText(textBox_ZIPALIGN_InputFile, "Zipalign_InputFile");
|
||||
BindValue(numericUpDown_ZIPALIGN_AlignmentBytes, "Zipalign_AlignmentInBytes");
|
||||
BindChecked(checkBox_ZIPALIGN_CheckAlignment, "Zipalign_CheckOnly");
|
||||
BindChecked(checkBox_ZIPALIGN_VerboseOutput, "Zipalign_Verbose");
|
||||
BindChecked(checkBox_ZIPALIGN_Recompress, "Zipalign_Recompress");
|
||||
BindChecked(checkBox_ZIPALIGN_OverwriteOutputFile, "Zipalign_OverwriteOutputFile");
|
||||
BindChecked(signAfterZipalignChkBox, "Zipalign_SignAfterZipAlign");
|
||||
BindChecked(zipalignOutputDirChkBox, "Zipalign_UseOutputDir");
|
||||
BindText(textBox_ZIPALIGN_OutputFile, "Zipalign_OutputDir");
|
||||
|
||||
BindChecked(checkBox_IF_FramePath, "Framework_UseFrameDir");
|
||||
BindText(textBox_IF_FrameDir, "Framework_FrameDir");
|
||||
BindChecked(checkBox_IF_Tag, "InstallFramework_UseTag");
|
||||
BindText(textBox_IF_Tag, "InstallFramework_Tag");
|
||||
BindText(textBox_IF_InputFramePath, "InstallFramework_InputFramePath");
|
||||
BindChecked(clearFwBeforeDecodeChkBox, "Framework_ClearBeforeDecode");
|
||||
BindEnabled(textBox_IF_FrameDir, "Framework_UseFrameDir");
|
||||
BindEnabled(button_IF_BrowseFrameDir, "Framework_UseFrameDir");
|
||||
BindEnabled(textBox_IF_Tag, "InstallFramework_UseTag");
|
||||
|
||||
BindChecked(baksmaliUseOutputChkBox, "Baksmali_UseOutputDir");
|
||||
BindText(baksmaliBrowseOutputTxtBox, "Baksmali_OutputDir");
|
||||
BindText(baksmaliBrowseInputDexTxtBox, "Baksmali_InputDexFile");
|
||||
BindChecked(smaliUseOutputChkBox, "Smali_UseOutputDir");
|
||||
BindText(smaliBrowseOutputTxtBox, "Smali_OutputDir");
|
||||
BindText(smaliBrowseInputDirTxtBox, "Smali_InputDir");
|
||||
|
||||
BindChecked(setVendorChkBox, "Adb_SetVendor");
|
||||
BindChecked(overrideAbiCheckBox, "Adb_SetOverrideAbi");
|
||||
BindText(apkPathAdbTxtBox, "Adb_SelectedApkPath");
|
||||
|
||||
BindText(splitApkPathTxtBox, "SplitApk_InputFile");
|
||||
}
|
||||
|
||||
private static void BindChecked(CheckBox c, string prop)
|
||||
{
|
||||
c.SetBinding(System.Windows.Controls.Primitives.ToggleButton.IsCheckedProperty,
|
||||
new Binding(prop) { Source = Settings.Default, Mode = BindingMode.TwoWay });
|
||||
}
|
||||
private static void BindText(TextBox t, string prop)
|
||||
{
|
||||
t.SetBinding(TextBox.TextProperty,
|
||||
new Binding(prop) { Source = Settings.Default, Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
|
||||
}
|
||||
private static void BindValue(NumericUpDown n, string prop)
|
||||
{
|
||||
n.SetBinding(NumericUpDown.ValueProperty,
|
||||
new Binding(prop) { Source = Settings.Default, Mode = BindingMode.TwoWay });
|
||||
}
|
||||
private static void BindEnabled(Control c, string prop)
|
||||
{
|
||||
c.SetBinding(UIElement.IsEnabledProperty,
|
||||
new Binding(prop) { Source = Settings.Default, Mode = BindingMode.OneWay });
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Event wiring
|
||||
|
||||
private void WireEvents()
|
||||
{
|
||||
// Decode
|
||||
button_DECODE_BrowseFrameDir.Click += Button_DECODE_BrowseFrameDir_Click;
|
||||
button_DECODE_BrowseOutputDirectory.Click += Button_DECODE_BrowseOutputDirectory_Click;
|
||||
button_DECODE_BrowseInputAppPath.Click += Button_DECODE_BrowseInputAppPath_Click;
|
||||
button_DECODE_Decode.Click += Button_DECODE_Decode_Click;
|
||||
|
||||
// Build
|
||||
button_BUILD_BrowseAaptPath.Click += Button_BUILD_BrowseAaptPath_Click;
|
||||
button_BUILD_BrowseFrameDir.Click += Button_BUILD_BrowseFrameDir_Click;
|
||||
button_BUILD_BrowseOutputAppPath.Click += Button_BUILD_BrowseOutputAppPath_Click;
|
||||
button_BUILD_BrowseInputProjectDir.Click += Button_BUILD_BrowseInputProjectDir_Click;
|
||||
button_BUILD_Build.Click += Button_BUILD_Build_Click;
|
||||
|
||||
// Sign
|
||||
button_SIGN_BrowsePublicKey.Click += Button_SIGN_BrowsePublicKey_Click;
|
||||
button_SIGN_BrowsePrivateKey.Click += Button_SIGN_BrowsePrivateKey_Click;
|
||||
button_SIGN_BrowseInputFile.Click += Button_SIGN_BrowseInputFile_Click;
|
||||
button_SIGN_BrowseOutputFile.Click += Button_SIGN_BrowseOutputFile_Click;
|
||||
selectKeyStoreFileBtn.Click += SelectKeyStoreFileBtn_Click;
|
||||
button_SIGN_Sign.Click += Button_SIGN_Sign_Click;
|
||||
schemev1ComboBox.SelectionChanged += SchemeComboBox_Changed;
|
||||
schemev2ComboBox.SelectionChanged += SchemeComboBox_Changed;
|
||||
schemev3ComboBox.SelectionChanged += SchemeComboBox_Changed;
|
||||
schemev4ComboBox.SelectionChanged += SchemeComboBox_Changed;
|
||||
|
||||
// Masked password fields: PasswordBox.Password isn't bindable, so load + sync manually.
|
||||
textBox3.Password = Settings.Default.Sign_KeystorePassword ?? "";
|
||||
textBox4.Password = Settings.Default.Sign_KeyPassword ?? "";
|
||||
textBox3.PasswordChanged += (s, e) => Settings.Default.Sign_KeystorePassword = textBox3.Password;
|
||||
textBox4.PasswordChanged += (s, e) => Settings.Default.Sign_KeyPassword = textBox4.Password;
|
||||
|
||||
// Zipalign
|
||||
checkBox_ZIPALIGN_CheckAlignment.Click += (s, e) => ApplyZipalignCheckSwitch();
|
||||
button_ZIPALIGN_BrowseOutputFile.Click += Button_ZIPALIGN_BrowseOutputFile_Click;
|
||||
button_ZIPALIGN_BrowseInputFile.Click += Button_ZIPALIGN_BrowseInputFile_Click;
|
||||
button_ZIPALIGN_Align.Click += Button_ZIPALIGN_Align_Click;
|
||||
|
||||
// Framework
|
||||
button_IF_BrowseFrameDir.Click += Button_IF_BrowseFrameDir_Click;
|
||||
button_IF_BrowseInputFramePath.Click += Button_IF_BrowseInputFramePath_Click;
|
||||
button_IF_InstallFramework.Click += Button_IF_InstallFramework_Click;
|
||||
clearFwBtn.Click += ClearFwBtn_Click;
|
||||
openFwFolderBtn.Click += OpenFwFolderBtn_Click;
|
||||
|
||||
// Baksmali / Smali
|
||||
baksmaliBrowseOutputBtn.Click += BaksmaliBrowseOutputBtn_Click;
|
||||
baksmaliBrowseInputDexBtn.Click += BaksmaliBrowseInputDexBtn_Click;
|
||||
decSmaliBtn.Click += DecSmaliBtn_Click;
|
||||
smaliBrowseOutputBtn.Click += SmaliBrowseOutputBtn_Click;
|
||||
smaliBrowseInputDirBtn.Click += SmaliBrowseInputDirBtn_Click;
|
||||
comSmaliBtn.Click += ComSmaliBtn_Click;
|
||||
|
||||
// ADB
|
||||
killAdbBtn.Click += KillAdbBtn_Click;
|
||||
installApkBtn.Click += InstallApkBtn_Click;
|
||||
refreshDevicesBtn.Click += RefreshDevicesBtn_Click;
|
||||
selApkAdbBtn.Click += SelApkAdbBtn_Click;
|
||||
devicesListBox.SelectionChanged += DevicesListBox_SelectionChanged;
|
||||
overrideAbiComboBox.SelectionChanged += OverrideAbiComboBox_Changed;
|
||||
|
||||
// APK info
|
||||
selApkFileInfoBtn.Click += SelApkFileInfoBtn_Click;
|
||||
apkIconPicBox.MouseLeftButtonUp += ApkIcon_Click;
|
||||
psLinkBtn.Click += (s, e) => { if (aapt != null) Process.Start(aapt.PlayStoreLink); };
|
||||
apkComboLinkBtn.Click += (s, e) => { if (aapt != null) Process.Start(aapt.ApkComboLink); };
|
||||
apkPureLinkBtn.Click += (s, e) => { if (aapt != null) Process.Start(aapt.ApkPureLink); };
|
||||
apkGkLinkBtn.Click += (s, e) => { if (aapt != null) Process.Start(aapt.ApkGkLink); };
|
||||
apkSupportLinkBtn.Click += (s, e) => { if (aapt != null) Process.Start(aapt.ApkSupportLink); };
|
||||
apkMirrorLinkBtn.Click += (s, e) => { if (aapt != null) Process.Start(aapt.ApkMirrorLink); };
|
||||
|
||||
// Main tab shortcut buttons
|
||||
mergeApkBtn.Click += MergeApkBtn_Click;
|
||||
selSplitApkBtn.Click += SelSplitApkBtn_Click;
|
||||
openAndroidMainfestBtn.Click += OpenAndroidMainfestBtn_Click;
|
||||
openApktoolYmlBtn.Click += OpenApktoolYmlBtn_Click;
|
||||
compileOutputOpenDirBtn.Click += CompiledApkOpenDirBtn_Click;
|
||||
button_OpenMainActivity.Click += Button_OpenMainActivity_Click;
|
||||
decApkOpenDirBtn.Click += DecApkOpenDirBtn_Click;
|
||||
decOutOpenDirBtn.Click += DecOutOpenDirBtn_Click;
|
||||
comApkOpenDir.Click += ComApkOpenDir_Click;
|
||||
signApkOpenDirBtn.Click += SignApkOpenDirBtn_Click;
|
||||
alignApkOpenDirBtn.Click += AlignApkOpenDirBtn_Click;
|
||||
|
||||
// Menu extras
|
||||
menuUseApkEditor.Click += (s, e) => Settings.Default.UseApkeditor = menuUseApkEditor.IsChecked;
|
||||
|
||||
// Cancel by clicking status text / progress bar
|
||||
statusText.MouseLeftButtonUp += (s, e) => PromptCancel();
|
||||
progressBar.MouseLeftButtonUp += (s, e) => PromptCancel();
|
||||
|
||||
WireDragDrop();
|
||||
ApplyZipalignCheckSwitch();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Window lifecycle
|
||||
|
||||
private async void MainWindow_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
_hwnd = new WindowInteropHelper(this).Handle;
|
||||
|
||||
try { new TaskBarJumpList(_hwnd); } catch (Exception ex) { Debug.WriteLine(ex); }
|
||||
|
||||
await Task.Run(() =>
|
||||
{
|
||||
InitializeUpdateChecker();
|
||||
InitializeZipalign();
|
||||
|
||||
javaPath = JavaUtils.GetJavaPath();
|
||||
if (javaPath != null)
|
||||
{
|
||||
InitializeBaksmali();
|
||||
InitializeSmali();
|
||||
InitializeAPKTool();
|
||||
InitializeSignapk();
|
||||
InitializeApkEditor();
|
||||
|
||||
string javaVersion = apktool.GetJavaVersion();
|
||||
if (javaVersion != null)
|
||||
{
|
||||
ToLog(ApktoolEventType.None, javaVersion);
|
||||
|
||||
if (!String.IsNullOrWhiteSpace(apktool.Version) && !Regex.IsMatch(apktool.Version, @"\r\n?|\n"))
|
||||
ToLog(ApktoolEventType.None, $"{Lang.APKToolVersion} {apktool.Version}");
|
||||
else
|
||||
ToLog(ApktoolEventType.Error, Lang.CantDetectApktoolVersion);
|
||||
|
||||
string apkeditorVersion = apkeditor.GetVersion();
|
||||
if (!String.IsNullOrWhiteSpace(apkeditorVersion))
|
||||
ToLog(ApktoolEventType.None, apkeditorVersion);
|
||||
else
|
||||
ToLog(ApktoolEventType.Error, Lang.CantDetectApkeditorVersion);
|
||||
}
|
||||
else
|
||||
ToLog(ApktoolEventType.Error, Lang.ErrorJavaDetect);
|
||||
}
|
||||
else
|
||||
{
|
||||
ToLog(ApktoolEventType.Error, Lang.ErrorJavaDetect);
|
||||
BeginInvokeOnUIThread(() =>
|
||||
{
|
||||
tabMain.IsEnabled = false;
|
||||
tabBaksmali.IsEnabled = false;
|
||||
tabFramework.IsEnabled = false;
|
||||
});
|
||||
}
|
||||
|
||||
InitializeAdb();
|
||||
|
||||
if (AdminUtils.IsAdministrator())
|
||||
ToLog(ApktoolEventType.Warning, Lang.DragDropNotSupported);
|
||||
else
|
||||
ToLog(ApktoolEventType.None, Lang.DragDropSupported);
|
||||
|
||||
ToLog(ApktoolEventType.None, String.Format(Lang.TempDirectory, Program.TEMP_PATH));
|
||||
|
||||
TimeSpan updateInterval = DateTime.Now - Settings.Default.LastUpdateCheck;
|
||||
if (updateInterval.Days > 0 && Settings.Default.CheckForUpdateAtStartup)
|
||||
updateCheker.CheckAsync(true);
|
||||
});
|
||||
|
||||
ToStatus(Lang.Done, Res.done);
|
||||
RunCmdArgs();
|
||||
await ListDevices();
|
||||
}
|
||||
|
||||
private void MainWindow_Closing(object sender, CancelEventArgs e)
|
||||
{
|
||||
Save();
|
||||
try { previousApkIcon?.Dispose(); previousApkIcon = null; } catch { }
|
||||
try
|
||||
{
|
||||
adb?.Dispose(); zipalign?.Dispose(); apktool?.Dispose(); signapk?.Dispose();
|
||||
baksmali?.Dispose(); smali?.Dispose(); apkeditor?.Dispose();
|
||||
}
|
||||
catch (Exception ex) { Debug.WriteLine(ex); }
|
||||
DirectoryUtils.Delete(Program.TEMP_PATH);
|
||||
}
|
||||
|
||||
private async void RunCmdArgs()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (Environment.GetCommandLineArgs().Length == 3)
|
||||
{
|
||||
if (Settings.Default.IgnoreOutputDirContextMenu)
|
||||
IgnoreOutputDirContextMenu = true;
|
||||
|
||||
string file = Environment.GetCommandLineArgs()[2];
|
||||
switch (Environment.GetCommandLineArgs()[1])
|
||||
{
|
||||
case "decapk":
|
||||
if (file.ContainsAny(".xapk", ".zip", ".apks", ".apkm")) { if (await MergeAndDecompile(file) == 0) Close(); }
|
||||
else { if (await Decompile(file) == 0) Close(); }
|
||||
break;
|
||||
case "comapk": if (await Build(file) == 0) Close(); break;
|
||||
case "sign": if (await Sign(file) == 0) Close(); break;
|
||||
case "zipalign": if (await Align(file) == 0) Close(); break;
|
||||
case "baksmali": if (await Baksmali(file) == 0) Close(); break;
|
||||
case "smali": if (await Smali(file) == 0) Close(); break;
|
||||
case "viewinfo": tabControlMain.SelectedIndex = 1; await GetApkInfo(file); break;
|
||||
default: IgnoreOutputDirContextMenu = false; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex) { ToLog(ApktoolEventType.Error, ex.Message); }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Menu
|
||||
|
||||
private void NewInstance_Click(object sender, RoutedEventArgs e) => Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location);
|
||||
|
||||
private void SaveLog_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
using (var sfd = new WinForms.SaveFileDialog())
|
||||
{
|
||||
sfd.FileName = "APK Tool GUI logs";
|
||||
sfd.Filter = Lang.TextFile + " (*.txt)|*.txt";
|
||||
if (sfd.ShowDialog() == WinForms.DialogResult.OK)
|
||||
File.WriteAllText(sfd.FileName, GetLogText());
|
||||
}
|
||||
}
|
||||
|
||||
private void OpenTempFolder_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (string.IsNullOrEmpty(Program.TEMP_PATH)) return;
|
||||
if (!Directory.Exists(Program.TEMP_PATH)) Directory.CreateDirectory(Program.TEMP_PATH);
|
||||
Process.Start("explorer.exe", Program.TEMP_PATH);
|
||||
}
|
||||
|
||||
private async void ClearTempFolder_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Running(Lang.ClearTempFolder);
|
||||
try
|
||||
{
|
||||
await Task.Run(() =>
|
||||
{
|
||||
foreach (var subDir in new DirectoryInfo(Program.TEMP_MAIN).EnumerateDirectories())
|
||||
{
|
||||
ToLog(ApktoolEventType.None, String.Format(Lang.DeletingFolder, subDir));
|
||||
DirectoryUtils.Delete(subDir.FullName);
|
||||
}
|
||||
Directory.CreateDirectory(Program.TEMP_PATH);
|
||||
});
|
||||
Done();
|
||||
}
|
||||
catch (Exception ex) { Error(ex); }
|
||||
}
|
||||
|
||||
private void Exit_Click(object sender, RoutedEventArgs e) => Close();
|
||||
private void OpenSettings_Click(object sender, RoutedEventArgs e) => new SettingsWindow { Owner = this }.ShowDialog();
|
||||
private void CheckUpdate_Click(object sender, RoutedEventArgs e) => updateCheker?.CheckAsync();
|
||||
private void ReportIssue_Click(object sender, RoutedEventArgs e) => Process.Start("https://github.com/AndnixSH/APKToolGUI/issues/new/choose");
|
||||
private void ApktoolIssues_Click(object sender, RoutedEventArgs e) => Process.Start("https://github.com/iBotPeaches/Apktool/issues?q=is%3Aissue");
|
||||
private void BaksmaliIssues_Click(object sender, RoutedEventArgs e) => Process.Start("https://github.com/JesusFreke/smali/issues?q=is%3Aissue");
|
||||
private void About_Click(object sender, RoutedEventArgs e) => new AboutWindow { Owner = this }.ShowDialog();
|
||||
|
||||
private string GetLogText()
|
||||
{
|
||||
FlushLogNow();
|
||||
return logTxtBox.GetText();
|
||||
}
|
||||
|
||||
private void LogCopy_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
FlushLogNow();
|
||||
logTxtBox.CopySelection();
|
||||
}
|
||||
|
||||
private void LogCopyAll_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
FlushLogNow();
|
||||
logTxtBox.CopyAll();
|
||||
}
|
||||
|
||||
private void LogClear_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ClearLogQueue();
|
||||
logTxtBox.Clear();
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,134 @@
|
||||
<Window x:Class="APKToolGUI.Forms.SettingsWindow"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
Title="Settings"
|
||||
Width="580" Height="588"
|
||||
MinWidth="520" MinHeight="420"
|
||||
ResizeMode="CanResize" ShowInTaskbar="False"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
UseLayoutRounding="True" TextOptions.TextFormattingMode="Display"
|
||||
FontFamily="Segoe UI" FontSize="12"
|
||||
Background="{DynamicResource WindowBackground}"
|
||||
Foreground="{DynamicResource PrimaryText}">
|
||||
|
||||
<!-- WPF replacement for the former WinForms FormSettings. Shared dark/light styles
|
||||
from Themes/Controls.xaml; colours applied via WpfTheme.Apply in code-behind.
|
||||
Resizable: a DockPanel keeps OK/Cancel pinned to the bottom while the groups sit
|
||||
in a ScrollViewer so the dialog never clips. -->
|
||||
<Window.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="pack://application:,,,/Themes/Controls.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</Window.Resources>
|
||||
|
||||
<DockPanel Margin="5" LastChildFill="True">
|
||||
|
||||
<!-- ===== OK / Cancel (pinned bottom) ===== -->
|
||||
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal"
|
||||
HorizontalAlignment="Right" Margin="0,14,0,0">
|
||||
<Button x:Name="btnOK" MinWidth="88" Height="26" Margin="0,0,8,0" IsDefault="True" Click="OK_Click"/>
|
||||
<Button x:Name="btnCancel" MinWidth="88" Height="26" IsCancel="True"/>
|
||||
</StackPanel>
|
||||
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled"
|
||||
Padding="0,0,6,0">
|
||||
<StackPanel>
|
||||
|
||||
<!-- ===== General =====
|
||||
col0 = Auto (checkbox / label), col1 = * (input, stretches and never
|
||||
overflows), col2 = Auto (browse button). Inputs carry a 16px left
|
||||
margin so labels never crowd the textbox. Nothing spans into col2,
|
||||
which previously let a long single-line value inflate that column. -->
|
||||
<GroupBox x:Name="groupGeneral" Header="General">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<CheckBox x:Name="chkCheckUpdate" Grid.Row="0" Grid.ColumnSpan="3" Margin="0,3"/>
|
||||
<CheckBox x:Name="chkClearLog" Grid.Row="1" Grid.ColumnSpan="3" Margin="0,3"/>
|
||||
<CheckBox x:Name="chkPlaySound" Grid.Row="2" Grid.ColumnSpan="3" Margin="0,3"/>
|
||||
|
||||
<CheckBox x:Name="chkCustomTemp" Grid.Row="3" Grid.Column="0" VerticalAlignment="Center" Margin="0,3"/>
|
||||
<TextBox x:Name="txtTempDir" Grid.Row="3" Grid.Column="1" Height="24" Margin="16,3,0,3"
|
||||
VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="btnTempBrowse" Grid.Row="3" Grid.Column="2" Content="..." Width="32" Height="24"
|
||||
Margin="6,3,0,3" Click="BrowseTemp_Click"/>
|
||||
|
||||
<CheckBox x:Name="chkCustomJava" Grid.Row="4" Grid.Column="0" VerticalAlignment="Center" Margin="0,3"/>
|
||||
<TextBox x:Name="txtJavaExe" Grid.Row="4" Grid.Column="1" Height="24" Margin="16,3,0,3"
|
||||
VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="btnJavaBrowse" Grid.Row="4" Grid.Column="2" Content="..." Width="32" Height="24"
|
||||
Margin="6,3,0,3" Click="BrowseJava_Click"/>
|
||||
|
||||
<CheckBox x:Name="chkCustomJvmArgs" Grid.Row="5" Grid.Column="0" VerticalAlignment="Center" Margin="0,3"/>
|
||||
<TextBox x:Name="txtJvmArgs" Grid.Row="5" Grid.Column="1" Height="24" Margin="16,3,0,3"
|
||||
VerticalContentAlignment="Center"/>
|
||||
|
||||
<CheckBox x:Name="chkUtf8" Grid.Row="6" Grid.ColumnSpan="3" Margin="0,3"/>
|
||||
|
||||
<TextBlock x:Name="lblTempNote" Grid.Row="7" Grid.ColumnSpan="3" Margin="0,3,0,6"
|
||||
TextWrapping="Wrap" Foreground="{DynamicResource SecondaryText}"/>
|
||||
|
||||
<CheckBox x:Name="chkCustomApktool" Grid.Row="8" Grid.Column="0" VerticalAlignment="Center" Margin="0,3"/>
|
||||
<TextBox x:Name="txtApktoolPath" Grid.Row="8" Grid.Column="1" Height="24" Margin="16,3,0,3"
|
||||
VerticalContentAlignment="Center"/>
|
||||
<Button x:Name="btnApktoolBrowse" Grid.Row="8" Grid.Column="2" Content="..." Width="32" Height="24"
|
||||
Margin="6,3,0,3" Click="BrowseApktool_Click"/>
|
||||
|
||||
<Label x:Name="lblTheme" Grid.Row="9" Grid.Column="0" VerticalAlignment="Center" Padding="0" Margin="0,3"/>
|
||||
<ComboBox x:Name="cboTheme" Grid.Row="9" Grid.Column="1" Margin="16,3,0,3" HorizontalAlignment="Left" Width="160"/>
|
||||
|
||||
<CheckBox x:Name="chkDebug" Grid.Row="10" Grid.ColumnSpan="3" Margin="0,3"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
<!-- ===== Language ===== -->
|
||||
<GroupBox x:Name="groupLanguage" Header="Language">
|
||||
<ComboBox x:Name="cboLanguage" HorizontalAlignment="Left" Width="360" Margin="0,2"/>
|
||||
</GroupBox>
|
||||
|
||||
<!-- ===== Context menu ===== -->
|
||||
<GroupBox x:Name="groupContextMenu" Header="Context menu">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Label x:Name="lblAdminRights" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center" Padding="0"/>
|
||||
<Button x:Name="btnInstallCM" Grid.Row="0" Grid.Column="1" MinWidth="88" Height="26" Margin="6,0,0,0"
|
||||
Click="InstallContextMenu_Click"/>
|
||||
<Button x:Name="btnUninstallCM" Grid.Row="0" Grid.Column="2" MinWidth="88" Height="26" Margin="8,0,0,0"
|
||||
Click="UninstallContextMenu_Click"/>
|
||||
|
||||
<CheckBox x:Name="chkIgnoreOutputCM" Grid.Row="1" Grid.ColumnSpan="3" Margin="0,14,0,0"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
</DockPanel>
|
||||
</Window>
|
||||
@@ -0,0 +1,341 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using APKToolGUI.Controls;
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Utils;
|
||||
using Ookii.Dialogs.WinForms;
|
||||
using Lang = APKToolGUI.Languages.Language;
|
||||
using WinForms = System.Windows.Forms;
|
||||
|
||||
namespace APKToolGUI.Forms
|
||||
{
|
||||
/// <summary>
|
||||
/// WPF replacement for the former WinForms <c>FormSettings</c>. Behaviour is kept
|
||||
/// identical: settings are loaded into the controls on open and written back on OK
|
||||
/// (the old form used live two-way data bindings; a modal dialog makes load/save on
|
||||
/// OK equivalent), the language list is discovered from embedded satellite resources,
|
||||
/// and a restart is offered when the language or theme changes.
|
||||
/// </summary>
|
||||
public partial class SettingsWindow : Window
|
||||
{
|
||||
// Captured at load to detect changes that require a restart / apktool refresh.
|
||||
private string currentCulture;
|
||||
private int currentTheme;
|
||||
private bool currentUseApktoolChk;
|
||||
private string currentApktoolPath;
|
||||
|
||||
/// <summary>Language list entry: a display caption plus the stored culture value.</summary>
|
||||
private sealed class LanguageItem
|
||||
{
|
||||
public string Display { get; }
|
||||
public string Culture { get; } // "Auto", "" (English) or a culture name
|
||||
public LanguageItem(string display, string culture) { Display = display; Culture = culture; }
|
||||
public override string ToString() => Display;
|
||||
}
|
||||
|
||||
public SettingsWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
Theme theme = (Theme)Settings.Default.Theme;
|
||||
WpfTheme.Apply(this, Program.IsDarkTheme());
|
||||
NativeDarkMode.ApplyTheme(this, theme);
|
||||
|
||||
ApplyLocalizedText();
|
||||
LoadFromSettings();
|
||||
PopulateLanguages();
|
||||
|
||||
if (!AdminUtils.IsAdministrator())
|
||||
{
|
||||
SetShield(btnInstallCM);
|
||||
SetShield(btnUninstallCM);
|
||||
}
|
||||
}
|
||||
|
||||
#region Localization
|
||||
|
||||
private void ApplyLocalizedText()
|
||||
{
|
||||
var rm = Lang.ResourceManager;
|
||||
|
||||
Title = Lang.Settings;
|
||||
groupGeneral.Header = rm.GetString("SettingsGeneral");
|
||||
groupLanguage.Header = rm.GetString("SettingsLanguage");
|
||||
groupContextMenu.Header = rm.GetString("SettingsContextMenu");
|
||||
|
||||
chkCheckUpdate.Content = rm.GetString("SettingsCheckUpdate");
|
||||
chkClearLog.Content = rm.GetString("SettingsClearLog");
|
||||
chkPlaySound.Content = rm.GetString("SettingsPlaySound");
|
||||
chkCustomTemp.Content = rm.GetString("SettingsCustomTemp");
|
||||
chkCustomJava.Content = rm.GetString("SettingsCustomJava");
|
||||
chkCustomJvmArgs.Content = rm.GetString("SettingsCustomJvmArgs");
|
||||
chkUtf8.Content = rm.GetString("SettingsUtf8");
|
||||
lblTempNote.Text = rm.GetString("SettingsTempNote");
|
||||
chkCustomApktool.Content = rm.GetString("SettingsCustomApktool");
|
||||
lblTheme.Content = rm.GetString("SettingsTheme");
|
||||
chkDebug.Content = Lang.DebugMode;
|
||||
chkIgnoreOutputCM.Content = rm.GetString("SettingsIgnoreOutputCM");
|
||||
|
||||
lblAdminRights.Content = rm.GetString("SettingsAdminRights");
|
||||
btnInstallCM.Content = rm.GetString("SettingsInstall");
|
||||
btnUninstallCM.Content = rm.GetString("SettingsUninstall");
|
||||
|
||||
btnOK.Content = rm.GetString("AboutOK");
|
||||
btnCancel.Content = rm.GetString("SettingsCancel");
|
||||
|
||||
cboTheme.Items.Add(rm.GetString("ThemeAuto"));
|
||||
cboTheme.Items.Add(rm.GetString("ThemeLight"));
|
||||
cboTheme.Items.Add(rm.GetString("ThemeDark"));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Load / Save
|
||||
|
||||
private void LoadFromSettings()
|
||||
{
|
||||
var s = Settings.Default;
|
||||
|
||||
chkClearLog.IsChecked = s.ClearLogBeforeAction;
|
||||
chkPlaySound.IsChecked = s.PlaySoundWhenDone;
|
||||
chkCheckUpdate.IsChecked = s.CheckForUpdateAtStartup;
|
||||
chkCustomTemp.IsChecked = s.UseCustomTempDir;
|
||||
txtTempDir.Text = s.TempDir;
|
||||
chkCustomJava.IsChecked = s.UseCustomJavaExe;
|
||||
txtJavaExe.Text = s.JavaExe;
|
||||
chkCustomJvmArgs.IsChecked = s.UseCustomJVMArgs;
|
||||
txtJvmArgs.Text = s.CustomJVMArgs;
|
||||
chkUtf8.IsChecked = s.Utf8FilenameSupport;
|
||||
chkDebug.IsChecked = s.DebugMode;
|
||||
chkCustomApktool.IsChecked = s.UseCustomApktool;
|
||||
txtApktoolPath.Text = s.ApktoolPath;
|
||||
chkIgnoreOutputCM.IsChecked = s.IgnoreOutputDirContextMenu;
|
||||
|
||||
int t = s.Theme;
|
||||
if (t < 0 || t >= cboTheme.Items.Count) t = 0;
|
||||
cboTheme.SelectedIndex = t;
|
||||
|
||||
currentTheme = t;
|
||||
currentUseApktoolChk = chkCustomApktool.IsChecked == true;
|
||||
currentApktoolPath = txtApktoolPath.Text;
|
||||
}
|
||||
|
||||
private void SaveToSettings()
|
||||
{
|
||||
try
|
||||
{
|
||||
var s = Settings.Default;
|
||||
|
||||
s.ClearLogBeforeAction = chkClearLog.IsChecked == true;
|
||||
s.PlaySoundWhenDone = chkPlaySound.IsChecked == true;
|
||||
s.CheckForUpdateAtStartup = chkCheckUpdate.IsChecked == true;
|
||||
s.UseCustomTempDir = chkCustomTemp.IsChecked == true;
|
||||
s.TempDir = txtTempDir.Text;
|
||||
s.UseCustomJavaExe = chkCustomJava.IsChecked == true;
|
||||
s.JavaExe = txtJavaExe.Text;
|
||||
s.UseCustomJVMArgs = chkCustomJvmArgs.IsChecked == true;
|
||||
s.CustomJVMArgs = txtJvmArgs.Text;
|
||||
s.Utf8FilenameSupport = chkUtf8.IsChecked == true;
|
||||
s.DebugMode = chkDebug.IsChecked == true;
|
||||
s.UseCustomApktool = chkCustomApktool.IsChecked == true;
|
||||
s.ApktoolPath = txtApktoolPath.Text;
|
||||
s.IgnoreOutputDirContextMenu = chkIgnoreOutputCM.IsChecked == true;
|
||||
|
||||
string newCulture = (cboLanguage.SelectedItem as LanguageItem)?.Culture ?? currentCulture;
|
||||
s.Culture = newCulture;
|
||||
s.Theme = cboTheme.SelectedIndex;
|
||||
s.Save();
|
||||
|
||||
bool languageChanged = newCulture != currentCulture;
|
||||
bool themeChanged = cboTheme.SelectedIndex != currentTheme;
|
||||
if (languageChanged || themeChanged)
|
||||
{
|
||||
if (WinForms.MessageBox.Show(Lang.RestartApplicationPrompt, WinForms.Application.ProductName,
|
||||
WinForms.MessageBoxButtons.YesNo, WinForms.MessageBoxIcon.Question) == WinForms.DialogResult.Yes)
|
||||
{
|
||||
// This is a WPF app (no WinForms message loop), so WinForms.Application.Restart()
|
||||
// would start a new instance but never shut this one down. Do it explicitly.
|
||||
Process.Start(WinForms.Application.ExecutablePath);
|
||||
System.Windows.Application.Current.Shutdown();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (currentUseApktoolChk != (chkCustomApktool.IsChecked == true) || currentApktoolPath != txtApktoolPath.Text)
|
||||
MainWindow.Instance?.SetApktoolPath();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.e(ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Language list
|
||||
|
||||
private void PopulateLanguages()
|
||||
{
|
||||
string sysLang = Lang.SystemLanguage;
|
||||
string culture = Settings.Default.Culture;
|
||||
currentCulture = culture;
|
||||
|
||||
cboLanguage.Items.Add(new LanguageItem(sysLang, "Auto"));
|
||||
cboLanguage.Items.Add(new LanguageItem(CultureInfo.GetCultureInfo("en").NativeName, ""));
|
||||
|
||||
// Discover the languages we ship by scanning the embedded satellite resources
|
||||
// (e.g. "APKToolGUI.de.resources.dll" -> "de").
|
||||
foreach (string resourceName in Assembly.GetExecutingAssembly().GetManifestResourceNames())
|
||||
{
|
||||
if (!resourceName.EndsWith(".resources.dll", StringComparison.OrdinalIgnoreCase))
|
||||
continue;
|
||||
|
||||
string[] parts = resourceName.Split('.');
|
||||
if (parts.Length < 2) continue;
|
||||
|
||||
try
|
||||
{
|
||||
CultureInfo c = CultureInfo.GetCultureInfo(parts[1]);
|
||||
cboLanguage.Items.Add(new LanguageItem($"{c.DisplayName} [{c.Name}]", c.Name));
|
||||
}
|
||||
catch (CultureNotFoundException) { }
|
||||
}
|
||||
|
||||
// Select the entry matching the stored culture.
|
||||
int select = 1; // default: English
|
||||
if (culture == "Auto")
|
||||
select = 0;
|
||||
else if (!string.IsNullOrEmpty(culture))
|
||||
{
|
||||
for (int i = 0; i < cboLanguage.Items.Count; i++)
|
||||
if (((LanguageItem)cboLanguage.Items[i]).Culture == culture) { select = i; break; }
|
||||
}
|
||||
cboLanguage.SelectedIndex = select;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Buttons / pickers
|
||||
|
||||
private void OK_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
SaveToSettings();
|
||||
Close();
|
||||
}
|
||||
|
||||
private void BrowseJava_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
using (var ofd = new WinForms.OpenFileDialog())
|
||||
{
|
||||
ofd.Filter = string.Format(Lang.FilterJavaExe, "java.exe");
|
||||
if (ofd.ShowDialog() == WinForms.DialogResult.OK)
|
||||
txtJavaExe.Text = Program.GetPortablePath(ofd.FileName);
|
||||
}
|
||||
}
|
||||
|
||||
private void BrowseTemp_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
using (var fbd = new VistaFolderBrowserDialog())
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(txtTempDir.Text))
|
||||
fbd.SelectedPath = txtTempDir.Text;
|
||||
if (fbd.ShowDialog() == WinForms.DialogResult.OK)
|
||||
{
|
||||
txtTempDir.Text = fbd.SelectedPath;
|
||||
|
||||
// Move the working temp folder to the new location, as the old form did.
|
||||
DirectoryUtils.Delete(Program.TEMP_PATH);
|
||||
Program.TEMP_PATH = Program.RandTempDirectory();
|
||||
Directory.CreateDirectory(Program.TEMP_PATH);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void BrowseApktool_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
using (var ofd = new WinForms.OpenFileDialog())
|
||||
{
|
||||
ofd.Filter = string.Format(Lang.FilterApktool, "*.jar");
|
||||
if (ofd.ShowDialog() == WinForms.DialogResult.OK)
|
||||
txtApktoolPath.Text = ofd.FileName;
|
||||
}
|
||||
}
|
||||
|
||||
private void InstallContextMenu_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (WinForms.MessageBox.Show(Lang.DoYouRealyWantToInstallCM, WinForms.Application.ProductName,
|
||||
WinForms.MessageBoxButtons.YesNo, WinForms.MessageBoxIcon.Question) == WinForms.DialogResult.Yes)
|
||||
RunAsAdmin(WinForms.Application.ExecutablePath, "ccm");
|
||||
}
|
||||
|
||||
private void UninstallContextMenu_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (WinForms.MessageBox.Show(Lang.DoYouRealyWantToRemoveCM, WinForms.Application.ProductName,
|
||||
WinForms.MessageBoxButtons.YesNo, WinForms.MessageBoxIcon.Question) == WinForms.DialogResult.Yes)
|
||||
RunAsAdmin(WinForms.Application.ExecutablePath, "rcm");
|
||||
}
|
||||
|
||||
private static void RunAsAdmin(string fileName, string arguments)
|
||||
{
|
||||
var psi = new ProcessStartInfo
|
||||
{
|
||||
FileName = fileName,
|
||||
Arguments = arguments,
|
||||
UseShellExecute = true,
|
||||
Verb = "runas"
|
||||
};
|
||||
try
|
||||
{
|
||||
Process.Start(psi);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
WinForms.MessageBox.Show(ex.Message, WinForms.Application.ProductName,
|
||||
WinForms.MessageBoxButtons.OK, WinForms.MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// WPF equivalent of the old BCM_SETSHIELD: prepends the UAC shield icon to a
|
||||
/// button's caption to signal the action needs elevation.
|
||||
/// </summary>
|
||||
private void SetShield(Button btn)
|
||||
{
|
||||
try
|
||||
{
|
||||
var source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
|
||||
System.Drawing.SystemIcons.Shield.Handle,
|
||||
Int32Rect.Empty,
|
||||
System.Windows.Media.Imaging.BitmapSizeOptions.FromWidthAndHeight(16, 16));
|
||||
|
||||
var panel = new StackPanel { Orientation = Orientation.Horizontal };
|
||||
panel.Children.Add(new Image
|
||||
{
|
||||
Source = source,
|
||||
Width = 16,
|
||||
Height = 16,
|
||||
Margin = new Thickness(0, 0, 6, 0),
|
||||
VerticalAlignment = VerticalAlignment.Center
|
||||
});
|
||||
panel.Children.Add(new TextBlock
|
||||
{
|
||||
Text = btn.Content as string,
|
||||
VerticalAlignment = VerticalAlignment.Center
|
||||
});
|
||||
btn.Content = panel;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Shield is cosmetic; ignore if the icon can't be created.
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
using APKToolGUI.Languages;
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Utils;
|
||||
using Ookii.Dialogs.WinForms;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace APKToolGUI.Handlers
|
||||
{
|
||||
class BaksmaliControlEventHandlers
|
||||
{
|
||||
private static FormMain main;
|
||||
public BaksmaliControlEventHandlers(FormMain Main)
|
||||
{
|
||||
main = Main;
|
||||
}
|
||||
|
||||
internal void baksmaliBrowseOutputBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
VistaFolderBrowserDialog dlg = new VistaFolderBrowserDialog();
|
||||
dlg.ShowNewFolderButton = true;
|
||||
|
||||
if (dlg.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
main.baksmaliBrowseOutputTxtBox.Text = dlg.SelectedPath;
|
||||
}
|
||||
}
|
||||
|
||||
internal void baksmaliBrowseInputDexBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (OpenFileDialog ofd = new OpenFileDialog())
|
||||
{
|
||||
ofd.Filter = "dex|*.dex";
|
||||
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
main.baksmaliBrowseInputDexTxtBox.Text = ofd.FileName;
|
||||
}
|
||||
}
|
||||
|
||||
internal async void decSmaliBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (main.baksmaliUseOutputChkBox.Checked)
|
||||
{
|
||||
if (String.IsNullOrWhiteSpace(main.baksmaliBrowseOutputTxtBox.Text) || !Directory.Exists(main.baksmaliBrowseOutputTxtBox.Text))
|
||||
{
|
||||
main.ShowMessage(Language.ErrorSelectedOutputFolderNotExist, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!File.Exists(main.baksmaliBrowseInputDexTxtBox.Text))
|
||||
{
|
||||
main.ShowMessage(Language.ErrorSelectedFileNotExist, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
await main.Baksmali(Settings.Default.Baksmali_InputDexFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,107 +0,0 @@
|
||||
using APKToolGUI.Languages;
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Utils;
|
||||
using Ookii.Dialogs.WinForms;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
|
||||
namespace APKToolGUI.Handlers
|
||||
{
|
||||
class BuildControlEventHandlers
|
||||
{
|
||||
private static FormMain main;
|
||||
|
||||
public BuildControlEventHandlers(FormMain Main)
|
||||
{
|
||||
main = Main;
|
||||
}
|
||||
|
||||
internal void button_BUILD_BrowseAaptPath_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (OpenFileDialog ofd = new OpenFileDialog())
|
||||
{
|
||||
ofd.Filter = Language.ExecutableFile + "|*.exe";
|
||||
if (!String.IsNullOrWhiteSpace(main.textBox_BUILD_AaptPath.Text))
|
||||
{
|
||||
ofd.InitialDirectory = Path.GetDirectoryName(main.textBox_BUILD_AaptPath.Text);
|
||||
ofd.FileName = Path.GetFileName(main.textBox_BUILD_AaptPath.Text);
|
||||
}
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
main.textBox_BUILD_AaptPath.Text = ofd.FileName;
|
||||
}
|
||||
}
|
||||
|
||||
internal void button_BUILD_BrowseFrameDir_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (VistaFolderBrowserDialog fbd = new VistaFolderBrowserDialog())
|
||||
{
|
||||
if (!String.IsNullOrWhiteSpace(main.textBox_BUILD_FrameDir.Text))
|
||||
fbd.SelectedPath = main.textBox_BUILD_FrameDir.Text;
|
||||
if (fbd.ShowDialog() == DialogResult.OK)
|
||||
main.textBox_BUILD_FrameDir.Text = fbd.SelectedPath;
|
||||
}
|
||||
}
|
||||
|
||||
internal void button_BUILD_BrowseOutputAppPath_Click(object sender, EventArgs e)
|
||||
{
|
||||
VistaFolderBrowserDialog dlg = new VistaFolderBrowserDialog();
|
||||
dlg.ShowNewFolderButton = true;
|
||||
|
||||
if (dlg.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
main.textBox_BUILD_OutputAppPath.Text = dlg.SelectedPath;
|
||||
}
|
||||
}
|
||||
|
||||
internal void button_BUILD_BrowseInputProjectDir_Click(object sender, EventArgs e)
|
||||
{
|
||||
VistaFolderBrowserDialog dlg = new VistaFolderBrowserDialog();
|
||||
dlg.ShowNewFolderButton = true;
|
||||
|
||||
if (dlg.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
main.textBox_BUILD_InputProjectDir.Text = dlg.SelectedPath;
|
||||
}
|
||||
}
|
||||
|
||||
internal async void button_BUILD_Build_Click(object sender, EventArgs e)
|
||||
{
|
||||
string decApkDir = main.textBox_BUILD_InputProjectDir.Text;
|
||||
if (Directory.Exists(main.textBox_BUILD_InputProjectDir.Text))
|
||||
{
|
||||
await main.Build(decApkDir);
|
||||
}
|
||||
else
|
||||
MessageBox.Show(Language.WarningDecodingFolderNotSelected, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
|
||||
internal void comApkOpenDir_Click(object sender, EventArgs e)
|
||||
{
|
||||
string decApkDir = main.textBox_BUILD_InputProjectDir.Text;
|
||||
|
||||
string outputFile = decApkDir + " compiled.apk";
|
||||
if (Settings.Default.Build_SignAfterBuild)
|
||||
outputFile = decApkDir + " signed.apk";
|
||||
if (Settings.Default.Build_UseOutputAppPath)
|
||||
{
|
||||
outputFile = Path.Combine(Settings.Default.Build_OutputAppPath, Path.GetFileName(decApkDir)) + ".apk";
|
||||
if (Settings.Default.Build_SignAfterBuild)
|
||||
outputFile = Path.Combine(Settings.Default.Build_OutputAppPath, Path.GetFileName(decApkDir)) + "signed.apk";
|
||||
}
|
||||
|
||||
if (File.Exists(outputFile))
|
||||
Process.Start("explorer.exe", string.Format("/select,\"{0}\"", outputFile));
|
||||
else
|
||||
{
|
||||
main.ToLog(ApktoolEventType.Error, Language.ErrorSelectedFileNotExist);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,105 +0,0 @@
|
||||
using APKToolGUI.Languages;
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Utils;
|
||||
using Ookii.Dialogs.WinForms;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace APKToolGUI.Handlers
|
||||
{
|
||||
class DecodeControlEventHandlers
|
||||
{
|
||||
private static FormMain main;
|
||||
public DecodeControlEventHandlers(FormMain Main)
|
||||
{
|
||||
main = Main;
|
||||
}
|
||||
|
||||
internal void button_DECODE_BrowseFrameDir_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (VistaFolderBrowserDialog fbd = new VistaFolderBrowserDialog())
|
||||
{
|
||||
if (!String.IsNullOrWhiteSpace(main.textBox_DECODE_FrameDir.Text))
|
||||
fbd.SelectedPath = main.textBox_DECODE_FrameDir.Text;
|
||||
if (fbd.ShowDialog() == DialogResult.OK)
|
||||
main.textBox_DECODE_FrameDir.Text = fbd.SelectedPath;
|
||||
}
|
||||
}
|
||||
|
||||
internal void button_DECODE_BrowseOutputDirectory_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (VistaFolderBrowserDialog fbd = new VistaFolderBrowserDialog())
|
||||
{
|
||||
if (!String.IsNullOrWhiteSpace(main.textBox_DECODE_OutputDirectory.Text))
|
||||
fbd.SelectedPath = main.textBox_DECODE_OutputDirectory.Text;
|
||||
else
|
||||
if (!String.IsNullOrWhiteSpace(main.textBox_DECODE_InputAppPath.Text))
|
||||
fbd.SelectedPath = Path.GetDirectoryName(main.textBox_DECODE_InputAppPath.Text);
|
||||
if (fbd.ShowDialog() == DialogResult.OK)
|
||||
main.textBox_DECODE_OutputDirectory.Text = fbd.SelectedPath;
|
||||
}
|
||||
}
|
||||
|
||||
internal void button_DECODE_BrowseInputAppPath_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (OpenFileDialog ofd = new OpenFileDialog())
|
||||
{
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
main.textBox_DECODE_InputAppPath.Text = ofd.FileName;
|
||||
main.GetApkInfo(ofd.FileName);
|
||||
if (main.checkBox_DECODE_OutputDirectory.Checked)
|
||||
{
|
||||
main.textBox_DECODE_OutputDirectory.Text = Path.Combine(Path.GetDirectoryName(main.textBox_DECODE_InputAppPath.Text), Path.GetFileNameWithoutExtension(main.textBox_DECODE_InputAppPath.Text));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal async void button_DECODE_Decode_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (File.Exists(main.textBox_DECODE_InputAppPath.Text))
|
||||
{
|
||||
if (main.checkBox_DECODE_UseFramework.Checked && !Directory.Exists(main.textBox_DECODE_FrameDir.Text))
|
||||
{
|
||||
main.ShowMessage(Language.DecodeSelectedFrameworkNotExist, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
if (main.checkBox_DECODE_OutputDirectory.Checked)
|
||||
{
|
||||
if (String.IsNullOrWhiteSpace(main.textBox_DECODE_OutputDirectory.Text))
|
||||
{
|
||||
main.ShowMessage(Language.DecodeDirNotSelected, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
else
|
||||
if (!PathUtils.IsValidPath(main.textBox_DECODE_OutputDirectory.Text))
|
||||
{
|
||||
main.ShowMessage(Language.DecodeCouldNotCreate, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
await main.Decompile(main.textBox_DECODE_InputAppPath.Text);
|
||||
}
|
||||
else
|
||||
MessageBox.Show(Language.WarningFileForDecodingNotSelected, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
|
||||
internal void decApkOpenDirBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (Directory.Exists(main.textBox_BUILD_InputProjectDir.Text))
|
||||
Process.Start("explorer.exe", main.textBox_BUILD_InputProjectDir.Text);
|
||||
else
|
||||
{
|
||||
main.ToLog(ApktoolEventType.Error, Language.ErrorSelectedFileNotExist);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,199 +0,0 @@
|
||||
using APKToolGUI.Languages;
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Utils;
|
||||
using SaveToGameWpf.Logic.Utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
namespace APKToolGUI.Handlers
|
||||
{
|
||||
class DragDropHandlers
|
||||
{
|
||||
private static FormMain main;
|
||||
public DragDropHandlers(FormMain Main)
|
||||
{
|
||||
main = Main;
|
||||
|
||||
//Decode
|
||||
DragEventHandler decEventHandler = new DragEventHandler((sender, e) => { DropApkToDec(e); });
|
||||
Register(main.decPanel, ".apk", decEventHandler);
|
||||
Register(main.textBox_DECODE_InputAppPath, ".apk", decEventHandler, main.decPanel);
|
||||
Register(main.button_DECODE_Decode, ".apk", decEventHandler, main.decPanel);
|
||||
|
||||
DragEventHandler comEventHandler = new DragEventHandler((sender, e) => { DropDirToCom(e); });
|
||||
Register(main.comPanel, "", comEventHandler);
|
||||
Register(main.textBox_BUILD_InputProjectDir, "", comEventHandler, main.comPanel);
|
||||
Register(main.button_BUILD_Build, "", comEventHandler, main.comPanel);
|
||||
|
||||
DragEventHandler alignEventHandler = new DragEventHandler((sender, e) => { DropApkToAlign(e); });
|
||||
Register(main.zipalignPanel, ".apk", alignEventHandler);
|
||||
Register(main.textBox_ZIPALIGN_InputFile, ".apk", alignEventHandler, main.zipalignPanel);
|
||||
Register(main.button_ZIPALIGN_Align, ".apk", alignEventHandler, main.zipalignPanel);
|
||||
|
||||
DragEventHandler signEventHandler = new DragEventHandler((sender, e) => { DropApkToSign(e); });
|
||||
Register(main.signPanel, ".apk", signEventHandler);
|
||||
Register(main.textBox_SIGN_InputFile, ".apk", signEventHandler, main.signPanel);
|
||||
Register(main.button_SIGN_Sign, ".apk", signEventHandler, main.signPanel);
|
||||
|
||||
DragEventHandler baksmaliEventHandler = new DragEventHandler((sender, e) => { DropDexToBaksmali(e); });
|
||||
Register(main.bakSmaliGroupBox, ".dex", baksmaliEventHandler);
|
||||
main.bakSmaliGroupBox.AllowDrop = true;
|
||||
|
||||
DragEventHandler smaliEventHandler = new DragEventHandler((sender, e) => { DropDirToSmali(e); });
|
||||
Register(main.smaliGroupBox, "", smaliEventHandler);
|
||||
main.smaliGroupBox.AllowDrop = true;
|
||||
|
||||
DragEventHandler apkInfoEventHandler = new DragEventHandler((sender, e) => { DropApkToGetInfo(e); });
|
||||
Register(main.tabPageApkInfo, ".apk", apkInfoEventHandler);
|
||||
Register(main.fileTxtBox, ".apk", apkInfoEventHandler);
|
||||
}
|
||||
|
||||
void Register(Control ctrl, string extension, DragEventHandler dragHandler, Control extCtrl = null)
|
||||
{
|
||||
if (extCtrl == null)
|
||||
extCtrl = ctrl;
|
||||
ctrl.DragLeave += new EventHandler((sender, e) => extCtrl.BackColor = Color.White);
|
||||
ctrl.DragEnter += new DragEventHandler((sender, e) => e.CheckDragEnter(extension));
|
||||
ctrl.DragOver += new DragEventHandler((sender, e) => { if (e.CheckDragOver(extension)) extCtrl.BackColor = Color.LightGreen; });
|
||||
ctrl.DragDrop += dragHandler;
|
||||
}
|
||||
|
||||
private async void DropApkToDec(DragEventArgs e)
|
||||
{
|
||||
string apkFile = null;
|
||||
if (e.DropOneByEnd(".apk", file => apkFile = file))
|
||||
{
|
||||
main.GetApkInfo(apkFile);
|
||||
main.textBox_DECODE_InputAppPath.Text = apkFile;
|
||||
main.decPanel.BackColor = Color.White;
|
||||
|
||||
await main.Decompile(apkFile);
|
||||
}
|
||||
}
|
||||
|
||||
private async void DropDirToCom(DragEventArgs e)
|
||||
{
|
||||
string folder = null;
|
||||
if (e.DropOneByEnd("", file => folder = file))
|
||||
{
|
||||
if (File.Exists(Path.Combine(folder, "AndroidManifest.xml")))
|
||||
{
|
||||
main.textBox_BUILD_InputProjectDir.Text = folder;
|
||||
main.comPanel.BackColor = Color.White;
|
||||
await main.Build(folder);
|
||||
}
|
||||
else
|
||||
main.ToLog(ApktoolEventType.Error, Language.ErrorNotAnApk);
|
||||
}
|
||||
}
|
||||
|
||||
private async void DropApkToAlign(DragEventArgs e)
|
||||
{
|
||||
string apkFile = null;
|
||||
if (e.DropOneByEnd(".apk", file => apkFile = file))
|
||||
{
|
||||
main.textBox_ZIPALIGN_InputFile.Text = apkFile;
|
||||
main.zipalignPanel.BackColor = Color.White;
|
||||
|
||||
try
|
||||
{
|
||||
main.Running();
|
||||
|
||||
await Task.Factory.StartNew(() =>
|
||||
{
|
||||
string outputDir = apkFile;
|
||||
if (Settings.Default.Zipalign_UseOutputDir)
|
||||
outputDir = Path.Combine(Settings.Default.Zipalign_OutputDir, Path.GetFileName(apkFile));
|
||||
|
||||
if (!Settings.Default.Zipalign_OverwriteOutputFile)
|
||||
outputDir = PathUtils.GetDirectoryNameWithoutExtension(outputDir) + " aligned.apk";
|
||||
|
||||
if (main.Align(apkFile, outputDir) == 0)
|
||||
main.ToLog(ApktoolEventType.Information, String.Format(Language.ZipalignFileSavedTo, outputDir));
|
||||
else
|
||||
main.ToLog(ApktoolEventType.Error, Language.ErrorZipalign);
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
main.ToLog(ApktoolEventType.Error, ex.Message);
|
||||
}
|
||||
main.Done();
|
||||
}
|
||||
}
|
||||
private async void DropApkToSign(DragEventArgs e)
|
||||
{
|
||||
string apkFile = null;
|
||||
if (e.DropOneByEnd(".apk", file => apkFile = file))
|
||||
{
|
||||
main.textBox_SIGN_InputFile.Text = apkFile;
|
||||
main.signPanel.BackColor = Color.White;
|
||||
|
||||
try
|
||||
{
|
||||
main.Running();
|
||||
|
||||
await Task.Factory.StartNew(() =>
|
||||
{
|
||||
string inputFile = apkFile;
|
||||
string outputDir = apkFile;
|
||||
if (Settings.Default.Zipalign_UseOutputDir)
|
||||
outputDir = Path.Combine(Settings.Default.Sign_OutputDir, Path.GetFileName(inputFile));
|
||||
|
||||
if (main.Sign(inputFile, outputDir) == 0)
|
||||
if (Settings.Default.Zipalign_UseOutputDir)
|
||||
main.ToLog(ApktoolEventType.Information, String.Format(Language.SignSuccessfullyCompleted, inputFile));
|
||||
else
|
||||
main.ToLog(ApktoolEventType.Information, String.Format(Language.SignSuccessfullyCompleted, outputDir));
|
||||
else
|
||||
main.ToLog(ApktoolEventType.Error, String.Format(Language.ErrorSigning, outputDir));
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
main.ToLog(ApktoolEventType.Error, ex.Message);
|
||||
}
|
||||
main.Done();
|
||||
}
|
||||
}
|
||||
|
||||
private async void DropDexToBaksmali(DragEventArgs e)
|
||||
{
|
||||
string apkFile = null;
|
||||
if (e.DropOneByEnd(".dex", file => apkFile = file))
|
||||
{
|
||||
main.baksmaliBrowseInputDexTxtBox.Text = apkFile;
|
||||
main.bakSmaliGroupBox.BackColor = Color.White;
|
||||
await main.Baksmali(apkFile);
|
||||
}
|
||||
}
|
||||
|
||||
private async void DropDirToSmali(DragEventArgs e)
|
||||
{
|
||||
string dir = null;
|
||||
if (e.DropOneByEnd("", file => dir = file))
|
||||
{
|
||||
main.smaliBrowseInputDirTxtBox.Text = dir;
|
||||
main.smaliGroupBox.BackColor = Color.White;
|
||||
await main.Smali(dir + ".dex");
|
||||
}
|
||||
}
|
||||
|
||||
private void DropApkToGetInfo(DragEventArgs e)
|
||||
{
|
||||
string apkFile = null;
|
||||
if (e.DropOneByEnd(".apk", file => apkFile = file))
|
||||
{
|
||||
main.smaliBrowseInputDirTxtBox.Text = apkFile;
|
||||
main.tabPageApkInfo.BackColor = Color.White;
|
||||
main.GetApkInfo(apkFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,111 +0,0 @@
|
||||
using APKToolGUI.Languages;
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Utils;
|
||||
using Ookii.Dialogs.WinForms;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace APKToolGUI.Handlers
|
||||
{
|
||||
class FrameworkControlEventHandlers
|
||||
{
|
||||
private static FormMain main;
|
||||
|
||||
public FrameworkControlEventHandlers(FormMain Main)
|
||||
{
|
||||
main = Main;
|
||||
}
|
||||
|
||||
internal void button_IF_BrowseFrameDir_Click(object sender, EventArgs e)
|
||||
{
|
||||
main.clearFwBeforeDecodeChkBox.Checked = false;
|
||||
VistaFolderBrowserDialog dlg = new VistaFolderBrowserDialog();
|
||||
dlg.ShowNewFolderButton = true;
|
||||
|
||||
if (dlg.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
main.textBox_IF_FrameDir.Text = dlg.SelectedPath;
|
||||
}
|
||||
}
|
||||
|
||||
internal void button_IF_BrowseInputFramePath_Click(object sender, EventArgs e)
|
||||
{
|
||||
main.clearFwBeforeDecodeChkBox.Checked = false;
|
||||
using (OpenFileDialog ofd = new OpenFileDialog())
|
||||
{
|
||||
if (File.Exists(main.textBox_IF_InputFramePath.Text))
|
||||
{
|
||||
ofd.InitialDirectory = Path.GetDirectoryName(main.textBox_IF_InputFramePath.Text);
|
||||
ofd.FileName = Path.GetFileNameWithoutExtension(main.textBox_IF_InputFramePath.Text);
|
||||
}
|
||||
ofd.Filter = "apk|*.apk";
|
||||
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
main.textBox_IF_InputFramePath.Text = ofd.FileName;
|
||||
}
|
||||
}
|
||||
|
||||
internal async void button_IF_InstallFramework_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (main.checkBox_IF_FramePath.Checked)
|
||||
{
|
||||
if (String.IsNullOrWhiteSpace(main.textBox_IF_FrameDir.Text) || !Directory.Exists(main.textBox_IF_FrameDir.Text))
|
||||
{
|
||||
main.ShowMessage(Language.ErrorSelectingFrameworkDirectory, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (main.checkBox_IF_Tag.Checked && String.IsNullOrWhiteSpace(main.textBox_IF_Tag.Text))
|
||||
{
|
||||
main.ShowMessage(Language.ErrorEnteringFrameworkTag, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
if (!File.Exists(main.textBox_IF_InputFramePath.Text))
|
||||
{
|
||||
main.ShowMessage(Language.ErrorSelectingFrameworkFile, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
main.Running();
|
||||
main.ToLog(ApktoolEventType.Information, Language.InstallingFramework + " " + Path.GetFileName(main.textBox_IF_InputFramePath.Text));
|
||||
main.ToStatus(String.Format(Language.InstallingFramework + " \"{0}\"...", Path.GetFileName(main.textBox_IF_InputFramePath.Text)), Resources.waiting);
|
||||
|
||||
await Task.Factory.StartNew(() =>
|
||||
{
|
||||
if (main.apktool.InstallFramework() == 0)
|
||||
main.ToLog(ApktoolEventType.Information, Language.FrameworkInstalled);
|
||||
else
|
||||
main.ToLog(ApktoolEventType.Error, Language.FrameworkInstallationNotStarted);
|
||||
});
|
||||
main.Done();
|
||||
}
|
||||
|
||||
internal async void clearFwBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
await Task.Factory.StartNew(() =>
|
||||
{
|
||||
if (main.ClearFramework() == 0)
|
||||
main.ToLog(ApktoolEventType.Information, Language.Done);
|
||||
});
|
||||
|
||||
main.Done();
|
||||
}
|
||||
|
||||
internal void openFwFolderBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (main.checkBox_IF_FramePath.Checked && Directory.Exists(main.textBox_IF_FrameDir.Text))
|
||||
Process.Start("explorer.exe", main.textBox_IF_FrameDir.Text);
|
||||
else if (Directory.Exists(Program.FRAMEWORK_DIR))
|
||||
Process.Start("explorer.exe", Program.FRAMEWORK_DIR);
|
||||
else
|
||||
main.ToLog(ApktoolEventType.Error, Language.ErrorSelectedFolderNotExist);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,158 +0,0 @@
|
||||
using APKToolGUI.Languages;
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Utils;
|
||||
using Ookii.Dialogs.WinForms;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
|
||||
namespace APKToolGUI.Handlers
|
||||
{
|
||||
class SignControlEventHandlers
|
||||
{
|
||||
private static FormMain main;
|
||||
|
||||
public SignControlEventHandlers(FormMain Main)
|
||||
{
|
||||
main = Main;
|
||||
}
|
||||
|
||||
internal void button_SIGN_BrowsePublicKey_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (OpenFileDialog ofd = new OpenFileDialog())
|
||||
{
|
||||
ofd.Filter = "*.pem|*.pem";
|
||||
if (File.Exists(main.textBox_SIGN_PublicKey.Text))
|
||||
{
|
||||
ofd.InitialDirectory = Path.GetDirectoryName(main.textBox_SIGN_PublicKey.Text);
|
||||
ofd.FileName = Path.GetFileNameWithoutExtension(main.textBox_SIGN_PublicKey.Text);
|
||||
}
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
main.textBox_SIGN_PublicKey.Text = Program.GetPortablePath(ofd.FileName);
|
||||
}
|
||||
}
|
||||
|
||||
internal void button_SIGN_BrowsePrivateKey_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (OpenFileDialog ofd = new OpenFileDialog())
|
||||
{
|
||||
ofd.Filter = "*.pk8|*.pk8";
|
||||
if (File.Exists(main.textBox_SIGN_PrivateKey.Text))
|
||||
{
|
||||
ofd.InitialDirectory = Path.GetDirectoryName(main.textBox_SIGN_PrivateKey.Text);
|
||||
ofd.FileName = Path.GetFileNameWithoutExtension(main.textBox_SIGN_PrivateKey.Text);
|
||||
}
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
main.textBox_SIGN_PrivateKey.Text = Program.GetPortablePath(ofd.FileName);
|
||||
}
|
||||
}
|
||||
|
||||
internal void button_SIGN_BrowseOutputFile_Click(object sender, EventArgs e)
|
||||
{
|
||||
VistaFolderBrowserDialog dlg = new VistaFolderBrowserDialog();
|
||||
dlg.ShowNewFolderButton = true;
|
||||
|
||||
if (dlg.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
main.textBox_SIGN_OutputFile.Text = dlg.SelectedPath;
|
||||
}
|
||||
}
|
||||
|
||||
internal void button_SIGN_BrowseInputFile_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (OpenFileDialog ofd = new OpenFileDialog())
|
||||
{
|
||||
ofd.Filter = "(*.apk;*.jar;*.zip)|*.apk;*.jar;*.zip";
|
||||
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
main.textBox_SIGN_InputFile.Text = ofd.FileName;
|
||||
main.GetApkInfo(ofd.FileName);
|
||||
main.textBox_SIGN_OutputFile.Text =
|
||||
String.Format("{0}{1}{2}_signed{3}",
|
||||
Path.GetDirectoryName(main.textBox_SIGN_InputFile.Text),
|
||||
Path.DirectorySeparatorChar,
|
||||
Path.GetFileNameWithoutExtension(main.textBox_SIGN_InputFile.Text),
|
||||
Path.GetExtension(main.textBox_SIGN_InputFile.Text));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal async void button_SIGN_Sign_Click(object sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
main.Save();
|
||||
if (!File.Exists(Settings.Default.Sign_PublicKey))
|
||||
{
|
||||
main.ShowMessage(Language.SignPublicKeyNotFound, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
if (!File.Exists(Settings.Default.Sign_PrivateKey))
|
||||
{
|
||||
main.ShowMessage(Language.SignPrivateKeyNotFound, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
if (!File.Exists(main.textBox_SIGN_InputFile.Text))
|
||||
{
|
||||
main.ShowMessage(Language.SignInputFileNotFound, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
main.Running();
|
||||
|
||||
await Task.Factory.StartNew(() =>
|
||||
{
|
||||
string inputFile = Settings.Default.Sign_InputFile;
|
||||
string outputDir = inputFile;
|
||||
if (Settings.Default.Zipalign_UseOutputDir)
|
||||
outputDir = Path.Combine(Settings.Default.Sign_OutputDir, Path.GetFileName(inputFile));
|
||||
|
||||
if (main.Sign(inputFile, outputDir) == 0)
|
||||
if (Settings.Default.Zipalign_UseOutputDir)
|
||||
main.ToLog(ApktoolEventType.Information, String.Format(Language.SignSuccessfullyCompleted, inputFile));
|
||||
else
|
||||
main.ToLog(ApktoolEventType.Information, String.Format(Language.SignSuccessfullyCompleted, outputDir));
|
||||
else
|
||||
main.ToLog(ApktoolEventType.Error, String.Format(Language.ErrorSigning, outputDir));
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
main.ToLog(ApktoolEventType.Error, ex.Message);
|
||||
}
|
||||
main.Done();
|
||||
}
|
||||
|
||||
internal void selectKeyStoreFileBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (OpenFileDialog ofd = new OpenFileDialog())
|
||||
{
|
||||
ofd.Filter = "Keystore|*.keystore;*.jks";
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
main.keyStoreFileTxtBox.Text = ofd.FileName;
|
||||
}
|
||||
}
|
||||
|
||||
internal void signApkOpenDirBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
string inputFile = Settings.Default.Sign_InputFile;
|
||||
string outputFile = inputFile;
|
||||
if (Settings.Default.Zipalign_UseOutputDir)
|
||||
outputFile = Path.Combine(Settings.Default.Sign_OutputDir, Path.GetFileName(inputFile));
|
||||
|
||||
if (File.Exists(outputFile))
|
||||
Process.Start("explorer.exe", string.Format("/select,\"{0}\"", outputFile));
|
||||
else
|
||||
{
|
||||
main.ToLog(ApktoolEventType.Error, Language.ErrorSelectedFileNotExist);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
using APKToolGUI.Languages;
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Utils;
|
||||
using Ookii.Dialogs.WinForms;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace APKToolGUI.Handlers
|
||||
{
|
||||
class SmaliControlEventHandlers
|
||||
{
|
||||
private static FormMain main;
|
||||
public SmaliControlEventHandlers(FormMain Main)
|
||||
{
|
||||
main = Main;
|
||||
}
|
||||
|
||||
internal void smaliBrowseOutputBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
VistaFolderBrowserDialog dlg = new VistaFolderBrowserDialog();
|
||||
dlg.ShowNewFolderButton = true;
|
||||
|
||||
if (dlg.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
main.smaliBrowseOutputTxtBox.Text = dlg.SelectedPath;
|
||||
}
|
||||
}
|
||||
|
||||
internal void smaliBrowseInputDirBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
VistaFolderBrowserDialog dlg = new VistaFolderBrowserDialog();
|
||||
dlg.ShowNewFolderButton = true;
|
||||
|
||||
if (dlg.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
main.smaliBrowseInputDirTxtBox.Text = dlg.SelectedPath;
|
||||
}
|
||||
}
|
||||
|
||||
internal void comSmaliBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (main.smaliUseOutputChkBox.Checked)
|
||||
{
|
||||
if (String.IsNullOrWhiteSpace(main.smaliBrowseOutputTxtBox.Text) || !Directory.Exists(main.smaliBrowseOutputTxtBox.Text))
|
||||
{
|
||||
main.ShowMessage(Language.ErrorSelectedOutputFolderNotExist, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!Directory.Exists(main.smaliBrowseInputDirTxtBox.Text))
|
||||
{
|
||||
main.ShowMessage(Language.ErrorSelectedFileNotExist, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
main.Smali(Settings.Default.Smali_InputDir + ".dex");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,128 +0,0 @@
|
||||
using APKToolGUI.Languages;
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Utils;
|
||||
using Ookii.Dialogs.WinForms;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace APKToolGUI.Handlers
|
||||
{
|
||||
class ZipalignControlEventHandlers
|
||||
{
|
||||
private static FormMain main;
|
||||
|
||||
public ZipalignControlEventHandlers(FormMain Main)
|
||||
{
|
||||
main = Main;
|
||||
CheckAlignSwitch = !Settings.Default.Zipalign_CheckOnly;
|
||||
}
|
||||
|
||||
internal bool CheckAlignSwitch
|
||||
{
|
||||
set
|
||||
{
|
||||
main.checkBox_ZIPALIGN_Recompress.Enabled = value;
|
||||
main.checkBox_ZIPALIGN_OverwriteOutputFile.Enabled = value;
|
||||
}
|
||||
}
|
||||
|
||||
internal void checkBox_ZIPALIGN_CheckAlignment_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
CheckAlignSwitch = !main.checkBox_ZIPALIGN_CheckAlignment.Checked;
|
||||
}
|
||||
|
||||
internal void button_ZIPALIGN_BrowseOutputFile_Click(object sender, EventArgs e)
|
||||
{
|
||||
VistaFolderBrowserDialog dlg = new VistaFolderBrowserDialog();
|
||||
dlg.ShowNewFolderButton = true;
|
||||
|
||||
if (dlg.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
main.textBox_ZIPALIGN_OutputFile.Text = dlg.SelectedPath;
|
||||
}
|
||||
}
|
||||
|
||||
internal void button_ZIPALIGN_BrowseInputFile_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (OpenFileDialog ofd = new OpenFileDialog())
|
||||
{
|
||||
// ofd.Filter = "ZIP archives(*.apk;*.zip;*.jar)|*.apk;*.zip;*.jar";
|
||||
ofd.Filter = Language.ZIPArchives + " (*.apk)|*.apk";
|
||||
if (File.Exists(main.textBox_ZIPALIGN_InputFile.Text))
|
||||
{
|
||||
ofd.InitialDirectory = Path.GetDirectoryName(main.textBox_ZIPALIGN_InputFile.Text);
|
||||
ofd.FileName = Path.GetFileName(main.textBox_ZIPALIGN_InputFile.Text);
|
||||
}
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
main.textBox_ZIPALIGN_InputFile.Text = ofd.FileName;
|
||||
main.GetApkInfo(ofd.FileName);
|
||||
if (!main.checkBox_ZIPALIGN_CheckAlignment.Checked)
|
||||
main.textBox_ZIPALIGN_OutputFile.Text = String.Format("{0}\\{1}_zipaligned{2}",
|
||||
Path.GetDirectoryName(ofd.FileName),
|
||||
Path.GetFileNameWithoutExtension(ofd.FileName),
|
||||
Path.GetExtension(ofd.FileName));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal async void button_ZIPALIGN_Align_Click(object sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!File.Exists(main.textBox_ZIPALIGN_InputFile.Text))
|
||||
{
|
||||
main.ShowMessage(Language.ErrorSelectedFileNotExist, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
await Task.Factory.StartNew(() =>
|
||||
{
|
||||
string inputFile = Settings.Default.Zipalign_InputFile;
|
||||
|
||||
string outputDir = inputFile;
|
||||
if (Settings.Default.Zipalign_UseOutputDir)
|
||||
outputDir = Path.Combine(Settings.Default.Zipalign_OutputDir, Path.GetFileName(inputFile));
|
||||
|
||||
if (!Settings.Default.Zipalign_OverwriteOutputFile)
|
||||
outputDir = PathUtils.GetDirectoryNameWithoutExtension(outputDir) + " aligned.apk";
|
||||
|
||||
if (main.Align(inputFile, outputDir) == 0)
|
||||
main.ToLog(ApktoolEventType.Information, String.Format(Language.ZipalignFileSavedTo, outputDir));
|
||||
else
|
||||
main.ToLog(ApktoolEventType.Error, Language.ErrorZipalign);
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
main.ToLog(ApktoolEventType.Error, ex.Message);
|
||||
}
|
||||
main.Done();
|
||||
}
|
||||
|
||||
internal void alignApkOpenDirBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
string inputFile = Settings.Default.Zipalign_InputFile;
|
||||
|
||||
string outputFile = inputFile;
|
||||
if (Settings.Default.Zipalign_UseOutputDir)
|
||||
outputFile = Path.Combine(Settings.Default.Zipalign_OutputDir, Path.GetFileName(inputFile));
|
||||
|
||||
if (!Settings.Default.Zipalign_OverwriteOutputFile)
|
||||
outputFile = PathUtils.GetDirectoryNameWithoutExtension(outputFile) + " aligned.apk";
|
||||
|
||||
if (File.Exists(outputFile))
|
||||
Process.Start("explorer.exe", string.Format("/select,\"{0}\"", outputFile));
|
||||
else
|
||||
{
|
||||
main.ToLog(ApktoolEventType.Error, Language.ErrorSelectedFileNotExist);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,8 @@
|
||||
using System;
|
||||
using APKToolGUI.Properties;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Java
|
||||
@@ -12,7 +14,7 @@ namespace Java
|
||||
|
||||
public JarProcess(string javaPath, string jarPath)
|
||||
{
|
||||
JavaPath = javaPath.Equals("java") ? "" : javaPath;
|
||||
JavaPath = string.IsNullOrWhiteSpace(javaPath) ? "java" : javaPath;
|
||||
JarPath = jarPath;
|
||||
Initialize();
|
||||
}
|
||||
@@ -20,10 +22,8 @@ namespace Java
|
||||
private void Initialize()
|
||||
{
|
||||
EnableRaisingEvents = true;
|
||||
if (!String.IsNullOrEmpty(JavaPath))
|
||||
StartInfo.FileName = JavaPath;
|
||||
else
|
||||
StartInfo.FileName = "cmd.exe";
|
||||
StartInfo.FileName = JavaPath;
|
||||
StartInfo.StandardOutputEncoding = Encoding.GetEncoding("UTF-8");
|
||||
StartInfo.UseShellExecute = false;
|
||||
StartInfo.RedirectStandardOutput = true;
|
||||
StartInfo.RedirectStandardError = true;
|
||||
@@ -33,16 +33,14 @@ namespace Java
|
||||
public new bool Start(string args)
|
||||
{
|
||||
EnableRaisingEvents = true;
|
||||
if (!String.IsNullOrEmpty(JavaPath))
|
||||
{
|
||||
StartInfo.Arguments = String.Format("-jar \"{0}\" {1}", JarPath, args);
|
||||
Debug.WriteLine(String.Format("-jar \"{0}\" {1}", JarPath, args));
|
||||
}
|
||||
else
|
||||
{
|
||||
StartInfo.Arguments = String.Format("/c \" java -jar \"{0}\" {1} \"", JarPath, args);
|
||||
Debug.WriteLine(String.Format("CMD: java -jar \"{0}\" {1} \"", JarPath, args));
|
||||
}
|
||||
string customArgs = "";
|
||||
|
||||
if (Settings.Default.UseCustomJVMArgs)
|
||||
customArgs = Settings.Default.CustomJVMArgs;
|
||||
|
||||
string jvmArgs = string.IsNullOrWhiteSpace(customArgs) ? string.Empty : customArgs.Trim() + " ";
|
||||
StartInfo.Arguments = String.Format("{0}-jar \"{1}\" {2}", jvmArgs, JarPath, args);
|
||||
Debug.WriteLine(StartInfo.Arguments);
|
||||
return base.Start();
|
||||
}
|
||||
|
||||
@@ -52,17 +50,8 @@ namespace Java
|
||||
{
|
||||
using (Process javaProcess = new Process())
|
||||
{
|
||||
if (!String.IsNullOrEmpty(JavaPath))
|
||||
{
|
||||
javaProcess.StartInfo.FileName = JavaPath;
|
||||
javaProcess.StartInfo.Arguments = String.Format("-jar \"{0}\" {1}", JarPath, args);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
javaProcess.StartInfo.FileName = "cmd.exe";
|
||||
javaProcess.StartInfo.Arguments = String.Format("/c \" java -jar \"{0}\" {1} \"", JarPath, args);
|
||||
}
|
||||
javaProcess.StartInfo.FileName = JavaPath;
|
||||
javaProcess.StartInfo.Arguments = String.Format("-jar \"{0}\" {1}", JarPath, args);
|
||||
javaProcess.StartInfo.CreateNoWindow = true;
|
||||
javaProcess.StartInfo.UseShellExecute = false;
|
||||
javaProcess.StartInfo.RedirectStandardError = true;
|
||||
@@ -88,31 +77,36 @@ namespace Java
|
||||
{
|
||||
using (Process javaProcess = new Process())
|
||||
{
|
||||
if (!String.IsNullOrEmpty(JavaPath))
|
||||
{
|
||||
javaProcess.StartInfo.FileName = JavaPath;
|
||||
javaProcess.StartInfo.Arguments = "-version";
|
||||
}
|
||||
else
|
||||
{
|
||||
javaProcess.StartInfo.FileName = "cmd.exe";
|
||||
javaProcess.StartInfo.Arguments = "/c \"java -version \"";
|
||||
}
|
||||
javaProcess.StartInfo.FileName = JavaPath;
|
||||
javaProcess.StartInfo.Arguments = "-version";
|
||||
javaProcess.StartInfo.CreateNoWindow = true;
|
||||
javaProcess.StartInfo.UseShellExecute = false;
|
||||
javaProcess.StartInfo.RedirectStandardError = true;
|
||||
javaProcess.Start();
|
||||
string output = javaProcess.StandardError.ReadToEnd();
|
||||
javaProcess.WaitForExit(3000);
|
||||
|
||||
//I use _JAVA_OPTIONS so I want the prompt removed
|
||||
if (output.Contains("_JAVA_OPTIONS"))
|
||||
{
|
||||
int n = 2;
|
||||
string[] lines = output
|
||||
.Split(Environment.NewLine.ToCharArray())
|
||||
.Skip(n)
|
||||
.ToArray();
|
||||
|
||||
output = string.Join(Environment.NewLine, lines);
|
||||
}
|
||||
|
||||
if (!String.IsNullOrEmpty(output))
|
||||
return output.Split(new[] { '\r', '\n' }).FirstOrDefault().Replace("java", "Java");
|
||||
return output.Replace("\r\n\r\n", "\n").Trim();
|
||||
else
|
||||
return null;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,40 +4,44 @@ using APKToolGUI.Properties;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using static Microsoft.WindowsAPICodePack.Shell.PropertySystem.SystemProperties.System;
|
||||
|
||||
namespace Java
|
||||
{
|
||||
public class JavaUtils
|
||||
{
|
||||
public static bool TryGetSystemVariable(out string javaExeLocation)
|
||||
public static string GetSystemVariable()
|
||||
{
|
||||
try
|
||||
{
|
||||
ProcessStartInfo procStartInfo = new ProcessStartInfo("java", "-version ");
|
||||
procStartInfo.RedirectStandardOutput = true;
|
||||
procStartInfo.RedirectStandardError = true;
|
||||
procStartInfo.UseShellExecute = false;
|
||||
procStartInfo.CreateNoWindow = true;
|
||||
Process proc = new Process();
|
||||
proc.StartInfo = procStartInfo;
|
||||
proc.Start();
|
||||
if (!String.IsNullOrEmpty(proc.StandardError.ReadToEnd()))
|
||||
using (Process javaProcess = new Process())
|
||||
{
|
||||
javaExeLocation = "java";
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
javaExeLocation = null;
|
||||
return false;
|
||||
javaProcess.StartInfo.FileName = "where";
|
||||
javaProcess.StartInfo.Arguments = "java";
|
||||
javaProcess.StartInfo.CreateNoWindow = true;
|
||||
javaProcess.StartInfo.UseShellExecute = false;
|
||||
javaProcess.StartInfo.RedirectStandardError = true;
|
||||
javaProcess.StartInfo.RedirectStandardOutput = true;
|
||||
javaProcess.Start();
|
||||
string output = javaProcess.StandardOutput.ReadToEnd();
|
||||
javaProcess.WaitForExit();
|
||||
if (!String.IsNullOrEmpty(output))
|
||||
{
|
||||
string[] paths = output.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
|
||||
foreach (string path in paths)
|
||||
{
|
||||
return path;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
javaExeLocation = null;
|
||||
return false;
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
private static string GetJavaInstallationPath()
|
||||
{
|
||||
@@ -82,34 +86,23 @@ namespace Java
|
||||
|
||||
public static string GetJavaPath()
|
||||
{
|
||||
string javaExec;
|
||||
if (!JavaUtils.TryGetSystemVariable(out javaExec))
|
||||
if (Settings.Default.UseCustomJavaExe)
|
||||
{
|
||||
javaExec = JavaUtils.SearchPath();
|
||||
if (!File.Exists(javaExec))
|
||||
{
|
||||
if (MessageBox.Show(Language.DoYouWantToSelectJavaLocation, Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
|
||||
{
|
||||
using (OpenFileDialog openJavaExe = new OpenFileDialog())
|
||||
{
|
||||
openJavaExe.Filter = "java.exe|java.exe";
|
||||
if (openJavaExe.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
javaExec = Program.GetPortablePath(openJavaExe.FileName);
|
||||
}
|
||||
else
|
||||
Environment.Exit(0);
|
||||
}
|
||||
}
|
||||
else
|
||||
Environment.Exit(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return javaExec;
|
||||
}
|
||||
return Settings.Default.JavaExe;
|
||||
}
|
||||
else
|
||||
{
|
||||
string javaExec = JavaUtils.GetSystemVariable();
|
||||
if (String.IsNullOrEmpty(javaExec))
|
||||
{
|
||||
javaExec = JavaUtils.SearchPath();
|
||||
if (File.Exists(javaExec))
|
||||
{
|
||||
return javaExec;
|
||||
}
|
||||
}
|
||||
return javaExec;
|
||||
}
|
||||
return javaExec;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace APKToolGUI.Languages {
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Language {
|
||||
@@ -60,6 +60,15 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Aborted.
|
||||
/// </summary>
|
||||
internal static string Aborted {
|
||||
get {
|
||||
return ResourceManager.GetString("Aborted", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to About.
|
||||
/// </summary>
|
||||
@@ -132,6 +141,24 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Are you sure you want to cancel the process?.
|
||||
/// </summary>
|
||||
internal static string CancelProcess {
|
||||
get {
|
||||
return ResourceManager.GetString("CancelProcess", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Can't detect APKEditor version.
|
||||
/// </summary>
|
||||
internal static string CantDetectApkeditorVersion {
|
||||
get {
|
||||
return ResourceManager.GetString("CantDetectApkeditorVersion", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Can't detect apktool version..
|
||||
/// </summary>
|
||||
@@ -159,6 +186,15 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to It is required to clear framework cache after changing Apktool version to avoid unexpected errors. Do you want to clear it now?.
|
||||
/// </summary>
|
||||
internal static string ClearFrameworkPrompt {
|
||||
get {
|
||||
return ResourceManager.GetString("ClearFrameworkPrompt", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Clearing Framework.
|
||||
/// </summary>
|
||||
@@ -168,6 +204,15 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Clearing temp folder.
|
||||
/// </summary>
|
||||
internal static string ClearTempFolder {
|
||||
get {
|
||||
return ResourceManager.GetString("ClearTempFolder", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Compile APK.
|
||||
/// </summary>
|
||||
@@ -204,6 +249,42 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Are you sure you want to kill ADB server? You might need to reconnect your device or restart emulator.
|
||||
/// </summary>
|
||||
internal static string ConfirmKillingAdbServer {
|
||||
get {
|
||||
return ResourceManager.GetString("ConfirmKillingAdbServer", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Copy file "{0}" to "{1}".
|
||||
/// </summary>
|
||||
internal static string CopyFileTo {
|
||||
get {
|
||||
return ResourceManager.GetString("CopyFileTo", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Copy file "{0}" to temp directory "{1}".
|
||||
/// </summary>
|
||||
internal static string CopyFileToTemp {
|
||||
get {
|
||||
return ResourceManager.GetString("CopyFileToTemp", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Copy decompiled apk folder "{0}" to temp directory "{1}".
|
||||
/// </summary>
|
||||
internal static string CopyFolderToTemp {
|
||||
get {
|
||||
return ResourceManager.GetString("CopyFolderToTemp", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Creating Unsigned APK.
|
||||
/// </summary>
|
||||
@@ -240,6 +321,15 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Destination directory "{0}" already exists. Enable "Force delete destination directory" if you want to overwrite it..
|
||||
/// </summary>
|
||||
internal static string DecodeDesDirExists {
|
||||
get {
|
||||
return ResourceManager.GetString("DecodeDesDirExists", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Decompilation directory not selected..
|
||||
/// </summary>
|
||||
@@ -294,6 +384,15 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Decompiling all APK files.
|
||||
/// </summary>
|
||||
internal static string DecompilingAllApkFiles {
|
||||
get {
|
||||
return ResourceManager.GetString("DecompilingAllApkFiles", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Decompiling dex.
|
||||
/// </summary>
|
||||
@@ -312,6 +411,87 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Delete file "{0}".
|
||||
/// </summary>
|
||||
internal static string DeleteFile {
|
||||
get {
|
||||
return ResourceManager.GetString("DeleteFile", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Deleting folder: {0}.
|
||||
/// </summary>
|
||||
internal static string DeletingFolder {
|
||||
get {
|
||||
return ResourceManager.GetString("DeletingFolder", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to {0} detected as base.
|
||||
/// </summary>
|
||||
internal static string DetectedAsBase {
|
||||
get {
|
||||
return ResourceManager.GetString("DetectedAsBase", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to {0} detected as split.
|
||||
/// </summary>
|
||||
internal static string DetectedAsSplit {
|
||||
get {
|
||||
return ResourceManager.GetString("DetectedAsSplit", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Device is not selected.
|
||||
/// </summary>
|
||||
internal static string DeviceNotSelected {
|
||||
get {
|
||||
return ResourceManager.GetString("DeviceNotSelected", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Device selected "{0}".
|
||||
/// </summary>
|
||||
internal static string DeviceSelected {
|
||||
get {
|
||||
return ResourceManager.GetString("DeviceSelected", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to {0} devices found.
|
||||
/// </summary>
|
||||
internal static string DevicesFound {
|
||||
get {
|
||||
return ResourceManager.GetString("DevicesFound", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to The directory "{0}" does not exist.
|
||||
/// </summary>
|
||||
internal static string DirectoryNotExist {
|
||||
get {
|
||||
return ResourceManager.GetString("DirectoryNotExist", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Directory "{0}" does not exist.
|
||||
/// </summary>
|
||||
internal static string DirNotExist {
|
||||
get {
|
||||
return ResourceManager.GetString("DirNotExist", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Done.
|
||||
/// </summary>
|
||||
@@ -340,16 +520,7 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Java is not found. Do you want to select custom location?.
|
||||
/// </summary>
|
||||
internal static string DoYouWantToSelectJavaLocation {
|
||||
get {
|
||||
return ResourceManager.GetString("DoYouWantToSelectJavaLocation", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to You are running as administrator. Drag & drop is not supported.
|
||||
/// Looks up a localized string similar to You are running as administrator. Drag & drop may not be supported.
|
||||
/// </summary>
|
||||
internal static string DragDropNotSupported {
|
||||
get {
|
||||
@@ -412,7 +583,16 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Java is not installed or is installed incorrectly. The program will be closed..
|
||||
/// Looks up a localized string similar to There was an error getting APK infomation.
|
||||
/// </summary>
|
||||
internal static string ErrorGettingApkInfo {
|
||||
get {
|
||||
return ResourceManager.GetString("ErrorGettingApkInfo", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Java is not installed or is installed incorrectly. Please install Java or set custom location in Settings.
|
||||
/// </summary>
|
||||
internal static string ErrorJavaDetect {
|
||||
get {
|
||||
@@ -420,6 +600,15 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Merging failed.
|
||||
/// </summary>
|
||||
internal static string ErrorMerging {
|
||||
get {
|
||||
return ResourceManager.GetString("ErrorMerging", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to This directory is not an Android package.
|
||||
/// </summary>
|
||||
@@ -546,6 +735,15 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Extracting all APK files.
|
||||
/// </summary>
|
||||
internal static string ExtractingAllApkFiles {
|
||||
get {
|
||||
return ResourceManager.GetString("ExtractingAllApkFiles", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to File.
|
||||
/// </summary>
|
||||
@@ -573,6 +771,15 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Fixed apktool.yml.
|
||||
/// </summary>
|
||||
internal static string FixApktoolYml {
|
||||
get {
|
||||
return ResourceManager.GetString("FixApktoolYml", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Folder does not exist.
|
||||
/// </summary>
|
||||
@@ -619,7 +826,7 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Get APK Info.
|
||||
/// Looks up a localized string similar to View APK Info.
|
||||
/// </summary>
|
||||
internal static string GetApkInfo {
|
||||
get {
|
||||
@@ -627,6 +834,15 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Getting devices....
|
||||
/// </summary>
|
||||
internal static string GettingDevices {
|
||||
get {
|
||||
return ResourceManager.GetString("GettingDevices", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Help.
|
||||
/// </summary>
|
||||
@@ -636,6 +852,42 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Input directory: {0}.
|
||||
/// </summary>
|
||||
internal static string InputDirectory {
|
||||
get {
|
||||
return ResourceManager.GetString("InputDirectory", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Input file: {0}.
|
||||
/// </summary>
|
||||
internal static string InputFile {
|
||||
get {
|
||||
return ResourceManager.GetString("InputFile", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to APK Installation failed.
|
||||
/// </summary>
|
||||
internal static string InstallApkFailed {
|
||||
get {
|
||||
return ResourceManager.GetString("InstallApkFailed", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to APK Installation successfully.
|
||||
/// </summary>
|
||||
internal static string InstallApkSuccessful {
|
||||
get {
|
||||
return ResourceManager.GetString("InstallApkSuccessful", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Install framework.
|
||||
/// </summary>
|
||||
@@ -645,6 +897,24 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Installing APK.
|
||||
/// </summary>
|
||||
internal static string InstallingApk {
|
||||
get {
|
||||
return ResourceManager.GetString("InstallingApk", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Installing APK "{0}".
|
||||
/// </summary>
|
||||
internal static string InstallingApkPath {
|
||||
get {
|
||||
return ResourceManager.GetString("InstallingApkPath", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Installing framework.
|
||||
/// </summary>
|
||||
@@ -672,6 +942,33 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Merge finished. Moving directory to "{0}".
|
||||
/// </summary>
|
||||
internal static string MergeFinishedMoveDir {
|
||||
get {
|
||||
return ResourceManager.GetString("MergeFinishedMoveDir", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Merging APK.
|
||||
/// </summary>
|
||||
internal static string MergingApk {
|
||||
get {
|
||||
return ResourceManager.GetString("MergingApk", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Merging APK using APKEditor.jar.
|
||||
/// </summary>
|
||||
internal static string MergingApkEditor {
|
||||
get {
|
||||
return ResourceManager.GetString("MergingApkEditor", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to META-INF folder does not exist. Skipped.
|
||||
/// </summary>
|
||||
@@ -681,6 +978,33 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Move temp folder "{0}" to output directory "{1}".
|
||||
/// </summary>
|
||||
internal static string MoveTempApkFileToOutput {
|
||||
get {
|
||||
return ResourceManager.GetString("MoveTempApkFileToOutput", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Move temp apk "{0}" to output directory "{1}".
|
||||
/// </summary>
|
||||
internal static string MoveTempApkToOutput {
|
||||
get {
|
||||
return ResourceManager.GetString("MoveTempApkToOutput", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Moving base directory to "{0}".
|
||||
/// </summary>
|
||||
internal static string MovingBasedirectory {
|
||||
get {
|
||||
return ResourceManager.GetString("MovingBasedirectory", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to For the changes to take effect you must restart the program. You want to do it now?.
|
||||
/// </summary>
|
||||
@@ -690,6 +1014,15 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to No devices found. Make sure your device is connected to the computer with the adb debugging turned on. If you use an emulator, restart it and wait until it boot up.
|
||||
/// </summary>
|
||||
internal static string NoDevicesFound {
|
||||
get {
|
||||
return ResourceManager.GetString("NoDevicesFound", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to This folder is not a decompiled APK.
|
||||
/// </summary>
|
||||
@@ -708,6 +1041,42 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Open compile output folder.
|
||||
/// </summary>
|
||||
internal static string OpenComFolder {
|
||||
get {
|
||||
return ResourceManager.GetString("OpenComFolder", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Open decompile output folder.
|
||||
/// </summary>
|
||||
internal static string OpenDecFolder {
|
||||
get {
|
||||
return ResourceManager.GetString("OpenDecFolder", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Parsing APK Info....
|
||||
/// </summary>
|
||||
internal static string ParsingApkInfo {
|
||||
get {
|
||||
return ResourceManager.GetString("ParsingApkInfo", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Please wait....
|
||||
/// </summary>
|
||||
internal static string PleaseWait {
|
||||
get {
|
||||
return ResourceManager.GetString("PleaseWait", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Removed all ApkTool dummies.
|
||||
/// </summary>
|
||||
@@ -726,6 +1095,24 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Restart is required to apply changes. Do you want to restart the application?.
|
||||
/// </summary>
|
||||
internal static string RestartApplicationPrompt {
|
||||
get {
|
||||
return ResourceManager.GetString("RestartApplicationPrompt", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to .
|
||||
/// </summary>
|
||||
internal static string SetLanguageRestartApplication {
|
||||
get {
|
||||
return ResourceManager.GetString("SetLanguageRestartApplication", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Settings.
|
||||
/// </summary>
|
||||
@@ -807,6 +1194,15 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Split APK is not selected.
|
||||
/// </summary>
|
||||
internal static string SplitApkNotFound {
|
||||
get {
|
||||
return ResourceManager.GetString("SplitApkNotFound", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to System language.
|
||||
/// </summary>
|
||||
@@ -816,6 +1212,15 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Temp directory: "{0}".
|
||||
/// </summary>
|
||||
internal static string TempDirectory {
|
||||
get {
|
||||
return ResourceManager.GetString("TempDirectory", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Text file.
|
||||
/// </summary>
|
||||
@@ -825,6 +1230,24 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Time ended: {0}.
|
||||
/// </summary>
|
||||
internal static string TimeEnded {
|
||||
get {
|
||||
return ResourceManager.GetString("TimeEnded", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Time started: {0}.
|
||||
/// </summary>
|
||||
internal static string TimeStarted {
|
||||
get {
|
||||
return ResourceManager.GetString("TimeStarted", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to New version is available. Do you want to update?.
|
||||
/// </summary>
|
||||
@@ -914,5 +1337,91 @@ namespace APKToolGUI.Languages {
|
||||
return ResourceManager.GetString("ZIPArchives", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
internal static string CopyAll {
|
||||
get {
|
||||
return ResourceManager.GetString("CopyAll", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
internal static string Loading {
|
||||
get {
|
||||
return ResourceManager.GetString("Loading", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
internal static string Ready {
|
||||
get {
|
||||
return ResourceManager.GetString("Ready", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
internal static string SaveImageTitle {
|
||||
get {
|
||||
return ResourceManager.GetString("SaveImageTitle", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
internal static string PngImage {
|
||||
get {
|
||||
return ResourceManager.GetString("PngImage", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
internal static string FilterAndroidPackage {
|
||||
get { return ResourceManager.GetString("FilterAndroidPackage", resourceCulture); }
|
||||
}
|
||||
|
||||
internal static string FilterSplitApk {
|
||||
get { return ResourceManager.GetString("FilterSplitApk", resourceCulture); }
|
||||
}
|
||||
|
||||
internal static string FilterApkJarZip {
|
||||
get { return ResourceManager.GetString("FilterApkJarZip", resourceCulture); }
|
||||
}
|
||||
|
||||
internal static string FilterKeystore {
|
||||
get { return ResourceManager.GetString("FilterKeystore", resourceCulture); }
|
||||
}
|
||||
|
||||
internal static string FilterPublicKey {
|
||||
get { return ResourceManager.GetString("FilterPublicKey", resourceCulture); }
|
||||
}
|
||||
|
||||
internal static string FilterPrivateKey {
|
||||
get { return ResourceManager.GetString("FilterPrivateKey", resourceCulture); }
|
||||
}
|
||||
|
||||
internal static string FilterApk {
|
||||
get { return ResourceManager.GetString("FilterApk", resourceCulture); }
|
||||
}
|
||||
|
||||
internal static string FilterDex {
|
||||
get { return ResourceManager.GetString("FilterDex", resourceCulture); }
|
||||
}
|
||||
|
||||
internal static string FilterJavaExe {
|
||||
get { return ResourceManager.GetString("FilterJavaExe", resourceCulture); }
|
||||
}
|
||||
|
||||
internal static string FilterApktool {
|
||||
get { return ResourceManager.GetString("FilterApktool", resourceCulture); }
|
||||
}
|
||||
|
||||
internal static string SchemeDefault {
|
||||
get { return ResourceManager.GetString("SchemeDefault", resourceCulture); }
|
||||
}
|
||||
|
||||
internal static string SchemeTrue {
|
||||
get { return ResourceManager.GetString("SchemeTrue", resourceCulture); }
|
||||
}
|
||||
|
||||
internal static string SchemeFalse {
|
||||
get { return ResourceManager.GetString("SchemeFalse", resourceCulture); }
|
||||
}
|
||||
|
||||
internal static string AaptDump {
|
||||
get { return ResourceManager.GetString("AaptDump", resourceCulture); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,516 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="About" xml:space="preserve">
|
||||
<value>Rólunk</value>
|
||||
</data>
|
||||
<data name="APKToolVersion" xml:space="preserve">
|
||||
<value>Apktool verzió</value>
|
||||
</data>
|
||||
<data name="CheckForUpdate" xml:space="preserve">
|
||||
<value>Frissítés keresése</value>
|
||||
</data>
|
||||
<data name="DebugMode" xml:space="preserve">
|
||||
<value>Hibakereső mód</value>
|
||||
</data>
|
||||
<data name="Exit" xml:space="preserve">
|
||||
<value>Kilépés</value>
|
||||
</data>
|
||||
<data name="File" xml:space="preserve">
|
||||
<value>Fájl</value>
|
||||
</data>
|
||||
<data name="Help" xml:space="preserve">
|
||||
<value>Súgó</value>
|
||||
</data>
|
||||
<data name="Settings" xml:space="preserve">
|
||||
<value>Beállítások</value>
|
||||
</data>
|
||||
<data name="ErrorJavaDetect" xml:space="preserve">
|
||||
<value>Java nincs vagy rosszul van telepítve. Telepítse a Javát vagy adja meg az egyéni helyét a Beállításokban</value>
|
||||
</data>
|
||||
<data name="ErrorReadSettings" xml:space="preserve">
|
||||
<value>Hiba a beállítások olvasásakor!</value>
|
||||
</data>
|
||||
<data name="UpdateNewVersion" xml:space="preserve">
|
||||
<value>Új verzió érhető el. Szeretne frissíteni?</value>
|
||||
</data>
|
||||
<data name="UpdateNoUpdates" xml:space="preserve">
|
||||
<value>Nincs frissítés.</value>
|
||||
</data>
|
||||
<data name="WarningDecodingFolderNotSelected" xml:space="preserve">
|
||||
<value>Dekódolási mappa nincs kiválasztva!</value>
|
||||
</data>
|
||||
<data name="WarningFileForDecodingNotSelected" xml:space="preserve">
|
||||
<value>A dekódolandó fájl nincs kiválasztva!</value>
|
||||
</data>
|
||||
<data name="WarningFileForSigningNotSelected" xml:space="preserve">
|
||||
<value>Az aláírni szánt fájl nincs kiválasztva!</value>
|
||||
</data>
|
||||
<data name="WarningFrameworkNotSelected" xml:space="preserve">
|
||||
<value>A framework nincs kiválasztva!</value>
|
||||
</data>
|
||||
<data name="ErrorSaveSettings" xml:space="preserve">
|
||||
<value>Hiba a beállítások mentése során!</value>
|
||||
</data>
|
||||
<data name="NeedRestart" xml:space="preserve">
|
||||
<value>A módosítások érvényesítéséhez újra kell indítania a programot. Most akarja megtenni?</value>
|
||||
</data>
|
||||
<data name="FileNotFound" xml:space="preserve">
|
||||
<value>A fájl nem található</value>
|
||||
</data>
|
||||
<data name="FolderNotExist" xml:space="preserve">
|
||||
<value>A mappa nem létezik</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Hiba</value>
|
||||
</data>
|
||||
<data name="Build" xml:space="preserve">
|
||||
<value>Build</value>
|
||||
</data>
|
||||
<data name="Decode" xml:space="preserve">
|
||||
<value>Dekódolás</value>
|
||||
</data>
|
||||
<data name="InstallFramework" xml:space="preserve">
|
||||
<value>A keretrendszer telepítése</value>
|
||||
</data>
|
||||
<data name="Sign" xml:space="preserve">
|
||||
<value>Aláírás</value>
|
||||
</data>
|
||||
<data name="SystemLanguage" xml:space="preserve">
|
||||
<value>Rendszer nyelve</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToInstallCM" xml:space="preserve">
|
||||
<value>Tényleg telepíteni szeretné a kontextus menüt?</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToRemoveCM" xml:space="preserve">
|
||||
<value>Tényleg el akarja távolítani a kontextus menüt?</value>
|
||||
</data>
|
||||
<data name="Done" xml:space="preserve">
|
||||
<value>Kész</value>
|
||||
</data>
|
||||
<data name="CantDetectApktoolVersion" xml:space="preserve">
|
||||
<value>Nem érzékeli az apktool verzióját.</value>
|
||||
</data>
|
||||
<data name="DecompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>A dekompilálás sikeresen befejeződött. Kimeneti könyvtár "{0}".</value>
|
||||
</data>
|
||||
<data name="ErrorUpdateChecking" xml:space="preserve">
|
||||
<value>Frissítés ell. hiba:</value>
|
||||
</data>
|
||||
<data name="SignSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Az aláírás sikeresen befejeződött. Fájl mentve: "{0}".</value>
|
||||
</data>
|
||||
<data name="Aligning" xml:space="preserve">
|
||||
<value>Igazítás</value>
|
||||
</data>
|
||||
<data name="ErrorCompiling" xml:space="preserve">
|
||||
<value>A kódolás sikertelen</value>
|
||||
</data>
|
||||
<data name="ErrorEnteringFrameworkTag" xml:space="preserve">
|
||||
<value>Hiba a framework címke bevitelében.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFileNotExist" xml:space="preserve">
|
||||
<value>A kiválasztott fájl nem létezik.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkDirectory" xml:space="preserve">
|
||||
<value>Hiba a keretrendszer könyvtár kiválasztásában.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkFile" xml:space="preserve">
|
||||
<value>Hiba a keretrendszer fájl kiválasztásában. A fájl nem létezik.</value>
|
||||
</data>
|
||||
<data name="ErrorSigning" xml:space="preserve">
|
||||
<value>Az aláírás sikertelen.</value>
|
||||
</data>
|
||||
<data name="FrameworkInstallationNotStarted" xml:space="preserve">
|
||||
<value>Hiba. A keretrendszer telepítése nem indult el.</value>
|
||||
</data>
|
||||
<data name="InstallingFramework" xml:space="preserve">
|
||||
<value>A keretrendszer telepítése</value>
|
||||
</data>
|
||||
<data name="Signing" xml:space="preserve">
|
||||
<value>Aláírás</value>
|
||||
</data>
|
||||
<data name="SignInputFileNotFound" xml:space="preserve">
|
||||
<value>A bemeneti fájl nem található.</value>
|
||||
</data>
|
||||
<data name="SignPrivateKeyNotFound" xml:space="preserve">
|
||||
<value>Privát kulcs nem található.</value>
|
||||
</data>
|
||||
<data name="SignPublicKeyNotFound" xml:space="preserve">
|
||||
<value>Nyilvános kulcs nem található.</value>
|
||||
</data>
|
||||
<data name="ZIPArchives" xml:space="preserve">
|
||||
<value>ZIP archívumok</value>
|
||||
</data>
|
||||
<data name="DecodeCouldNotCreate" xml:space="preserve">
|
||||
<value>A kiválasztott dekompilációs könyvtárat nem lehetett létrehozni, mert érvénytelen karaktereket tartalmaz.</value>
|
||||
</data>
|
||||
<data name="DecodeDirNotSelected" xml:space="preserve">
|
||||
<value>A dekompilációs könyvtár nincs kiválasztva.</value>
|
||||
</data>
|
||||
<data name="DecodeSelectedFrameworkNotExist" xml:space="preserve">
|
||||
<value>A kiválasztott keretkönyvtár nem létezik.</value>
|
||||
</data>
|
||||
<data name="Decoding" xml:space="preserve">
|
||||
<value>Dekódolás</value>
|
||||
</data>
|
||||
<data name="ErrorDecompiling" xml:space="preserve">
|
||||
<value>A dekompilálás sikertelen</value>
|
||||
</data>
|
||||
<data name="ExecutableFile" xml:space="preserve">
|
||||
<value>Végrehajtható fájl</value>
|
||||
</data>
|
||||
<data name="ChangedTargetSdkTo29" xml:space="preserve">
|
||||
<value>A cél SDK 29-re változott</value>
|
||||
</data>
|
||||
<data name="ErrorVersionParsing" xml:space="preserve">
|
||||
<value>Nem sikerült elemezni a verziót</value>
|
||||
</data>
|
||||
<data name="FixAndroidManifest" xml:space="preserve">
|
||||
<value>Javított AndroidManifest.xml</value>
|
||||
</data>
|
||||
<data name="RemoveApkToolDummies" xml:space="preserve">
|
||||
<value>Eltávolítottuk az összes ApkTool dummie-t</value>
|
||||
</data>
|
||||
<data name="APKSelected" xml:space="preserve">
|
||||
<value>APK kiválasztva:</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFolderNotExist" xml:space="preserve">
|
||||
<value>A kiválasztott mappa nem létezik.</value>
|
||||
</data>
|
||||
<data name="AndroidManifestNotExist" xml:space="preserve">
|
||||
<value>Az AndroidManifest.xml nem létezik</value>
|
||||
</data>
|
||||
<data name="DecompiledAPKNotExist" xml:space="preserve">
|
||||
<value>A dekompilált APK könyvtár nem létezik</value>
|
||||
</data>
|
||||
<data name="MainActivityFound" xml:space="preserve">
|
||||
<value>A MainActivity itt, "{0}" található</value>
|
||||
</data>
|
||||
<data name="MainActivityNotFoundPleaseFindManually" xml:space="preserve">
|
||||
<value>Nem találta a MainActivity-t. Kérjük keresse meg manuálisan</value>
|
||||
</data>
|
||||
<data name="ClearingFramework" xml:space="preserve">
|
||||
<value>Keretrendszer tisztítás</value>
|
||||
</data>
|
||||
<data name="CompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Az összeállítás sikeresen befejeződött. Kimeneti könyvtár "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorZipalign" xml:space="preserve">
|
||||
<value>A Zipalign nem sikerült</value>
|
||||
</data>
|
||||
<data name="ZipalignFileSavedTo" xml:space="preserve">
|
||||
<value>A Zipalign sikeresen befejeződött. Fájl ide mentve "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorClearingFw" xml:space="preserve">
|
||||
<value>Keretrendszer törlési hiba</value>
|
||||
</data>
|
||||
<data name="FrameworkCacheCleared" xml:space="preserve">
|
||||
<value>A keretrendszer gyorsítótára törölve</value>
|
||||
</data>
|
||||
<data name="AllDone" xml:space="preserve">
|
||||
<value>Minden kész!</value>
|
||||
</data>
|
||||
<data name="FrameworkInstalled" xml:space="preserve">
|
||||
<value>A keretrendszer sikeresen települt</value>
|
||||
</data>
|
||||
<data name="FrameworkDirNotExist" xml:space="preserve">
|
||||
<value>A keretrendszer könyvtár nem létezik</value>
|
||||
</data>
|
||||
<data name="DecompilingDex" xml:space="preserve">
|
||||
<value>Dex dekódolása</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedOutputFolderNotExist" xml:space="preserve">
|
||||
<value>A kiválasztott kimeneti mappa nem létezik.</value>
|
||||
</data>
|
||||
<data name="CompilingDex" xml:space="preserve">
|
||||
<value>Dex összeállítása</value>
|
||||
</data>
|
||||
<data name="DragDropNotSupported" xml:space="preserve">
|
||||
<value>Rendszergazdaként fut. A Húzd & Dobd nem támogatott</value>
|
||||
</data>
|
||||
<data name="DragDropSupported" xml:space="preserve">
|
||||
<value>A Húzd & Dobd támogatott</value>
|
||||
</data>
|
||||
<data name="ErrorNotAnApk" xml:space="preserve">
|
||||
<value>Ez a könyvtár nem egy Android csomag</value>
|
||||
</data>
|
||||
<data name="Baksmali" xml:space="preserve">
|
||||
<value>Baksmali</value>
|
||||
</data>
|
||||
<data name="Smali" xml:space="preserve">
|
||||
<value>Smali</value>
|
||||
</data>
|
||||
<data name="Zipalign" xml:space="preserve">
|
||||
<value>Zipalign</value>
|
||||
</data>
|
||||
<data name="CompileApk" xml:space="preserve">
|
||||
<value>APK összeállítása</value>
|
||||
</data>
|
||||
<data name="CompileDex" xml:space="preserve">
|
||||
<value>DEX összeszerelése</value>
|
||||
</data>
|
||||
<data name="DecompileApk" xml:space="preserve">
|
||||
<value>APK dekompilálása</value>
|
||||
</data>
|
||||
<data name="DecompileDex" xml:space="preserve">
|
||||
<value>DEX szétszerelése</value>
|
||||
</data>
|
||||
<data name="GetApkInfo" xml:space="preserve">
|
||||
<value>APK infó beszerzése</value>
|
||||
</data>
|
||||
<data name="NotDecompiledApk" xml:space="preserve">
|
||||
<value>Ez a mappa nem egy dekompilált APK</value>
|
||||
</data>
|
||||
<data name="NotDecompiledDex" xml:space="preserve">
|
||||
<value>Ez a mappa nem dekompilált DEX</value>
|
||||
</data>
|
||||
<data name="RequiredFilesMissing" xml:space="preserve">
|
||||
<value>Szükséges fájlok hiányoznak</value>
|
||||
</data>
|
||||
<data name="SignApk" xml:space="preserve">
|
||||
<value>APK aláírása</value>
|
||||
</data>
|
||||
<data name="TextFile" xml:space="preserve">
|
||||
<value>Szöveg fájl</value>
|
||||
</data>
|
||||
<data name="ZipalignApk" xml:space="preserve">
|
||||
<value>APK Zipalign</value>
|
||||
</data>
|
||||
<data name="CreateUnsignedApk" xml:space="preserve">
|
||||
<value>Aláírás nélküli APK létrehozása</value>
|
||||
</data>
|
||||
<data name="MetainfNotExist" xml:space="preserve">
|
||||
<value>A META-INF mappa nem létezik. Kihagyva</value>
|
||||
</data>
|
||||
<data name="ErrorGettingApkInfo" xml:space="preserve">
|
||||
<value>Hiba történt az APK-infó megszerzésében</value>
|
||||
</data>
|
||||
<data name="InputDirectory" xml:space="preserve">
|
||||
<value>Bemeneti könyvtár: {0}</value>
|
||||
</data>
|
||||
<data name="InputFile" xml:space="preserve">
|
||||
<value>Bemeneti fájl: {0}</value>
|
||||
</data>
|
||||
<data name="DeleteFile" xml:space="preserve">
|
||||
<value>"{0}" fájl törlése</value>
|
||||
</data>
|
||||
<data name="CopyFileToTemp" xml:space="preserve">
|
||||
<value>"{0}" fájl másolása "{1}" ideiglenes könyvtárba.</value>
|
||||
</data>
|
||||
<data name="CopyFolderToTemp" xml:space="preserve">
|
||||
<value>Dekompilált apk mappa "{0}" másolása "{1}" ideiglenes könyvtárba.</value>
|
||||
</data>
|
||||
<data name="DecodeDesDirExists" xml:space="preserve">
|
||||
<value>A "{0}" célkönyvtár már létezik. Ha felül szeretné írni, engedélyezze a "Célkönyvtár kényszerített törlésének" beállítását.</value>
|
||||
</data>
|
||||
<data name="MoveTempApkFileToOutput" xml:space="preserve">
|
||||
<value>A "{0}" ideiglenes mappa áthelyezése a "{1}" kimeneti könyvtárba</value>
|
||||
</data>
|
||||
<data name="MoveTempApkToOutput" xml:space="preserve">
|
||||
<value>A(z) "{0}" ideiglenes apk áthelyezése a "{1}" kimeneti könyvtárba</value>
|
||||
</data>
|
||||
<data name="ParsingApkInfo" xml:space="preserve">
|
||||
<value>APK információk elemzése...</value>
|
||||
</data>
|
||||
<data name="DecompilingAllApkFiles" xml:space="preserve">
|
||||
<value>Az összes APK fájl visszafejtése</value>
|
||||
</data>
|
||||
<data name="DetectedAsBase" xml:space="preserve">
|
||||
<value>{0} bázisként észlelve</value>
|
||||
</data>
|
||||
<data name="DetectedAsSplit" xml:space="preserve">
|
||||
<value>{0} részeként észlelve</value>
|
||||
</data>
|
||||
<data name="ExtractingAllApkFiles" xml:space="preserve">
|
||||
<value>Az összes APK fájl kicsomagolása</value>
|
||||
</data>
|
||||
<data name="MergeFinishedMoveDir" xml:space="preserve">
|
||||
<value>Egyesítés kész. Könyvtár áthelyezése ide: "{0}"</value>
|
||||
</data>
|
||||
<data name="MergingApk" xml:space="preserve">
|
||||
<value>APK egyesítése</value>
|
||||
</data>
|
||||
<data name="MovingBasedirectory" xml:space="preserve">
|
||||
<value>Bázis könyvtár áthelyezése ide: "{0}"</value>
|
||||
</data>
|
||||
<data name="DirNotExist" xml:space="preserve">
|
||||
<value>A(z) "{0}" könyvtár nem létezik</value>
|
||||
</data>
|
||||
<data name="TempDirectory" xml:space="preserve">
|
||||
<value>Temp könyvtár: "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorMerging" xml:space="preserve">
|
||||
<value>Az ˘egyesítés nem sikerült</value>
|
||||
</data>
|
||||
<data name="MergingApkEditor" xml:space="preserve">
|
||||
<value>APK egyesítése az APKEditor.jar használatával</value>
|
||||
</data>
|
||||
<data name="Aborted" xml:space="preserve">
|
||||
<value>Megszakítva</value>
|
||||
</data>
|
||||
<data name="CancelProcess" xml:space="preserve">
|
||||
<value>Biztosan megszakítja a folyamatot?</value>
|
||||
</data>
|
||||
<data name="GettingDevices" xml:space="preserve">
|
||||
<value>Eszközök keresése...</value>
|
||||
</data>
|
||||
<data name="PleaseWait" xml:space="preserve">
|
||||
<value>Kis türelmet...</value>
|
||||
</data>
|
||||
<data name="ConfirmKillingAdbServer" xml:space="preserve">
|
||||
<value>Biztosan leállítja az ADB szervert? Lehet, hogy újra kell csatlakoztatnia az eszközt, vagy újra kell indítania az emulátort</value>
|
||||
</data>
|
||||
<data name="DeviceNotSelected" xml:space="preserve">
|
||||
<value>Az eszköz nincs kiválasztva</value>
|
||||
</data>
|
||||
<data name="DeviceSelected" xml:space="preserve">
|
||||
<value>Kiválasztott eszköz: "{0}"</value>
|
||||
</data>
|
||||
<data name="DevicesFound" xml:space="preserve">
|
||||
<value>{0} eszköz található</value>
|
||||
</data>
|
||||
<data name="InstallApkFailed" xml:space="preserve">
|
||||
<value>Az APK telepítése nem sikerült</value>
|
||||
</data>
|
||||
<data name="InstallApkSuccessful" xml:space="preserve">
|
||||
<value>Az APK telepítése sikeres volt</value>
|
||||
</data>
|
||||
<data name="InstallingApk" xml:space="preserve">
|
||||
<value>APK telepítése</value>
|
||||
</data>
|
||||
<data name="InstallingApkPath" xml:space="preserve">
|
||||
<value>"{0}" APK telepítése</value>
|
||||
</data>
|
||||
<data name="NoDevicesFound" xml:space="preserve">
|
||||
<value>Nem találhatók eszközök. Győződjön meg róla, hogy eszközén be van kapcsolva az adb hibakeresés. Ha emulátort használ, indítsa újra és várja meg amíg elindul</value>
|
||||
</data>
|
||||
<data name="TimeEnded" xml:space="preserve">
|
||||
<value>Befejezve: {0}</value>
|
||||
</data>
|
||||
<data name="TimeStarted" xml:space="preserve">
|
||||
<value>Elkezdve: {0}</value>
|
||||
</data>
|
||||
<data name="ClearFrameworkPrompt" xml:space="preserve">
|
||||
<value>A váratlan hibák elkerülése érdekében az Apktool verziójának módosítása után törölni kell a framework gyorsítótárát. Szeretné most törölni?</value>
|
||||
</data>
|
||||
<data name="SetLanguageRestartApplication" xml:space="preserve">
|
||||
<value>A nyelv be van állítva. Újra akarja indítani az alkalmazást?</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,546 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="About" xml:space="preserve">
|
||||
<value>バージョン情報</value>
|
||||
</data>
|
||||
<data name="APKToolVersion" xml:space="preserve">
|
||||
<value>Apktool のバージョン</value>
|
||||
</data>
|
||||
<data name="CheckForUpdate" xml:space="preserve">
|
||||
<value>更新を確認する</value>
|
||||
</data>
|
||||
<data name="DebugMode" xml:space="preserve">
|
||||
<value>デバッグモード</value>
|
||||
</data>
|
||||
<data name="Exit" xml:space="preserve">
|
||||
<value>終了</value>
|
||||
</data>
|
||||
<data name="File" xml:space="preserve">
|
||||
<value>ファイル</value>
|
||||
</data>
|
||||
<data name="Help" xml:space="preserve">
|
||||
<value>ヘルプ</value>
|
||||
</data>
|
||||
<data name="Settings" xml:space="preserve">
|
||||
<value>設定</value>
|
||||
</data>
|
||||
<data name="ErrorJavaDetect" xml:space="preserve">
|
||||
<value>Java がインストールされていないか、正しくインストールされていません。 Java をインストールするか、設定でカスタムの場所を設定してください。</value>
|
||||
</data>
|
||||
<data name="ErrorReadSettings" xml:space="preserve">
|
||||
<value>設定の読み取りエラーです!</value>
|
||||
</data>
|
||||
<data name="UpdateNewVersion" xml:space="preserve">
|
||||
<value>新しいバージョン利用可能です。 更新しますか?</value>
|
||||
</data>
|
||||
<data name="UpdateNoUpdates" xml:space="preserve">
|
||||
<value>利用可能な更新はありません。</value>
|
||||
</data>
|
||||
<data name="WarningDecodingFolderNotSelected" xml:space="preserve">
|
||||
<value>デコード先のフォルダーが未選択です!</value>
|
||||
</data>
|
||||
<data name="WarningFileForDecodingNotSelected" xml:space="preserve">
|
||||
<value>デコードするファイルが未選択です!</value>
|
||||
</data>
|
||||
<data name="WarningFileForSigningNotSelected" xml:space="preserve">
|
||||
<value>署名用のファイルが未選択です!</value>
|
||||
</data>
|
||||
<data name="WarningFrameworkNotSelected" xml:space="preserve">
|
||||
<value>フレームワークが未選択です!</value>
|
||||
</data>
|
||||
<data name="ErrorSaveSettings" xml:space="preserve">
|
||||
<value>設定の保存エラーです!</value>
|
||||
</data>
|
||||
<data name="NeedRestart" xml:space="preserve">
|
||||
<value>設定を有効化するにはプログラムを再起動してください。 今すぐしますか?</value>
|
||||
</data>
|
||||
<data name="FileNotFound" xml:space="preserve">
|
||||
<value>ファイルが見つかりません</value>
|
||||
</data>
|
||||
<data name="FolderNotExist" xml:space="preserve">
|
||||
<value>フォルダーが存在しません</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>エラー</value>
|
||||
</data>
|
||||
<data name="Build" xml:space="preserve">
|
||||
<value>ビルド</value>
|
||||
</data>
|
||||
<data name="Decode" xml:space="preserve">
|
||||
<value>デコード</value>
|
||||
</data>
|
||||
<data name="InstallFramework" xml:space="preserve">
|
||||
<value>フレームワークをインストール</value>
|
||||
</data>
|
||||
<data name="Sign" xml:space="preserve">
|
||||
<value>署名</value>
|
||||
</data>
|
||||
<data name="SystemLanguage" xml:space="preserve">
|
||||
<value>システムの言語</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToInstallCM" xml:space="preserve">
|
||||
<value>コンテキストメニューをインストールしますか?</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToRemoveCM" xml:space="preserve">
|
||||
<value>コンテキストメニューを削除しますか?</value>
|
||||
</data>
|
||||
<data name="Done" xml:space="preserve">
|
||||
<value>完了</value>
|
||||
</data>
|
||||
<data name="CantDetectApktoolVersion" xml:space="preserve">
|
||||
<value>apktool のバージョンを検出できません。</value>
|
||||
</data>
|
||||
<data name="DecompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>デコンパイルが正常に完了しました。 出力先のディレクトリ: {0}</value>
|
||||
</data>
|
||||
<data name="ErrorUpdateChecking" xml:space="preserve">
|
||||
<value>更新の確認でエラーが発生しました:</value>
|
||||
</data>
|
||||
<data name="SignSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>署名は正常に完了しました。 ファイルの保存先: {0}</value>
|
||||
</data>
|
||||
<data name="Aligning" xml:space="preserve">
|
||||
<value>最適化中</value>
|
||||
</data>
|
||||
<data name="ErrorCompiling" xml:space="preserve">
|
||||
<value>コンパイルに失敗しました</value>
|
||||
</data>
|
||||
<data name="ErrorEnteringFrameworkTag" xml:space="preserve">
|
||||
<value>フレームワークタグの入力エラーです。</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFileNotExist" xml:space="preserve">
|
||||
<value>選択したファイルは存在しません。</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkDirectory" xml:space="preserve">
|
||||
<value>フレームワークディレクトリの選択中にエラーが発生しました。</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkFile" xml:space="preserve">
|
||||
<value>フレームワークファイルの選択中にエラーが発生しました。 ファイルが存在しません。</value>
|
||||
</data>
|
||||
<data name="ErrorSigning" xml:space="preserve">
|
||||
<value>署名に失敗しました。</value>
|
||||
</data>
|
||||
<data name="FrameworkInstallationNotStarted" xml:space="preserve">
|
||||
<value>エラーが発生しました。 フレームワークのインストールが開始されていません。</value>
|
||||
</data>
|
||||
<data name="InstallingFramework" xml:space="preserve">
|
||||
<value>フレームワークをインストール</value>
|
||||
</data>
|
||||
<data name="Signing" xml:space="preserve">
|
||||
<value>署名</value>
|
||||
</data>
|
||||
<data name="SignInputFileNotFound" xml:space="preserve">
|
||||
<value>入力先のファイルがありません。</value>
|
||||
</data>
|
||||
<data name="SignPrivateKeyNotFound" xml:space="preserve">
|
||||
<value>秘密鍵がありません。</value>
|
||||
</data>
|
||||
<data name="SignPublicKeyNotFound" xml:space="preserve">
|
||||
<value>公開鍵がありません。</value>
|
||||
</data>
|
||||
<data name="ZIPArchives" xml:space="preserve">
|
||||
<value>ZIP アーカイブ</value>
|
||||
</data>
|
||||
<data name="DecodeCouldNotCreate" xml:space="preserve">
|
||||
<value>無効な文字が含まれているため、選択したデコンパイルディレクトリを作成できませんでした。</value>
|
||||
</data>
|
||||
<data name="DecodeDirNotSelected" xml:space="preserve">
|
||||
<value>デコンパイルディレクトリが未選択です。</value>
|
||||
</data>
|
||||
<data name="DecodeSelectedFrameworkNotExist" xml:space="preserve">
|
||||
<value>選択したフレームワークディレクトリが存在しません。</value>
|
||||
</data>
|
||||
<data name="Decoding" xml:space="preserve">
|
||||
<value>デコード中</value>
|
||||
</data>
|
||||
<data name="ErrorDecompiling" xml:space="preserve">
|
||||
<value>デコンパイルに失敗しました</value>
|
||||
</data>
|
||||
<data name="ExecutableFile" xml:space="preserve">
|
||||
<value>実行可能なファイル</value>
|
||||
</data>
|
||||
<data name="ChangedTargetSdkTo29" xml:space="preserve">
|
||||
<value>ターゲット SDK を 29 に変更する</value>
|
||||
</data>
|
||||
<data name="ErrorVersionParsing" xml:space="preserve">
|
||||
<value>バージョンの解析に失敗しました</value>
|
||||
</data>
|
||||
<data name="FixAndroidManifest" xml:space="preserve">
|
||||
<value>AndroidManifest.xml を修正しました</value>
|
||||
</data>
|
||||
<data name="RemoveApkToolDummies" xml:space="preserve">
|
||||
<value>すべての ApkTook ダミーを削除しました</value>
|
||||
</data>
|
||||
<data name="APKSelected" xml:space="preserve">
|
||||
<value>選択した APK:</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFolderNotExist" xml:space="preserve">
|
||||
<value>選択したフォルダーは存在しません。</value>
|
||||
</data>
|
||||
<data name="AndroidManifestNotExist" xml:space="preserve">
|
||||
<value>AndroidManifest.xml が存在しません</value>
|
||||
</data>
|
||||
<data name="DecompiledAPKNotExist" xml:space="preserve">
|
||||
<value>デコンパイルされた APK ディレクトリが存在しません</value>
|
||||
</data>
|
||||
<data name="MainActivityFound" xml:space="preserve">
|
||||
<value>「{0}」でメインアクティビティが見つかりました</value>
|
||||
</data>
|
||||
<data name="MainActivityNotFoundPleaseFindManually" xml:space="preserve">
|
||||
<value>メインアクティビティが見つかりませんでした。 手動で検索してください</value>
|
||||
</data>
|
||||
<data name="ClearingFramework" xml:space="preserve">
|
||||
<value>フレームワークを消去</value>
|
||||
</data>
|
||||
<data name="CompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>コンパイルが正常に完了しました。 出力先ディレクトリ: {0}</value>
|
||||
</data>
|
||||
<data name="ErrorZipalign" xml:space="preserve">
|
||||
<value>Zipaligning に失敗しました</value>
|
||||
</data>
|
||||
<data name="ZipalignFileSavedTo" xml:space="preserve">
|
||||
<value>Zipalign が正常に完了しました。 ファイルは「{0}」に保存されました</value>
|
||||
</data>
|
||||
<data name="ErrorClearingFw" xml:space="preserve">
|
||||
<value>フレームワークの消去でエラーが発生しました</value>
|
||||
</data>
|
||||
<data name="FrameworkCacheCleared" xml:space="preserve">
|
||||
<value>フレームワークキャッシュを消去しました</value>
|
||||
</data>
|
||||
<data name="AllDone" xml:space="preserve">
|
||||
<value>すべて完了しました!</value>
|
||||
</data>
|
||||
<data name="FrameworkInstalled" xml:space="preserve">
|
||||
<value>フレームワークが正常にインストールされました</value>
|
||||
</data>
|
||||
<data name="FrameworkDirNotExist" xml:space="preserve">
|
||||
<value>フレームワークディレクトリが存在しません</value>
|
||||
</data>
|
||||
<data name="DecompilingDex" xml:space="preserve">
|
||||
<value>DEX をデコンパイル中</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedOutputFolderNotExist" xml:space="preserve">
|
||||
<value>選択した出力先フォルダーが存在しません。</value>
|
||||
</data>
|
||||
<data name="CompilingDex" xml:space="preserve">
|
||||
<value>DEX をコンパイル中</value>
|
||||
</data>
|
||||
<data name="DragDropNotSupported" xml:space="preserve">
|
||||
<value>管理者として実行中です。 ドラッグ & ドロップはサポートされていない可能性があります</value>
|
||||
</data>
|
||||
<data name="DragDropSupported" xml:space="preserve">
|
||||
<value>ドラッグ & ドロップはサポートされています</value>
|
||||
</data>
|
||||
<data name="ErrorNotAnApk" xml:space="preserve">
|
||||
<value>このディレクトリは Android パッケージではありません</value>
|
||||
</data>
|
||||
<data name="Baksmali" xml:space="preserve">
|
||||
<value>Baksmali</value>
|
||||
</data>
|
||||
<data name="Smali" xml:space="preserve">
|
||||
<value>Smali</value>
|
||||
</data>
|
||||
<data name="Zipalign" xml:space="preserve">
|
||||
<value>Zipalign</value>
|
||||
</data>
|
||||
<data name="CompileApk" xml:space="preserve">
|
||||
<value>APK をコンパイル</value>
|
||||
</data>
|
||||
<data name="CompileDex" xml:space="preserve">
|
||||
<value>DEX を組み立て</value>
|
||||
</data>
|
||||
<data name="DecompileApk" xml:space="preserve">
|
||||
<value>APK をデコンパイル</value>
|
||||
</data>
|
||||
<data name="DecompileDex" xml:space="preserve">
|
||||
<value>DEX を分解</value>
|
||||
</data>
|
||||
<data name="GetApkInfo" xml:space="preserve">
|
||||
<value>APK 情報を表示</value>
|
||||
</data>
|
||||
<data name="NotDecompiledApk" xml:space="preserve">
|
||||
<value>このフォルダーはデコンパイルされた APK ではありません</value>
|
||||
</data>
|
||||
<data name="NotDecompiledDex" xml:space="preserve">
|
||||
<value>このフォルダーはデコンパイルされた DEX ではありません</value>
|
||||
</data>
|
||||
<data name="RequiredFilesMissing" xml:space="preserve">
|
||||
<value>必要なファイルが見つかりません</value>
|
||||
</data>
|
||||
<data name="SignApk" xml:space="preserve">
|
||||
<value>APK を署名</value>
|
||||
</data>
|
||||
<data name="TextFile" xml:space="preserve">
|
||||
<value>テキストファイル</value>
|
||||
</data>
|
||||
<data name="ZipalignApk" xml:space="preserve">
|
||||
<value>APK を最適化</value>
|
||||
</data>
|
||||
<data name="CreateUnsignedApk" xml:space="preserve">
|
||||
<value>未署名の APK を作成</value>
|
||||
</data>
|
||||
<data name="MetainfNotExist" xml:space="preserve">
|
||||
<value>META-INF フォルダーがありません。 スキップしました</value>
|
||||
</data>
|
||||
<data name="ErrorGettingApkInfo" xml:space="preserve">
|
||||
<value>アプリ情報の取得中にエラーが発生しました</value>
|
||||
</data>
|
||||
<data name="InputDirectory" xml:space="preserve">
|
||||
<value>入力先のディレクトリ: {0}</value>
|
||||
</data>
|
||||
<data name="InputFile" xml:space="preserve">
|
||||
<value>入力ファイル: {0}</value>
|
||||
</data>
|
||||
<data name="DeleteFile" xml:space="preserve">
|
||||
<value>「{0}」のファイルを削除</value>
|
||||
</data>
|
||||
<data name="CopyFileToTemp" xml:space="preserve">
|
||||
<value>「{0}」のファイルを一時ディレクトリ「{1}」にコピーします</value>
|
||||
</data>
|
||||
<data name="CopyFolderToTemp" xml:space="preserve">
|
||||
<value>デコンパイルされた apk フォルダー「{0}」を一時ディレクトリの「{1}」コピーします</value>
|
||||
</data>
|
||||
<data name="DecodeDesDirExists" xml:space="preserve">
|
||||
<value>宛先のディレクトリ「{0}」は既に存在します。 上書きする場合は「宛先のディレクトリを強制的に削除」を有効化してください。</value>
|
||||
</data>
|
||||
<data name="MoveTempApkFileToOutput" xml:space="preserve">
|
||||
<value>一時フォルダー「{0}」を出力先ディレクトリ「{1}」に移動します</value>
|
||||
</data>
|
||||
<data name="MoveTempApkToOutput" xml:space="preserve">
|
||||
<value>一時 APK「{0}」を出力先ディレクトリ「{1}」に移動します</value>
|
||||
</data>
|
||||
<data name="ParsingApkInfo" xml:space="preserve">
|
||||
<value>APK 情報を解析中です...</value>
|
||||
</data>
|
||||
<data name="RestartApplicationPrompt" xml:space="preserve">
|
||||
<value>変更を適用するには再起動が必要です。 アプリを再起動しますか?</value>
|
||||
</data>
|
||||
<data name="DecompilingAllApkFiles" xml:space="preserve">
|
||||
<value>すべての APK ファイルをデコンパイル中</value>
|
||||
</data>
|
||||
<data name="DetectedAsBase" xml:space="preserve">
|
||||
<value>{0} がベースとして検出されました</value>
|
||||
</data>
|
||||
<data name="DetectedAsSplit" xml:space="preserve">
|
||||
<value>{0} が分割として検出されました</value>
|
||||
</data>
|
||||
<data name="ExtractingAllApkFiles" xml:space="preserve">
|
||||
<value>すべての APK ファイルを展開中</value>
|
||||
</data>
|
||||
<data name="MergeFinishedMoveDir" xml:space="preserve">
|
||||
<value>統合が完了しました。 ディレクトリを「{0}」に移動中です</value>
|
||||
</data>
|
||||
<data name="MergingApk" xml:space="preserve">
|
||||
<value>APK を統合中</value>
|
||||
</data>
|
||||
<data name="MovingBasedirectory" xml:space="preserve">
|
||||
<value>ベースディレクトリを「{0}」に移動中です</value>
|
||||
</data>
|
||||
<data name="DirNotExist" xml:space="preserve">
|
||||
<value>ディレクトリ「{0}」は存在しません</value>
|
||||
</data>
|
||||
<data name="TempDirectory" xml:space="preserve">
|
||||
<value>一時ディレクトリ: {0}</value>
|
||||
</data>
|
||||
<data name="ErrorMerging" xml:space="preserve">
|
||||
<value>統合に失敗しました</value>
|
||||
</data>
|
||||
<data name="MergingApkEditor" xml:space="preserve">
|
||||
<value>APKEditor.jar を使用して APK を統合する</value>
|
||||
</data>
|
||||
<data name="Aborted" xml:space="preserve">
|
||||
<value>中断しました</value>
|
||||
</data>
|
||||
<data name="CancelProcess" xml:space="preserve">
|
||||
<value>プロセスをキャンセルしますか?</value>
|
||||
</data>
|
||||
<data name="GettingDevices" xml:space="preserve">
|
||||
<value>デバイスを取得中です...</value>
|
||||
</data>
|
||||
<data name="PleaseWait" xml:space="preserve">
|
||||
<value>お待ちください...</value>
|
||||
</data>
|
||||
<data name="ConfirmKillingAdbServer" xml:space="preserve">
|
||||
<value>ADB サーバーを強制終了しますか? デバイスを再接続するか、エミュレーターを再起動する必要があるかもしれません</value>
|
||||
</data>
|
||||
<data name="DeviceNotSelected" xml:space="preserve">
|
||||
<value>デバイスが未選択です</value>
|
||||
</data>
|
||||
<data name="DeviceSelected" xml:space="preserve">
|
||||
<value>選択されたデバイス: {0}</value>
|
||||
</data>
|
||||
<data name="DevicesFound" xml:space="preserve">
|
||||
<value>{0} 件のデバイスを検出</value>
|
||||
</data>
|
||||
<data name="InstallApkFailed" xml:space="preserve">
|
||||
<value>APK のインストールに失敗しました</value>
|
||||
</data>
|
||||
<data name="InstallApkSuccessful" xml:space="preserve">
|
||||
<value>APK のインストールに成功しました</value>
|
||||
</data>
|
||||
<data name="InstallingApk" xml:space="preserve">
|
||||
<value>APK をインストール中</value>
|
||||
</data>
|
||||
<data name="InstallingApkPath" xml:space="preserve">
|
||||
<value>APK「{0}」をインストール中です</value>
|
||||
</data>
|
||||
<data name="NoDevicesFound" xml:space="preserve">
|
||||
<value>デバイスはありません。 adb デバイスが ON になっている状態でデバイスがコンピューターに接続されていることを確認してください。 エミュレーターを使用する場合は、再起動して起動まで待機します</value>
|
||||
</data>
|
||||
<data name="TimeEnded" xml:space="preserve">
|
||||
<value>終了時間: {0}</value>
|
||||
</data>
|
||||
<data name="TimeStarted" xml:space="preserve">
|
||||
<value>開始時間: {0}</value>
|
||||
</data>
|
||||
<data name="ClearFrameworkPrompt" xml:space="preserve">
|
||||
<value>予期しないエラーを回避するには、Apktook のバージョンを変更後にフレームワークキャッシュを消去する必要があります。 今すぐに消去しますか?</value>
|
||||
</data>
|
||||
<data name="ClearTempFolder" xml:space="preserve">
|
||||
<value>一時フォルダーを削除中</value>
|
||||
</data>
|
||||
<data name="DeletingFolder" xml:space="preserve">
|
||||
<value>削除するフォルダー: {0}</value>
|
||||
</data>
|
||||
<data name="DirectoryNotExist" xml:space="preserve">
|
||||
<value>ディレクトリ「{0}」は存在しません</value>
|
||||
</data>
|
||||
<data name="OpenComFolder" xml:space="preserve">
|
||||
<value>コンパイル出力先フォルダーを開く</value>
|
||||
</data>
|
||||
<data name="OpenDecFolder" xml:space="preserve">
|
||||
<value>デコンパイル出力先フォルダーを開く</value>
|
||||
</data>
|
||||
<data name="FixApktoolYml" xml:space="preserve">
|
||||
<value>apktool.yml を修正しました</value>
|
||||
</data>
|
||||
<data name="CopyFileTo" xml:space="preserve">
|
||||
<value>「{0}」のファイルを「{1}」にコピー</value>
|
||||
</data>
|
||||
<data name="SplitApkNotFound" xml:space="preserve">
|
||||
<value>分割 APK は未選択です</value>
|
||||
</data>
|
||||
<data name="CantDetectApkeditorVersion" xml:space="preserve">
|
||||
<value> APKEditor バージョンの検出ができません</value>
|
||||
</data>
|
||||
<data name="SetLanguageRestartApplication" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,429 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="About" xml:space="preserve">
|
||||
<value>Sobre</value>
|
||||
</data>
|
||||
<data name="Aligning" xml:space="preserve">
|
||||
<value>Alinhar</value>
|
||||
</data>
|
||||
<data name="AllDone" xml:space="preserve">
|
||||
<value>Tudo concluído!</value>
|
||||
</data>
|
||||
<data name="AndroidManifestNotExist" xml:space="preserve">
|
||||
<value>AndroidManifest.xml não existe</value>
|
||||
</data>
|
||||
<data name="APKSelected" xml:space="preserve">
|
||||
<value>APK selecionado:</value>
|
||||
</data>
|
||||
<data name="APKToolVersion" xml:space="preserve">
|
||||
<value>Versão do apktool</value>
|
||||
</data>
|
||||
<data name="Baksmali" xml:space="preserve">
|
||||
<value>Baksmali</value>
|
||||
</data>
|
||||
<data name="Build" xml:space="preserve">
|
||||
<value>Compilar</value>
|
||||
</data>
|
||||
<data name="CantDetectApktoolVersion" xml:space="preserve">
|
||||
<value>Não foi possível detectar a versão do apktool.</value>
|
||||
</data>
|
||||
<data name="ChangedTargetSdkTo29" xml:space="preserve">
|
||||
<value>SDK de destino alterado para 29</value>
|
||||
</data>
|
||||
<data name="CheckForUpdate" xml:space="preserve">
|
||||
<value>Verificar por atualizações</value>
|
||||
</data>
|
||||
<data name="ClearingFramework" xml:space="preserve">
|
||||
<value>Limpando framework</value>
|
||||
</data>
|
||||
<data name="CompileApk" xml:space="preserve">
|
||||
<value>Compilar APK</value>
|
||||
</data>
|
||||
<data name="CompileDex" xml:space="preserve">
|
||||
<value>Montar DEX</value>
|
||||
</data>
|
||||
<data name="CompilingDex" xml:space="preserve">
|
||||
<value>Compilando DEX</value>
|
||||
</data>
|
||||
<data name="CompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Compilado com sucesso. Pasta de saída: "{0}"</value>
|
||||
</data>
|
||||
<data name="CopyFileToTemp" xml:space="preserve">
|
||||
<value>Copiar arquivo "{0}" para pasta temporária "{1}"</value>
|
||||
</data>
|
||||
<data name="CopyFolderToTemp" xml:space="preserve">
|
||||
<value>Copiar pasta "{0}" do APK descompilado para pasta temporária "{1}"</value>
|
||||
</data>
|
||||
<data name="CreateUnsignedApk" xml:space="preserve">
|
||||
<value>Criando APK não assinado</value>
|
||||
</data>
|
||||
<data name="DebugMode" xml:space="preserve">
|
||||
<value>Modo de depuração</value>
|
||||
</data>
|
||||
<data name="Decode" xml:space="preserve">
|
||||
<value>Decodificar</value>
|
||||
</data>
|
||||
<data name="DecodeCouldNotCreate" xml:space="preserve">
|
||||
<value>A pasta de descompilação selecionada não pôde ser criado porque contém caracteres inválidos.</value>
|
||||
</data>
|
||||
<data name="DecodeDesDirExists" xml:space="preserve">
|
||||
<value>A pasta de destino "{0}" já existe. Ative "Forçar excluir pasta de destino" se quiser substituí-la.</value>
|
||||
</data>
|
||||
<data name="DecodeDirNotSelected" xml:space="preserve">
|
||||
<value>Pasta de descompilação não selecionada.</value>
|
||||
</data>
|
||||
<data name="DecodeSelectedFrameworkNotExist" xml:space="preserve">
|
||||
<value>A pasta do framework selecionado não existe.</value>
|
||||
</data>
|
||||
<data name="Decoding" xml:space="preserve">
|
||||
<value>Decodificando</value>
|
||||
</data>
|
||||
<data name="DecompileApk" xml:space="preserve">
|
||||
<value>Descompilar APK</value>
|
||||
</data>
|
||||
<data name="DecompiledAPKNotExist" xml:space="preserve">
|
||||
<value>A pasta do APK descompilado não existe</value>
|
||||
</data>
|
||||
<data name="DecompileDex" xml:space="preserve">
|
||||
<value>Desmontar DEX</value>
|
||||
</data>
|
||||
<data name="DecompilingDex" xml:space="preserve">
|
||||
<value>Descompilando DEX</value>
|
||||
</data>
|
||||
<data name="DecompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Descompilado com sucesso. Pasta de saída "{0}".</value>
|
||||
</data>
|
||||
<data name="DeleteFile" xml:space="preserve">
|
||||
<value>Excluir arquivo "{0}"</value>
|
||||
</data>
|
||||
<data name="Done" xml:space="preserve">
|
||||
<value>Concluído</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToInstallCM" xml:space="preserve">
|
||||
<value>Você realmente deseja instalar o menu de contexto?</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToRemoveCM" xml:space="preserve">
|
||||
<value>Você realmente deseja remover o menu de contexto?</value>
|
||||
</data>
|
||||
<data name="DragDropNotSupported" xml:space="preserve">
|
||||
<value>Você está executando como Administrador. Arrastar e soltar não é suportado</value>
|
||||
</data>
|
||||
<data name="DragDropSupported" xml:space="preserve">
|
||||
<value>Arrastar e soltar é suportado</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Erro</value>
|
||||
</data>
|
||||
<data name="ErrorClearingFw" xml:space="preserve">
|
||||
<value>Erro ao limpar o framework</value>
|
||||
</data>
|
||||
<data name="ErrorCompiling" xml:space="preserve">
|
||||
<value>Falha ao compilar</value>
|
||||
</data>
|
||||
<data name="ErrorDecompiling" xml:space="preserve">
|
||||
<value>Falha ao descompilar</value>
|
||||
</data>
|
||||
<data name="ErrorEnteringFrameworkTag" xml:space="preserve">
|
||||
<value>Erro ao entrar etiqueta do framework.</value>
|
||||
</data>
|
||||
<data name="ErrorGettingApkInfo" xml:space="preserve">
|
||||
<value>Ocorreu um erro ao obter as informações do APK</value>
|
||||
</data>
|
||||
<data name="ErrorJavaDetect" xml:space="preserve">
|
||||
<value>O Java não está instalado ou está instalado incorretamente. Instale o Java ou defina um local personalizado em Configurações</value>
|
||||
</data>
|
||||
<data name="ErrorNotAnApk" xml:space="preserve">
|
||||
<value>Esta pasta não é um pacote do Android</value>
|
||||
</data>
|
||||
<data name="ErrorReadSettings" xml:space="preserve">
|
||||
<value>Erro ao ler as configurações!</value>
|
||||
</data>
|
||||
<data name="ErrorSaveSettings" xml:space="preserve">
|
||||
<value>Erro ao salvar as configurações!</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFileNotExist" xml:space="preserve">
|
||||
<value>O arquivo selecionado não existe.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFolderNotExist" xml:space="preserve">
|
||||
<value>A pasta selecionada não existe.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedOutputFolderNotExist" xml:space="preserve">
|
||||
<value>A pasta de saída selecionada não existe.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkDirectory" xml:space="preserve">
|
||||
<value>Erro ao selecionar a pasta do framework.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkFile" xml:space="preserve">
|
||||
<value>Erro ao selecionar arquivo do framework. O arquivo não existe.</value>
|
||||
</data>
|
||||
<data name="ErrorSigning" xml:space="preserve">
|
||||
<value>Falha ao assinar.</value>
|
||||
</data>
|
||||
<data name="ErrorUpdateChecking" xml:space="preserve">
|
||||
<value>Erro ao verificar por atualizações:</value>
|
||||
</data>
|
||||
<data name="ErrorVersionParsing" xml:space="preserve">
|
||||
<value>Falha ao analisar a versão</value>
|
||||
</data>
|
||||
<data name="ErrorZipalign" xml:space="preserve">
|
||||
<value>Falha ao alinhar ZIP</value>
|
||||
</data>
|
||||
<data name="ExecutableFile" xml:space="preserve">
|
||||
<value>Arquivo executável</value>
|
||||
</data>
|
||||
<data name="Exit" xml:space="preserve">
|
||||
<value>Sair</value>
|
||||
</data>
|
||||
<data name="File" xml:space="preserve">
|
||||
<value>Arquivo</value>
|
||||
</data>
|
||||
<data name="FileNotFound" xml:space="preserve">
|
||||
<value>Arquivo não encontrado</value>
|
||||
</data>
|
||||
<data name="FixAndroidManifest" xml:space="preserve">
|
||||
<value>AndroidManifest.xml corigido</value>
|
||||
</data>
|
||||
<data name="FolderNotExist" xml:space="preserve">
|
||||
<value>A pasta não existe</value>
|
||||
</data>
|
||||
<data name="FrameworkCacheCleared" xml:space="preserve">
|
||||
<value>Cache do framework limpo</value>
|
||||
</data>
|
||||
<data name="FrameworkDirNotExist" xml:space="preserve">
|
||||
<value>A pasta do framework não existe</value>
|
||||
</data>
|
||||
<data name="FrameworkInstallationNotStarted" xml:space="preserve">
|
||||
<value>Erro: A instalação do framewoek não foi iniciada.</value>
|
||||
</data>
|
||||
<data name="FrameworkInstalled" xml:space="preserve">
|
||||
<value>Framework instalado com sucesso</value>
|
||||
</data>
|
||||
<data name="GetApkInfo" xml:space="preserve">
|
||||
<value>Obter informações do APK</value>
|
||||
</data>
|
||||
<data name="Help" xml:space="preserve">
|
||||
<value>Ajuda</value>
|
||||
</data>
|
||||
<data name="InputDirectory" xml:space="preserve">
|
||||
<value>Pasta de entrada: {0}</value>
|
||||
</data>
|
||||
<data name="InputFile" xml:space="preserve">
|
||||
<value>Arquivo de entrada: {0}</value>
|
||||
</data>
|
||||
<data name="InstallFramework" xml:space="preserve">
|
||||
<value>Instalar framework</value>
|
||||
</data>
|
||||
<data name="InstallingFramework" xml:space="preserve">
|
||||
<value>Instalando framework</value>
|
||||
</data>
|
||||
<data name="MainActivityFound" xml:space="preserve">
|
||||
<value>MainActivity encontrado em "{0}"</value>
|
||||
</data>
|
||||
<data name="MainActivityNotFoundPleaseFindManually" xml:space="preserve">
|
||||
<value>Não foi possível localizar MainActivity. Por favor, encontre-o manualmente.</value>
|
||||
</data>
|
||||
<data name="MetainfNotExist" xml:space="preserve">
|
||||
<value>A pasta META-INF não existe. Ignorado</value>
|
||||
</data>
|
||||
<data name="MoveTempApkFileToOutput" xml:space="preserve">
|
||||
<value>Mova a pasta temporária "{0}" para a pasta de saída "{1}"</value>
|
||||
</data>
|
||||
<data name="MoveTempApkToOutput" xml:space="preserve">
|
||||
<value>Mover o APK temporário "{0}" para a pasta de saída "{1}"</value>
|
||||
</data>
|
||||
<data name="NeedRestart" xml:space="preserve">
|
||||
<value>Para que as alterações entrem em vigor, você deve reiniciar o programa. Você quer fazer isso agora?</value>
|
||||
</data>
|
||||
<data name="NotDecompiledApk" xml:space="preserve">
|
||||
<value>Esta pasta não é um APK descompilado</value>
|
||||
</data>
|
||||
<data name="NotDecompiledDex" xml:space="preserve">
|
||||
<value>Esta pasta não é um DEX descompilado</value>
|
||||
</data>
|
||||
<data name="RemoveApkToolDummies" xml:space="preserve">
|
||||
<value>Removidos todos os dummies do apktool</value>
|
||||
</data>
|
||||
<data name="RequiredFilesMissing" xml:space="preserve">
|
||||
<value>Arquivos necessários ausentes</value>
|
||||
</data>
|
||||
<data name="Settings" xml:space="preserve">
|
||||
<value>Configurações</value>
|
||||
</data>
|
||||
<data name="Sign" xml:space="preserve">
|
||||
<value>Assinar</value>
|
||||
</data>
|
||||
<data name="SignApk" xml:space="preserve">
|
||||
<value>Assinar APK</value>
|
||||
</data>
|
||||
<data name="Signing" xml:space="preserve">
|
||||
<value>Assinando</value>
|
||||
</data>
|
||||
<data name="SignInputFileNotFound" xml:space="preserve">
|
||||
<value>Arquivo de entrada não localizado.</value>
|
||||
</data>
|
||||
<data name="SignPrivateKeyNotFound" xml:space="preserve">
|
||||
<value>Chave privada não localizada.</value>
|
||||
</data>
|
||||
<data name="SignPublicKeyNotFound" xml:space="preserve">
|
||||
<value>Chave pública não localizada.</value>
|
||||
</data>
|
||||
<data name="SignSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Assinatura concluída com sucesso. Arquivo salvo em "{0}".</value>
|
||||
</data>
|
||||
<data name="Smali" xml:space="preserve">
|
||||
<value>Smali</value>
|
||||
</data>
|
||||
<data name="SystemLanguage" xml:space="preserve">
|
||||
<value>Idioma do sistema</value>
|
||||
</data>
|
||||
<data name="TextFile" xml:space="preserve">
|
||||
<value>Arquivo de texto</value>
|
||||
</data>
|
||||
<data name="UpdateNewVersion" xml:space="preserve">
|
||||
<value>Nova versão disponível. Deseja atualizar?</value>
|
||||
</data>
|
||||
<data name="UpdateNoUpdates" xml:space="preserve">
|
||||
<value>Nenhuma atualização está disponível.</value>
|
||||
</data>
|
||||
<data name="WarningDecodingFolderNotSelected" xml:space="preserve">
|
||||
<value>Pasta de decodificação não selecionada!</value>
|
||||
</data>
|
||||
<data name="WarningFileForDecodingNotSelected" xml:space="preserve">
|
||||
<value>Arquivo para decodificação não selecionado!</value>
|
||||
</data>
|
||||
<data name="WarningFileForSigningNotSelected" xml:space="preserve">
|
||||
<value>Arquivo para assinar não selecionado!</value>
|
||||
</data>
|
||||
<data name="WarningFrameworkNotSelected" xml:space="preserve">
|
||||
<value>Framework não selecionado!</value>
|
||||
</data>
|
||||
<data name="Zipalign" xml:space="preserve">
|
||||
<value>Alinhar ZIP</value>
|
||||
</data>
|
||||
<data name="ZipalignApk" xml:space="preserve">
|
||||
<value>Alinhar ZIP do APK</value>
|
||||
</data>
|
||||
<data name="ZipalignFileSavedTo" xml:space="preserve">
|
||||
<value>Alinhar ZIP concluído com sucesso. Arquivo salvo em "{0}"</value>
|
||||
</data>
|
||||
<data name="ZIPArchives" xml:space="preserve">
|
||||
<value>Arquivos ZIP</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
@@ -142,7 +142,7 @@
|
||||
<value>Settings</value>
|
||||
</data>
|
||||
<data name="ErrorJavaDetect" xml:space="preserve">
|
||||
<value>Java is not installed or is installed incorrectly. The program will be closed.</value>
|
||||
<value>Java is not installed or is installed incorrectly. Please install Java or set custom location in Settings</value>
|
||||
</data>
|
||||
<data name="ErrorReadSettings" xml:space="preserve">
|
||||
<value>Error reading settings!</value>
|
||||
@@ -204,9 +204,6 @@
|
||||
<data name="Done" xml:space="preserve">
|
||||
<value>Done</value>
|
||||
</data>
|
||||
<data name="DoYouWantToSelectJavaLocation" xml:space="preserve">
|
||||
<value>Java is not found. Do you want to select custom location?</value>
|
||||
</data>
|
||||
<data name="CantDetectApktoolVersion" xml:space="preserve">
|
||||
<value>Can't detect apktool version.</value>
|
||||
</data>
|
||||
@@ -346,7 +343,7 @@
|
||||
<value>Compiling dex</value>
|
||||
</data>
|
||||
<data name="DragDropNotSupported" xml:space="preserve">
|
||||
<value>You are running as administrator. Drag & drop is not supported</value>
|
||||
<value>You are running as administrator. Drag & drop may not be supported</value>
|
||||
</data>
|
||||
<data name="DragDropSupported" xml:space="preserve">
|
||||
<value>Drag & drop is supported</value>
|
||||
@@ -376,7 +373,7 @@
|
||||
<value>Disassemble DEX</value>
|
||||
</data>
|
||||
<data name="GetApkInfo" xml:space="preserve">
|
||||
<value>Get APK Info</value>
|
||||
<value>View APK Info</value>
|
||||
</data>
|
||||
<data name="NotDecompiledApk" xml:space="preserve">
|
||||
<value>This folder is not a decompiled APK</value>
|
||||
@@ -402,4 +399,805 @@
|
||||
<data name="MetainfNotExist" xml:space="preserve">
|
||||
<value>META-INF folder does not exist. Skipped</value>
|
||||
</data>
|
||||
<data name="ErrorGettingApkInfo" xml:space="preserve">
|
||||
<value>There was an error getting APK infomation</value>
|
||||
</data>
|
||||
<data name="InputDirectory" xml:space="preserve">
|
||||
<value>Input directory: {0}</value>
|
||||
</data>
|
||||
<data name="InputFile" xml:space="preserve">
|
||||
<value>Input file: {0}</value>
|
||||
</data>
|
||||
<data name="DeleteFile" xml:space="preserve">
|
||||
<value>Delete file "{0}"</value>
|
||||
</data>
|
||||
<data name="CopyFileToTemp" xml:space="preserve">
|
||||
<value>Copy file "{0}" to temp directory "{1}"</value>
|
||||
</data>
|
||||
<data name="CopyFolderToTemp" xml:space="preserve">
|
||||
<value>Copy decompiled apk folder "{0}" to temp directory "{1}"</value>
|
||||
</data>
|
||||
<data name="DecodeDesDirExists" xml:space="preserve">
|
||||
<value>Destination directory "{0}" already exists. Enable "Force delete destination directory" if you want to overwrite it.</value>
|
||||
</data>
|
||||
<data name="MoveTempApkFileToOutput" xml:space="preserve">
|
||||
<value>Move temp folder "{0}" to output directory "{1}"</value>
|
||||
</data>
|
||||
<data name="MoveTempApkToOutput" xml:space="preserve">
|
||||
<value>Move temp apk "{0}" to output directory "{1}"</value>
|
||||
</data>
|
||||
<data name="ParsingApkInfo" xml:space="preserve">
|
||||
<value>Parsing APK Info...</value>
|
||||
</data>
|
||||
<data name="RestartApplicationPrompt" xml:space="preserve">
|
||||
<value>Restart is required to apply changes. Do you want to restart the application?</value>
|
||||
</data>
|
||||
<data name="DecompilingAllApkFiles" xml:space="preserve">
|
||||
<value>Decompiling all APK files</value>
|
||||
</data>
|
||||
<data name="DetectedAsBase" xml:space="preserve">
|
||||
<value>{0} detected as base</value>
|
||||
</data>
|
||||
<data name="DetectedAsSplit" xml:space="preserve">
|
||||
<value>{0} detected as split</value>
|
||||
</data>
|
||||
<data name="ExtractingAllApkFiles" xml:space="preserve">
|
||||
<value>Extracting all APK files</value>
|
||||
</data>
|
||||
<data name="MergeFinishedMoveDir" xml:space="preserve">
|
||||
<value>Merge finished. Moving directory to "{0}"</value>
|
||||
</data>
|
||||
<data name="MergingApk" xml:space="preserve">
|
||||
<value>Merging APK</value>
|
||||
</data>
|
||||
<data name="MovingBasedirectory" xml:space="preserve">
|
||||
<value>Moving base directory to "{0}"</value>
|
||||
</data>
|
||||
<data name="DirNotExist" xml:space="preserve">
|
||||
<value>Directory "{0}" does not exist</value>
|
||||
</data>
|
||||
<data name="TempDirectory" xml:space="preserve">
|
||||
<value>Temp directory: "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorMerging" xml:space="preserve">
|
||||
<value>Merging failed</value>
|
||||
</data>
|
||||
<data name="MergingApkEditor" xml:space="preserve">
|
||||
<value>Merging APK using APKEditor.jar</value>
|
||||
</data>
|
||||
<data name="Aborted" xml:space="preserve">
|
||||
<value>Aborted</value>
|
||||
</data>
|
||||
<data name="CancelProcess" xml:space="preserve">
|
||||
<value>Are you sure you want to cancel the process?</value>
|
||||
</data>
|
||||
<data name="GettingDevices" xml:space="preserve">
|
||||
<value>Getting devices...</value>
|
||||
</data>
|
||||
<data name="PleaseWait" xml:space="preserve">
|
||||
<value>Please wait...</value>
|
||||
</data>
|
||||
<data name="ConfirmKillingAdbServer" xml:space="preserve">
|
||||
<value>Are you sure you want to kill ADB server? You might need to reconnect your device or restart emulator</value>
|
||||
</data>
|
||||
<data name="DeviceNotSelected" xml:space="preserve">
|
||||
<value>Device is not selected</value>
|
||||
</data>
|
||||
<data name="DeviceSelected" xml:space="preserve">
|
||||
<value>Device selected "{0}"</value>
|
||||
</data>
|
||||
<data name="DevicesFound" xml:space="preserve">
|
||||
<value>{0} devices found</value>
|
||||
</data>
|
||||
<data name="InstallApkFailed" xml:space="preserve">
|
||||
<value>APK Installation failed</value>
|
||||
</data>
|
||||
<data name="InstallApkSuccessful" xml:space="preserve">
|
||||
<value>APK Installation successfully</value>
|
||||
</data>
|
||||
<data name="InstallingApk" xml:space="preserve">
|
||||
<value>Installing APK</value>
|
||||
</data>
|
||||
<data name="InstallingApkPath" xml:space="preserve">
|
||||
<value>Installing APK "{0}"</value>
|
||||
</data>
|
||||
<data name="NoDevicesFound" xml:space="preserve">
|
||||
<value>No devices found. Make sure your device is connected to the computer with the adb debugging turned on. If you use an emulator, restart it and wait until it boot up</value>
|
||||
</data>
|
||||
<data name="TimeEnded" xml:space="preserve">
|
||||
<value>Time ended: {0}</value>
|
||||
</data>
|
||||
<data name="TimeStarted" xml:space="preserve">
|
||||
<value>Time started: {0}</value>
|
||||
</data>
|
||||
<data name="ClearFrameworkPrompt" xml:space="preserve">
|
||||
<value>It is required to clear framework cache after changing Apktool version to avoid unexpected errors. Do you want to clear it now?</value>
|
||||
</data>
|
||||
<data name="ClearTempFolder" xml:space="preserve">
|
||||
<value>Clearing temp folder</value>
|
||||
</data>
|
||||
<data name="DeletingFolder" xml:space="preserve">
|
||||
<value>Deleting folder: {0}</value>
|
||||
</data>
|
||||
<data name="DirectoryNotExist" xml:space="preserve">
|
||||
<value>The directory "{0}" does not exist</value>
|
||||
</data>
|
||||
<data name="OpenComFolder" xml:space="preserve">
|
||||
<value>Open compile output folder</value>
|
||||
</data>
|
||||
<data name="OpenDecFolder" xml:space="preserve">
|
||||
<value>Open decompile output folder</value>
|
||||
</data>
|
||||
<data name="FixApktoolYml" xml:space="preserve">
|
||||
<value>Fixed apktool.yml</value>
|
||||
</data>
|
||||
<data name="CopyFileTo" xml:space="preserve">
|
||||
<value>Copy file "{0}" to "{1}"</value>
|
||||
</data>
|
||||
<data name="SplitApkNotFound" xml:space="preserve">
|
||||
<value>Split APK is not selected</value>
|
||||
</data>
|
||||
<data name="CantDetectApkeditorVersion" xml:space="preserve">
|
||||
<value>Can't detect APKEditor version</value>
|
||||
</data>
|
||||
<data name="SetLanguageRestartApplication" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="AboutVersion" xml:space="preserve">
|
||||
<value>Version</value>
|
||||
</data>
|
||||
<data name="AboutCopyright" xml:space="preserve">
|
||||
<value>Copyright</value>
|
||||
</data>
|
||||
<data name="AboutGithubRepo" xml:space="preserve">
|
||||
<value>Github Repo</value>
|
||||
</data>
|
||||
<data name="AboutOK" xml:space="preserve">
|
||||
<value>OK</value>
|
||||
</data>
|
||||
<data name="SettingsGeneral" xml:space="preserve">
|
||||
<value>General</value>
|
||||
</data>
|
||||
<data name="SettingsLanguage" xml:space="preserve">
|
||||
<value>Language</value>
|
||||
</data>
|
||||
<data name="SettingsContextMenu" xml:space="preserve">
|
||||
<value>Context menu</value>
|
||||
</data>
|
||||
<data name="SettingsTheme" xml:space="preserve">
|
||||
<value>Theme</value>
|
||||
</data>
|
||||
<data name="SettingsTempNote" xml:space="preserve">
|
||||
<value>The process will be slower since files will be moved to temp folder </value>
|
||||
</data>
|
||||
<data name="SettingsAdminRights" xml:space="preserve">
|
||||
<value>Administrator rights required</value>
|
||||
</data>
|
||||
<data name="SettingsClearLog" xml:space="preserve">
|
||||
<value>Clear log before action</value>
|
||||
</data>
|
||||
<data name="SettingsPlaySound" xml:space="preserve">
|
||||
<value>Play sound when done</value>
|
||||
</data>
|
||||
<data name="SettingsCustomTemp" xml:space="preserve">
|
||||
<value>Custom temp location</value>
|
||||
</data>
|
||||
<data name="SettingsCustomJava" xml:space="preserve">
|
||||
<value>Custom Java location</value>
|
||||
</data>
|
||||
<data name="SettingsUtf8" xml:space="preserve">
|
||||
<value>UTF-8 filename support</value>
|
||||
</data>
|
||||
<data name="SettingsCustomJvmArgs" xml:space="preserve">
|
||||
<value>Custom JVM arguments</value>
|
||||
</data>
|
||||
<data name="SettingsCheckUpdate" xml:space="preserve">
|
||||
<value>Check for updates at startup</value>
|
||||
</data>
|
||||
<data name="SettingsCustomApktool" xml:space="preserve">
|
||||
<value>Custom apktool location</value>
|
||||
</data>
|
||||
<data name="SettingsIgnoreOutputCM" xml:space="preserve">
|
||||
<value>Ignore custom output directory for context menu</value>
|
||||
</data>
|
||||
<data name="SettingsInstall" xml:space="preserve">
|
||||
<value>Install</value>
|
||||
</data>
|
||||
<data name="SettingsUninstall" xml:space="preserve">
|
||||
<value>Uninstall</value>
|
||||
</data>
|
||||
<data name="SettingsCancel" xml:space="preserve">
|
||||
<value>Cancel</value>
|
||||
</data>
|
||||
<data name="ThemeAuto" xml:space="preserve">
|
||||
<value>Auto</value>
|
||||
</data>
|
||||
<data name="ThemeLight" xml:space="preserve">
|
||||
<value>Light</value>
|
||||
</data>
|
||||
<data name="ThemeDark" xml:space="preserve">
|
||||
<value>Dark</value>
|
||||
</data>
|
||||
<data name="splitApkTxt.Text" xml:space="preserve">
|
||||
<value>Merge split APK into single APK:</value>
|
||||
</data>
|
||||
<data name="selSplitApkBtn.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="mergeApkBtn.Text" xml:space="preserve">
|
||||
<value>Merge</value>
|
||||
</data>
|
||||
<data name="comApkOpenDir.Text" xml:space="preserve">
|
||||
<value>Compiled APK location</value>
|
||||
</data>
|
||||
<data name="decOutOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>Decompile output location</value>
|
||||
</data>
|
||||
<data name="signApkOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>Sign APK location</value>
|
||||
</data>
|
||||
<data name="alignApkOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>Zipalign APK location</value>
|
||||
</data>
|
||||
<data name="decApkOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>Decompiled APK location</value>
|
||||
</data>
|
||||
<data name="compileOutputOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>Compile output location</value>
|
||||
</data>
|
||||
<data name="button_OpenMainActivity.Text" xml:space="preserve">
|
||||
<value>Main activity smali</value>
|
||||
</data>
|
||||
<data name="openApktoolYmlBtn.Text" xml:space="preserve">
|
||||
<value>Apktool.yml</value>
|
||||
</data>
|
||||
<data name="openAndroidMainfestBtn.Text" xml:space="preserve">
|
||||
<value>AndroidManifest.xml</value>
|
||||
</data>
|
||||
<data name="label4.Text" xml:space="preserve">
|
||||
<value>APK File to sign:</value>
|
||||
</data>
|
||||
<data name="button_SIGN_BrowseInputFile.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="button_SIGN_Sign.Text" xml:space="preserve">
|
||||
<value>Sign</value>
|
||||
</data>
|
||||
<data name="label3.Text" xml:space="preserve">
|
||||
<value>APK file to align:</value>
|
||||
</data>
|
||||
<data name="button_ZIPALIGN_Align.Text" xml:space="preserve">
|
||||
<value>Align</value>
|
||||
</data>
|
||||
<data name="button_ZIPALIGN_BrowseInputFile.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="label2.Text" xml:space="preserve">
|
||||
<value>Decompiled APK folder:</value>
|
||||
</data>
|
||||
<data name="button_BUILD_BrowseInputProjectDir.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="button_BUILD_Build.Text" xml:space="preserve">
|
||||
<value>Compile</value>
|
||||
</data>
|
||||
<data name="label1.Text" xml:space="preserve">
|
||||
<value>APK/XAPK/APKS/ZIP/APKM File:</value>
|
||||
</data>
|
||||
<data name="button_DECODE_Decode.Text" xml:space="preserve">
|
||||
<value>Decompile</value>
|
||||
</data>
|
||||
<data name="button_DECODE_BrowseInputAppPath.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="tabPageMain.Text" xml:space="preserve">
|
||||
<value>Main</value>
|
||||
</data>
|
||||
<data name="sigTxtBox.Text" xml:space="preserve">
|
||||
<value></value>
|
||||
</data>
|
||||
<data name="label5.Text" xml:space="preserve">
|
||||
<value>Signature:</value>
|
||||
</data>
|
||||
<data name="label31.Text" xml:space="preserve">
|
||||
<value>Launch activity:</value>
|
||||
</data>
|
||||
<data name="label30.Text" xml:space="preserve">
|
||||
<value>Architectures:</value>
|
||||
</data>
|
||||
<data name="apkMirrorLinkBtn.Text" xml:space="preserve">
|
||||
<value>Apk Mirror</value>
|
||||
</data>
|
||||
<data name="apkSupportLinkBtn.Text" xml:space="preserve">
|
||||
<value>Apk.support</value>
|
||||
</data>
|
||||
<data name="apkGkLinkBtn.Text" xml:space="preserve">
|
||||
<value>ApkGk</value>
|
||||
</data>
|
||||
<data name="label17.Text" xml:space="preserve">
|
||||
<value>File:</value>
|
||||
</data>
|
||||
<data name="localsTxtBox.Text" xml:space="preserve">
|
||||
<value></value>
|
||||
</data>
|
||||
<data name="selApkFileInfoBtn.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="label18.Text" xml:space="preserve">
|
||||
<value>Locals: </value>
|
||||
</data>
|
||||
<data name="permTxtBox.Text" xml:space="preserve">
|
||||
<value></value>
|
||||
</data>
|
||||
<data name="apkComboLinkBtn.Text" xml:space="preserve">
|
||||
<value>ApkCombo</value>
|
||||
</data>
|
||||
<data name="label15.Text" xml:space="preserve">
|
||||
<value>Permissions: </value>
|
||||
</data>
|
||||
<data name="label14.Text" xml:space="preserve">
|
||||
<value>Densities: </value>
|
||||
</data>
|
||||
<data name="apkPureLinkBtn.Text" xml:space="preserve">
|
||||
<value>ApkPure</value>
|
||||
</data>
|
||||
<data name="psLinkBtn.Text" xml:space="preserve">
|
||||
<value>Play Store</value>
|
||||
</data>
|
||||
<data name="label19.Text" xml:space="preserve">
|
||||
<value>Links:</value>
|
||||
</data>
|
||||
<data name="label7.Text" xml:space="preserve">
|
||||
<value>App name:</value>
|
||||
</data>
|
||||
<data name="label9.Text" xml:space="preserve">
|
||||
<value>Package name:</value>
|
||||
</data>
|
||||
<data name="label8.Text" xml:space="preserve">
|
||||
<value>Version:</value>
|
||||
</data>
|
||||
<data name="label11.Text" xml:space="preserve">
|
||||
<value>Min. SDK</value>
|
||||
</data>
|
||||
<data name="label10.Text" xml:space="preserve">
|
||||
<value>Build:</value>
|
||||
</data>
|
||||
<data name="label13.Text" xml:space="preserve">
|
||||
<value>Screen sizes: </value>
|
||||
</data>
|
||||
<data name="label12.Text" xml:space="preserve">
|
||||
<value>Target SDK:</value>
|
||||
</data>
|
||||
<data name="basicInfoTabPage.Text" xml:space="preserve">
|
||||
<value>Basic info</value>
|
||||
</data>
|
||||
<data name="fullInfoTextBox.Text" xml:space="preserve">
|
||||
<value></value>
|
||||
</data>
|
||||
<data name="tabPageApkInfo.Text" xml:space="preserve">
|
||||
<value>APK Info</value>
|
||||
</data>
|
||||
<data name="checkBox3.Text" xml:space="preserve">
|
||||
<value>Set the number of threads to use.</value>
|
||||
</data>
|
||||
<data name="checkBox7.Text" xml:space="preserve">
|
||||
<value>Don't parse APK info when selecting APK for decompiling</value>
|
||||
</data>
|
||||
<data name="decSetApiLvlChkBox.Text" xml:space="preserve">
|
||||
<value>Set API level of the file to generate, e.g. 14 for ICS.</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_FixError.Text" xml:space="preserve">
|
||||
<value>Fix ApkTool errors after decompile</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_OnlyMainClasses.Text" xml:space="preserve">
|
||||
<value>Only disassemble the main dex classes (classes[0-9]*.dex) in the root. (<2.12.1)</value>
|
||||
</data>
|
||||
<data name="button_DECODE_BrowseOutputDirectory.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_UseFramework.Text" xml:space="preserve">
|
||||
<value>Uses framework files located in:</value>
|
||||
</data>
|
||||
<data name="button_DECODE_BrowseFrameDir.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_MatchOriginal.Text" xml:space="preserve">
|
||||
<value>Keeps files to closest to original as possible. Prevents rebuild.</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_OutputDirectory.Text" xml:space="preserve">
|
||||
<value>Output directory:</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_KeepBrokenRes.Text" xml:space="preserve">
|
||||
<value>Keep broken resource.</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoSrc.Text" xml:space="preserve">
|
||||
<value>Do not decode sources.</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_Force.Text" xml:space="preserve">
|
||||
<value>Force delete destination directory.</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoRes.Text" xml:space="preserve">
|
||||
<value>Do not decode resources.</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoDebugInfo.Text" xml:space="preserve">
|
||||
<value>Don't write out debug info (.local, .param, .line, etc.)</value>
|
||||
</data>
|
||||
<data name="groupBox_DECODE_Options.Text" xml:space="preserve">
|
||||
<value>Options</value>
|
||||
</data>
|
||||
<data name="tabPageDecode.Text" xml:space="preserve">
|
||||
<value>Decode</value>
|
||||
</data>
|
||||
<data name="checkBox4.Text" xml:space="preserve">
|
||||
<value>Set the number of threads to use.</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_NetSecConf.Text" xml:space="preserve">
|
||||
<value>Add a generic Network Security Configuration file in the output APK</value>
|
||||
</data>
|
||||
<data name="useAapt2ChkBox.Text" xml:space="preserve">
|
||||
<value>Use aapt2 (Upgrades apktool to use experimental aapt2 binary.) (< 2.11.1)</value>
|
||||
</data>
|
||||
<data name="buildSetApiLvlChkBox.Text" xml:space="preserve">
|
||||
<value>Set API level of the file to generate, e.g. 14 for ICS.</value>
|
||||
</data>
|
||||
<data name="createUnsignApkChkBox.Text" xml:space="preserve">
|
||||
<value>Create unsigned APK with original signature after build</value>
|
||||
</data>
|
||||
<data name="signAfterBuildChkBox.Text" xml:space="preserve">
|
||||
<value>Sign after build / zipalign</value>
|
||||
</data>
|
||||
<data name="zipalignAfterBuildChkBox.Text" xml:space="preserve">
|
||||
<value>Zipalign after build</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_NoCrunch.Text" xml:space="preserve">
|
||||
<value>Disable crunching of resource files during the build step.</value>
|
||||
</data>
|
||||
<data name="button_BUILD_BrowseOutputAppPath.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_ForceAll.Text" xml:space="preserve">
|
||||
<value>Skip changes detection and build all files.</value>
|
||||
</data>
|
||||
<data name="button_BUILD_BrowseFrameDir.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="button_BUILD_BrowseAaptPath.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_OutputAppPath.Text" xml:space="preserve">
|
||||
<value>APK output directory:</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_CopyOriginal.Text" xml:space="preserve">
|
||||
<value>Copy original AndroidManifest.xml and META-INF folder</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_UseAapt.Text" xml:space="preserve">
|
||||
<value>Uses aapt.exe located in:</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_UseFramework.Text" xml:space="preserve">
|
||||
<value>Uses framework files located in:</value>
|
||||
</data>
|
||||
<data name="groupBox_BUILD_Options.Text" xml:space="preserve">
|
||||
<value>Options</value>
|
||||
</data>
|
||||
<data name="tabPageBuild.Text" xml:space="preserve">
|
||||
<value>Build</value>
|
||||
</data>
|
||||
<data name="label23.Text" xml:space="preserve">
|
||||
<value>Private key password:</value>
|
||||
</data>
|
||||
<data name="checkBox2.Text" xml:space="preserve">
|
||||
<value>Install APK after signing (Make sure the device is selected in ADB tab first)</value>
|
||||
</data>
|
||||
<data name="checkBox1.Text" xml:space="preserve">
|
||||
<value>Overwrite input file</value>
|
||||
</data>
|
||||
<data name="autoDelIdsigChkBox.Text" xml:space="preserve">
|
||||
<value>Auto delete idsig file</value>
|
||||
</data>
|
||||
<data name="label27.Text" xml:space="preserve">
|
||||
<value>Scheme v4:</value>
|
||||
</data>
|
||||
<data name="label26.Text" xml:space="preserve">
|
||||
<value>Scheme v3:</value>
|
||||
</data>
|
||||
<data name="label25.Text" xml:space="preserve">
|
||||
<value>Scheme v2:</value>
|
||||
</data>
|
||||
<data name="label24.Text" xml:space="preserve">
|
||||
<value>Scheme v1:</value>
|
||||
</data>
|
||||
<data name="selectKeyStoreFileBtn.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="useAliasChkBox.Text" xml:space="preserve">
|
||||
<value>Alias:</value>
|
||||
</data>
|
||||
<data name="label22.Text" xml:space="preserve">
|
||||
<value>It is strongly recommended that you use your own key, created via Android Studio or other tools</value>
|
||||
</data>
|
||||
<data name="label21.Text" xml:space="preserve">
|
||||
<value>Password:</value>
|
||||
</data>
|
||||
<data name="label20.Text" xml:space="preserve">
|
||||
<value>keystore/jks file:</value>
|
||||
</data>
|
||||
<data name="useKeyStoreChkBox.Text" xml:space="preserve">
|
||||
<value>Use keystore</value>
|
||||
</data>
|
||||
<data name="useSigningOutputDir.Text" xml:space="preserve">
|
||||
<value>APK output directory:</value>
|
||||
</data>
|
||||
<data name="label_SIGN_PrivateKey.Text" xml:space="preserve">
|
||||
<value>Private key:</value>
|
||||
</data>
|
||||
<data name="label_SIGN_PublicKey.Text" xml:space="preserve">
|
||||
<value>Public key:</value>
|
||||
</data>
|
||||
<data name="button_SIGN_BrowseOutputFile.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="button_SIGN_BrowsePublicKey.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="button_SIGN_BrowsePrivateKey.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="groupBox_SIGN_Options.Text" xml:space="preserve">
|
||||
<value>Options</value>
|
||||
</data>
|
||||
<data name="tabPageSign.Text" xml:space="preserve">
|
||||
<value>Sign</value>
|
||||
</data>
|
||||
<data name="zipalignOutputDirChkBox.Text" xml:space="preserve">
|
||||
<value>APK output directory:</value>
|
||||
</data>
|
||||
<data name="signAfterZipalignChkBox.Text" xml:space="preserve">
|
||||
<value>Sign after zipalign</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_Recompress.Text" xml:space="preserve">
|
||||
<value>Recompress using Zopfli</value>
|
||||
</data>
|
||||
<data name="label_ZIPALIGN_AlignmentBytes.Text" xml:space="preserve">
|
||||
<value>Alignment in bytes, e.g. '4' provides 32-bit alignment</value>
|
||||
</data>
|
||||
<data name="button_ZIPALIGN_BrowseOutputFile.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_CheckAlignment.Text" xml:space="preserve">
|
||||
<value>Check alignment only (does not modify file)</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_VerboseOutput.Text" xml:space="preserve">
|
||||
<value>Verbose output</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_OverwriteOutputFile.Text" xml:space="preserve">
|
||||
<value>Overwrite existing output file</value>
|
||||
</data>
|
||||
<data name="groupBox_ZIPALIGN_Options.Text" xml:space="preserve">
|
||||
<value>Options</value>
|
||||
</data>
|
||||
<data name="tabPageZipAlign.Text" xml:space="preserve">
|
||||
<value>Zip align</value>
|
||||
</data>
|
||||
<data name="openFwFolderBtn.Text" xml:space="preserve">
|
||||
<value>Open framework folder</value>
|
||||
</data>
|
||||
<data name="clearFwBtn.Text" xml:space="preserve">
|
||||
<value>Clear framework</value>
|
||||
</data>
|
||||
<data name="clearFwBeforeDecodeChkBox.Text" xml:space="preserve">
|
||||
<value>Clear framework before decompiling</value>
|
||||
</data>
|
||||
<data name="groupBox1.Text" xml:space="preserve">
|
||||
<value>Options</value>
|
||||
</data>
|
||||
<data name="checkBox_IF_Tag.Text" xml:space="preserve">
|
||||
<value>Tag frameworks using:</value>
|
||||
</data>
|
||||
<data name="checkBox_IF_FramePath.Text" xml:space="preserve">
|
||||
<value>Stores framework files into:</value>
|
||||
</data>
|
||||
<data name="button_IF_InstallFramework.Text" xml:space="preserve">
|
||||
<value>Install</value>
|
||||
</data>
|
||||
<data name="button_IF_BrowseFrameDir.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="button_IF_BrowseInputFramePath.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="groupBox_IF_Options.Text" xml:space="preserve">
|
||||
<value>Install Framework</value>
|
||||
</data>
|
||||
<data name="tabPageInstallFramework.Text" xml:space="preserve">
|
||||
<value>Framework</value>
|
||||
</data>
|
||||
<data name="label29.Text" xml:space="preserve">
|
||||
<value>Smali folder to compile:</value>
|
||||
</data>
|
||||
<data name="smaliUseOutputChkBox.Text" xml:space="preserve">
|
||||
<value>Dex output directory:</value>
|
||||
</data>
|
||||
<data name="comSmaliBtn.Text" xml:space="preserve">
|
||||
<value>Compile</value>
|
||||
</data>
|
||||
<data name="smaliBrowseOutputBtn.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="smaliBrowseInputDirBtn.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="smaliGroupBox.Text" xml:space="preserve">
|
||||
<value>Smali</value>
|
||||
</data>
|
||||
<data name="label28.Text" xml:space="preserve">
|
||||
<value>Dex to decompile:</value>
|
||||
</data>
|
||||
<data name="baksmaliUseOutputChkBox.Text" xml:space="preserve">
|
||||
<value>Folder output directory:</value>
|
||||
</data>
|
||||
<data name="baksmaliBrowseOutputBtn.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="decSmaliBtn.Text" xml:space="preserve">
|
||||
<value>Decompile</value>
|
||||
</data>
|
||||
<data name="baksmaliBrowseInputDexBtn.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="bakSmaliGroupBox.Text" xml:space="preserve">
|
||||
<value>Baksmali</value>
|
||||
</data>
|
||||
<data name="tabPageBaksmali.Text" xml:space="preserve">
|
||||
<value>Baksmali</value>
|
||||
</data>
|
||||
<data name="label33.Text" xml:space="preserve">
|
||||
<value>Selected device: </value>
|
||||
</data>
|
||||
<data name="killAdbBtn.Text" xml:space="preserve">
|
||||
<value>Kill adb process</value>
|
||||
</data>
|
||||
<data name="installApkBtn.Text" xml:space="preserve">
|
||||
<value>Install APK</value>
|
||||
</data>
|
||||
<data name="refreshDevicesBtn.Text" xml:space="preserve">
|
||||
<value>Refresh</value>
|
||||
</data>
|
||||
<data name="selApkAdbBtn.Text" xml:space="preserve">
|
||||
<value>...</value>
|
||||
</data>
|
||||
<data name="overrideAbiCheckBox.Text" xml:space="preserve">
|
||||
<value>Override platform's default ABI: </value>
|
||||
</data>
|
||||
<data name="setVendorChkBox.Text" xml:space="preserve">
|
||||
<value>Set vendor to Play Store (com.android.vending)</value>
|
||||
</data>
|
||||
<data name="label32.Text" xml:space="preserve">
|
||||
<value>Selected APK: </value>
|
||||
</data>
|
||||
<data name="tabPageAdb.Text" xml:space="preserve">
|
||||
<value>ADB</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelStateImage.Text" xml:space="preserve">
|
||||
<value>toolStripStatusLabel1</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelStateText.Text" xml:space="preserve">
|
||||
<value>Loading...</value>
|
||||
</data>
|
||||
<data name="statusStrip1.Text" xml:space="preserve">
|
||||
<value>statusStrip1</value>
|
||||
</data>
|
||||
<data name="copyToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Copy</value>
|
||||
</data>
|
||||
<data name="clearLogToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Clear log</value>
|
||||
</data>
|
||||
<data name="logTxtBox.Text" xml:space="preserve">
|
||||
<value></value>
|
||||
</data>
|
||||
<data name="newInsToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>New instance</value>
|
||||
</data>
|
||||
<data name="saveLogToFileToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Save log to file</value>
|
||||
</data>
|
||||
<data name="openTempFolderToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Open temp folder</value>
|
||||
</data>
|
||||
<data name="clearTempFolderToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Clear temp folder</value>
|
||||
</data>
|
||||
<data name="exitToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Exit</value>
|
||||
</data>
|
||||
<data name="fileToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>File</value>
|
||||
</data>
|
||||
<data name="useAPKEditorForDecompilingItem.Text" xml:space="preserve">
|
||||
<value>Use APKEditor for decompiling</value>
|
||||
</data>
|
||||
<data name="settingsToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Open settings...</value>
|
||||
</data>
|
||||
<data name="settingsToolStripMenuItem1.Text" xml:space="preserve">
|
||||
<value>Settings</value>
|
||||
</data>
|
||||
<data name="checkForUpdateToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Check for update</value>
|
||||
</data>
|
||||
<data name="reportAnIsuueToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Report an issue</value>
|
||||
</data>
|
||||
<data name="apktoolIssuesToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Apktool issue tracker</value>
|
||||
</data>
|
||||
<data name="baksmaliIssuesToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Baksmali issue tracker</value>
|
||||
</data>
|
||||
<data name="aboutToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>About</value>
|
||||
</data>
|
||||
<data name="helpToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Help</value>
|
||||
</data>
|
||||
<data name="menuStrip1.Text" xml:space="preserve">
|
||||
<value>menuStrip1</value>
|
||||
</data>
|
||||
<data name="CopyAll" xml:space="preserve">
|
||||
<value>Copy all</value>
|
||||
</data>
|
||||
<data name="Loading" xml:space="preserve">
|
||||
<value>Loading...</value>
|
||||
</data>
|
||||
<data name="Ready" xml:space="preserve">
|
||||
<value>Ready</value>
|
||||
</data>
|
||||
<data name="SaveImageTitle" xml:space="preserve">
|
||||
<value>Save an Image File</value>
|
||||
</data>
|
||||
<data name="PngImage" xml:space="preserve">
|
||||
<value>PNG Image</value>
|
||||
</data>
|
||||
<data name="FilterAndroidPackage" xml:space="preserve">
|
||||
<value>Android Package ({0})|{0}</value>
|
||||
</data>
|
||||
<data name="FilterSplitApk" xml:space="preserve">
|
||||
<value>Split APK Package ({0})|{0}</value>
|
||||
</data>
|
||||
<data name="FilterApkJarZip" xml:space="preserve">
|
||||
<value>APK / JAR / ZIP ({0})|{0}</value>
|
||||
</data>
|
||||
<data name="FilterKeystore" xml:space="preserve">
|
||||
<value>Keystore ({0})|{0}</value>
|
||||
</data>
|
||||
<data name="FilterPublicKey" xml:space="preserve">
|
||||
<value>Public key ({0})|{0}</value>
|
||||
</data>
|
||||
<data name="FilterPrivateKey" xml:space="preserve">
|
||||
<value>Private key ({0})|{0}</value>
|
||||
</data>
|
||||
<data name="FilterApk" xml:space="preserve">
|
||||
<value>APK ({0})|{0}</value>
|
||||
</data>
|
||||
<data name="FilterDex" xml:space="preserve">
|
||||
<value>Dex ({0})|{0}</value>
|
||||
</data>
|
||||
<data name="FilterJavaExe" xml:space="preserve">
|
||||
<value>Java ({0})|{0}</value>
|
||||
</data>
|
||||
<data name="FilterApktool" xml:space="preserve">
|
||||
<value>Apktool ({0})|{0}</value>
|
||||
</data>
|
||||
<data name="SchemeDefault" xml:space="preserve">
|
||||
<value>Default</value>
|
||||
</data>
|
||||
<data name="SchemeTrue" xml:space="preserve">
|
||||
<value>True</value>
|
||||
</data>
|
||||
<data name="SchemeFalse" xml:space="preserve">
|
||||
<value>False</value>
|
||||
</data>
|
||||
<data name="AaptDump" xml:space="preserve">
|
||||
<value>AAPT dump</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
@@ -117,26 +117,83 @@
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="SystemLanguage" xml:space="preserve">
|
||||
<value>Язык системы</value>
|
||||
<data name="About" xml:space="preserve">
|
||||
<value>О программе</value>
|
||||
</data>
|
||||
<data name="UpdateNewVersion" xml:space="preserve">
|
||||
<value>Доступна новая версия. Выполнить обновление?</value>
|
||||
<data name="APKToolVersion" xml:space="preserve">
|
||||
<value>Версия Apktool</value>
|
||||
</data>
|
||||
<data name="Done" xml:space="preserve">
|
||||
<value>Готово</value>
|
||||
<data name="CheckForUpdate" xml:space="preserve">
|
||||
<value>Проверить обновления</value>
|
||||
</data>
|
||||
<data name="DebugMode" xml:space="preserve">
|
||||
<value>Режим Debug</value>
|
||||
</data>
|
||||
<data name="Exit" xml:space="preserve">
|
||||
<value>Выход</value>
|
||||
</data>
|
||||
<data name="File" xml:space="preserve">
|
||||
<value>Файл</value>
|
||||
</data>
|
||||
<data name="Help" xml:space="preserve">
|
||||
<value>Помощь</value>
|
||||
</data>
|
||||
<data name="Settings" xml:space="preserve">
|
||||
<value>Настройки</value>
|
||||
</data>
|
||||
<data name="ErrorJavaDetect" xml:space="preserve">
|
||||
<value>Java не установлена или установлена не корректно. Программа будет закрыта.</value>
|
||||
<value>Java не установлена или установлена некорректно. Пожалуйста, установите Java или укажите путь в настройках</value>
|
||||
</data>
|
||||
<data name="ErrorReadSettings" xml:space="preserve">
|
||||
<value>Ошибка при чтении файла настроек!</value>
|
||||
</data>
|
||||
<data name="UpdateNewVersion" xml:space="preserve">
|
||||
<value>Доступна новая версия. Загрузить обновление?</value>
|
||||
</data>
|
||||
<data name="UpdateNoUpdates" xml:space="preserve">
|
||||
<value>Нет доступных обновлений.</value>
|
||||
<value>Нет обновлений.</value>
|
||||
</data>
|
||||
<data name="DoYouWantToSelectJavaLocation" xml:space="preserve">
|
||||
<value>Java не найдена. Хотите указать расположение вручную?</value>
|
||||
<data name="WarningDecodingFolderNotSelected" xml:space="preserve">
|
||||
<value>Папка для декодирования не выбрана!</value>
|
||||
</data>
|
||||
<data name="WarningFileForDecodingNotSelected" xml:space="preserve">
|
||||
<value>Файл для декодирования не выбран!</value>
|
||||
</data>
|
||||
<data name="WarningFileForSigningNotSelected" xml:space="preserve">
|
||||
<value>Файл для подписи не выбран!</value>
|
||||
</data>
|
||||
<data name="WarningFrameworkNotSelected" xml:space="preserve">
|
||||
<value>Фреймворк не выбран!</value>
|
||||
<value>Не выбраны необходимые компоненты!</value>
|
||||
</data>
|
||||
<data name="ErrorSaveSettings" xml:space="preserve">
|
||||
<value>Ошибка при сохранении файла настроек!</value>
|
||||
</data>
|
||||
<data name="NeedRestart" xml:space="preserve">
|
||||
<value>Для завершения обновления необходим перезапуск. Перезапустить сейчас?</value>
|
||||
</data>
|
||||
<data name="FileNotFound" xml:space="preserve">
|
||||
<value>Файл не найден</value>
|
||||
</data>
|
||||
<data name="FolderNotExist" xml:space="preserve">
|
||||
<value>Папка не найдена</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Ошибка</value>
|
||||
</data>
|
||||
<data name="Build" xml:space="preserve">
|
||||
<value>Build</value>
|
||||
</data>
|
||||
<data name="Decode" xml:space="preserve">
|
||||
<value>Декодирование</value>
|
||||
</data>
|
||||
<data name="InstallFramework" xml:space="preserve">
|
||||
<value>Установка</value>
|
||||
</data>
|
||||
<data name="Sign" xml:space="preserve">
|
||||
<value>Подпись</value>
|
||||
</data>
|
||||
<data name="SystemLanguage" xml:space="preserve">
|
||||
<value>Язык системы</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToInstallCM" xml:space="preserve">
|
||||
<value>Вы действительно хотите установить контекстное меню?</value>
|
||||
@@ -144,4 +201,601 @@
|
||||
<data name="DoYouRealyWantToRemoveCM" xml:space="preserve">
|
||||
<value>Вы действительно хотите удалить контекстное меню?</value>
|
||||
</data>
|
||||
<data name="Done" xml:space="preserve">
|
||||
<value>Готово</value>
|
||||
</data>
|
||||
<data name="CantDetectApktoolVersion" xml:space="preserve">
|
||||
<value>Не определена версия apktool.</value>
|
||||
</data>
|
||||
<data name="DecompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Декомпиляция успешно завершена. Выходная директория "{0}".</value>
|
||||
</data>
|
||||
<data name="ErrorUpdateChecking" xml:space="preserve">
|
||||
<value>Ошибка при проверке обновлений:</value>
|
||||
</data>
|
||||
<data name="SignSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Операция успешно завершена. Файл сохранен в "{0}".</value>
|
||||
</data>
|
||||
<data name="Aligning" xml:space="preserve">
|
||||
<value>Aligning</value>
|
||||
</data>
|
||||
<data name="ErrorCompiling" xml:space="preserve">
|
||||
<value>Ошибка при компиляции</value>
|
||||
</data>
|
||||
<data name="ErrorEnteringFrameworkTag" xml:space="preserve">
|
||||
<value>Ошибка ввода тегов</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFileNotExist" xml:space="preserve">
|
||||
<value>Выбранный файл не существует.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkDirectory" xml:space="preserve">
|
||||
<value>Ошибка при выборе папки.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkFile" xml:space="preserve">
|
||||
<value>Ошибка при выборе файла. Файл не существует.</value>
|
||||
</data>
|
||||
<data name="ErrorSigning" xml:space="preserve">
|
||||
<value>Sign: ошибка</value>
|
||||
</data>
|
||||
<data name="FrameworkInstallationNotStarted" xml:space="preserve">
|
||||
<value>Ошибка. Установка не запущена.</value>
|
||||
</data>
|
||||
<data name="InstallingFramework" xml:space="preserve">
|
||||
<value>Установка</value>
|
||||
</data>
|
||||
<data name="Signing" xml:space="preserve">
|
||||
<value>Подписывание</value>
|
||||
</data>
|
||||
<data name="SignInputFileNotFound" xml:space="preserve">
|
||||
<value>Входной файл не найден.</value>
|
||||
</data>
|
||||
<data name="SignPrivateKeyNotFound" xml:space="preserve">
|
||||
<value>Приватный ключ не найден.</value>
|
||||
</data>
|
||||
<data name="SignPublicKeyNotFound" xml:space="preserve">
|
||||
<value>Публичный ключ не найден.</value>
|
||||
</data>
|
||||
<data name="ZIPArchives" xml:space="preserve">
|
||||
<value>ZIP архивы</value>
|
||||
</data>
|
||||
<data name="DecodeCouldNotCreate" xml:space="preserve">
|
||||
<value>Выбранная директория содержит недопустимые символы и не может быть создана.</value>
|
||||
</data>
|
||||
<data name="DecodeDirNotSelected" xml:space="preserve">
|
||||
<value>Папка для декомпиляции не выбрана.</value>
|
||||
</data>
|
||||
<data name="DecodeSelectedFrameworkNotExist" xml:space="preserve">
|
||||
<value>Выбранная папка не существует</value>
|
||||
</data>
|
||||
<data name="Decoding" xml:space="preserve">
|
||||
<value>Декодирование</value>
|
||||
</data>
|
||||
<data name="ErrorDecompiling" xml:space="preserve">
|
||||
<value>Ошибка при декодировании</value>
|
||||
</data>
|
||||
<data name="ExecutableFile" xml:space="preserve">
|
||||
<value>Исполняемый файл</value>
|
||||
</data>
|
||||
<data name="ChangedTargetSdkTo29" xml:space="preserve">
|
||||
<value>Изменена версия SDK на 29</value>
|
||||
</data>
|
||||
<data name="ErrorVersionParsing" xml:space="preserve">
|
||||
<value>Ошибка при считывании версии</value>
|
||||
</data>
|
||||
<data name="FixAndroidManifest" xml:space="preserve">
|
||||
<value>Измененный AndroidManifest.xml</value>
|
||||
</data>
|
||||
<data name="RemoveApkToolDummies" xml:space="preserve">
|
||||
<value>Удалены все дополнения для ApkTool</value>
|
||||
</data>
|
||||
<data name="APKSelected" xml:space="preserve">
|
||||
<value>Выбранный APK:</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFolderNotExist" xml:space="preserve">
|
||||
<value>Выбранная папка не существует.</value>
|
||||
</data>
|
||||
<data name="AndroidManifestNotExist" xml:space="preserve">
|
||||
<value>AndroidManifest.xml не найден</value>
|
||||
</data>
|
||||
<data name="DecompiledAPKNotExist" xml:space="preserve">
|
||||
<value>Декомпилированный каталог APK не существует</value>
|
||||
</data>
|
||||
<data name="MainActivityFound" xml:space="preserve">
|
||||
<value>MainActivity найден в "{0}"</value>
|
||||
</data>
|
||||
<data name="MainActivityNotFoundPleaseFindManually" xml:space="preserve">
|
||||
<value>Не найден MainActivity. Попробуйте выполнить поиск вручную</value>
|
||||
</data>
|
||||
<data name="ClearingFramework" xml:space="preserve">
|
||||
<value>Очистка</value>
|
||||
</data>
|
||||
<data name="CompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Компиляция успешно завершена. Выходная папка "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorZipalign" xml:space="preserve">
|
||||
<value>Zipalign: ошибка</value>
|
||||
</data>
|
||||
<data name="ZipalignFileSavedTo" xml:space="preserve">
|
||||
<value>Zipalign: успешно завершено. Файл сохранен в "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorClearingFw" xml:space="preserve">
|
||||
<value>Ошибка при очистке</value>
|
||||
</data>
|
||||
<data name="FrameworkCacheCleared" xml:space="preserve">
|
||||
<value>Кеш очищен</value>
|
||||
</data>
|
||||
<data name="AllDone" xml:space="preserve">
|
||||
<value>Завершено!</value>
|
||||
</data>
|
||||
<data name="FrameworkInstalled" xml:space="preserve">
|
||||
<value>Успешно установлено</value>
|
||||
</data>
|
||||
<data name="FrameworkDirNotExist" xml:space="preserve">
|
||||
<value>Папка не существует</value>
|
||||
</data>
|
||||
<data name="DecompilingDex" xml:space="preserve">
|
||||
<value>Декомпиляция DEX</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedOutputFolderNotExist" xml:space="preserve">
|
||||
<value>Выбранная выходная папка не существует.</value>
|
||||
</data>
|
||||
<data name="CompilingDex" xml:space="preserve">
|
||||
<value>Компиляция DEX</value>
|
||||
</data>
|
||||
<data name="DragDropNotSupported" xml:space="preserve">
|
||||
<value>Программа запущена в режиме администратора. Drag & drop не поддерживается</value>
|
||||
</data>
|
||||
<data name="DragDropSupported" xml:space="preserve">
|
||||
<value>Drag & drop поддерживается</value>
|
||||
</data>
|
||||
<data name="ErrorNotAnApk" xml:space="preserve">
|
||||
<value>Эта папка не является пакетом Android</value>
|
||||
</data>
|
||||
<data name="Baksmali" xml:space="preserve">
|
||||
<value>Baksmali</value>
|
||||
</data>
|
||||
<data name="Smali" xml:space="preserve">
|
||||
<value>Smali</value>
|
||||
</data>
|
||||
<data name="Zipalign" xml:space="preserve">
|
||||
<value>Zipalign</value>
|
||||
</data>
|
||||
<data name="CompileApk" xml:space="preserve">
|
||||
<value>Компиляция APK</value>
|
||||
</data>
|
||||
<data name="CompileDex" xml:space="preserve">
|
||||
<value>Assemble DEX</value>
|
||||
</data>
|
||||
<data name="DecompileApk" xml:space="preserve">
|
||||
<value>Декомпиляция APK</value>
|
||||
</data>
|
||||
<data name="DecompileDex" xml:space="preserve">
|
||||
<value>Дизассемблирование DEX</value>
|
||||
</data>
|
||||
<data name="GetApkInfo" xml:space="preserve">
|
||||
<value>Информация о APK</value>
|
||||
</data>
|
||||
<data name="NotDecompiledApk" xml:space="preserve">
|
||||
<value>Эта папка не является декомпилированным АРК</value>
|
||||
</data>
|
||||
<data name="NotDecompiledDex" xml:space="preserve">
|
||||
<value>Эта папка не является декомпилированным DEX</value>
|
||||
</data>
|
||||
<data name="RequiredFilesMissing" xml:space="preserve">
|
||||
<value>Отсутствуют необходимые файлы</value>
|
||||
</data>
|
||||
<data name="SignApk" xml:space="preserve">
|
||||
<value>Подпись APK</value>
|
||||
</data>
|
||||
<data name="TextFile" xml:space="preserve">
|
||||
<value>Текстовый файл</value>
|
||||
</data>
|
||||
<data name="ZipalignApk" xml:space="preserve">
|
||||
<value>Zipalign APK</value>
|
||||
</data>
|
||||
<data name="CreateUnsignedApk" xml:space="preserve">
|
||||
<value>Создание APK (unsigned)</value>
|
||||
</data>
|
||||
<data name="MetainfNotExist" xml:space="preserve">
|
||||
<value>Папка META-INF не существует.</value>
|
||||
</data>
|
||||
<data name="ErrorGettingApkInfo" xml:space="preserve">
|
||||
<value>Ошибка при получении информации о APK</value>
|
||||
</data>
|
||||
<data name="InputDirectory" xml:space="preserve">
|
||||
<value>Входная папка: {0}</value>
|
||||
</data>
|
||||
<data name="InputFile" xml:space="preserve">
|
||||
<value>Входной файл: {0}</value>
|
||||
</data>
|
||||
<data name="DeleteFile" xml:space="preserve">
|
||||
<value>Удален файл "{0}"</value>
|
||||
</data>
|
||||
<data name="CopyFileToTemp" xml:space="preserve">
|
||||
<value>Файл "{0}" скопирован во временную папку "{1}"</value>
|
||||
</data>
|
||||
<data name="CopyFolderToTemp" xml:space="preserve">
|
||||
<value>Копирование декомпилированного АРК "{0}" во временную папку "{1}"</value>
|
||||
</data>
|
||||
<data name="DecodeDesDirExists" xml:space="preserve">
|
||||
<value>Целевая папка "{0}" уже существует. Используйте опцию принудительного удаления, если вы хотите ее перезаписать.</value>
|
||||
</data>
|
||||
<data name="MoveTempApkFileToOutput" xml:space="preserve">
|
||||
<value>Перемещение временной папки "{0}" в выходной каталог "{1}"</value>
|
||||
</data>
|
||||
<data name="MoveTempApkToOutput" xml:space="preserve">
|
||||
<value>Перемещение временного АРК "{0}" в выходной каталог "{1}"</value>
|
||||
</data>
|
||||
<data name="ParsingApkInfo" xml:space="preserve">
|
||||
<value>Чтение информации о APK...</value>
|
||||
</data>
|
||||
<data name="DecompilingAllApkFiles" xml:space="preserve">
|
||||
<value>Декомпиляция всех APK файлов</value>
|
||||
</data>
|
||||
<data name="DetectedAsBase" xml:space="preserve">
|
||||
<value>{0} определен как базовый</value>
|
||||
</data>
|
||||
<data name="DetectedAsSplit" xml:space="preserve">
|
||||
<value>{0} определен как split</value>
|
||||
</data>
|
||||
<data name="ExtractingAllApkFiles" xml:space="preserve">
|
||||
<value>Извлечение всех APK файлов</value>
|
||||
</data>
|
||||
<data name="MergeFinishedMoveDir" xml:space="preserve">
|
||||
<value>Слияние завершено. Перемещение каталога в "{0}"</value>
|
||||
</data>
|
||||
<data name="MergingApk" xml:space="preserve">
|
||||
<value>Слияние APK</value>
|
||||
</data>
|
||||
<data name="MovingBasedirectory" xml:space="preserve">
|
||||
<value>Перемещение базового каталога в "{0}"</value>
|
||||
</data>
|
||||
<data name="DirNotExist" xml:space="preserve">
|
||||
<value>Папка "{0}" не существует</value>
|
||||
</data>
|
||||
<data name="TempDirectory" xml:space="preserve">
|
||||
<value>Временная папка: "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorMerging" xml:space="preserve">
|
||||
<value>Ошибка при слиянии</value>
|
||||
</data>
|
||||
<data name="MergingApkEditor" xml:space="preserve">
|
||||
<value>Слияние APK с помощью APKEditor.jar</value>
|
||||
</data>
|
||||
<data name="Aborted" xml:space="preserve">
|
||||
<value>Отменено</value>
|
||||
</data>
|
||||
<data name="CancelProcess" xml:space="preserve">
|
||||
<value>Вы действительно хотите прервать процесс?</value>
|
||||
</data>
|
||||
<data name="GettingDevices" xml:space="preserve">
|
||||
<value>Получение устройств...</value>
|
||||
</data>
|
||||
<data name="PleaseWait" xml:space="preserve">
|
||||
<value>Пожалуйста, подождите...</value>
|
||||
</data>
|
||||
<data name="ConfirmKillingAdbServer" xml:space="preserve">
|
||||
<value>Вы действительно хотите завершить работу ADB сервера? После завершения работы необходимо переподключить устройство или перезапустить эмулятор</value>
|
||||
</data>
|
||||
<data name="DeviceNotSelected" xml:space="preserve">
|
||||
<value>Устройство не выбрано</value>
|
||||
</data>
|
||||
<data name="DeviceSelected" xml:space="preserve">
|
||||
<value>Выбрано устройство "{0}"</value>
|
||||
</data>
|
||||
<data name="DevicesFound" xml:space="preserve">
|
||||
<value>Найдено {0} устройств</value>
|
||||
</data>
|
||||
<data name="InstallApkFailed" xml:space="preserve">
|
||||
<value>Ошибка при установке АРК</value>
|
||||
</data>
|
||||
<data name="InstallApkSuccessful" xml:space="preserve">
|
||||
<value>Установка АРК успешно завершена</value>
|
||||
</data>
|
||||
<data name="InstallingApk" xml:space="preserve">
|
||||
<value>Установка APK</value>
|
||||
</data>
|
||||
<data name="InstallingApkPath" xml:space="preserve">
|
||||
<value>Установлено APK "{0}"</value>
|
||||
</data>
|
||||
<data name="NoDevicesFound" xml:space="preserve">
|
||||
<value>Устройств не обнаружено. Убедитесь, что ваше устройство подключено к компьютеру с включенной отладкой ADB. Если вы используете эмулятор, перезапустите его и дождитесь завершения загрузки</value>
|
||||
</data>
|
||||
<data name="TimeEnded" xml:space="preserve">
|
||||
<value>Время завершения: {0}</value>
|
||||
</data>
|
||||
<data name="TimeStarted" xml:space="preserve">
|
||||
<value>Время начала: {0}</value>
|
||||
</data>
|
||||
<data name="ClearFrameworkPrompt" xml:space="preserve">
|
||||
<value>После изменения версии Apktool необходимо очистить кеш. Вы хотите очистить его сейчас?</value>
|
||||
</data>
|
||||
<data name="RestartApplicationPrompt" xml:space="preserve">
|
||||
<value>Для применения изменений требуется перезапуск. Перезапустить приложение сейчас?</value>
|
||||
</data>
|
||||
<data name="ClearTempFolder" xml:space="preserve">
|
||||
<value>Очистка временной папки</value>
|
||||
</data>
|
||||
<data name="DeletingFolder" xml:space="preserve">
|
||||
<value>Удаление папки: {0}</value>
|
||||
</data>
|
||||
<data name="DirectoryNotExist" xml:space="preserve">
|
||||
<value>Директория "{0}" не существует</value>
|
||||
</data>
|
||||
<data name="OpenComFolder" xml:space="preserve">
|
||||
<value>Открыть папку скомпилированных файлов</value>
|
||||
</data>
|
||||
<data name="OpenDecFolder" xml:space="preserve">
|
||||
<value>Открыть папку декомпилированных файлов</value>
|
||||
</data>
|
||||
<data name="FixApktoolYml" xml:space="preserve">
|
||||
<value>Исправлен apktool.yml</value>
|
||||
</data>
|
||||
<data name="CopyFileTo" xml:space="preserve">
|
||||
<value>Копирование файла "{0}" в "{1}"</value>
|
||||
</data>
|
||||
<data name="SplitApkNotFound" xml:space="preserve">
|
||||
<value>Split APK не выбран</value>
|
||||
</data>
|
||||
<data name="CantDetectApkeditorVersion" xml:space="preserve">
|
||||
<value>Не удалось определить версию APKEditor</value>
|
||||
</data>
|
||||
<data name="SetLanguageRestartApplication" xml:space="preserve">
|
||||
<value>Язык установлен. Хотите перезапустить программу?</value>
|
||||
</data>
|
||||
<data name="AboutVersion" xml:space="preserve">
|
||||
<value>Версия</value>
|
||||
</data>
|
||||
<data name="AboutCopyright" xml:space="preserve">
|
||||
<value>Авторские права</value>
|
||||
</data>
|
||||
<data name="AboutGithubRepo" xml:space="preserve">
|
||||
<value>Сайт</value>
|
||||
</data>
|
||||
<data name="SettingsGeneral" xml:space="preserve">
|
||||
<value>Общие</value>
|
||||
</data>
|
||||
<data name="SettingsLanguage" xml:space="preserve">
|
||||
<value>Язык</value>
|
||||
</data>
|
||||
<data name="SettingsContextMenu" xml:space="preserve">
|
||||
<value>Контекстное меню</value>
|
||||
</data>
|
||||
<data name="SettingsTheme" xml:space="preserve">
|
||||
<value>Тема</value>
|
||||
</data>
|
||||
<data name="SettingsAdminRights" xml:space="preserve">
|
||||
<value>Требуются права администратора</value>
|
||||
</data>
|
||||
<data name="SettingsClearLog" xml:space="preserve">
|
||||
<value>Очищать журнал событий перед каждой операцией</value>
|
||||
</data>
|
||||
<data name="SettingsCustomJvmArgs" xml:space="preserve">
|
||||
<value>Аргументы JVM</value>
|
||||
</data>
|
||||
<data name="SettingsCheckUpdate" xml:space="preserve">
|
||||
<value>Проверять обновление при запуске (раз в сутки)</value>
|
||||
</data>
|
||||
<data name="SettingsCustomApktool" xml:space="preserve">
|
||||
<value>Свой путь к Apktool</value>
|
||||
</data>
|
||||
<data name="SettingsInstall" xml:space="preserve">
|
||||
<value>Установить</value>
|
||||
</data>
|
||||
<data name="SettingsUninstall" xml:space="preserve">
|
||||
<value>Удалить</value>
|
||||
</data>
|
||||
<data name="SettingsCancel" xml:space="preserve">
|
||||
<value>Отмена</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_UseFramework.Text" xml:space="preserve">
|
||||
<value>Использовать файлы фремворка из:</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_Force.Text" xml:space="preserve">
|
||||
<value>Перезаписывать файлы в каталоге назначения</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoRes.Text" xml:space="preserve">
|
||||
<value>Не декомпилировать ресурсы</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoSrc.Text" xml:space="preserve">
|
||||
<value>Не декомпилировать исходный код</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_UseAapt.Text" xml:space="preserve">
|
||||
<value>Использовать aapt.exe из</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_ForceAll.Text" xml:space="preserve">
|
||||
<value>Пропустить определение изменений и построить все файлы</value>
|
||||
</data>
|
||||
<data name="clearLogToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Очистить журнал</value>
|
||||
</data>
|
||||
<data name="menuItemSettings.Text" xml:space="preserve">
|
||||
<value>Настройки</value>
|
||||
</data>
|
||||
<data name="menuItemExit.Text" xml:space="preserve">
|
||||
<value>Выход</value>
|
||||
</data>
|
||||
<data name="menuItemFile.Text" xml:space="preserve">
|
||||
<value>Файл</value>
|
||||
</data>
|
||||
<data name="menuItemCheckUpdate.Text" xml:space="preserve">
|
||||
<value>Проверить обновление</value>
|
||||
</data>
|
||||
<data name="menuItemAbout.Text" xml:space="preserve">
|
||||
<value>О программе</value>
|
||||
</data>
|
||||
<data name="menuItemHelp.Text" xml:space="preserve">
|
||||
<value>Справка</value>
|
||||
</data>
|
||||
<data name="button_BUILD_Build.Text" xml:space="preserve">
|
||||
<value>Собрать</value>
|
||||
</data>
|
||||
<data name="button_DECODE_Decode.Text" xml:space="preserve">
|
||||
<value>Декомпилировать</value>
|
||||
</data>
|
||||
<data name="tabPageZipAlign.Text" xml:space="preserve">
|
||||
<value>Выравнивание</value>
|
||||
</data>
|
||||
<data name="tabPageSign.Text" xml:space="preserve">
|
||||
<value>Подпись</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelStateText.Text" xml:space="preserve">
|
||||
<value>Загрузка...</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_CopyOriginal.Text" xml:space="preserve">
|
||||
<value>Копировать оригинальный AndroidManifest.xml и папку META-INF в построенный apk</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_UseFramework.Text" xml:space="preserve">
|
||||
<value>Использовать файлы фремворка из:</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_KeepBrokenRes.Text" xml:space="preserve">
|
||||
<value>Сохранить испорченные ресурсы</value>
|
||||
</data>
|
||||
<data name="tabPageBuild.Text" xml:space="preserve">
|
||||
<value>Сборка</value>
|
||||
</data>
|
||||
<data name="tabPageDecode.Text" xml:space="preserve">
|
||||
<value>Декомпиляция</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_OutputDirectory.Text" xml:space="preserve">
|
||||
<value>Декомпилировать в каталог:</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_OutputAppPath.Text" xml:space="preserve">
|
||||
<value>Сохранить файл как:</value>
|
||||
</data>
|
||||
<data name="tabPageInstallFramework.Text" xml:space="preserve">
|
||||
<value>Установка фреймворков</value>
|
||||
</data>
|
||||
<data name="groupBox_BUILD_Options.Text" xml:space="preserve">
|
||||
<value>Опции</value>
|
||||
</data>
|
||||
<data name="groupBox_DECODE_Options.Text" xml:space="preserve">
|
||||
<value>Опции</value>
|
||||
</data>
|
||||
<data name="groupBox_IF_Options.Text" xml:space="preserve">
|
||||
<value>Опции</value>
|
||||
</data>
|
||||
<data name="button_IF_InstallFramework.Text" xml:space="preserve">
|
||||
<value>Установить</value>
|
||||
</data>
|
||||
<data name="button_ZIPALIGN_Align.Text" xml:space="preserve">
|
||||
<value>Выровнять</value>
|
||||
</data>
|
||||
<data name="label_ZIPALIGN_OutputFile.Text" xml:space="preserve">
|
||||
<value>Сохранить файл как:</value>
|
||||
</data>
|
||||
<data name="groupBox_ZIPALIGN_Options.Text" xml:space="preserve">
|
||||
<value>Опции</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_OverwriteOutputFile.Text" xml:space="preserve">
|
||||
<value>Перезаписать выходной файл, если он существует</value>
|
||||
</data>
|
||||
<data name="button_SIGN_Sign.Text" xml:space="preserve">
|
||||
<value>Подписать</value>
|
||||
</data>
|
||||
<data name="checkBox_IF_FramePath.Text" xml:space="preserve">
|
||||
<value>Устанавливать фреймворк в каталог:</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_Recompress.Text" xml:space="preserve">
|
||||
<value>Перепаковать с использованием алгоритма Zopfli</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_VerboseOutput.Text" xml:space="preserve">
|
||||
<value>Подробный вывод</value>
|
||||
</data>
|
||||
<data name="label_ZIPALIGN_AlignmentBytes.Text" xml:space="preserve">
|
||||
<value>Выравнивание (в байтах), например, '4' для 32-битного выравнивания</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_MatchOriginal.Text" xml:space="preserve">
|
||||
<value>Сохранять файлы близко к оригиналу, насколько это возможно. Предотвращает ребилд.</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_CheckAlignment.Text" xml:space="preserve">
|
||||
<value>Только проверить выравнивание (не модифицирует файл)</value>
|
||||
</data>
|
||||
<data name="groupBox_SIGN_Options.Text" xml:space="preserve">
|
||||
<value>Опции</value>
|
||||
</data>
|
||||
<data name="label_SIGN_OutputFile.Text" xml:space="preserve">
|
||||
<value>Сохранить файл как:</value>
|
||||
</data>
|
||||
<data name="label_SIGN_PrivateKey.Text" xml:space="preserve">
|
||||
<value>Закрытый ключ</value>
|
||||
</data>
|
||||
<data name="label_SIGN_PublicKey.Text" xml:space="preserve">
|
||||
<value>Открытый ключ</value>
|
||||
</data>
|
||||
<data name="tabPageMain.Text" xml:space="preserve">
|
||||
<value>Главная</value>
|
||||
</data>
|
||||
<data name="tabPageApkInfo.Text" xml:space="preserve">
|
||||
<value>Инфо APK</value>
|
||||
</data>
|
||||
<data name="checkBox4.Text" xml:space="preserve">
|
||||
<value>Количество потоков:</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_NetSecConf.Text" xml:space="preserve">
|
||||
<value>Добавить файл конфигурации сетевой безопасности (Network Security Configuration)</value>
|
||||
</data>
|
||||
<data name="useAapt2ChkBox.Text" xml:space="preserve">
|
||||
<value>Использовать aapt2 (для версий apktool < 2.11.1)</value>
|
||||
</data>
|
||||
<data name="buildSetApiLvlChkBox.Text" xml:space="preserve">
|
||||
<value>Установить уровень API (напр. 14 для ICS)</value>
|
||||
</data>
|
||||
<data name="createUnsignApkChkBox.Text" xml:space="preserve">
|
||||
<value>Создать неподписанный APK с оригинальной подписью (Core Patch)</value>
|
||||
</data>
|
||||
<data name="signAfterBuildChkBox.Text" xml:space="preserve">
|
||||
<value>Подписать после сборки / выравнивания</value>
|
||||
</data>
|
||||
<data name="zipalignAfterBuildChkBox.Text" xml:space="preserve">
|
||||
<value>Выровнять после сборки</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_NoCrunch.Text" xml:space="preserve">
|
||||
<value>Отключить сжатие ресурсов</value>
|
||||
</data>
|
||||
<data name="tabPageBaksmali.Text" xml:space="preserve">
|
||||
<value>Baksmali / Smali</value>
|
||||
</data>
|
||||
<data name="tabPageAdb.Text" xml:space="preserve">
|
||||
<value>ADB</value>
|
||||
</data>
|
||||
<data name="mergeApkBtn.Text" xml:space="preserve">
|
||||
<value>Слияние APK</value>
|
||||
</data>
|
||||
<data name="selSplitApkBtn.Text" xml:space="preserve">
|
||||
<value>Выбрать Split APK</value>
|
||||
</data>
|
||||
<data name="baksmaliUseOutputChkBox.Text" xml:space="preserve">
|
||||
<value>Свой каталог вывода:</value>
|
||||
</data>
|
||||
<data name="smaliUseOutputChkBox.Text" xml:space="preserve">
|
||||
<value>Свой каталог вывода:</value>
|
||||
</data>
|
||||
<data name="killAdbBtn.Text" xml:space="preserve">
|
||||
<value>Перезапустить ADB</value>
|
||||
</data>
|
||||
<data name="installApkBtn.Text" xml:space="preserve">
|
||||
<value>Установить APK</value>
|
||||
</data>
|
||||
<data name="refreshDevicesBtn.Text" xml:space="preserve">
|
||||
<value>Обновить список</value>
|
||||
</data>
|
||||
<data name="selApkAdbBtn.Text" xml:space="preserve">
|
||||
<value>Выбрать APK</value>
|
||||
</data>
|
||||
<data name="overrideAbiCheckBox.Text" xml:space="preserve">
|
||||
<value>Переопределить ABI:</value>
|
||||
</data>
|
||||
<data name="bakSmaliGroupBox.Text" xml:space="preserve">
|
||||
<value>Baksmali (DEX -> Smali)</value>
|
||||
</data>
|
||||
<data name="smaliGroupBox.Text" xml:space="preserve">
|
||||
<value>Smali (Smali -> DEX)</value>
|
||||
</data>
|
||||
<data name="decSmaliBtn.Text" xml:space="preserve">
|
||||
<value>Дизассемблировать</value>
|
||||
</data>
|
||||
<data name="comSmaliBtn.Text" xml:space="preserve">
|
||||
<value>Ассемблировать</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,546 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="About" xml:space="preserve">
|
||||
<value>Hakkında</value>
|
||||
</data>
|
||||
<data name="APKToolVersion" xml:space="preserve">
|
||||
<value>Apktool sürümü</value>
|
||||
</data>
|
||||
<data name="CheckForUpdate" xml:space="preserve">
|
||||
<value>Güncellemeleri kontrol et</value>
|
||||
</data>
|
||||
<data name="DebugMode" xml:space="preserve">
|
||||
<value>Hata ayıklama modu</value>
|
||||
</data>
|
||||
<data name="Exit" xml:space="preserve">
|
||||
<value>Çıkış</value>
|
||||
</data>
|
||||
<data name="File" xml:space="preserve">
|
||||
<value>Dosya</value>
|
||||
</data>
|
||||
<data name="Help" xml:space="preserve">
|
||||
<value>Yardım</value>
|
||||
</data>
|
||||
<data name="Settings" xml:space="preserve">
|
||||
<value>Ayarlar</value>
|
||||
</data>
|
||||
<data name="ErrorJavaDetect" xml:space="preserve">
|
||||
<value>Java yüklü değil veya yanlış yüklenmiş. Lütfen Java’yı yükleyin veya Ayarlar’dan özel konumu ayarlayın</value>
|
||||
</data>
|
||||
<data name="ErrorReadSettings" xml:space="preserve">
|
||||
<value>Ayarlar okunurken hata oluştu!</value>
|
||||
</data>
|
||||
<data name="UpdateNewVersion" xml:space="preserve">
|
||||
<value>Yeni bir sürüm mevcut. Güncellemek ister misiniz?</value>
|
||||
</data>
|
||||
<data name="UpdateNoUpdates" xml:space="preserve">
|
||||
<value>Güncelleme mevcut değil.</value>
|
||||
</data>
|
||||
<data name="WarningDecodingFolderNotSelected" xml:space="preserve">
|
||||
<value>Çözümleme klasörü seçilmedi!</value>
|
||||
</data>
|
||||
<data name="WarningFileForDecodingNotSelected" xml:space="preserve">
|
||||
<value>Çözümleme için dosya seçilmedi!</value>
|
||||
</data>
|
||||
<data name="WarningFileForSigningNotSelected" xml:space="preserve">
|
||||
<value>İmzalama için dosya seçilmedi!</value>
|
||||
</data>
|
||||
<data name="WarningFrameworkNotSelected" xml:space="preserve">
|
||||
<value>Çerçeve seçilmedi!</value>
|
||||
</data>
|
||||
<data name="ErrorSaveSettings" xml:space="preserve">
|
||||
<value>Ayarlar kaydedilirken hata oluştu!</value>
|
||||
</data>
|
||||
<data name="NeedRestart" xml:space="preserve">
|
||||
<value>Değişikliklerin etkili olması için programı yeniden başlatmanız gerekiyor. Şimdi yapmak ister misiniz?</value>
|
||||
</data>
|
||||
<data name="FileNotFound" xml:space="preserve">
|
||||
<value>Dosya bulunamadı</value>
|
||||
</data>
|
||||
<data name="FolderNotExist" xml:space="preserve">
|
||||
<value>Klasör mevcut değil</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Hata</value>
|
||||
</data>
|
||||
<data name="Build" xml:space="preserve">
|
||||
<value>Derle</value>
|
||||
</data>
|
||||
<data name="Decode" xml:space="preserve">
|
||||
<value>Çözümle</value>
|
||||
</data>
|
||||
<data name="InstallFramework" xml:space="preserve">
|
||||
<value>Çerçeveyi yükle</value>
|
||||
</data>
|
||||
<data name="Sign" xml:space="preserve">
|
||||
<value>İmzala</value>
|
||||
</data>
|
||||
<data name="SystemLanguage" xml:space="preserve">
|
||||
<value>Sistem dili</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToInstallCM" xml:space="preserve">
|
||||
<value>Bağlam menüsünü gerçekten yüklemek istiyor musunuz?</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToRemoveCM" xml:space="preserve">
|
||||
<value>Bağlam menüsünü gerçekten kaldırmak istiyor musunuz?</value>
|
||||
</data>
|
||||
<data name="Done" xml:space="preserve">
|
||||
<value>Tamamlandı</value>
|
||||
</data>
|
||||
<data name="CantDetectApktoolVersion" xml:space="preserve">
|
||||
<value>Apktool sürümü tespit edilemedi.</value>
|
||||
</data>
|
||||
<data name="DecompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Çözümleme başarıyla tamamlandı. Çıkış dizini "{0}".</value>
|
||||
</data>
|
||||
<data name="ErrorUpdateChecking" xml:space="preserve">
|
||||
<value>Güncelleme kontrolü hatası:</value>
|
||||
</data>
|
||||
<data name="SignSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>İmzalama başarıyla tamamlandı. Dosya "{0}" konumuna kaydedildi.</value>
|
||||
</data>
|
||||
<data name="Aligning" xml:space="preserve">
|
||||
<value>Hizalama</value>
|
||||
</data>
|
||||
<data name="ErrorCompiling" xml:space="preserve">
|
||||
<value>Derleme başarısız</value>
|
||||
</data>
|
||||
<data name="ErrorEnteringFrameworkTag" xml:space="preserve">
|
||||
<value>Çerçeve etiketi girilirken hata oluştu.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFileNotExist" xml:space="preserve">
|
||||
<value>Seçilen dosya mevcut değil.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkDirectory" xml:space="preserve">
|
||||
<value>Çerçeve dizini seçilirken hata oluştu.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkFile" xml:space="preserve">
|
||||
<value>Çerçeve dosyası seçilirken hata oluştu. Dosya mevcut değil.</value>
|
||||
</data>
|
||||
<data name="ErrorSigning" xml:space="preserve">
|
||||
<value>İmzalama başarısız.</value>
|
||||
</data>
|
||||
<data name="FrameworkInstallationNotStarted" xml:space="preserve">
|
||||
<value>Hata. Çerçeve kurulumu başlatılmadı.</value>
|
||||
</data>
|
||||
<data name="InstallingFramework" xml:space="preserve">
|
||||
<value>Çerçeve yükleniyor</value>
|
||||
</data>
|
||||
<data name="Signing" xml:space="preserve">
|
||||
<value>İmzalanıyor</value>
|
||||
</data>
|
||||
<data name="SignInputFileNotFound" xml:space="preserve">
|
||||
<value>Giriş dosyası bulunamadı.</value>
|
||||
</data>
|
||||
<data name="SignPrivateKeyNotFound" xml:space="preserve">
|
||||
<value>Özel anahtar bulunamadı.</value>
|
||||
</data>
|
||||
<data name="SignPublicKeyNotFound" xml:space="preserve">
|
||||
<value>Genel anahtar bulunamadı.</value>
|
||||
</data>
|
||||
<data name="ZIPArchives" xml:space="preserve">
|
||||
<value>ZIP arşivleri</value>
|
||||
</data>
|
||||
<data name="DecodeCouldNotCreate" xml:space="preserve">
|
||||
<value>Seçilen çözümleme dizini, geçersiz karakterler içerdiği için oluşturulamadı.</value>
|
||||
</data>
|
||||
<data name="DecodeDirNotSelected" xml:space="preserve">
|
||||
<value>Çözümleme dizini seçilmedi.</value>
|
||||
</data>
|
||||
<data name="DecodeSelectedFrameworkNotExist" xml:space="preserve">
|
||||
<value>Seçilen çerçeve dizini mevcut değil.</value>
|
||||
</data>
|
||||
<data name="Decoding" xml:space="preserve">
|
||||
<value>Çözümleniyor</value>
|
||||
</data>
|
||||
<data name="ErrorDecompiling" xml:space="preserve">
|
||||
<value>Çözümleme başarısız</value>
|
||||
</data>
|
||||
<data name="ExecutableFile" xml:space="preserve">
|
||||
<value>Çalıştırılabilir dosya</value>
|
||||
</data>
|
||||
<data name="ChangedTargetSdkTo29" xml:space="preserve">
|
||||
<value>Hedef SDK 29’a değiştirildi</value>
|
||||
</data>
|
||||
<data name="ErrorVersionParsing" xml:space="preserve">
|
||||
<value>Sürüm ayrıştırılamadı</value>
|
||||
</data>
|
||||
<data name="FixAndroidManifest" xml:space="preserve">
|
||||
<value>AndroidManifest.xml düzeltildi</value>
|
||||
</data>
|
||||
<data name="RemoveApkToolDummies" xml:space="preserve">
|
||||
<value>Tüm ApkTool kuklaları kaldırıldı</value>
|
||||
</data>
|
||||
<data name="APKSelected" xml:space="preserve">
|
||||
<value>APK Seçildi:</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFolderNotExist" xml:space="preserve">
|
||||
<value>Seçilen klasör mevcut değil.</value>
|
||||
</data>
|
||||
<data name="AndroidManifestNotExist" xml:space="preserve">
|
||||
<value>AndroidManifest.xml mevcut değil</value>
|
||||
</data>
|
||||
<data name="DecompiledAPKNotExist" xml:space="preserve">
|
||||
<value>Çözümlenmiş APK dizini mevcut değil</value>
|
||||
</data>
|
||||
<data name="MainActivityFound" xml:space="preserve">
|
||||
<value>Ana aktivite "{0}" içinde bulundu</value>
|
||||
</data>
|
||||
<data name="MainActivityNotFoundPleaseFindManually" xml:space="preserve">
|
||||
<value>MainActivity bulunamadı. Lütfen manuel olarak bulun</value>
|
||||
</data>
|
||||
<data name="ClearingFramework" xml:space="preserve">
|
||||
<value>Çerçeve temizleniyor</value>
|
||||
</data>
|
||||
<data name="CompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Derleme başarıyla tamamlandı. Çıkış dizini "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorZipalign" xml:space="preserve">
|
||||
<value>Zipalign başarısız</value>
|
||||
</data>
|
||||
<data name="ZipalignFileSavedTo" xml:space="preserve">
|
||||
<value>Zipalign başarıyla tamamlandı. Dosya "{0}" konumuna kaydedildi</value>
|
||||
</data>
|
||||
<data name="ErrorClearingFw" xml:space="preserve">
|
||||
<value>Çerçeve temizlenirken hata oluştu</value>
|
||||
</data>
|
||||
<data name="FrameworkCacheCleared" xml:space="preserve">
|
||||
<value>Çerçeve önbelleği temizlendi</value>
|
||||
</data>
|
||||
<data name="AllDone" xml:space="preserve">
|
||||
<value>Hepsi tamamlandı!</value>
|
||||
</data>
|
||||
<data name="FrameworkInstalled" xml:space="preserve">
|
||||
<value>Çerçeve başarıyla yüklendi</value>
|
||||
</data>
|
||||
<data name="FrameworkDirNotExist" xml:space="preserve">
|
||||
<value>Çerçeve dizini mevcut değil</value>
|
||||
</data>
|
||||
<data name="DecompilingDex" xml:space="preserve">
|
||||
<value>Dex çözümlemesi yapılıyor</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedOutputFolderNotExist" xml:space="preserve">
|
||||
<value>Seçilen çıkış klasörü mevcut değil.</value>
|
||||
</data>
|
||||
<data name="CompilingDex" xml:space="preserve">
|
||||
<value>Dex derleniyor</value>
|
||||
</data>
|
||||
<data name="DragDropNotSupported" xml:space="preserve">
|
||||
<value>Yönetici olarak çalışıyorsunuz. Sürükle ve bırak desteklenmeyebilir</value>
|
||||
</data>
|
||||
<data name="DragDropSupported" xml:space="preserve">
|
||||
<value>Sürükle ve bırak destekleniyor</value>
|
||||
</data>
|
||||
<data name="ErrorNotAnApk" xml:space="preserve">
|
||||
<value>Bu dizin bir Android paketi değil</value>
|
||||
</data>
|
||||
<data name="Baksmali" xml:space="preserve">
|
||||
<value>Baksmali</value>
|
||||
</data>
|
||||
<data name="Smali" xml:space="preserve">
|
||||
<value>Smali</value>
|
||||
</data>
|
||||
<data name="Zipalign" xml:space="preserve">
|
||||
<value>Zipalign</value>
|
||||
</data>
|
||||
<data name="CompileApk" xml:space="preserve">
|
||||
<value>APK’yı derle</value>
|
||||
</data>
|
||||
<data name="CompileDex" xml:space="preserve">
|
||||
<value>DEX’i birleştir</value>
|
||||
</data>
|
||||
<data name="DecompileApk" xml:space="preserve">
|
||||
<value>APK’yı çözümle</value>
|
||||
</data>
|
||||
<data name="DecompileDex" xml:space="preserve">
|
||||
<value>DEX’i parçala</value>
|
||||
</data>
|
||||
<data name="GetApkInfo" xml:space="preserve">
|
||||
<value>APK Bilgilerini Görüntüle</value>
|
||||
</data>
|
||||
<data name="NotDecompiledApk" xml:space="preserve">
|
||||
<value>Bu klasör çözümlenmiş bir APK değil</value>
|
||||
</data>
|
||||
<data name="NotDecompiledDex" xml:space="preserve">
|
||||
<value>Bu klasör çözümlenmiş bir DEX değil</value>
|
||||
</data>
|
||||
<data name="RequiredFilesMissing" xml:space="preserve">
|
||||
<value>Gerekli dosyalar eksik</value>
|
||||
</data>
|
||||
<data name="SignApk" xml:space="preserve">
|
||||
<value>APK’yı imzala</value>
|
||||
</data>
|
||||
<data name="TextFile" xml:space="preserve">
|
||||
<value>Metin dosyası</value>
|
||||
</data>
|
||||
<data name="ZipalignApk" xml:space="preserve">
|
||||
<value>APK’yı zipalign yap</value>
|
||||
</data>
|
||||
<data name="CreateUnsignedApk" xml:space="preserve">
|
||||
<value>İmzasız APK oluşturuluyor</value>
|
||||
</data>
|
||||
<data name="MetainfNotExist" xml:space="preserve">
|
||||
<value>META-INF klasörü mevcut değil. Atlandı</value>
|
||||
</data>
|
||||
<data name="ErrorGettingApkInfo" xml:space="preserve">
|
||||
<value>APK bilgileri alınırken hata oluştu</value>
|
||||
</data>
|
||||
<data name="InputDirectory" xml:space="preserve">
|
||||
<value>Giriş dizini: {0}</value>
|
||||
</data>
|
||||
<data name="InputFile" xml:space="preserve">
|
||||
<value>Giriş dosyası: {0}</value>
|
||||
</data>
|
||||
<data name="DeleteFile" xml:space="preserve">
|
||||
<value>"{0}" dosyasını sil</value>
|
||||
</data>
|
||||
<data name="CopyFileToTemp" xml:space="preserve">
|
||||
<value>"{0}" dosyasını "{1}" geçici dizinine kopyala</value>
|
||||
</data>
|
||||
<data name="CopyFolderToTemp" xml:space="preserve">
|
||||
<value>Çözümlenmiş apk klasörünü "{0}" "{1}" geçici dizinine kopyala</value>
|
||||
</data>
|
||||
<data name="DecodeDesDirExists" xml:space="preserve">
|
||||
<value>Hedef dizin "{0}" zaten mevcut. Üzerine yazmak istiyorsanız "Hedef dizini zorla sil" seçeneğini etkinleştirin.</value>
|
||||
</data>
|
||||
<data name="MoveTempApkFileToOutput" xml:space="preserve">
|
||||
<value>Geçici klasörü "{0}" çıkış dizinine "{1}" taşı</value>
|
||||
</data>
|
||||
<data name="MoveTempApkToOutput" xml:space="preserve">
|
||||
<value>Geçici apk’yı "{0}" çıkış dizinine "{1}" taşı</value>
|
||||
</data>
|
||||
<data name="ParsingApkInfo" xml:space="preserve">
|
||||
<value>APK Bilgileri Ayrıştırılıyor...</value>
|
||||
</data>
|
||||
<data name="RestartApplicationPrompt" xml:space="preserve">
|
||||
<value>Değişiklikleri uygulamak için yeniden başlatma gerekiyor. Uygulamayı şimdi yeniden başlatmak ister misiniz?</value>
|
||||
</data>
|
||||
<data name="DecompilingAllApkFiles" xml:space="preserve">
|
||||
<value>Tüm APK dosyaları çözümleniyor</value>
|
||||
</data>
|
||||
<data name="DetectedAsBase" xml:space="preserve">
|
||||
<value>{0} temel olarak algılandı</value>
|
||||
</data>
|
||||
<data name="DetectedAsSplit" xml:space="preserve">
|
||||
<value>{0} bölünmüş olarak algılandı</value>
|
||||
</data>
|
||||
<data name="ExtractingAllApkFiles" xml:space="preserve">
|
||||
<value>Tüm APK dosyaları çıkarılıyor</value>
|
||||
</data>
|
||||
<data name="MergeFinishedMoveDir" xml:space="preserve">
|
||||
<value>Birleştirme tamamlandı. Dizin "{0}" konumuna taşınıyor</value>
|
||||
</data>
|
||||
<data name="MergingApk" xml:space="preserve">
|
||||
<value>APK birleştiriliyor</value>
|
||||
</data>
|
||||
<data name="MovingBasedirectory" xml:space="preserve">
|
||||
<value>Temel dizin "{0}" konumuna taşınıyor</value>
|
||||
</data>
|
||||
<data name="DirNotExist" xml:space="preserve">
|
||||
<value>"{0}" dizini mevcut değil</value>
|
||||
</data>
|
||||
<data name="TempDirectory" xml:space="preserve">
|
||||
<value>Geçici dizin: "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorMerging" xml:space="preserve">
|
||||
<value>Birleştirme başarısız</value>
|
||||
</data>
|
||||
<data name="MergingApkEditor" xml:space="preserve">
|
||||
<value>APK, APKEditor.jar kullanılarak birleştiriliyor</value>
|
||||
</data>
|
||||
<data name="Aborted" xml:space="preserve">
|
||||
<value>İptal edildi</value>
|
||||
</data>
|
||||
<data name="CancelProcess" xml:space="preserve">
|
||||
<value>İşlemi iptal etmek istediğinizden emin misiniz?</value>
|
||||
</data>
|
||||
<data name="GettingDevices" xml:space="preserve">
|
||||
<value>Cihazlar alınıyor...</value>
|
||||
</data>
|
||||
<data name="PleaseWait" xml:space="preserve">
|
||||
<value>Lütfen bekleyin...</value>
|
||||
</data>
|
||||
<data name="ConfirmKillingAdbServer" xml:space="preserve">
|
||||
<value>ADB sunucusunu sonlandırmak istediğinizden emin misiniz? Cihazınızı yeniden bağlamanız veya emülatörü yeniden başlatmanız gerekebilir</value>
|
||||
</data>
|
||||
<data name="DeviceNotSelected" xml:space="preserve">
|
||||
<value>Cihaz seçilmedi</value>
|
||||
</data>
|
||||
<data name="DeviceSelected" xml:space="preserve">
|
||||
<value>Cihaz seçildi "{0}"</value>
|
||||
</data>
|
||||
<data name="DevicesFound" xml:space="preserve">
|
||||
<value>{0} cihaz bulundu</value>
|
||||
</data>
|
||||
<data name="InstallApkFailed" xml:space="preserve">
|
||||
<value>APK Kurulumu başarısız</value>
|
||||
</data>
|
||||
<data name="InstallApkSuccessful" xml:space="preserve">
|
||||
<value>APK Kurulumu başarılı</value>
|
||||
</data>
|
||||
<data name="InstallingApk" xml:space="preserve">
|
||||
<value>APK yükleniyor</value>
|
||||
</data>
|
||||
<data name="InstallingApkPath" xml:space="preserve">
|
||||
<value>"{0}" APK’sı yükleniyor</value>
|
||||
</data>
|
||||
<data name="NoDevicesFound" xml:space="preserve">
|
||||
<value>Cihaz bulunamadı. Cihazınızın bilgisayara bağlı olduğundan ve adb hata ayıklamasının açık olduğundan emin olun. Emülatör kullanıyorsanız, yeniden başlatın ve açılmasını bekleyin</value>
|
||||
</data>
|
||||
<data name="TimeEnded" xml:space="preserve">
|
||||
<value>Bitiş zamanı: {0}</value>
|
||||
</data>
|
||||
<data name="TimeStarted" xml:space="preserve">
|
||||
<value>Başlangıç zamanı: {0}</value>
|
||||
</data>
|
||||
<data name="ClearFrameworkPrompt" xml:space="preserve">
|
||||
<value>Apktool sürümü değiştirildikten sonra beklenmedik hataları önlemek için çerçeve önbelleğini temizlemek gerekiyor. Şimdi temizlemek ister misiniz?</value>
|
||||
</data>
|
||||
<data name="ClearTempFolder" xml:space="preserve">
|
||||
<value>Geçici klasör temizleniyor</value>
|
||||
</data>
|
||||
<data name="DeletingFolder" xml:space="preserve">
|
||||
<value>Klasör siliniyor: {0}</value>
|
||||
</data>
|
||||
<data name="DirectoryNotExist" xml:space="preserve">
|
||||
<value>"{0}" dizini mevcut değil</value>
|
||||
</data>
|
||||
<data name="OpenComFolder" xml:space="preserve">
|
||||
<value>Derleme çıkış klasörünü aç</value>
|
||||
</data>
|
||||
<data name="OpenDecFolder" xml:space="preserve">
|
||||
<value>Çözümleme çıkış klasörünü aç</value>
|
||||
</data>
|
||||
<data name="FixApktoolYml" xml:space="preserve">
|
||||
<value>apktool.yml düzeltildi</value>
|
||||
</data>
|
||||
<data name="CopyFileTo" xml:space="preserve">
|
||||
<value>"{0}" dosyasını "{1}" konumuna kopyala</value>
|
||||
</data>
|
||||
<data name="SplitApkNotFound" xml:space="preserve">
|
||||
<value>Bölünmüş APK seçilmedi</value>
|
||||
</data>
|
||||
<data name="CantDetectApkeditorVersion" xml:space="preserve">
|
||||
<value>APKEditor sürümü tespit edilemedi</value>
|
||||
</data>
|
||||
<data name="SetLanguageRestartApplication" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,996 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="About" xml:space="preserve">
|
||||
<value>Giới thiệu</value>
|
||||
</data>
|
||||
<data name="APKToolVersion" xml:space="preserve">
|
||||
<value>Phiên bản Apktool</value>
|
||||
</data>
|
||||
<data name="CheckForUpdate" xml:space="preserve">
|
||||
<value>Kiểm tra cập nhật</value>
|
||||
</data>
|
||||
<data name="DebugMode" xml:space="preserve">
|
||||
<value>Chế độ gỡ lỗi</value>
|
||||
</data>
|
||||
<data name="Exit" xml:space="preserve">
|
||||
<value>Thoát</value>
|
||||
</data>
|
||||
<data name="File" xml:space="preserve">
|
||||
<value>Tệp</value>
|
||||
</data>
|
||||
<data name="Help" xml:space="preserve">
|
||||
<value>Trợ giúp</value>
|
||||
</data>
|
||||
<data name="Settings" xml:space="preserve">
|
||||
<value>Cài đặt</value>
|
||||
</data>
|
||||
<data name="ErrorJavaDetect" xml:space="preserve">
|
||||
<value>Java chưa được cài đặt hoặc đã cài đặt không đúng. Vui lòng cài đặt Java hoặc đặt vị trí tùy chỉnh trong Cài đặt</value>
|
||||
</data>
|
||||
<data name="ErrorReadSettings" xml:space="preserve">
|
||||
<value>Lỗi đọc cài đặt!</value>
|
||||
</data>
|
||||
<data name="UpdateNewVersion" xml:space="preserve">
|
||||
<value>Có phiên bản mới. Bạn có muốn cập nhật không?</value>
|
||||
</data>
|
||||
<data name="UpdateNoUpdates" xml:space="preserve">
|
||||
<value>Không có bản cập nhật nào.</value>
|
||||
</data>
|
||||
<data name="WarningDecodingFolderNotSelected" xml:space="preserve">
|
||||
<value>Thư mục dịch ngược chưa được chọn!</value>
|
||||
</data>
|
||||
<data name="WarningFileForDecodingNotSelected" xml:space="preserve">
|
||||
<value>Tệp để dịch ngược chưa được chọn!</value>
|
||||
</data>
|
||||
<data name="WarningFileForSigningNotSelected" xml:space="preserve">
|
||||
<value>Tệp để ký chưa được chọn!</value>
|
||||
</data>
|
||||
<data name="WarningFrameworkNotSelected" xml:space="preserve">
|
||||
<value>Framework chưa được chọn!</value>
|
||||
</data>
|
||||
<data name="ErrorSaveSettings" xml:space="preserve">
|
||||
<value>Lỗi lưu cài đặt!</value>
|
||||
</data>
|
||||
<data name="NeedRestart" xml:space="preserve">
|
||||
<value>Để các thay đổi có hiệu lực, bạn phải khởi động lại chương trình. Bạn có muốn thực hiện ngay bây giờ không?</value>
|
||||
</data>
|
||||
<data name="FileNotFound" xml:space="preserve">
|
||||
<value>Không tìm thấy tệp</value>
|
||||
</data>
|
||||
<data name="FolderNotExist" xml:space="preserve">
|
||||
<value>Thư mục không tồn tại</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Lỗi</value>
|
||||
</data>
|
||||
<data name="Build" xml:space="preserve">
|
||||
<value>Biên dịch</value>
|
||||
</data>
|
||||
<data name="Decode" xml:space="preserve">
|
||||
<value>Dịch ngược</value>
|
||||
</data>
|
||||
<data name="InstallFramework" xml:space="preserve">
|
||||
<value>Cài đặt framework</value>
|
||||
</data>
|
||||
<data name="Sign" xml:space="preserve">
|
||||
<value>Ký</value>
|
||||
</data>
|
||||
<data name="SystemLanguage" xml:space="preserve">
|
||||
<value>Ngôn ngữ hệ thống</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToInstallCM" xml:space="preserve">
|
||||
<value>Bạn có thực sự muốn cài đặt menu ngữ cảnh không?</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToRemoveCM" xml:space="preserve">
|
||||
<value>Bạn có thực sự muốn xóa menu ngữ cảnh không?</value>
|
||||
</data>
|
||||
<data name="Done" xml:space="preserve">
|
||||
<value>Hoàn tất</value>
|
||||
</data>
|
||||
<data name="CantDetectApktoolVersion" xml:space="preserve">
|
||||
<value>Không thể phát hiện phiên bản apktool.</value>
|
||||
</data>
|
||||
<data name="DecompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Dịch ngược thành công. Thư mục đầu ra "{0}".</value>
|
||||
</data>
|
||||
<data name="ErrorUpdateChecking" xml:space="preserve">
|
||||
<value>Lỗi kiểm tra cập nhật:</value>
|
||||
</data>
|
||||
<data name="SignSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Ký thành công. Tệp đã được lưu vào "{0}".</value>
|
||||
</data>
|
||||
<data name="Aligning" xml:space="preserve">
|
||||
<value>Đang căn chỉnh</value>
|
||||
</data>
|
||||
<data name="ErrorCompiling" xml:space="preserve">
|
||||
<value>Biên dịch thất bại</value>
|
||||
</data>
|
||||
<data name="ErrorEnteringFrameworkTag" xml:space="preserve">
|
||||
<value>Lỗi nhập thẻ framework.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFileNotExist" xml:space="preserve">
|
||||
<value>Tệp đã chọn không tồn tại.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkDirectory" xml:space="preserve">
|
||||
<value>Lỗi chọn thư mục framework.</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkFile" xml:space="preserve">
|
||||
<value>Lỗi chọn tệp framework. Tệp không tồn tại.</value>
|
||||
</data>
|
||||
<data name="ErrorSigning" xml:space="preserve">
|
||||
<value>Ký thất bại.</value>
|
||||
</data>
|
||||
<data name="FrameworkInstallationNotStarted" xml:space="preserve">
|
||||
<value>Lỗi. Việc cài đặt framework chưa được bắt đầu.</value>
|
||||
</data>
|
||||
<data name="InstallingFramework" xml:space="preserve">
|
||||
<value>Đang cài đặt framework</value>
|
||||
</data>
|
||||
<data name="Signing" xml:space="preserve">
|
||||
<value>Đang ký</value>
|
||||
</data>
|
||||
<data name="SignInputFileNotFound" xml:space="preserve">
|
||||
<value>Không tìm thấy tệp đầu vào.</value>
|
||||
</data>
|
||||
<data name="SignPrivateKeyNotFound" xml:space="preserve">
|
||||
<value>Không tìm thấy khóa riêng.</value>
|
||||
</data>
|
||||
<data name="SignPublicKeyNotFound" xml:space="preserve">
|
||||
<value>Không tìm thấy khóa công khai.</value>
|
||||
</data>
|
||||
<data name="ZIPArchives" xml:space="preserve">
|
||||
<value>Tệp nén ZIP</value>
|
||||
</data>
|
||||
<data name="DecodeCouldNotCreate" xml:space="preserve">
|
||||
<value>Thư mục dịch ngược đã chọn không thể được tạo vì chứa các ký tự không hợp lệ.</value>
|
||||
</data>
|
||||
<data name="DecodeDirNotSelected" xml:space="preserve">
|
||||
<value>Thư mục dịch ngược chưa được chọn.</value>
|
||||
</data>
|
||||
<data name="DecodeSelectedFrameworkNotExist" xml:space="preserve">
|
||||
<value>Thư mục framework đã chọn không tồn tại.</value>
|
||||
</data>
|
||||
<data name="Decoding" xml:space="preserve">
|
||||
<value>Đang dịch ngược</value>
|
||||
</data>
|
||||
<data name="ErrorDecompiling" xml:space="preserve">
|
||||
<value>Dịch ngược thất bại</value>
|
||||
</data>
|
||||
<data name="ExecutableFile" xml:space="preserve">
|
||||
<value>Tệp thực thi</value>
|
||||
</data>
|
||||
<data name="ChangedTargetSdkTo29" xml:space="preserve">
|
||||
<value>Đã thay đổi target SDK thành 29</value>
|
||||
</data>
|
||||
<data name="ErrorVersionParsing" xml:space="preserve">
|
||||
<value>Phân tích phiên bản thất bại</value>
|
||||
</data>
|
||||
<data name="FixAndroidManifest" xml:space="preserve">
|
||||
<value>Đã sửa tệp AndroidManifest.xml</value>
|
||||
</data>
|
||||
<data name="RemoveApkToolDummies" xml:space="preserve">
|
||||
<value>Đã xóa tất cả các tệp giả của ApkTool</value>
|
||||
</data>
|
||||
<data name="APKSelected" xml:space="preserve">
|
||||
<value>APK đã chọn:</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFolderNotExist" xml:space="preserve">
|
||||
<value>Thư mục đã chọn không tồn tại.</value>
|
||||
</data>
|
||||
<data name="AndroidManifestNotExist" xml:space="preserve">
|
||||
<value>Tệp AndroidManifest.xml không tồn tại</value>
|
||||
</data>
|
||||
<data name="DecompiledAPKNotExist" xml:space="preserve">
|
||||
<value>Thư mục APK đã dịch ngược không tồn tại</value>
|
||||
</data>
|
||||
<data name="MainActivityFound" xml:space="preserve">
|
||||
<value>Đã tìm thấy activity chính trong "{0}"</value>
|
||||
</data>
|
||||
<data name="MainActivityNotFoundPleaseFindManually" xml:space="preserve">
|
||||
<value>Không thể tìm thấy MainActivity. Vui lòng tìm thủ công</value>
|
||||
</data>
|
||||
<data name="ClearingFramework" xml:space="preserve">
|
||||
<value>Đang xóa Framework</value>
|
||||
</data>
|
||||
<data name="CompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Biên dịch thành công. Thư mục đầu ra "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorZipalign" xml:space="preserve">
|
||||
<value>Zipalign thất bại</value>
|
||||
</data>
|
||||
<data name="ZipalignFileSavedTo" xml:space="preserve">
|
||||
<value>Zipalign thành công. Tệp đã được lưu vào "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorClearingFw" xml:space="preserve">
|
||||
<value>Lỗi xóa framework</value>
|
||||
</data>
|
||||
<data name="FrameworkCacheCleared" xml:space="preserve">
|
||||
<value>Đã xóa bộ nhớ đệm của Framework</value>
|
||||
</data>
|
||||
<data name="AllDone" xml:space="preserve">
|
||||
<value>Đã xong tất cả!</value>
|
||||
</data>
|
||||
<data name="FrameworkInstalled" xml:space="preserve">
|
||||
<value>Framework đã được cài đặt thành công</value>
|
||||
</data>
|
||||
<data name="FrameworkDirNotExist" xml:space="preserve">
|
||||
<value>Thư mục Framework không tồn tại</value>
|
||||
</data>
|
||||
<data name="DecompilingDex" xml:space="preserve">
|
||||
<value>Đang dịch ngược dex</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedOutputFolderNotExist" xml:space="preserve">
|
||||
<value>Thư mục đầu ra đã chọn không tồn tại.</value>
|
||||
</data>
|
||||
<data name="CompilingDex" xml:space="preserve">
|
||||
<value>Đang biên dịch dex</value>
|
||||
</data>
|
||||
<data name="DragDropNotSupported" xml:space="preserve">
|
||||
<value>Bạn đang chạy với quyền quản trị viên. Kéo và thả có thể không được hỗ trợ</value>
|
||||
</data>
|
||||
<data name="DragDropSupported" xml:space="preserve">
|
||||
<value>Kéo và thả được hỗ trợ</value>
|
||||
</data>
|
||||
<data name="ErrorNotAnApk" xml:space="preserve">
|
||||
<value>Thư mục này không phải là một gói Android</value>
|
||||
</data>
|
||||
<data name="Baksmali" xml:space="preserve">
|
||||
<value>Baksmali</value>
|
||||
</data>
|
||||
<data name="Smali" xml:space="preserve">
|
||||
<value>Smali</value>
|
||||
</data>
|
||||
<data name="Zipalign" xml:space="preserve">
|
||||
<value>Zipalign</value>
|
||||
</data>
|
||||
<data name="CompileApk" xml:space="preserve">
|
||||
<value>Biên dịch APK</value>
|
||||
</data>
|
||||
<data name="CompileDex" xml:space="preserve">
|
||||
<value>Biên dịch DEX</value>
|
||||
</data>
|
||||
<data name="DecompileApk" xml:space="preserve">
|
||||
<value>Dịch ngược APK</value>
|
||||
</data>
|
||||
<data name="DecompileDex" xml:space="preserve">
|
||||
<value>Dịch ngược DEX</value>
|
||||
</data>
|
||||
<data name="GetApkInfo" xml:space="preserve">
|
||||
<value>Xem thông tin APK</value>
|
||||
</data>
|
||||
<data name="NotDecompiledApk" xml:space="preserve">
|
||||
<value>Thư mục này không phải là một APK đã được dịch ngược</value>
|
||||
</data>
|
||||
<data name="NotDecompiledDex" xml:space="preserve">
|
||||
<value>Thư mục này không phải là một DEX đã được dịch ngược</value>
|
||||
</data>
|
||||
<data name="RequiredFilesMissing" xml:space="preserve">
|
||||
<value>Các tệp cần thiết bị thiếu</value>
|
||||
</data>
|
||||
<data name="SignApk" xml:space="preserve">
|
||||
<value>Ký APK</value>
|
||||
</data>
|
||||
<data name="TextFile" xml:space="preserve">
|
||||
<value>Tệp văn bản</value>
|
||||
</data>
|
||||
<data name="ZipalignApk" xml:space="preserve">
|
||||
<value>Zipalign APK</value>
|
||||
</data>
|
||||
<data name="CreateUnsignedApk" xml:space="preserve">
|
||||
<value>Đang tạo APK chưa ký</value>
|
||||
</data>
|
||||
<data name="MetainfNotExist" xml:space="preserve">
|
||||
<value>Thư mục META-INF không tồn tại. Đã bỏ qua</value>
|
||||
</data>
|
||||
<data name="ErrorGettingApkInfo" xml:space="preserve">
|
||||
<value>Đã xảy ra lỗi khi lấy thông tin APK</value>
|
||||
</data>
|
||||
<data name="InputDirectory" xml:space="preserve">
|
||||
<value>Thư mục đầu vào: {0}</value>
|
||||
</data>
|
||||
<data name="InputFile" xml:space="preserve">
|
||||
<value>Tệp đầu vào: {0}</value>
|
||||
</data>
|
||||
<data name="DeleteFile" xml:space="preserve">
|
||||
<value>Xóa tệp "{0}"</value>
|
||||
</data>
|
||||
<data name="CopyFileToTemp" xml:space="preserve">
|
||||
<value>Sao chép tệp "{0}" vào thư mục tạm "{1}"</value>
|
||||
</data>
|
||||
<data name="CopyFolderToTemp" xml:space="preserve">
|
||||
<value>Sao chép thư mục apk đã dịch ngược "{0}" vào thư mục tạm "{1}"</value>
|
||||
</data>
|
||||
<data name="DecodeDesDirExists" xml:space="preserve">
|
||||
<value>Thư mục đích "{0}" đã tồn tại. Bật "Buộc xóa thư mục đích" nếu bạn muốn ghi đè lên nó.</value>
|
||||
</data>
|
||||
<data name="MoveTempApkFileToOutput" xml:space="preserve">
|
||||
<value>Di chuyển thư mục tạm "{0}" đến thư mục đầu ra "{1}"</value>
|
||||
</data>
|
||||
<data name="MoveTempApkToOutput" xml:space="preserve">
|
||||
<value>Di chuyển apk tạm "{0}" đến thư mục đầu ra "{1}"</value>
|
||||
</data>
|
||||
<data name="ParsingApkInfo" xml:space="preserve">
|
||||
<value>Đang phân tích thông tin APK...</value>
|
||||
</data>
|
||||
<data name="RestartApplicationPrompt" xml:space="preserve">
|
||||
<value>Cần khởi động lại để áp dụng các thay đổi. Bạn có muốn khởi động lại ứng dụng không?</value>
|
||||
</data>
|
||||
<data name="DecompilingAllApkFiles" xml:space="preserve">
|
||||
<value>Đang dịch ngược tất cả các tệp APK</value>
|
||||
</data>
|
||||
<data name="DetectedAsBase" xml:space="preserve">
|
||||
<value>{0} được phát hiện là base</value>
|
||||
</data>
|
||||
<data name="DetectedAsSplit" xml:space="preserve">
|
||||
<value>{0} được phát hiện là split</value>
|
||||
</data>
|
||||
<data name="ExtractingAllApkFiles" xml:space="preserve">
|
||||
<value>Đang giải nén tất cả các tệp APK</value>
|
||||
</data>
|
||||
<data name="MergeFinishedMoveDir" xml:space="preserve">
|
||||
<value>Hợp nhất hoàn tất. Đang di chuyển thư mục đến "{0}"</value>
|
||||
</data>
|
||||
<data name="MergingApk" xml:space="preserve">
|
||||
<value>Đang hợp nhất APK</value>
|
||||
</data>
|
||||
<data name="MovingBasedirectory" xml:space="preserve">
|
||||
<value>Đang di chuyển thư mục base đến "{0}"</value>
|
||||
</data>
|
||||
<data name="DirNotExist" xml:space="preserve">
|
||||
<value>Thư mục "{0}" không tồn tại</value>
|
||||
</data>
|
||||
<data name="TempDirectory" xml:space="preserve">
|
||||
<value>Thư mục tạm: "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorMerging" xml:space="preserve">
|
||||
<value>Hợp nhất thất bại</value>
|
||||
</data>
|
||||
<data name="MergingApkEditor" xml:space="preserve">
|
||||
<value>Đang hợp nhất APK bằng APKEditor.jar</value>
|
||||
</data>
|
||||
<data name="Aborted" xml:space="preserve">
|
||||
<value>Đã hủy</value>
|
||||
</data>
|
||||
<data name="CancelProcess" xml:space="preserve">
|
||||
<value>Bạn có chắc muốn hủy tiến trình không?</value>
|
||||
</data>
|
||||
<data name="GettingDevices" xml:space="preserve">
|
||||
<value>Đang lấy danh sách thiết bị...</value>
|
||||
</data>
|
||||
<data name="PleaseWait" xml:space="preserve">
|
||||
<value>Vui lòng đợi...</value>
|
||||
</data>
|
||||
<data name="ConfirmKillingAdbServer" xml:space="preserve">
|
||||
<value>Bạn có chắc muốn tắt máy chủ ADB không? Bạn có thể cần kết nối lại thiết bị hoặc khởi động lại trình giả lập</value>
|
||||
</data>
|
||||
<data name="DeviceNotSelected" xml:space="preserve">
|
||||
<value>Thiết bị chưa được chọn</value>
|
||||
</data>
|
||||
<data name="DeviceSelected" xml:space="preserve">
|
||||
<value>Đã chọn thiết bị "{0}"</value>
|
||||
</data>
|
||||
<data name="DevicesFound" xml:space="preserve">
|
||||
<value>Đã tìm thấy {0} thiết bị</value>
|
||||
</data>
|
||||
<data name="InstallApkFailed" xml:space="preserve">
|
||||
<value>Cài đặt APK thất bại</value>
|
||||
</data>
|
||||
<data name="InstallApkSuccessful" xml:space="preserve">
|
||||
<value>Cài đặt APK thành công</value>
|
||||
</data>
|
||||
<data name="InstallingApk" xml:space="preserve">
|
||||
<value>Đang cài đặt APK</value>
|
||||
</data>
|
||||
<data name="InstallingApkPath" xml:space="preserve">
|
||||
<value>Đang cài đặt APK "{0}"</value>
|
||||
</data>
|
||||
<data name="NoDevicesFound" xml:space="preserve">
|
||||
<value>Không tìm thấy thiết bị nào. Hãy chắc chắn rằng thiết bị của bạn được kết nối với máy tính và đã bật chế độ gỡ lỗi adb. Nếu bạn sử dụng trình giả lập, hãy khởi động lại và đợi cho đến khi nó khởi động xong</value>
|
||||
</data>
|
||||
<data name="TimeEnded" xml:space="preserve">
|
||||
<value>Thời gian kết thúc: {0}</value>
|
||||
</data>
|
||||
<data name="TimeStarted" xml:space="preserve">
|
||||
<value>Thời gian bắt đầu: {0}</value>
|
||||
</data>
|
||||
<data name="ClearFrameworkPrompt" xml:space="preserve">
|
||||
<value>Cần phải xóa bộ nhớ đệm của framework sau khi thay đổi phiên bản Apktool để tránh các lỗi không mong muốn. Bạn có muốn xóa ngay bây giờ không?</value>
|
||||
</data>
|
||||
<data name="ClearTempFolder" xml:space="preserve">
|
||||
<value>Đang xóa thư mục tạm</value>
|
||||
</data>
|
||||
<data name="DeletingFolder" xml:space="preserve">
|
||||
<value>Đang xóa thư mục: {0}</value>
|
||||
</data>
|
||||
<data name="DirectoryNotExist" xml:space="preserve">
|
||||
<value>Thư mục "{0}" không tồn tại</value>
|
||||
</data>
|
||||
<data name="OpenComFolder" xml:space="preserve">
|
||||
<value>Mở thư mục đầu ra biên dịch</value>
|
||||
</data>
|
||||
<data name="OpenDecFolder" xml:space="preserve">
|
||||
<value>Mở thư mục đầu ra dịch ngược</value>
|
||||
</data>
|
||||
<data name="FixApktoolYml" xml:space="preserve">
|
||||
<value>Đã sửa tệp apktool.yml</value>
|
||||
</data>
|
||||
<data name="CopyFileTo" xml:space="preserve">
|
||||
<value>Sao chép tệp "{0}" đến "{1}"</value>
|
||||
</data>
|
||||
<data name="SplitApkNotFound" xml:space="preserve">
|
||||
<value>Split APK chưa được chọn</value>
|
||||
</data>
|
||||
<data name="CantDetectApkeditorVersion" xml:space="preserve">
|
||||
<value>Không thể phát hiện phiên bản APKEditor</value>
|
||||
</data>
|
||||
<data name="SetLanguageRestartApplication" xml:space="preserve">
|
||||
<value />
|
||||
</data>
|
||||
<data name="AboutVersion" xml:space="preserve">
|
||||
<value>Phiên bản</value>
|
||||
</data>
|
||||
<data name="AboutCopyright" xml:space="preserve">
|
||||
<value>Bản quyền</value>
|
||||
</data>
|
||||
<data name="AboutGithubRepo" xml:space="preserve">
|
||||
<value>Kho Github</value>
|
||||
</data>
|
||||
<data name="SettingsGeneral" xml:space="preserve">
|
||||
<value>Chung</value>
|
||||
</data>
|
||||
<data name="SettingsLanguage" xml:space="preserve">
|
||||
<value>Ngôn ngữ</value>
|
||||
</data>
|
||||
<data name="SettingsContextMenu" xml:space="preserve">
|
||||
<value>Menu chuột phải</value>
|
||||
</data>
|
||||
<data name="SettingsTheme" xml:space="preserve">
|
||||
<value>Giao diện</value>
|
||||
</data>
|
||||
<data name="SettingsTempNote" xml:space="preserve">
|
||||
<value>Việc di chuyển các tệp trong quá trình xử lý vào thư mục tạm có thể mất thời gian, vui lòng kiên nhẫn chờ đợi</value>
|
||||
</data>
|
||||
<data name="SettingsAdminRights" xml:space="preserve">
|
||||
<value>Yêu cầu quyền quản trị</value>
|
||||
</data>
|
||||
<data name="SettingsClearLog" xml:space="preserve">
|
||||
<value>Xóa nhật ký trước khi thực hiện</value>
|
||||
</data>
|
||||
<data name="SettingsPlaySound" xml:space="preserve">
|
||||
<value>Âm báo hoàn thành</value>
|
||||
</data>
|
||||
<data name="SettingsCustomTemp" xml:space="preserve">
|
||||
<value>Vị trí bộ đệm tùy chỉnh</value>
|
||||
</data>
|
||||
<data name="SettingsCustomJava" xml:space="preserve">
|
||||
<value>Vị trí Java tùy chỉnh</value>
|
||||
</data>
|
||||
<data name="SettingsUtf8" xml:space="preserve">
|
||||
<value>Hỗ trợ tên tệp UTF-8 (bật khi tên tệp bị lỗi hiển thị)</value>
|
||||
</data>
|
||||
<data name="SettingsCustomJvmArgs" xml:space="preserve">
|
||||
<value>Tùy chỉnh lệnh JVM</value>
|
||||
</data>
|
||||
<data name="SettingsCheckUpdate" xml:space="preserve">
|
||||
<value>Kiểm tra cập nhật khi khởi động</value>
|
||||
</data>
|
||||
<data name="SettingsCustomApktool" xml:space="preserve">
|
||||
<value>Vị trí apktool tùy chỉnh</value>
|
||||
</data>
|
||||
<data name="SettingsIgnoreOutputCM" xml:space="preserve">
|
||||
<value>Bỏ qua thư mục đầu ra tùy chỉnh của menu chuột phải</value>
|
||||
</data>
|
||||
<data name="SettingsInstall" xml:space="preserve">
|
||||
<value>Cài đặt</value>
|
||||
</data>
|
||||
<data name="SettingsUninstall" xml:space="preserve">
|
||||
<value>Gỡ cài đặt</value>
|
||||
</data>
|
||||
<data name="SettingsCancel" xml:space="preserve">
|
||||
<value>Hủy</value>
|
||||
</data>
|
||||
<data name="ThemeAuto" xml:space="preserve">
|
||||
<value>Tự động</value>
|
||||
</data>
|
||||
<data name="ThemeLight" xml:space="preserve">
|
||||
<value>Sáng</value>
|
||||
</data>
|
||||
<data name="ThemeDark" xml:space="preserve">
|
||||
<value>Tối</value>
|
||||
</data>
|
||||
<data name="splitApkTxt.Text" xml:space="preserve">
|
||||
<value>Hợp nhất các tệp APK bị chia nhỏ thành một tệp APK duy nhất:</value>
|
||||
</data>
|
||||
<data name="mergeApkBtn.Text" xml:space="preserve">
|
||||
<value>Hợp nhất</value>
|
||||
</data>
|
||||
<data name="comApkOpenDir.Text" xml:space="preserve">
|
||||
<value>Thư mục APK đã biên dịch</value>
|
||||
</data>
|
||||
<data name="decOutOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>Thư mục đầu ra dịch ngược</value>
|
||||
</data>
|
||||
<data name="signApkOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>Thư mục APK đã ký</value>
|
||||
</data>
|
||||
<data name="alignApkOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>Thư mục APK đã Zipalign</value>
|
||||
</data>
|
||||
<data name="decApkOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>Thư mục APK đã dịch ngược</value>
|
||||
</data>
|
||||
<data name="compileOutputOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>Thư mục đầu ra biên dịch</value>
|
||||
</data>
|
||||
<data name="button_OpenMainActivity.Text" xml:space="preserve">
|
||||
<value>Smali của Activity khởi động</value>
|
||||
</data>
|
||||
<data name="label4.Text" xml:space="preserve">
|
||||
<value>Ký APK:</value>
|
||||
</data>
|
||||
<data name="button_SIGN_Sign.Text" xml:space="preserve">
|
||||
<value>Ký</value>
|
||||
</data>
|
||||
<data name="label3.Text" xml:space="preserve">
|
||||
<value>Zipalign tệp APK:</value>
|
||||
</data>
|
||||
<data name="button_ZIPALIGN_Align.Text" xml:space="preserve">
|
||||
<value>Zipalign</value>
|
||||
</data>
|
||||
<data name="label2.Text" xml:space="preserve">
|
||||
<value>Thư mục APK đã dịch ngược:</value>
|
||||
</data>
|
||||
<data name="button_BUILD_Build.Text" xml:space="preserve">
|
||||
<value>Biên dịch</value>
|
||||
</data>
|
||||
<data name="label1.Text" xml:space="preserve">
|
||||
<value>Tệp APK/XAPK/APKS/ZIP/APKM:</value>
|
||||
</data>
|
||||
<data name="button_DECODE_Decode.Text" xml:space="preserve">
|
||||
<value>Dịch ngược</value>
|
||||
</data>
|
||||
<data name="tabPageMain.Text" xml:space="preserve">
|
||||
<value>Trang chính</value>
|
||||
</data>
|
||||
<data name="label31.Text" xml:space="preserve">
|
||||
<value>Activity khởi động:</value>
|
||||
</data>
|
||||
<data name="label30.Text" xml:space="preserve">
|
||||
<value>Kiến trúc:</value>
|
||||
</data>
|
||||
<data name="label17.Text" xml:space="preserve">
|
||||
<value>Tệp:</value>
|
||||
</data>
|
||||
<data name="label18.Text" xml:space="preserve">
|
||||
<value>Bản địa hóa:</value>
|
||||
</data>
|
||||
<data name="label15.Text" xml:space="preserve">
|
||||
<value>Quyền:</value>
|
||||
</data>
|
||||
<data name="label14.Text" xml:space="preserve">
|
||||
<value>Mật độ (DPI):</value>
|
||||
</data>
|
||||
<data name="label19.Text" xml:space="preserve">
|
||||
<value>Liên kết cửa hàng:</value>
|
||||
</data>
|
||||
<data name="label7.Text" xml:space="preserve">
|
||||
<value>Tên ứng dụng:</value>
|
||||
</data>
|
||||
<data name="label9.Text" xml:space="preserve">
|
||||
<value>Tên gói ứng dụng:</value>
|
||||
</data>
|
||||
<data name="label8.Text" xml:space="preserve">
|
||||
<value>Phiên bản:</value>
|
||||
</data>
|
||||
<data name="label11.Text" xml:space="preserve">
|
||||
<value>SDK tương thích tối thiểu:</value>
|
||||
</data>
|
||||
<data name="label10.Text" xml:space="preserve">
|
||||
<value>Tên mã:</value>
|
||||
</data>
|
||||
<data name="label13.Text" xml:space="preserve">
|
||||
<value>Kích thước màn hình</value>
|
||||
</data>
|
||||
<data name="label12.Text" xml:space="preserve">
|
||||
<value>SDK mục tiêu:</value>
|
||||
</data>
|
||||
<data name="basicInfoTabPage.Text" xml:space="preserve">
|
||||
<value>Thông tin cơ bản</value>
|
||||
</data>
|
||||
<data name="tabPageApkInfo.Text" xml:space="preserve">
|
||||
<value>Thông tin APK</value>
|
||||
</data>
|
||||
<data name="checkBox7.Text" xml:space="preserve">
|
||||
<value>Không phân tích thông tin APK khi chọn APK để dịch ngược</value>
|
||||
</data>
|
||||
<data name="decSetApiLvlChkBox.Text" xml:space="preserve">
|
||||
<value>Đặt cấp độ API cho các tệp sẽ được tạo, ví dụ: 14 cho ICS.</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_FixError.Text" xml:space="preserve">
|
||||
<value>Sửa lỗi ApkTool sau khi dịch ngược</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_OnlyMainClasses.Text" xml:space="preserve">
|
||||
<value>Chỉ dịch ngược các tệp dex chính trong thư mục gốc (classes[0-9]*.dex).</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_UseFramework.Text" xml:space="preserve">
|
||||
<value>Sử dụng vị trí tệp framework:</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_MatchOriginal.Text" xml:space="preserve">
|
||||
<value>Giữ các tệp gần với bản gốc nhất có thể, ngăn việc xây dựng lại</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_OutputDirectory.Text" xml:space="preserve">
|
||||
<value>Thư mục đầu ra:</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_KeepBrokenRes.Text" xml:space="preserve">
|
||||
<value>Giữ lại tài nguyên bị hỏng</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoSrc.Text" xml:space="preserve">
|
||||
<value>Không dịch ngược mã nguồn</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_Force.Text" xml:space="preserve">
|
||||
<value>Buộc xóa thư mục đích</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoRes.Text" xml:space="preserve">
|
||||
<value>Không dịch ngược tài nguyên (resources)</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoDebugInfo.Text" xml:space="preserve">
|
||||
<value>Không xuất thông tin gỡ lỗi (.local, .param, .line, v.v.)</value>
|
||||
</data>
|
||||
<data name="groupBox_DECODE_Options.Text" xml:space="preserve">
|
||||
<value>Tùy chọn</value>
|
||||
</data>
|
||||
<data name="tabPageDecode.Text" xml:space="preserve">
|
||||
<value>Dịch ngược</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_NetSecConf.Text" xml:space="preserve">
|
||||
<value>Thêm cấu hình bảo mật mạng chung vào APK đầu ra</value>
|
||||
</data>
|
||||
<data name="useAapt2ChkBox.Text" xml:space="preserve">
|
||||
<value>Sử dụng aapt2 (Nâng cấp apktool để sử dụng tệp nhị phân aapt2 thử nghiệm)</value>
|
||||
</data>
|
||||
<data name="buildSetApiLvlChkBox.Text" xml:space="preserve">
|
||||
<value>Đặt cấp độ API cho các tệp sẽ được tạo, ví dụ: 14 cho ICS.</value>
|
||||
</data>
|
||||
<data name="createUnsignApkChkBox.Text" xml:space="preserve">
|
||||
<value>Tạo APK chưa ký với chữ ký gốc sau khi biên dịch</value>
|
||||
</data>
|
||||
<data name="signAfterBuildChkBox.Text" xml:space="preserve">
|
||||
<value>Ký sau khi Biên dịch/Zipalign</value>
|
||||
</data>
|
||||
<data name="zipalignAfterBuildChkBox.Text" xml:space="preserve">
|
||||
<value>Zipalign sau khi biên dịch</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_NoCrunch.Text" xml:space="preserve">
|
||||
<value>Vô hiệu hóa việc xử lý các tệp tài nguyên trong bước biên dịch</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_ForceAll.Text" xml:space="preserve">
|
||||
<value>Bỏ qua kiểm tra thay đổi và biên dịch tất cả các tệp</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_OutputAppPath.Text" xml:space="preserve">
|
||||
<value>Thư mục đầu ra APK</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_CopyOriginal.Text" xml:space="preserve">
|
||||
<value>Sao chép thư mục AndroidManifest.xml và META-INF gốc</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_UseAapt.Text" xml:space="preserve">
|
||||
<value>Sử dụng vị trí tệp aapt.exe:</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_UseFramework.Text" xml:space="preserve">
|
||||
<value>Sử dụng vị trí tệp framework:</value>
|
||||
</data>
|
||||
<data name="groupBox_BUILD_Options.Text" xml:space="preserve">
|
||||
<value>Tùy chọn</value>
|
||||
</data>
|
||||
<data name="tabPageBuild.Text" xml:space="preserve">
|
||||
<value>Biên dịch</value>
|
||||
</data>
|
||||
<data name="checkBox2.Text" xml:space="preserve">
|
||||
<value>Cài đặt APK sau khi ký (đảm bảo đã chọn thiết bị trong tùy chọn ADB trước)</value>
|
||||
</data>
|
||||
<data name="checkBox1.Text" xml:space="preserve">
|
||||
<value>Ghi đè tệp đầu vào</value>
|
||||
</data>
|
||||
<data name="autoDelIdsigChkBox.Text" xml:space="preserve">
|
||||
<value>Tự động xóa tệp idsig</value>
|
||||
</data>
|
||||
<data name="label27.Text" xml:space="preserve">
|
||||
<value>Lược đồ ký v4:</value>
|
||||
</data>
|
||||
<data name="label26.Text" xml:space="preserve">
|
||||
<value>Lược đồ ký v3:</value>
|
||||
</data>
|
||||
<data name="label25.Text" xml:space="preserve">
|
||||
<value>Lược đồ ký v2:</value>
|
||||
</data>
|
||||
<data name="label24.Text" xml:space="preserve">
|
||||
<value>Lược đồ ký v1:</value>
|
||||
</data>
|
||||
<data name="useAliasChkBox.Text" xml:space="preserve">
|
||||
<value>Tên bí danh (Alias)</value>
|
||||
</data>
|
||||
<data name="label22.Text" xml:space="preserve">
|
||||
<value>Rất khuyến khích bạn sử dụng khóa của riêng mình, được tạo bằng Android Studio hoặc các công cụ khác</value>
|
||||
</data>
|
||||
<data name="label21.Text" xml:space="preserve">
|
||||
<value>Mật khẩu:</value>
|
||||
</data>
|
||||
<data name="label20.Text" xml:space="preserve">
|
||||
<value>Tệp keystore/jks:</value>
|
||||
</data>
|
||||
<data name="useKeyStoreChkBox.Text" xml:space="preserve">
|
||||
<value>Sử dụng keystore</value>
|
||||
</data>
|
||||
<data name="useSigningOutputDir.Text" xml:space="preserve">
|
||||
<value>Thư mục đầu ra APK:</value>
|
||||
</data>
|
||||
<data name="label_SIGN_PrivateKey.Text" xml:space="preserve">
|
||||
<value>Khóa riêng:</value>
|
||||
</data>
|
||||
<data name="label_SIGN_PublicKey.Text" xml:space="preserve">
|
||||
<value>Khóa công khai:</value>
|
||||
</data>
|
||||
<data name="groupBox_SIGN_Options.Text" xml:space="preserve">
|
||||
<value>Tùy chọn</value>
|
||||
</data>
|
||||
<data name="tabPageSign.Text" xml:space="preserve">
|
||||
<value>Ký</value>
|
||||
</data>
|
||||
<data name="zipalignOutputDirChkBox.Text" xml:space="preserve">
|
||||
<value>Thư mục đầu ra APK:</value>
|
||||
</data>
|
||||
<data name="signAfterZipalignChkBox.Text" xml:space="preserve">
|
||||
<value>Ký sau khi zipalign</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_Recompress.Text" xml:space="preserve">
|
||||
<value>Nén lại bằng Zopfli</value>
|
||||
</data>
|
||||
<data name="label_ZIPALIGN_AlignmentBytes.Text" xml:space="preserve">
|
||||
<value>Căn chỉnh theo byte, ví dụ: '4' cung cấp căn chỉnh 32-bit</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_CheckAlignment.Text" xml:space="preserve">
|
||||
<value>Chỉ kiểm tra căn chỉnh (không sửa đổi tệp)</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_VerboseOutput.Text" xml:space="preserve">
|
||||
<value>Đầu ra chi tiết</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_OverwriteOutputFile.Text" xml:space="preserve">
|
||||
<value>Ghi đè tệp đầu ra hiện có</value>
|
||||
</data>
|
||||
<data name="groupBox_ZIPALIGN_Options.Text" xml:space="preserve">
|
||||
<value>Tùy chọn</value>
|
||||
</data>
|
||||
<data name="tabPageZipAlign.Text" xml:space="preserve">
|
||||
<value>Zipalign</value>
|
||||
</data>
|
||||
<data name="openFwFolderBtn.Text" xml:space="preserve">
|
||||
<value>Mở thư mục framework</value>
|
||||
</data>
|
||||
<data name="clearFwBtn.Text" xml:space="preserve">
|
||||
<value>Xóa bộ nhớ đệm framework</value>
|
||||
</data>
|
||||
<data name="clearFwBeforeDecodeChkBox.Text" xml:space="preserve">
|
||||
<value>Xóa bộ nhớ đệm Framework trước khi dịch ngược</value>
|
||||
</data>
|
||||
<data name="groupBox1.Text" xml:space="preserve">
|
||||
<value>Tùy chọn</value>
|
||||
</data>
|
||||
<data name="checkBox_IF_Tag.Text" xml:space="preserve">
|
||||
<value>Gắn thẻ frameworks bằng:</value>
|
||||
</data>
|
||||
<data name="checkBox_IF_FramePath.Text" xml:space="preserve">
|
||||
<value>Lưu trữ tệp framework vào:</value>
|
||||
</data>
|
||||
<data name="button_IF_InstallFramework.Text" xml:space="preserve">
|
||||
<value>Cài đặt</value>
|
||||
</data>
|
||||
<data name="groupBox_IF_Options.Text" xml:space="preserve">
|
||||
<value>Tùy chọn</value>
|
||||
</data>
|
||||
<data name="label29.Text" xml:space="preserve">
|
||||
<value>Thư mục biên dịch Smali:</value>
|
||||
</data>
|
||||
<data name="smaliUseOutputChkBox.Text" xml:space="preserve">
|
||||
<value>Thư mục đầu ra Dex:</value>
|
||||
</data>
|
||||
<data name="comSmaliBtn.Text" xml:space="preserve">
|
||||
<value>Biên dịch</value>
|
||||
</data>
|
||||
<data name="label28.Text" xml:space="preserve">
|
||||
<value>Dịch ngược Dex:</value>
|
||||
</data>
|
||||
<data name="baksmaliUseOutputChkBox.Text" xml:space="preserve">
|
||||
<value>Thư mục đầu ra:</value>
|
||||
</data>
|
||||
<data name="decSmaliBtn.Text" xml:space="preserve">
|
||||
<value>Dịch ngược</value>
|
||||
</data>
|
||||
<data name="label33.Text" xml:space="preserve">
|
||||
<value>Chọn thiết bị</value>
|
||||
</data>
|
||||
<data name="killAdbBtn.Text" xml:space="preserve">
|
||||
<value>Dừng tiến trình ADB</value>
|
||||
</data>
|
||||
<data name="installApkBtn.Text" xml:space="preserve">
|
||||
<value>Cài đặt APK</value>
|
||||
</data>
|
||||
<data name="refreshDevicesBtn.Text" xml:space="preserve">
|
||||
<value>Làm mới</value>
|
||||
</data>
|
||||
<data name="overrideAbiCheckBox.Text" xml:space="preserve">
|
||||
<value>Ghi đè ABI mặc định của nền tảng:</value>
|
||||
</data>
|
||||
<data name="setVendorChkBox.Text" xml:space="preserve">
|
||||
<value>Đặt nhà cung cấp là Play Store (com.android.vending)</value>
|
||||
</data>
|
||||
<data name="label32.Text" xml:space="preserve">
|
||||
<value>Chọn APK: </value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelStateText.Text" xml:space="preserve">
|
||||
<value>Đang tải...</value>
|
||||
</data>
|
||||
<data name="clearLogToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Xóa nhật ký</value>
|
||||
</data>
|
||||
<data name="newInsToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Tiến trình mới</value>
|
||||
</data>
|
||||
<data name="saveLogToFileToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Lưu nhật ký</value>
|
||||
</data>
|
||||
<data name="openTempFolderToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Mở thư mục tạm</value>
|
||||
</data>
|
||||
<data name="clearTempFolderToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Xóa thư mục tạm</value>
|
||||
</data>
|
||||
<data name="exitToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Thoát</value>
|
||||
</data>
|
||||
<data name="fileToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Tệp</value>
|
||||
</data>
|
||||
<data name="useAPKEditorForDecompilingItem.Text" xml:space="preserve">
|
||||
<value>Sử dụng APKEditor để dịch ngược</value>
|
||||
</data>
|
||||
<data name="settingsToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Cài đặt</value>
|
||||
</data>
|
||||
<data name="checkForUpdateToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Kiểm tra cập nhật</value>
|
||||
</data>
|
||||
<data name="reportAnIsuueToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Báo cáo sự cố</value>
|
||||
</data>
|
||||
<data name="apktoolIssuesToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Sự cố Apktool</value>
|
||||
</data>
|
||||
<data name="baksmaliIssuesToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Sự cố Baksmali</value>
|
||||
</data>
|
||||
<data name="aboutToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Giới thiệu</value>
|
||||
</data>
|
||||
<data name="helpToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Trợ giúp</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_UseApkEditorMerge.Text" xml:space="preserve">
|
||||
<value>Sử dụng APKEditor.jar để hợp nhất/tách APK (nhanh hơn)</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,993 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="About" xml:space="preserve">
|
||||
<value>关于</value>
|
||||
</data>
|
||||
<data name="APKToolVersion" xml:space="preserve">
|
||||
<value>Apktool 版本</value>
|
||||
</data>
|
||||
<data name="CheckForUpdate" xml:space="preserve">
|
||||
<value>检查更新</value>
|
||||
</data>
|
||||
<data name="DebugMode" xml:space="preserve">
|
||||
<value>调试模式</value>
|
||||
</data>
|
||||
<data name="Exit" xml:space="preserve">
|
||||
<value>退出</value>
|
||||
</data>
|
||||
<data name="File" xml:space="preserve">
|
||||
<value>文件</value>
|
||||
</data>
|
||||
<data name="Help" xml:space="preserve">
|
||||
<value>帮助</value>
|
||||
</data>
|
||||
<data name="Settings" xml:space="preserve">
|
||||
<value>设置</value>
|
||||
</data>
|
||||
<data name="ErrorJavaDetect" xml:space="preserve">
|
||||
<value>Java 没有安装或安装不正确。该程序将被关闭。</value>
|
||||
</data>
|
||||
<data name="ErrorReadSettings" xml:space="preserve">
|
||||
<value>读取设置时出错!</value>
|
||||
</data>
|
||||
<data name="UpdateNewVersion" xml:space="preserve">
|
||||
<value>新版本可用。是否要更新?</value>
|
||||
</data>
|
||||
<data name="UpdateNoUpdates" xml:space="preserve">
|
||||
<value>没有更新可用。</value>
|
||||
</data>
|
||||
<data name="WarningDecodingFolderNotSelected" xml:space="preserve">
|
||||
<value>未选择反编译文件夹!</value>
|
||||
</data>
|
||||
<data name="WarningFileForDecodingNotSelected" xml:space="preserve">
|
||||
<value>未选择用于反编译的文件!</value>
|
||||
</data>
|
||||
<data name="WarningFileForSigningNotSelected" xml:space="preserve">
|
||||
<value>未选择用于签名的文件!</value>
|
||||
</data>
|
||||
<data name="WarningFrameworkNotSelected" xml:space="preserve">
|
||||
<value>Framework 未选择!</value>
|
||||
</data>
|
||||
<data name="ErrorSaveSettings" xml:space="preserve">
|
||||
<value>保存设置时出错!</value>
|
||||
</data>
|
||||
<data name="NeedRestart" xml:space="preserve">
|
||||
<value>为了使这些更改生效,你必须重新启动程序。你想立即重启吗?</value>
|
||||
</data>
|
||||
<data name="FileNotFound" xml:space="preserve">
|
||||
<value>未找到文件</value>
|
||||
</data>
|
||||
<data name="FolderNotExist" xml:space="preserve">
|
||||
<value>文件夹不存在</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>错误</value>
|
||||
</data>
|
||||
<data name="Build" xml:space="preserve">
|
||||
<value>构建</value>
|
||||
</data>
|
||||
<data name="Decode" xml:space="preserve">
|
||||
<value>反编译</value>
|
||||
</data>
|
||||
<data name="InstallFramework" xml:space="preserve">
|
||||
<value>安装 Framework</value>
|
||||
</data>
|
||||
<data name="Sign" xml:space="preserve">
|
||||
<value>签名</value>
|
||||
</data>
|
||||
<data name="SystemLanguage" xml:space="preserve">
|
||||
<value>系统语言</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToInstallCM" xml:space="preserve">
|
||||
<value>你真的想安装上下文菜单吗?</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToRemoveCM" xml:space="preserve">
|
||||
<value>你真的想删除上下文菜单吗?</value>
|
||||
</data>
|
||||
<data name="Done" xml:space="preserve">
|
||||
<value>完成</value>
|
||||
</data>
|
||||
<data name="CantDetectApktoolVersion" xml:space="preserve">
|
||||
<value>无法检测 apktool 版本。</value>
|
||||
</data>
|
||||
<data name="DecompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>反编译成功完成。输出目录"{0}"。</value>
|
||||
</data>
|
||||
<data name="ErrorUpdateChecking" xml:space="preserve">
|
||||
<value>检查更新错误:</value>
|
||||
</data>
|
||||
<data name="SignSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>签名成功完成。文件保存到"{0}"。</value>
|
||||
</data>
|
||||
<data name="Aligning" xml:space="preserve">
|
||||
<value>正在对齐</value>
|
||||
</data>
|
||||
<data name="ErrorCompiling" xml:space="preserve">
|
||||
<value>编译失败</value>
|
||||
</data>
|
||||
<data name="ErrorEnteringFrameworkTag" xml:space="preserve">
|
||||
<value>输入 Framework 标签错误。</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFileNotExist" xml:space="preserve">
|
||||
<value>所选文件不存在。</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkDirectory" xml:space="preserve">
|
||||
<value>选择 Framework 目录错误。</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkFile" xml:space="preserve">
|
||||
<value>选择 Framework 文件时出错。该文件不存在。</value>
|
||||
</data>
|
||||
<data name="ErrorSigning" xml:space="preserve">
|
||||
<value>签名失败。</value>
|
||||
</data>
|
||||
<data name="FrameworkInstallationNotStarted" xml:space="preserve">
|
||||
<value>错误。Framework 安装没有开始。</value>
|
||||
</data>
|
||||
<data name="InstallingFramework" xml:space="preserve">
|
||||
<value>正在安装 Framework</value>
|
||||
</data>
|
||||
<data name="Signing" xml:space="preserve">
|
||||
<value>正在签名</value>
|
||||
</data>
|
||||
<data name="SignInputFileNotFound" xml:space="preserve">
|
||||
<value>未找到输入文件。</value>
|
||||
</data>
|
||||
<data name="SignPrivateKeyNotFound" xml:space="preserve">
|
||||
<value>未找到私钥。</value>
|
||||
</data>
|
||||
<data name="SignPublicKeyNotFound" xml:space="preserve">
|
||||
<value>未找到公钥。</value>
|
||||
</data>
|
||||
<data name="ZIPArchives" xml:space="preserve">
|
||||
<value>ZIP 存档</value>
|
||||
</data>
|
||||
<data name="DecodeCouldNotCreate" xml:space="preserve">
|
||||
<value>所选的反编译目录无法创建,因为包含无效的字符。</value>
|
||||
</data>
|
||||
<data name="DecodeDirNotSelected" xml:space="preserve">
|
||||
<value>未选择反编译目录。</value>
|
||||
</data>
|
||||
<data name="DecodeSelectedFrameworkNotExist" xml:space="preserve">
|
||||
<value>所选的 Framework 目录不存在。</value>
|
||||
</data>
|
||||
<data name="Decoding" xml:space="preserve">
|
||||
<value>正在反编译</value>
|
||||
</data>
|
||||
<data name="ErrorDecompiling" xml:space="preserve">
|
||||
<value>反编译失败</value>
|
||||
</data>
|
||||
<data name="ExecutableFile" xml:space="preserve">
|
||||
<value>可执行文件</value>
|
||||
</data>
|
||||
<data name="ChangedTargetSdkTo29" xml:space="preserve">
|
||||
<value>更改目标 SDK 到 29</value>
|
||||
</data>
|
||||
<data name="ErrorVersionParsing" xml:space="preserve">
|
||||
<value>分析版本失败</value>
|
||||
</data>
|
||||
<data name="FixAndroidManifest" xml:space="preserve">
|
||||
<value>修复 AndroidManifest.xml</value>
|
||||
</data>
|
||||
<data name="RemoveApkToolDummies" xml:space="preserve">
|
||||
<value>删除所有 ApkTool 假象</value>
|
||||
</data>
|
||||
<data name="APKSelected" xml:space="preserve">
|
||||
<value>APK 选择:</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFolderNotExist" xml:space="preserve">
|
||||
<value>所选的文件夹不存在。</value>
|
||||
</data>
|
||||
<data name="AndroidManifestNotExist" xml:space="preserve">
|
||||
<value>AndroidManifest.xml 不存在</value>
|
||||
</data>
|
||||
<data name="DecompiledAPKNotExist" xml:space="preserve">
|
||||
<value>反编译的 APK 目录不存在</value>
|
||||
</data>
|
||||
<data name="MainActivityFound" xml:space="preserve">
|
||||
<value>在 "{0}" 找到主要 Activity</value>
|
||||
</data>
|
||||
<data name="MainActivityNotFoundPleaseFindManually" xml:space="preserve">
|
||||
<value>找不到 MainActivity。请手动查找</value>
|
||||
</data>
|
||||
<data name="ClearingFramework" xml:space="preserve">
|
||||
<value>正在清理 Framework</value>
|
||||
</data>
|
||||
<data name="CompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>编译成功完成。输出目录"{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorZipalign" xml:space="preserve">
|
||||
<value>Zip 对齐失败</value>
|
||||
</data>
|
||||
<data name="ZipalignFileSavedTo" xml:space="preserve">
|
||||
<value>Zip 对齐成功完成。文件保存到 "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorClearingFw" xml:space="preserve">
|
||||
<value>清除 Framework 错误</value>
|
||||
</data>
|
||||
<data name="FrameworkCacheCleared" xml:space="preserve">
|
||||
<value>Framework 缓存已清除</value>
|
||||
</data>
|
||||
<data name="AllDone" xml:space="preserve">
|
||||
<value>全部完成!</value>
|
||||
</data>
|
||||
<data name="FrameworkInstalled" xml:space="preserve">
|
||||
<value>Framework 已成功安装</value>
|
||||
</data>
|
||||
<data name="FrameworkDirNotExist" xml:space="preserve">
|
||||
<value>Framework 目录不存在</value>
|
||||
</data>
|
||||
<data name="DecompilingDex" xml:space="preserve">
|
||||
<value>正在反编译 dex</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedOutputFolderNotExist" xml:space="preserve">
|
||||
<value>所选的输出文件夹不存在。</value>
|
||||
</data>
|
||||
<data name="CompilingDex" xml:space="preserve">
|
||||
<value>正在编译 dex</value>
|
||||
</data>
|
||||
<data name="DragDropNotSupported" xml:space="preserve">
|
||||
<value>您正在以管理员身份运行。不支持拖放。</value>
|
||||
</data>
|
||||
<data name="DragDropSupported" xml:space="preserve">
|
||||
<value>支持拖放</value>
|
||||
</data>
|
||||
<data name="ErrorNotAnApk" xml:space="preserve">
|
||||
<value>此目录不是安卓软件包</value>
|
||||
</data>
|
||||
<data name="Baksmali" xml:space="preserve">
|
||||
<value>Baksmali</value>
|
||||
</data>
|
||||
<data name="Smali" xml:space="preserve">
|
||||
<value>Smali</value>
|
||||
</data>
|
||||
<data name="Zipalign" xml:space="preserve">
|
||||
<value>Zip 对齐</value>
|
||||
</data>
|
||||
<data name="CompileApk" xml:space="preserve">
|
||||
<value>编译 APK</value>
|
||||
</data>
|
||||
<data name="CompileDex" xml:space="preserve">
|
||||
<value>编译 DEX</value>
|
||||
</data>
|
||||
<data name="DecompileApk" xml:space="preserve">
|
||||
<value>反编译 APK</value>
|
||||
</data>
|
||||
<data name="DecompileDex" xml:space="preserve">
|
||||
<value>反编译 DEX</value>
|
||||
</data>
|
||||
<data name="GetApkInfo" xml:space="preserve">
|
||||
<value>获取 APK 信息</value>
|
||||
</data>
|
||||
<data name="NotDecompiledApk" xml:space="preserve">
|
||||
<value>此文件夹不是已反编译的 APK</value>
|
||||
</data>
|
||||
<data name="NotDecompiledDex" xml:space="preserve">
|
||||
<value>此文件夹不是反编译的 DEX</value>
|
||||
</data>
|
||||
<data name="RequiredFilesMissing" xml:space="preserve">
|
||||
<value>缺少必需的文件</value>
|
||||
</data>
|
||||
<data name="SignApk" xml:space="preserve">
|
||||
<value>签名 APK</value>
|
||||
</data>
|
||||
<data name="TextFile" xml:space="preserve">
|
||||
<value>文本文件</value>
|
||||
</data>
|
||||
<data name="ZipalignApk" xml:space="preserve">
|
||||
<value>Zip 对齐 APK</value>
|
||||
</data>
|
||||
<data name="CreateUnsignedApk" xml:space="preserve">
|
||||
<value>创建未签名的 APK</value>
|
||||
</data>
|
||||
<data name="MetainfNotExist" xml:space="preserve">
|
||||
<value>META-INF 文件夹不存在。已跳过</value>
|
||||
</data>
|
||||
<data name="ErrorGettingApkInfo" xml:space="preserve">
|
||||
<value>获取 APK 信息时发生错误</value>
|
||||
</data>
|
||||
<data name="InputDirectory" xml:space="preserve">
|
||||
<value>输入目录:{0}</value>
|
||||
</data>
|
||||
<data name="InputFile" xml:space="preserve">
|
||||
<value>输入文件:{0}</value>
|
||||
</data>
|
||||
<data name="DeleteFile" xml:space="preserve">
|
||||
<value>删除文件 "{0}"</value>
|
||||
</data>
|
||||
<data name="CopyFileToTemp" xml:space="preserve">
|
||||
<value>复制文件 "{0}" 到临时目录 "{1}"</value>
|
||||
</data>
|
||||
<data name="CopyFolderToTemp" xml:space="preserve">
|
||||
<value>复制反编译的 apk 文件夹 "{0}" 到临时目录 "{1}"</value>
|
||||
</data>
|
||||
<data name="DecodeDesDirExists" xml:space="preserve">
|
||||
<value>目标目录 "{0}" 已经存在。如果你想覆盖它,请启用 "强制删除目标目录"。</value>
|
||||
</data>
|
||||
<data name="MoveTempApkFileToOutput" xml:space="preserve">
|
||||
<value>移动临时文件夹 "{0}" 到输出目录 "{1}"。</value>
|
||||
</data>
|
||||
<data name="MoveTempApkToOutput" xml:space="preserve">
|
||||
<value>移动临时 apk"{0}" 到输出目录 "{1}"</value>
|
||||
</data>
|
||||
<data name="ParsingApkInfo" xml:space="preserve">
|
||||
<value>正在解析 APK 信息...</value>
|
||||
</data>
|
||||
<data name="RestartApplicationPrompt" xml:space="preserve">
|
||||
<value>需要重新启动才能应用更改。 是否要重新启动应用程序?</value>
|
||||
</data>
|
||||
<data name="DecompilingAllApkFiles" xml:space="preserve">
|
||||
<value>正在反编译所有 APK 文件</value>
|
||||
</data>
|
||||
<data name="DetectedAsBase" xml:space="preserve">
|
||||
<value>{0} 检测为基本模块</value>
|
||||
</data>
|
||||
<data name="DetectedAsSplit" xml:space="preserve">
|
||||
<value>{0} 检测为拆分</value>
|
||||
</data>
|
||||
<data name="ExtractingAllApkFiles" xml:space="preserve">
|
||||
<value>提取所有 APK 文件</value>
|
||||
</data>
|
||||
<data name="MergeFinishedMoveDir" xml:space="preserve">
|
||||
<value>合并完成。移动目录到 "{0}"</value>
|
||||
</data>
|
||||
<data name="MergingApk" xml:space="preserve">
|
||||
<value>正在合并 APK</value>
|
||||
</data>
|
||||
<data name="MovingBasedirectory" xml:space="preserve">
|
||||
<value>将基目录移动到 "{0}"</value>
|
||||
</data>
|
||||
<data name="DirNotExist" xml:space="preserve">
|
||||
<value>目录 "{0}" 不存在</value>
|
||||
</data>
|
||||
<data name="TempDirectory" xml:space="preserve">
|
||||
<value>临时目录: "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorMerging" xml:space="preserve">
|
||||
<value>合并失败</value>
|
||||
</data>
|
||||
<data name="MergingApkEditor" xml:space="preserve">
|
||||
<value>使用 APKEditor.jar 合并 APK</value>
|
||||
</data>
|
||||
<data name="Aborted" xml:space="preserve">
|
||||
<value>已终止</value>
|
||||
</data>
|
||||
<data name="CancelProcess" xml:space="preserve">
|
||||
<value>您确定要取消该进程吗?</value>
|
||||
</data>
|
||||
<data name="GettingDevices" xml:space="preserve">
|
||||
<value>正在获取设备...</value>
|
||||
</data>
|
||||
<data name="PleaseWait" xml:space="preserve">
|
||||
<value>请稍候...</value>
|
||||
</data>
|
||||
<data name="ConfirmKillingAdbServer" xml:space="preserve">
|
||||
<value>您确定要终止 ADB 服务吗? 您可能需要重新连接设备或重新启动模拟器</value>
|
||||
</data>
|
||||
<data name="DeviceNotSelected" xml:space="preserve">
|
||||
<value>未选择设备</value>
|
||||
</data>
|
||||
<data name="DeviceSelected" xml:space="preserve">
|
||||
<value>已选择 "{0}" 设备</value>
|
||||
</data>
|
||||
<data name="DevicesFound" xml:space="preserve">
|
||||
<value>发现 {0} 设备</value>
|
||||
</data>
|
||||
<data name="InstallApkFailed" xml:space="preserve">
|
||||
<value>APK 安装失败</value>
|
||||
</data>
|
||||
<data name="InstallApkSuccessful" xml:space="preserve">
|
||||
<value>APK 安装成功</value>
|
||||
</data>
|
||||
<data name="InstallingApk" xml:space="preserve">
|
||||
<value>正在安装 APK</value>
|
||||
</data>
|
||||
<data name="InstallingApkPath" xml:space="preserve">
|
||||
<value>正在安装 APK "{0}"</value>
|
||||
</data>
|
||||
<data name="NoDevicesFound" xml:space="preserve">
|
||||
<value>未找到设备。 确保您的设备已连接到计算机并打开了 adb 调试。 如果您使用模拟器,请重新启动它并等待它启动</value>
|
||||
</data>
|
||||
<data name="TimeEnded" xml:space="preserve">
|
||||
<value>结束时间: {0}</value>
|
||||
</data>
|
||||
<data name="TimeStarted" xml:space="preserve">
|
||||
<value>开始时间: {0}</value>
|
||||
</data>
|
||||
<data name="ClearFrameworkPrompt" xml:space="preserve">
|
||||
<value>更改 Apktool 版本后需要清除 Framework 缓存以避免意外错误。 你想现在清除它吗?</value>
|
||||
</data>
|
||||
<data name="ClearTempFolder" xml:space="preserve">
|
||||
<value>清除临时文件夹</value>
|
||||
</data>
|
||||
<data name="DeletingFolder" xml:space="preserve">
|
||||
<value>正在删除文件夹: {0}</value>
|
||||
</data>
|
||||
<data name="DirectoryNotExist" xml:space="preserve">
|
||||
<value>目录 "{0}" 不存在</value>
|
||||
</data>
|
||||
<data name="OpenComFolder" xml:space="preserve">
|
||||
<value>打开编译输出文件夹</value>
|
||||
</data>
|
||||
<data name="OpenDecFolder" xml:space="preserve">
|
||||
<value>打开反编译输出文件夹</value>
|
||||
</data>
|
||||
<data name="FixApktoolYml" xml:space="preserve">
|
||||
<value>Apktool.yml 已修复</value>
|
||||
</data>
|
||||
<data name="CopyFileTo" xml:space="preserve">
|
||||
<value>复制文件 "{0}" 到 "{1}"</value>
|
||||
</data>
|
||||
<data name="SplitApkNotFound" xml:space="preserve">
|
||||
<value>未选择拆分的 APK</value>
|
||||
</data>
|
||||
<data name="CantDetectApkeditorVersion" xml:space="preserve">
|
||||
<value>无法检测 APKEditor 版本</value>
|
||||
</data>
|
||||
<data name="AboutVersion" xml:space="preserve">
|
||||
<value>版本</value>
|
||||
</data>
|
||||
<data name="AboutCopyright" xml:space="preserve">
|
||||
<value>版权</value>
|
||||
</data>
|
||||
<data name="AboutGithubRepo" xml:space="preserve">
|
||||
<value>Github 仓库</value>
|
||||
</data>
|
||||
<data name="SettingsGeneral" xml:space="preserve">
|
||||
<value>常规</value>
|
||||
</data>
|
||||
<data name="SettingsLanguage" xml:space="preserve">
|
||||
<value>语言</value>
|
||||
</data>
|
||||
<data name="SettingsContextMenu" xml:space="preserve">
|
||||
<value>右键菜单</value>
|
||||
</data>
|
||||
<data name="SettingsTheme" xml:space="preserve">
|
||||
<value>主题</value>
|
||||
</data>
|
||||
<data name="SettingsTempNote" xml:space="preserve">
|
||||
<value>操作过程的文件移动到缓存目录中需要时间,请耐心等待</value>
|
||||
</data>
|
||||
<data name="SettingsAdminRights" xml:space="preserve">
|
||||
<value>需要管理员权限</value>
|
||||
</data>
|
||||
<data name="SettingsClearLog" xml:space="preserve">
|
||||
<value>操作前清除日志</value>
|
||||
</data>
|
||||
<data name="SettingsPlaySound" xml:space="preserve">
|
||||
<value>完成提示音</value>
|
||||
</data>
|
||||
<data name="SettingsCustomTemp" xml:space="preserve">
|
||||
<value>自定义缓存位置</value>
|
||||
</data>
|
||||
<data name="SettingsCustomJava" xml:space="preserve">
|
||||
<value>自定义 Java 位置</value>
|
||||
</data>
|
||||
<data name="SettingsUtf8" xml:space="preserve">
|
||||
<value>UTF-8 文件名支持,中文乱码开启</value>
|
||||
</data>
|
||||
<data name="SettingsCustomJvmArgs" xml:space="preserve">
|
||||
<value>自定义 JVM 命令</value>
|
||||
</data>
|
||||
<data name="SettingsCheckUpdate" xml:space="preserve">
|
||||
<value>启动时检查更新</value>
|
||||
</data>
|
||||
<data name="SettingsCustomApktool" xml:space="preserve">
|
||||
<value>自定义 apktool 位置</value>
|
||||
</data>
|
||||
<data name="SettingsIgnoreOutputCM" xml:space="preserve">
|
||||
<value>忽略右键菜单的自定义输出目录</value>
|
||||
</data>
|
||||
<data name="SettingsInstall" xml:space="preserve">
|
||||
<value>安装</value>
|
||||
</data>
|
||||
<data name="SettingsUninstall" xml:space="preserve">
|
||||
<value>卸载</value>
|
||||
</data>
|
||||
<data name="SettingsCancel" xml:space="preserve">
|
||||
<value>取消</value>
|
||||
</data>
|
||||
<data name="ThemeAuto" xml:space="preserve">
|
||||
<value>自动</value>
|
||||
</data>
|
||||
<data name="ThemeLight" xml:space="preserve">
|
||||
<value>浅色</value>
|
||||
</data>
|
||||
<data name="ThemeDark" xml:space="preserve">
|
||||
<value>深色</value>
|
||||
</data>
|
||||
<data name="splitApkTxt.Text" xml:space="preserve">
|
||||
<value>将拆分的 APK 合并为单个 APK:</value>
|
||||
</data>
|
||||
<data name="mergeApkBtn.Text" xml:space="preserve">
|
||||
<value>合并</value>
|
||||
</data>
|
||||
<data name="comApkOpenDir.Text" xml:space="preserve">
|
||||
<value>编译的 APK 目录</value>
|
||||
</data>
|
||||
<data name="decOutOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>反编译输出目录</value>
|
||||
</data>
|
||||
<data name="signApkOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>签名的 APK 目录</value>
|
||||
</data>
|
||||
<data name="alignApkOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>Zip 对齐的 APK 目录</value>
|
||||
</data>
|
||||
<data name="decApkOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>反编译的 APK 目录</value>
|
||||
</data>
|
||||
<data name="compileOutputOpenDirBtn.Text" xml:space="preserve">
|
||||
<value>编译输出目录</value>
|
||||
</data>
|
||||
<data name="button_OpenMainActivity.Text" xml:space="preserve">
|
||||
<value>启动项 smail</value>
|
||||
</data>
|
||||
<data name="label4.Text" xml:space="preserve">
|
||||
<value>APK 签名:</value>
|
||||
</data>
|
||||
<data name="button_SIGN_Sign.Text" xml:space="preserve">
|
||||
<value>签名</value>
|
||||
</data>
|
||||
<data name="label3.Text" xml:space="preserve">
|
||||
<value>APK 文件对齐优化:</value>
|
||||
</data>
|
||||
<data name="button_ZIPALIGN_Align.Text" xml:space="preserve">
|
||||
<value>对齐优化</value>
|
||||
</data>
|
||||
<data name="label2.Text" xml:space="preserve">
|
||||
<value>反编译 APK 目录:</value>
|
||||
</data>
|
||||
<data name="button_BUILD_Build.Text" xml:space="preserve">
|
||||
<value>编译</value>
|
||||
</data>
|
||||
<data name="label1.Text" xml:space="preserve">
|
||||
<value>APK/XAPK/APKS/ZIP/APKM 文件:</value>
|
||||
</data>
|
||||
<data name="button_DECODE_Decode.Text" xml:space="preserve">
|
||||
<value>反编译</value>
|
||||
</data>
|
||||
<data name="tabPageMain.Text" xml:space="preserve">
|
||||
<value>首页</value>
|
||||
</data>
|
||||
<data name="label31.Text" xml:space="preserve">
|
||||
<value>启动 activity:</value>
|
||||
</data>
|
||||
<data name="label30.Text" xml:space="preserve">
|
||||
<value>架构:</value>
|
||||
</data>
|
||||
<data name="label17.Text" xml:space="preserve">
|
||||
<value>文件:</value>
|
||||
</data>
|
||||
<data name="label18.Text" xml:space="preserve">
|
||||
<value>本地化:</value>
|
||||
</data>
|
||||
<data name="label15.Text" xml:space="preserve">
|
||||
<value>权限:</value>
|
||||
</data>
|
||||
<data name="label14.Text" xml:space="preserve">
|
||||
<value>密度:</value>
|
||||
</data>
|
||||
<data name="label19.Text" xml:space="preserve">
|
||||
<value>商店链接:</value>
|
||||
</data>
|
||||
<data name="label7.Text" xml:space="preserve">
|
||||
<value>应用名:</value>
|
||||
</data>
|
||||
<data name="label9.Text" xml:space="preserve">
|
||||
<value>应用包名:</value>
|
||||
</data>
|
||||
<data name="label8.Text" xml:space="preserve">
|
||||
<value>版本:</value>
|
||||
</data>
|
||||
<data name="label11.Text" xml:space="preserve">
|
||||
<value>最小兼容 SDK:</value>
|
||||
</data>
|
||||
<data name="label10.Text" xml:space="preserve">
|
||||
<value>代号:</value>
|
||||
</data>
|
||||
<data name="label13.Text" xml:space="preserve">
|
||||
<value>屏幕尺寸</value>
|
||||
</data>
|
||||
<data name="label12.Text" xml:space="preserve">
|
||||
<value>目标 SDK:</value>
|
||||
</data>
|
||||
<data name="basicInfoTabPage.Text" xml:space="preserve">
|
||||
<value>基本信息</value>
|
||||
</data>
|
||||
<data name="tabPageApkInfo.Text" xml:space="preserve">
|
||||
<value>APK 信息</value>
|
||||
</data>
|
||||
<data name="checkBox7.Text" xml:space="preserve">
|
||||
<value>在选择 APK 进行反编译时,不要解析 APK 信息</value>
|
||||
</data>
|
||||
<data name="decSetApiLvlChkBox.Text" xml:space="preserve">
|
||||
<value>设置要生成的文件的 API 级别,例如 ICS 的 14。</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_FixError.Text" xml:space="preserve">
|
||||
<value>修复反编译后的 ApkTool 错误</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_OnlyMainClasses.Text" xml:space="preserve">
|
||||
<value>只反汇编根目录中的主索引类(classes[0-9]*.dex)。</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_UseFramework.Text" xml:space="preserve">
|
||||
<value>使用的 framework 文件位置:</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_MatchOriginal.Text" xml:space="preserve">
|
||||
<value>尽可能保持文件最接近原始,防止重建</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_OutputDirectory.Text" xml:space="preserve">
|
||||
<value>输出目录:</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_KeepBrokenRes.Text" xml:space="preserve">
|
||||
<value>保留损坏资源</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoSrc.Text" xml:space="preserve">
|
||||
<value>不反编译源码</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_Force.Text" xml:space="preserve">
|
||||
<value>强制删除目标目录</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoRes.Text" xml:space="preserve">
|
||||
<value>不反编译 resouces</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoDebugInfo.Text" xml:space="preserve">
|
||||
<value>不要输出调试信息(.Local, .param, .line等)</value>
|
||||
</data>
|
||||
<data name="groupBox_DECODE_Options.Text" xml:space="preserve">
|
||||
<value>选项</value>
|
||||
</data>
|
||||
<data name="tabPageDecode.Text" xml:space="preserve">
|
||||
<value>反编译</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_NetSecConf.Text" xml:space="preserve">
|
||||
<value>在输出 APK 中添加通用的网络安全配置文件</value>
|
||||
</data>
|
||||
<data name="useAapt2ChkBox.Text" xml:space="preserve">
|
||||
<value>使用 aapt2(升级 apktool 使用实验性 aapt2 二进制)</value>
|
||||
</data>
|
||||
<data name="buildSetApiLvlChkBox.Text" xml:space="preserve">
|
||||
<value>设置要生成的文件的 API 级别,例如 ICS 的 14。</value>
|
||||
</data>
|
||||
<data name="createUnsignApkChkBox.Text" xml:space="preserve">
|
||||
<value>构建后创建具有原始签名的未签名 APK</value>
|
||||
</data>
|
||||
<data name="signAfterBuildChkBox.Text" xml:space="preserve">
|
||||
<value>在 构建/zip对齐 后进行签名</value>
|
||||
</data>
|
||||
<data name="zipalignAfterBuildChkBox.Text" xml:space="preserve">
|
||||
<value>在构建后进行 zip对齐</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_NoCrunch.Text" xml:space="preserve">
|
||||
<value>在构建步骤中禁用对 resource 文件的处理</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_ForceAll.Text" xml:space="preserve">
|
||||
<value>跳过变更检测并构建所有文件</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_OutputAppPath.Text" xml:space="preserve">
|
||||
<value>APK 输出目录</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_CopyOriginal.Text" xml:space="preserve">
|
||||
<value>复制原来的 AndroidManifest.xml 和 META-INF 文件夹</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_UseAapt.Text" xml:space="preserve">
|
||||
<value>使用的 aapt.exe 文件位置:</value>
|
||||
</data>
|
||||
<data name="checkBox_BUILD_UseFramework.Text" xml:space="preserve">
|
||||
<value>使用的 framework 文件位置:</value>
|
||||
</data>
|
||||
<data name="groupBox_BUILD_Options.Text" xml:space="preserve">
|
||||
<value>选项</value>
|
||||
</data>
|
||||
<data name="tabPageBuild.Text" xml:space="preserve">
|
||||
<value>构建</value>
|
||||
</data>
|
||||
<data name="checkBox2.Text" xml:space="preserve">
|
||||
<value>签名后安装 APK(确保首先在 ADB 选项中选择设备)</value>
|
||||
</data>
|
||||
<data name="checkBox1.Text" xml:space="preserve">
|
||||
<value>覆盖输入文件</value>
|
||||
</data>
|
||||
<data name="autoDelIdsigChkBox.Text" xml:space="preserve">
|
||||
<value>自动删除 idsig 文件</value>
|
||||
</data>
|
||||
<data name="label27.Text" xml:space="preserve">
|
||||
<value>签名方案 v4:</value>
|
||||
</data>
|
||||
<data name="label26.Text" xml:space="preserve">
|
||||
<value>签名方案 v3:</value>
|
||||
</data>
|
||||
<data name="label25.Text" xml:space="preserve">
|
||||
<value>签名方案 v2:</value>
|
||||
</data>
|
||||
<data name="label24.Text" xml:space="preserve">
|
||||
<value>签名方案 v1:</value>
|
||||
</data>
|
||||
<data name="useAliasChkBox.Text" xml:space="preserve">
|
||||
<value>别名</value>
|
||||
</data>
|
||||
<data name="label22.Text" xml:space="preserve">
|
||||
<value>强烈建议您使用自己的密钥,通过 Android Studio 或其他工具创建</value>
|
||||
</data>
|
||||
<data name="label21.Text" xml:space="preserve">
|
||||
<value>密码:</value>
|
||||
</data>
|
||||
<data name="label20.Text" xml:space="preserve">
|
||||
<value>keystore/jks 文件:</value>
|
||||
</data>
|
||||
<data name="useKeyStoreChkBox.Text" xml:space="preserve">
|
||||
<value>使用 keystore</value>
|
||||
</data>
|
||||
<data name="useSigningOutputDir.Text" xml:space="preserve">
|
||||
<value>APK 输出目录:</value>
|
||||
</data>
|
||||
<data name="label_SIGN_PrivateKey.Text" xml:space="preserve">
|
||||
<value>私钥:</value>
|
||||
</data>
|
||||
<data name="label_SIGN_PublicKey.Text" xml:space="preserve">
|
||||
<value>公钥:</value>
|
||||
</data>
|
||||
<data name="groupBox_SIGN_Options.Text" xml:space="preserve">
|
||||
<value>选项</value>
|
||||
</data>
|
||||
<data name="tabPageSign.Text" xml:space="preserve">
|
||||
<value>签名</value>
|
||||
</data>
|
||||
<data name="zipalignOutputDirChkBox.Text" xml:space="preserve">
|
||||
<value>APK 输出目录:</value>
|
||||
</data>
|
||||
<data name="signAfterZipalignChkBox.Text" xml:space="preserve">
|
||||
<value>zip对齐后进行签名</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_Recompress.Text" xml:space="preserve">
|
||||
<value>使用 Zopfli 重新压缩</value>
|
||||
</data>
|
||||
<data name="label_ZIPALIGN_AlignmentBytes.Text" xml:space="preserve">
|
||||
<value>以 bytes 为单位的对齐,例如: '4' 提供 32-bit 对齐</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_CheckAlignment.Text" xml:space="preserve">
|
||||
<value>只检查对齐(不修改文件)</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_VerboseOutput.Text" xml:space="preserve">
|
||||
<value>详细输出</value>
|
||||
</data>
|
||||
<data name="checkBox_ZIPALIGN_OverwriteOutputFile.Text" xml:space="preserve">
|
||||
<value>覆盖现有的输出文件</value>
|
||||
</data>
|
||||
<data name="groupBox_ZIPALIGN_Options.Text" xml:space="preserve">
|
||||
<value>选项</value>
|
||||
</data>
|
||||
<data name="tabPageZipAlign.Text" xml:space="preserve">
|
||||
<value>Zip对齐</value>
|
||||
</data>
|
||||
<data name="openFwFolderBtn.Text" xml:space="preserve">
|
||||
<value>打开 framework 目录</value>
|
||||
</data>
|
||||
<data name="clearFwBtn.Text" xml:space="preserve">
|
||||
<value>清空 framework 缓存</value>
|
||||
</data>
|
||||
<data name="clearFwBeforeDecodeChkBox.Text" xml:space="preserve">
|
||||
<value>反编译前清空 Framework 缓存</value>
|
||||
</data>
|
||||
<data name="groupBox1.Text" xml:space="preserve">
|
||||
<value>选项</value>
|
||||
</data>
|
||||
<data name="checkBox_IF_Tag.Text" xml:space="preserve">
|
||||
<value>标签 frameworks 使用:</value>
|
||||
</data>
|
||||
<data name="checkBox_IF_FramePath.Text" xml:space="preserve">
|
||||
<value>将 framework 文件存储到:</value>
|
||||
</data>
|
||||
<data name="button_IF_InstallFramework.Text" xml:space="preserve">
|
||||
<value>安装</value>
|
||||
</data>
|
||||
<data name="groupBox_IF_Options.Text" xml:space="preserve">
|
||||
<value>选项</value>
|
||||
</data>
|
||||
<data name="label29.Text" xml:space="preserve">
|
||||
<value>Smali 编译目录:</value>
|
||||
</data>
|
||||
<data name="smaliUseOutputChkBox.Text" xml:space="preserve">
|
||||
<value>Dex 输出目录:</value>
|
||||
</data>
|
||||
<data name="comSmaliBtn.Text" xml:space="preserve">
|
||||
<value>编译</value>
|
||||
</data>
|
||||
<data name="label28.Text" xml:space="preserve">
|
||||
<value>Dex 反编译:</value>
|
||||
</data>
|
||||
<data name="baksmaliUseOutputChkBox.Text" xml:space="preserve">
|
||||
<value>输出目录:</value>
|
||||
</data>
|
||||
<data name="decSmaliBtn.Text" xml:space="preserve">
|
||||
<value>反编译</value>
|
||||
</data>
|
||||
<data name="label33.Text" xml:space="preserve">
|
||||
<value>选择设备</value>
|
||||
</data>
|
||||
<data name="killAdbBtn.Text" xml:space="preserve">
|
||||
<value>结束 ADB 进程</value>
|
||||
</data>
|
||||
<data name="installApkBtn.Text" xml:space="preserve">
|
||||
<value>安装 APK</value>
|
||||
</data>
|
||||
<data name="refreshDevicesBtn.Text" xml:space="preserve">
|
||||
<value>刷新</value>
|
||||
</data>
|
||||
<data name="overrideAbiCheckBox.Text" xml:space="preserve">
|
||||
<value>覆盖平台的默认 ABI:</value>
|
||||
</data>
|
||||
<data name="setVendorChkBox.Text" xml:space="preserve">
|
||||
<value>设置 vendor 为 Play Store (com.android.vending)</value>
|
||||
</data>
|
||||
<data name="label32.Text" xml:space="preserve">
|
||||
<value>选择 APK: </value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelStateText.Text" xml:space="preserve">
|
||||
<value>加载中...</value>
|
||||
</data>
|
||||
<data name="clearLogToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>清除日志</value>
|
||||
</data>
|
||||
<data name="newInsToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>新进程</value>
|
||||
</data>
|
||||
<data name="saveLogToFileToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>保存日志</value>
|
||||
</data>
|
||||
<data name="openTempFolderToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>打开缓存目录</value>
|
||||
</data>
|
||||
<data name="clearTempFolderToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>清空缓存目录</value>
|
||||
</data>
|
||||
<data name="exitToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>退出</value>
|
||||
</data>
|
||||
<data name="fileToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>文件</value>
|
||||
</data>
|
||||
<data name="useAPKEditorForDecompilingItem.Text" xml:space="preserve">
|
||||
<value>使用 APKEditor 进行反编译</value>
|
||||
</data>
|
||||
<data name="settingsToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>设置</value>
|
||||
</data>
|
||||
<data name="checkForUpdateToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>检查更新</value>
|
||||
</data>
|
||||
<data name="reportAnIsuueToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>反馈问题</value>
|
||||
</data>
|
||||
<data name="apktoolIssuesToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Apktool 问题反馈</value>
|
||||
</data>
|
||||
<data name="baksmaliIssuesToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>Baksmail 问题反馈</value>
|
||||
</data>
|
||||
<data name="aboutToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>关于</value>
|
||||
</data>
|
||||
<data name="helpToolStripMenuItem.Text" xml:space="preserve">
|
||||
<value>帮助</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_UseApkEditorMerge.Text" xml:space="preserve">
|
||||
<value>使用 APKEditor.jar 合并、分离 APK(速度更快)</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,10 +1,16 @@
|
||||
using APKToolGUI.Languages;
|
||||
using APKToolGUI.Controls;
|
||||
using APKToolGUI.Languages;
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Utils;
|
||||
using Bluegrams.Application;
|
||||
using OSVersionExtension;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace APKToolGUI
|
||||
@@ -12,7 +18,7 @@ namespace APKToolGUI
|
||||
static class Program
|
||||
{
|
||||
/// <summary>
|
||||
/// Главная точка входа для приложения.
|
||||
/// Main entry point for the application.
|
||||
/// </summary>
|
||||
[DllImport("Shcore.dll")]
|
||||
static extern int SetProcessDpiAwareness(int PROCESS_DPI_AWARENESS);
|
||||
@@ -23,80 +29,147 @@ namespace APKToolGUI
|
||||
[STAThread]
|
||||
static void Main(String[] arg)
|
||||
{
|
||||
if (Environment.OSVersion.Version.Major == 6)
|
||||
try
|
||||
{
|
||||
SetProcessDPIAware();
|
||||
}
|
||||
//Debug.WriteLine(Application.ProductName);
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
|
||||
if (arg.Length == 1)
|
||||
{
|
||||
switch (arg[0])
|
||||
if (Environment.OSVersion.Version.Major == 6)
|
||||
{
|
||||
case "ccm":
|
||||
ExplorerContextMenuMethod(ExplorerContextMenu.Action.Create);
|
||||
break;
|
||||
case "rcm":
|
||||
ExplorerContextMenuMethod(ExplorerContextMenu.Action.Remove);
|
||||
break;
|
||||
SetProcessDPIAware();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (arg.Length == 2)
|
||||
|
||||
PortableSettingsProvider.SettingsFileName = "config.xml";
|
||||
PortableSettingsProvider.ApplyProvider(Settings.Default);
|
||||
|
||||
if (arg.Length == 1)
|
||||
{
|
||||
switch (arg[0])
|
||||
{
|
||||
case "comapk":
|
||||
if (!File.Exists(Path.Combine(arg[1], "AndroidManifest.xml")))
|
||||
case "ccm":
|
||||
ExplorerContextMenuMethod(ExplorerContextMenu.Action.Create);
|
||||
break;
|
||||
case "rcm":
|
||||
ExplorerContextMenuMethod(ExplorerContextMenu.Action.Remove);
|
||||
break;
|
||||
case "opendecfolder":
|
||||
if (Settings.Default.Decode_UseOutputDir)
|
||||
{
|
||||
MessageBox.Show(Language.NotDecompiledApk, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
return;
|
||||
string outDir = Settings.Default.Decode_OutputDir;
|
||||
if (Directory.Exists(outDir))
|
||||
Process.Start(outDir);
|
||||
else
|
||||
MessageBox.Show(String.Format(Language.DirectoryNotExist, outDir), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
break;
|
||||
case "opencomfolder":
|
||||
if (Settings.Default.Build_UseOutputAppPath)
|
||||
{
|
||||
string outDir = Settings.Default.Build_OutputAppPath;
|
||||
if (Directory.Exists(outDir))
|
||||
Process.Start(outDir);
|
||||
else
|
||||
MessageBox.Show(String.Format(Language.DirectoryNotExist, outDir), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (FilesCheck() == true)
|
||||
else
|
||||
{
|
||||
Directory.CreateDirectory(TEMP_DIR);
|
||||
PortableSettingsProvider.SettingsFileName = "config.xml";
|
||||
PortableSettingsProvider.ApplyProvider(Settings.Default);
|
||||
Application.Run(new FormMain());
|
||||
if (arg.Length == 2)
|
||||
{
|
||||
switch (arg[0])
|
||||
{
|
||||
case "comapk":
|
||||
if (!File.Exists(Path.Combine(arg[1], "AndroidManifest.xml")))
|
||||
{
|
||||
MessageBox.Show(Language.NotDecompiledApk, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (FilesCheck() == true)
|
||||
{
|
||||
TEMP_PATH = RandTempDirectory();
|
||||
TEMP_MAIN = TempDirectory();
|
||||
Directory.CreateDirectory(TEMP_PATH);
|
||||
|
||||
// Set the process app mode before any window is created so that
|
||||
// Win32 popup/context menus render dark too. The WPF MainWindow
|
||||
// applies its own immersive dark title bar internally.
|
||||
NativeDarkMode.SetProcessTheme((Theme)Settings.Default.Theme);
|
||||
|
||||
var app = new System.Windows.Application();
|
||||
app.Run(new Forms.MainWindow());
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine(ex);
|
||||
//MessageBox.Show(ex.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsWin10OrAbove()
|
||||
{
|
||||
// Check if the operating system is Windows 10 or above
|
||||
return OSVersion.GetOSVersion().Version.Major >= 10;
|
||||
}
|
||||
|
||||
|
||||
public static bool IsDarkTheme()
|
||||
{
|
||||
if (IsWin10OrAbove())
|
||||
return NativeDarkMode.EffectiveIsDark((Theme)Settings.Default.Theme);
|
||||
else if (Settings.Default.Theme == 2)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void SetLanguage()
|
||||
{
|
||||
String settingsCulture = Settings.Default.Culture;
|
||||
|
||||
if (settingsCulture.Equals("Auto"))
|
||||
{
|
||||
System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.InstalledUICulture;
|
||||
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InstalledUICulture;
|
||||
// Let .NET handle the resource fallback process.
|
||||
// It will automatically use the system's language if a satellite assembly is available,
|
||||
// otherwise it will fall back to the neutral language defined in the main assembly (English).
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
||||
try
|
||||
{
|
||||
System.Globalization.CultureInfo _settingsCulture = System.Globalization.CultureInfo.GetCultureInfo(settingsCulture);
|
||||
System.Threading.Thread.CurrentThread.CurrentUICulture = _settingsCulture;
|
||||
System.Threading.Thread.CurrentThread.CurrentCulture = _settingsCulture;
|
||||
System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.GetCultureInfo(settingsCulture);
|
||||
System.Threading.Thread.CurrentThread.CurrentUICulture = culture;
|
||||
System.Threading.Thread.CurrentThread.CurrentCulture = culture;
|
||||
}
|
||||
catch (System.Globalization.CultureNotFoundException ex)
|
||||
{
|
||||
Debug.WriteLine($"[Program] Invalid culture '{settingsCulture}': {ex.Message}");
|
||||
// Fall back to system default culture
|
||||
}
|
||||
catch (ArgumentException ex)
|
||||
{
|
||||
Debug.WriteLine($"[Program] Failed to set culture: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private static bool FilesCheck()
|
||||
{
|
||||
// проверка файлов
|
||||
// File verification
|
||||
List<String> missigFiles = MissingFilesCheck();
|
||||
if (missigFiles.Count > 0)
|
||||
{
|
||||
String files = Environment.NewLine;
|
||||
StringBuilder filesBuilder = new StringBuilder();
|
||||
filesBuilder.AppendLine();
|
||||
foreach (String file in missigFiles)
|
||||
{
|
||||
files += file + Environment.NewLine;
|
||||
filesBuilder.AppendLine(file);
|
||||
}
|
||||
MessageBox.Show(Language.RequiredFilesMissing + files, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
MessageBox.Show(Language.RequiredFilesMissing + filesBuilder.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
//Application.Exit();
|
||||
return false;
|
||||
}
|
||||
@@ -116,7 +189,13 @@ namespace APKToolGUI
|
||||
AAPT_PATH,
|
||||
AAPT2_PATH,
|
||||
SIGNAPK_KEYPRIVATE,
|
||||
SIGNAPK_KEYPUBLIC};
|
||||
SIGNAPK_KEYPUBLIC,
|
||||
APKEDITOR_PATH,
|
||||
ADB_PATH,
|
||||
ADBWINAPI_PATH,
|
||||
ADBWINUSBAPI_PATH,
|
||||
LIBWINP_PATH,
|
||||
};
|
||||
for (int i = 0; i < fileList.Length; i++)
|
||||
if (!File.Exists(fileList[i]))
|
||||
missingFiles.Add(Path.GetFileName(fileList[i]));
|
||||
@@ -155,18 +234,42 @@ namespace APKToolGUI
|
||||
return path;
|
||||
}
|
||||
|
||||
public static string LOCAL_APPDATA_PATH = Environment.GetEnvironmentVariable("LocalAppData");
|
||||
public static string TEMP_DIR = Path.Combine(Path.GetTempPath(), "APKToolGUI");
|
||||
public static string APP_PATH = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
|
||||
public static string APKTOOL_PATH = APP_PATH + @"\Resources\apktool.jar";
|
||||
public static string APKSIGNER_PATH = APP_PATH + @"\Resources\apksigner.jar";
|
||||
public static string BAKSMALI_PATH = APP_PATH + @"\Resources\baksmali.jar";
|
||||
public static string SMALI_PATH = APP_PATH + @"\Resources\smali.jar";
|
||||
public static string SIGNAPK_KEYPRIVATE = APP_PATH + @"\Resources\testkey.pk8";
|
||||
public static string SIGNAPK_KEYPUBLIC = APP_PATH + @"\Resources\testkey.x509.pem";
|
||||
public static string ZIPALIGN_PATH = APP_PATH + @"\Resources\zipalign.exe";
|
||||
public static string AAPT_PATH = APP_PATH + @"\Resources\aapt.exe";
|
||||
public static string AAPT2_PATH = APP_PATH + @"\Resources\aapt2.exe";
|
||||
public static string FRAMEWORK_DIR = LOCAL_APPDATA_PATH + @"\apktool\framework";
|
||||
public static string TempDirectory()
|
||||
{
|
||||
//Generate new every new instance to avoid conflict
|
||||
//We want to keep obfuscated path short as possible to prevent long path error
|
||||
if (Settings.Default.UseCustomTempDir)
|
||||
return Path.Combine(Settings.Default.TempDir);
|
||||
else
|
||||
return Path.Combine(LOCAL_APPDATA_PATH, ASSEMBLY_NAME, "Temp");
|
||||
}
|
||||
|
||||
public static string RandTempDirectory()
|
||||
{
|
||||
return Path.Combine(TempDirectory(), StringExt.RandStrWithCaps(5));
|
||||
}
|
||||
|
||||
public static string ASSEMBLY_NAME { get { return AssemblyName.GetAssemblyName(Assembly.GetExecutingAssembly().Location).Name; } }
|
||||
public static string TEMP_PATH { get; set; }
|
||||
public static string TEMP_MAIN { get; set; }
|
||||
public static string LOCAL_APPDATA_PATH { get { return Environment.GetEnvironmentVariable("LocalAppData"); } }
|
||||
public static string APP_PATH { get { return Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); } }
|
||||
public static string RES_PATH { get { return Path.Combine(APP_PATH, "Resources"); } }
|
||||
public static string APKTOOL_PATH { get { return Path.Combine(RES_PATH, "apktool.jar"); } }
|
||||
public static string APKSIGNER_PATH { get { return Path.Combine(RES_PATH, "apksigner.jar"); } }
|
||||
public static string BAKSMALI_PATH { get { return Path.Combine(RES_PATH, "baksmali.jar"); } }
|
||||
public static string SMALI_PATH { get { return Path.Combine(RES_PATH, "smali.jar"); } }
|
||||
public static string SIGNAPK_KEYPRIVATE { get { return Path.Combine(RES_PATH, "testkey.pk8"); } }
|
||||
public static string SIGNAPK_KEYPUBLIC { get { return Path.Combine(RES_PATH, "testkey.x509.pem"); } }
|
||||
public static string ZIPALIGN_PATH { get { return Path.Combine(RES_PATH, "zipalign.exe"); } }
|
||||
public static string AAPT_PATH { get { return Path.Combine(RES_PATH, "aapt.exe"); } }
|
||||
public static string AAPT2_PATH { get { return Path.Combine(RES_PATH, "aapt2.exe"); } }
|
||||
public static string APKEDITOR_PATH { get { return Path.Combine(RES_PATH, "apkeditor.jar"); } }
|
||||
public static string ADB_PATH { get { return Path.Combine(RES_PATH, "adb.exe"); } }
|
||||
public static string ADBWINAPI_PATH { get { return Path.Combine(RES_PATH, "AdbWinApi.dll"); } }
|
||||
public static string ADBWINUSBAPI_PATH { get { return Path.Combine(RES_PATH, "AdbWinUsbApi.dll"); } }
|
||||
public static string LIBWINP_PATH { get { return Path.Combine(RES_PATH, "libwinpthread-1.dll"); } }
|
||||
public static string FRAMEWORK_DIR { get { return Path.Combine(LOCAL_APPDATA_PATH, "apktool", "framework"); } }
|
||||
public static string STANDALONE_FRAMEWORK_DIR { get { return Path.Combine(LOCAL_APPDATA_PATH, ASSEMBLY_NAME, "framework"); } }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,35 +2,35 @@
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// Управление общими сведениями о сборке осуществляется с помощью
|
||||
// набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения,
|
||||
// связанные со сборкой.
|
||||
[assembly: AssemblyTitle("APKTool GUI")]
|
||||
// General information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("APK Tool GUI")]
|
||||
[assembly: AssemblyDescription("GUI for apktool, signapk and zipalign utilities.")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("APKTool GUI")]
|
||||
[assembly: AssemblyCopyright("© INFINUM, 2012-2015 | AndnixSH, 2022")]
|
||||
[assembly: AssemblyProduct("APK Tool GUI")]
|
||||
[assembly: AssemblyCopyright("Original owner: INFINUM, 2012-2015 | Maintained by: AndnixSH, 2022-2025")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Параметр ComVisible со значением FALSE делает типы в сборке невидимыми
|
||||
// для COM-компонентов. Если требуется обратиться к типу в этой сборке через
|
||||
// COM, задайте атрибуту ComVisible значение TRUE для этого типа.
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM
|
||||
[assembly: Guid("12cc5907-c237-4d52-8c7e-08d622828cf4")]
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("49ccb60c-22a6-4a25-a4bf-9208712ad928")]
|
||||
|
||||
// Сведения о версии сборки состоят из следующих четырех значений:
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Основной номер версии
|
||||
// Дополнительный номер версии
|
||||
// Номер построения
|
||||
// Редакция
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// Можно задать все значения или принять номер построения и номер редакции по умолчанию,
|
||||
// используя "*", как показано ниже:
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("3.0.0.2")]
|
||||
[assembly: AssemblyFileVersion("3.0.0.2")]
|
||||
[assembly: AssemblyVersion("3.3.2.3")]
|
||||
[assembly: AssemblyFileVersion("3.3.2.3")]
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace APKToolGUI.Properties {
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
@@ -80,36 +80,6 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap apkaio {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("apkaio", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap apkcombo {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("apkcombo", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap apkpure {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("apkpure", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
@@ -140,16 +110,6 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap playstore {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("playstore", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
<data name="done" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
|
||||
EgAACxIB0t1+/AAAAtVJREFUeF7tmzFu3DAQRfcoPoKBXGCP4pMErtK6TuVD5AB7gQBbGqncJU0AV6k3
|
||||
EQAACxEBf2RfkQAAAtVJREFUeF7tmzFu3DAQRfcoPoKBXGCP4pMErtK6TuVD5AB7gQBbGqncJU0AV6k3
|
||||
/wdDQFgMxSFFDqlQH3jVcobzKYmSKO7p0KFDh1rq8/dPD+AJvIILuCVgG7ZlzIOk2ZdYOHgB70AzmQNz
|
||||
MNf4g4Eiz8BylEth7rN0N45Q1KMUpxXdAvb1KN33FQp5XhTmzbOU4S90zqN+XRTTC9bgezagQ17rH1LA
|
||||
CLAWn7kBHfH2pBUxAk9SZhuxg7sOR6TNICAxT3utwxGpezkgISe8ka75FKy13sSIZCPM9rlcpfxtQqKe
|
||||
@@ -392,73 +392,6 @@
|
||||
<data name="android_thin" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\android-thin.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="apkcombo" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6
|
||||
JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAB3RJTUUH5gIUECEzhhsWEgAAAIFJREFU
|
||||
OE+9jNENgCAMRPthHMYp3MRx3MUlWMJ91BLaXOCK+ONLXri0V6Rh3y71OJe5TCTnMi+jmJTWycu1w7Bj
|
||||
dQgsR7mLFSMp3SWh6ePAciR2HLasVHLGjoMDy6Afq9hxyNKO7HWhk3OGLR+bYxU7FCwzX2FH6BB1+dOx
|
||||
8t8HIjeYr/a0lujdLAAAAABJRU5ErkJggg==
|
||||
</value>
|
||||
</data>
|
||||
<data name="apkpure" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6
|
||||
JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAF8ElEQVRYR9VW729TVRi+g+rAKOPDCGYY
|
||||
xKGA648hkGBiQkwYw63d3JAhsHVsLaAJa7cRcAmiERmjvbcbgtG/wKgJQU38ABGHY/1xb9vRTfGDOn50
|
||||
HZEoakgU1LHe4/Oee9t1VcbG9sU3efPe3nPued7nec97ToX/ja0N7M+xBNoXmAJHF8ELNPcUmP3tBUWR
|
||||
dx9deON8jj51Zq1Y8fKFixVPoVn23jDJ0l9mWbxlksXbFI1K1x9rAgdYVXfZNppn7amZTXHGzKiIfEGA
|
||||
+UyKxMyKdAeumhURzyIrkrtGS/x2Vh8tDc3rYjOrgiUkaexD4mIk8CtPQBaTcJXcqHSqz/gPJrcoZaP2
|
||||
fiurla2baX5d2DYzKhgViS9kCokdkJ4Ya+wpAY09W++vV+2x0tFaJFDXZw3wD2fCzCGRs7cExUUA/DnN
|
||||
XkuAcfaBN1SwZ/YBq1obsybrYlZmj1RU03f2cMX0VADjVO0PmXi99doDHOxVsE+u9zcQewb2lABUKCcV
|
||||
evkC0zFLSNv5lqBnIQB/zGZvAvtVYF+jlKtgzwCugr2KBLgKdUpFFX2PeH8qADDF/iDaLZM9d8jP1n7R
|
||||
dLL+QulNqj1PACoAPKXCV3yh+zFT0MPZmwMd+QAbzmSPZCgyo7/jivByVZ69z3qKb76Y9Y6eABLRVQjb
|
||||
KmidKasAAP6BSfa2ZbPH71FKYPnp1w/QnNpQdQmBgbUOPk6FbpozJcNJp9Ve8czHxrtKYDrrDPZHr+Z7
|
||||
qhfyD2B1UdvnHBDAKRVSewGdYKU59nDlLD75XgYQvfZSKxhjs+l9ryUwSuVYdubNgzRn7cDeXIq1wYoS
|
||||
7IG0CtQRYyrYztKcKZklLD4CwEH94EkCNM0el8+VgvYt+TRv9cldXC2yHVFrSoX0XtATYnal4gWaYw/b
|
||||
JlbBorMHmJtOOQBTvdPsKYHCswdOCOfW5RsuvFooRJxLcqONhUK0NX9DcHMDgWmg5VwFOhewIdn2qK2H
|
||||
A0zGTL3SQwD7nrMdq71qUXxseeCwOqu38RaAbwsKPJxyx5+C7Px9Q6Q62dBfxrZrnZBOoCZagYPpHpcU
|
||||
6p3q+1e02oO9nGbPitH3+T0tTJB3MIAyQXGkPSdMcSdbJONGjJWnTkXejkiG2eRNvB1fVKrT7dg85Mtp
|
||||
iXeOT2plyJsLsItZ7BmxXxFoJ/YAd6hgryKJMVfwjt7LThUqMKigAjjF/py+/N3NFPJq7EOiY4w93XZj
|
||||
7Becbx3PnmLKM1R4TK5ToQJvQ2JfKW+qpLU3R7bOdg9Js5oTvpymq745UMAMBcyuK515NC6s6el8AKBf
|
||||
U5shZrJXVwSOJGf7nUmwTII94n+4gjEal53J0kj1SMNAGavpq7zrceyO+za6h3y7WuLH5vIX5pC3NpM9
|
||||
3X5IQAV7dcH5vcSe5NbY/8t1FfjzThUqJO1gXxXZxC+krQONhtZEVx4Ay1xD0kZXXHoez/XNcd9qDr5a
|
||||
9j4I0FgWeyoBezrQcdvQ67wM8EsAuoRIz1nuyHDnoEFxXF+nvPQJXzzDAHoEzL9EAn6Uo11/LQirZN9c
|
||||
AF/MSoBOQLa8+1Anzcnrb5sryLtzhb5sd8IdujtzH+7fM0c485yhfvB4Aeq8E2CNYO2EbwO4B/EbJHIa
|
||||
Y0W0LnUDRTqE0hsQ4JQEMwY9vy3+cM9SGl/62f6J+1g3d0L7F9U8LM4H2CASYIhJuOqKi6prSBxFAm/R
|
||||
nKZr2r3DrTggkQrfkQpIYITL333oHRozXn4v3b+TsW2XDhsouhKSA4CsKS7+3QRgxBF3QvK5hzsLadyd
|
||||
0M8BgGptqEguUoFKAPY3H//ItYzeF57aNyn22dZyXZoD5t8CmJIgJYL60HizyNpf75Uh3zwk8IPG/u3j
|
||||
9O7Z4Q8md41mGcA4KVfCtxvPBM4gPf/LjrJwhcZZWoWwrw3/iNgTH7c8Rb+f/LTtvtin7LVf3s8FeByg
|
||||
Mf3VxFYc7VpSdO7wPnouYcFpgQNUU2FIaoE30jP2wJT204xY608nDK5rWRfPRGZWjk2L+dRMEP4BTv9m
|
||||
88NQBeoAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="playstore" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6
|
||||
JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAB3RJTUUH5gIUESUj/gKpRQAABIRJREFU
|
||||
WEfF11tMm2UYB/CvE8IkBrItZiYaYnCDlTGgg7VMb0jc2pVyKCzohV4bD9HEyEHmCj0YDzFRpybELBFd
|
||||
NpfovXG94WKbG65xFHgprBzaFVqggx44ybry+Lzd97H3LW1hrJsX/4vS73v+P573Iy0CAMj+z3CA/LH5
|
||||
3AKH5fN9TqOp0vWNnH3vcYUDZF+Hzp02K8kZaYZdY22RPI/xjDL8wx72mnSHA+y4BheFKwBZfVaS7WqG
|
||||
nZ5myPGd8uf5zR++BT9mstemKxxA6IXfhb8AKCJz0EqyvC2QOd0CT822QM68wfFi+It69vp0hAfcQMA1
|
||||
BIiIjCEryfAjYK4VZPOtsCPYBrmhzkuFi1+Vsvc9SniADQF/YzmDkDmsRBZoBSH4IJmh9sieBXOXavHb
|
||||
vez92wkPuIkAGxZTxPUHCOGWlbAAKVnBU4Hnwpa2Jvgti53zMOEBdgT8g4UU0YuREJcxSRA0z4QMzrzl
|
||||
L5vYWVsND+hHQB+WSYi440iFiD0f4Y6ewqWvj7AzNwsPGERAPxbFI9hNOP9MiqDJCLVHdweN3Yql759n
|
||||
ZycLDyAIGMSSVIjYJlIjaN6cbboBrr0GgKqn2Y748IBhBBAsSIW4iqGIFJvQTzcMwAiOdmJc2RPgfeEN
|
||||
tofNRsAQDqeIATEPuQm9D8sJjh3GjGLGMW4c7825CjMvvcL2xTq5FxQwjINZxGabYBB6L5YP4MghjLSB
|
||||
GAAziZnOAPDvPgvQtP5niz9lAE4EjOBQB0ZCbOWZwOOon2q0Qx+OkwB0AxQwgZEAPswsxp9tSgwYQ8At
|
||||
HCghaDbbBCI+O/0TWXunzA52HBe/gXjAjAARn4APZyLAOAJGcaiEoMchIZJs4lNDN4kePQ5rR48BvF16
|
||||
/wg2PAMYBKwh4K5X6LLZhPVPVnyHAbgQMIaDKcKJiT8OaRN2DCIsHd0kUqmBe5VqiFaKiHcRQQF0AyJg
|
||||
zYW/tVu4HBoXVGxfrJN7QQETOJwiKCDRJkSE2dhNVpUaWFWqIaJS30fQTbx8HOA9RIhHcM8pTCyPCq+z
|
||||
PWx4gFsESIj44xA3YTL9TJYrTsC/RzDxCHETkQ8O9q46hHanU0j5QZUcwCKY4zCafiELh7WwVK6F5Qot
|
||||
rFRQwAm4q9LEEJjoivLVszMq1ZY+qjcC3FiUCIGb6MDysEIHC4erYZEiEEA3sYKbWKlQw6LyWE+grErB
|
||||
ztwsiQEusZxBGCznSKC0BkJlNNUxhLSJhXKt8065uoGdtdUkBkgIMafN58hcSS3Ml9TAOgI3EVRUB/wK
|
||||
zUc2oXzbX1h5gAcBt0WAiPjEcp7MFtfBnUN1MHcIEaU0ushMibbLW1D1LHv/dpIS0G4+T6aL6mG2mKYO
|
||||
/MW14CvRXXIXaQ6y9z1KeMAkAjxYjoiPzReIV94APrkeKGKqqJa45DU69vp0hAfcjl6k5W2mC2SysBGm
|
||||
5I3gOaCfGz9Q+36PUPUE/jFxRQytpl+Ju+AkuAtPRkb368/05+l2sdekOxxg33d/5PbLX7M48hs6b+bX
|
||||
7Gffe1zhAE8+IPsPdRQlTjbOQZ0AAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="error" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\Error.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
@@ -471,7 +404,4 @@
|
||||
<data name="warning" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\warning.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="apkaio" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\apkaio.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -2,224 +2,302 @@
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="APKToolGUI.Properties" GeneratedClassName="Settings">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="Decode_NoSrc" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Decode_NoSrc" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_NoRes" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Decode_NoRes" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_Force" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Decode_Force" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_UseFramework" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Decode_UseFramework" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_ForceAll" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Build_ForceAll" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_InputAppPath" Provider="Bluegrams.Application.PortableSettingsProvider" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Setting Name="Decode_InputAppPath" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Decode_FrameDir" Provider="Bluegrams.Application.PortableSettingsProvider" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Setting Name="BuildProjectDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="BuildProjectDir" Provider="Bluegrams.Application.PortableSettingsProvider" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Setting Name="InstallFramework_InputFramePath" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="InstallFramework_InputFramePath" Provider="Bluegrams.Application.PortableSettingsProvider" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Setting Name="Sign_InputFile" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Sign_InputFile" Provider="Bluegrams.Application.PortableSettingsProvider" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Setting Name="Sign_OutputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Sign_OutputDir" Provider="Bluegrams.Application.PortableSettingsProvider" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Build_UseAapt" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Build_UseAapt" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_AaptPath" Provider="Bluegrams.Application.PortableSettingsProvider" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Setting Name="Build_AaptPath" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Culture" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.String" Scope="User">
|
||||
<Setting Name="Culture" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">Auto</Value>
|
||||
</Setting>
|
||||
<Setting Name="JavaExe" Provider="Bluegrams.Application.PortableSettingsProvider" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Setting Name="JavaExe" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="LastUpdateCheck" Provider="Bluegrams.Application.PortableSettingsProvider" GenerateDefaultValueInCode="false" Type="System.DateTime" Scope="User">
|
||||
<Setting Name="LastUpdateCheck" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" GenerateDefaultValueInCode="false" Type="System.DateTime" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="CheckForUpdateAtStartup" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="CheckForUpdateAtStartup" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="ClearLogBeforeAction" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="ClearLogBeforeAction" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_MatchOriginal" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_MatchOriginal" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Decode_KeepBrokenRes" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_KeepBrokenRes" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Build_CopyOriginal" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_CopyOriginal" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Build_UseFramework" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_FrameDir" Provider="Bluegrams.Application.PortableSettingsProvider" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Setting Name="Decode_UseOutputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_OutputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Build_UseFramework" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Build_UseOutputAppPath" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_UseOutputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Build_OutputAppPath" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Build_InputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Framework_UseFrameDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_OutputDir" Provider="Bluegrams.Application.PortableSettingsProvider" GenerateDefaultValueInCode="false" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Build_UseOutputAppPath" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="InstallFramework_UseTag" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_OutputAppPath" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.String" Scope="User">
|
||||
<Setting Name="InstallFramework_Tag" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Build_InputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.String" Scope="User">
|
||||
<Setting Name="Framework_FrameDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="InstallFramework_UseFrameDir" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="InstallFramework_UseTag" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="InstallFramework_Tag" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="InstallFramework_FrameDir" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Zipalign_AlignmentInBytes" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Decimal" Scope="User">
|
||||
<Setting Name="Zipalign_AlignmentInBytes" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Decimal" Scope="User">
|
||||
<Value Profile="(Default)">4</Value>
|
||||
</Setting>
|
||||
<Setting Name="Zipalign_OverwriteOutputFile" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Zipalign_OverwriteOutputFile" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Zipalign_CheckOnly" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Zipalign_CheckOnly" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Zipalign_Verbose" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Zipalign_Verbose" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Zipalign_OutputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.String" Scope="User">
|
||||
<Setting Name="Zipalign_OutputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Zipalign_InputFile" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.String" Scope="User">
|
||||
<Setting Name="Zipalign_InputFile" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Zipalign_Recompress" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Zipalign_Recompress" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Sign_PublicKey" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.String" Scope="User">
|
||||
<Setting Name="Sign_PublicKey" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Sign_PrivateKey" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.String" Scope="User">
|
||||
<Setting Name="Sign_PrivateKey" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Decode_OnlyMainClasses" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Decode_OnlyMainClasses" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_FixError" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Decode_FixError" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_NoCrunch" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Build_NoCrunch" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_NoDebugInfo" Provider="Bluegrams.Application.PortableSettingsProvider" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Decode_NoDebugInfo" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Framework_ClearBeforeDecode" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Framework_ClearBeforeDecode" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_ZipalignAfterBuild" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Build_ZipalignAfterBuild" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_SignAfterBuild" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Build_SignAfterBuild" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="Zipalign_UseOutputDir" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Zipalign_UseOutputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Zipalign_SignAfterZipAlign" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
<Setting Name="Zipalign_SignAfterZipAlign" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="Sign_Alias" Type="System.String" Scope="User">
|
||||
<Setting Name="Sign_Alias" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">CERT</Value>
|
||||
</Setting>
|
||||
<Setting Name="Sign_SetAlias" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Sign_SetAlias" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_CreateUnsignedApk" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Build_CreateUnsignedApk" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Sign_UseKeystoreFile" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Sign_UseKeystoreFile" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Sign_KeystoreFilePath" Type="System.String" Scope="User">
|
||||
<Setting Name="Sign_KeystoreFilePath" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Sign_KeystorePassword" Type="System.String" Scope="User">
|
||||
<Setting Name="Sign_KeystorePassword" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Sign_UseOutputDir" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Sign_UseOutputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Sign_Schemev1" Type="System.Int32" Scope="User">
|
||||
<Setting Name="Sign_Schemev1" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Int32" Scope="User">
|
||||
<Value Profile="(Default)">0</Value>
|
||||
</Setting>
|
||||
<Setting Name="Sign_Schemev2" Type="System.Int32" Scope="User">
|
||||
<Setting Name="Sign_Schemev2" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Int32" Scope="User">
|
||||
<Value Profile="(Default)">0</Value>
|
||||
</Setting>
|
||||
<Setting Name="Sign_Schemev3" Type="System.Int32" Scope="User">
|
||||
<Setting Name="Sign_Schemev3" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Int32" Scope="User">
|
||||
<Value Profile="(Default)">0</Value>
|
||||
</Setting>
|
||||
<Setting Name="Sign_Schemev4" Type="System.Int32" Scope="User">
|
||||
<Value Profile="(Default)">2</Value>
|
||||
<Setting Name="Sign_Schemev4" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Int32" Scope="User">
|
||||
<Value Profile="(Default)">0</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_ApiLevel" Type="System.Decimal" Scope="User">
|
||||
<Setting Name="Decode_ApiLevel" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Decimal" Scope="User">
|
||||
<Value Profile="(Default)">4</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_ApiLevel" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Decimal" Scope="User">
|
||||
<Value Profile="(Default)">29</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_ApiLevel" Type="System.Decimal" Scope="User">
|
||||
<Value Profile="(Default)">29</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_SetApiLevel" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Build_SetApiLevel" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_SetApiLevel" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Decode_SetApiLevel" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Baksmali_InputDexFile" Type="System.String" Scope="User">
|
||||
<Setting Name="Baksmali_InputDexFile" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Smali_OutputDexFile" Type="System.String" Scope="User">
|
||||
<Setting Name="Smali_OutputDexFile" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Baksmali_OutputDir" Type="System.String" Scope="User">
|
||||
<Setting Name="Baksmali_OutputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Baksmali_UseOutputDir" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Baksmali_UseOutputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Smali_InputDir" Type="System.String" Scope="User">
|
||||
<Setting Name="Smali_InputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Smali_OutputDir" Type="System.String" Scope="User">
|
||||
<Setting Name="Smali_OutputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Smali_UseOutputDir" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Smali_UseOutputDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="IgnoreOutputDirContextMenu" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="IgnoreOutputDirContextMenu" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_UseAapt2" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="PlaySoundWhenDone" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="UseCustomTempDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="TempDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="UseCustomJavaExe" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="AutoDeleteIdsigFile" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="Utf8FilenameSupport" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Sign_OverwriteInputFile" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Adb_SetVendor" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Adb_SelectedApkPath" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Sign_InstallApkAfterSign" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="UseCustomApktool" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="ApktoolPath" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Theme" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Int32" Scope="User">
|
||||
<Value Profile="(Default)">0</Value>
|
||||
</Setting>
|
||||
<Setting Name="DebugMode" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_NetSecConf" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_DontParseApkInfo" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="UseCustomJVMArgs" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="CustomJVMArgs" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)">-Dfile.encoding=UTF8 -Djdk.util.zip.disableZip64ExtraFieldValidation=true -Djdk.nio.zipfs.allowDotZipEntry=true</Value>
|
||||
</Setting>
|
||||
<Setting Name="SplitApk_InputFile" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="UseApkeditor" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Adb_OverrideAbi" Type="System.Int32" Scope="User">
|
||||
<Value Profile="(Default)">0</Value>
|
||||
</Setting>
|
||||
<Setting Name="Adb_SetOverrideAbi" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_Jobs" Type="System.Decimal" Scope="User">
|
||||
<Value Profile="(Default)">4</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_Jobs" Type="System.Decimal" Scope="User">
|
||||
<Value Profile="(Default)">4</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_SetJobs" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_SetJobs" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Sign_KeyPassword" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -1,38 +1,68 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||
<security>
|
||||
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<!-- Параметры манифеста UAC
|
||||
При необходимости изменить уровень управления учетными записями Windows замените
|
||||
узел requestedExecutionLevel одним из следующих значений.
|
||||
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||
<security>
|
||||
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<!-- UAC Manifest Options
|
||||
If you want to change the Windows User Account Control level replace the
|
||||
requestedExecutionLevel node with one of the following.
|
||||
|
||||
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
||||
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
|
||||
|
||||
Задание узла requestedExecutionLevel отключит виртуализацию файла и реестра.
|
||||
Если виртуализацию файла и реестра нужно использовать для обратной
|
||||
совместимости, удалите узел requestedExecutionLevel.
|
||||
Specifying requestedExecutionLevel element will disable file and registry virtualization.
|
||||
Remove this element if your application requires this virtualization for backwards
|
||||
compatibility.
|
||||
-->
|
||||
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||
</requestedPrivileges>
|
||||
<applicationRequestMinimum>
|
||||
<defaultAssemblyRequest permissionSetReference="Custom" />
|
||||
<PermissionSet class="System.Security.PermissionSet" version="1" ID="Custom" SameSite="site" Unrestricted="true" />
|
||||
</applicationRequestMinimum>
|
||||
</security>
|
||||
</trustInfo>
|
||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||
<application>
|
||||
<!-- Список всех версий Windows, с которыми это приложение предназначено работать. Windows автоматически выберет наиболее совместимую среду.-->
|
||||
<!-- Если приложение предназначено для работы с Windows 7, раскомментируйте следующий узел supportedOS-->
|
||||
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>-->
|
||||
</application>
|
||||
</compatibility>
|
||||
<!-- Включите темы для общих элементов управления и диалоговых окон Windows (Windows XP и более поздние версии) -->
|
||||
<!-- <dependency>
|
||||
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
|
||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||
<application>
|
||||
<!-- A list of the Windows versions that this application has been tested on
|
||||
and is designed to work with. Uncomment the appropriate elements
|
||||
and Windows will automatically select the most compatible environment. -->
|
||||
|
||||
<!-- Windows Vista -->
|
||||
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
|
||||
|
||||
<!-- Windows 7 -->
|
||||
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
|
||||
|
||||
<!-- Windows 8 -->
|
||||
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
|
||||
|
||||
<!-- Windows 8.1 -->
|
||||
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
|
||||
|
||||
<!-- Windows 10 -->
|
||||
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
|
||||
|
||||
</application>
|
||||
</compatibility>
|
||||
|
||||
<!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
|
||||
DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need
|
||||
to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should
|
||||
also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config.
|
||||
|
||||
Makes the application long-path aware. See https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation -->
|
||||
|
||||
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<windowsSettings>
|
||||
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
|
||||
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
|
||||
</windowsSettings>
|
||||
</application>
|
||||
|
||||
|
||||
<!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
|
||||
<!--
|
||||
<dependency>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity
|
||||
type="win32"
|
||||
@@ -43,5 +73,7 @@
|
||||
language="*"
|
||||
/>
|
||||
</dependentAssembly>
|
||||
</dependency>-->
|
||||
</asmv1:assembly>
|
||||
</dependency>
|
||||
-->
|
||||
|
||||
</assembly>
|
||||
|
||||
|
Before Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 355 B |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1,57 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.WindowsAPICodePack.Taskbar;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using Microsoft.WindowsAPICodePack.Shell;
|
||||
using APKToolGUI.Languages;
|
||||
|
||||
namespace APKToolGUI
|
||||
{
|
||||
public class TaskBarJumpList
|
||||
{
|
||||
private JumpList list;
|
||||
|
||||
/// <summary>
|
||||
/// Creating a JumpList for the application
|
||||
/// </summary>
|
||||
/// <param name="windowHandle"></param>
|
||||
public TaskBarJumpList(IntPtr windowHandle)
|
||||
{
|
||||
list = JumpList.CreateJumpListForIndividualWindow(TaskbarManager.Instance.ApplicationId, windowHandle);
|
||||
list.KnownCategoryToDisplay = JumpListKnownCategoryType.Recent;
|
||||
BuildList();
|
||||
}
|
||||
|
||||
public void AddToRecent(string destination)
|
||||
{
|
||||
//Call JumpList.AddToRecent(destination); because of bug
|
||||
JumpList.AddToRecent(destination);
|
||||
list.Refresh();
|
||||
}
|
||||
|
||||
public void AddTasks(string titleValue, string args)
|
||||
{
|
||||
JumpListLink jumpListLink = new JumpListLink(Assembly.GetEntryAssembly().Location, titleValue);
|
||||
jumpListLink.IconReference = new IconReference(Assembly.GetEntryAssembly().Location, 3);
|
||||
jumpListLink.Arguments = args;
|
||||
|
||||
list.AddUserTasks(jumpListLink);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Builds the Jumplist
|
||||
/// </summary>
|
||||
private void BuildList()
|
||||
{
|
||||
JumpListCustomCategory userActionsCategory = new JumpListCustomCategory("Actions");
|
||||
|
||||
AddTasks(Language.OpenDecFolder, "opendecfolder");
|
||||
AddTasks(Language.OpenComFolder, "opencomfolder");
|
||||
|
||||
list.Refresh();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,513 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:ctrl="clr-namespace:APKToolGUI.Controls">
|
||||
|
||||
<!--
|
||||
Shared implicit styles giving the common WPF controls a dark/light look.
|
||||
Colours come from DynamicResource brushes filled in by Controls/WpfTheme.cs.
|
||||
Merge this dictionary into a window, then call WpfTheme.Apply(this, dark).
|
||||
Reused across the staged WinForms->WPF conversion (AboutWindow, SettingsWindow, ...).
|
||||
-->
|
||||
|
||||
<Style TargetType="TextBlock">
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="Label">
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="TextBox">
|
||||
<Setter Property="Background" Value="{DynamicResource PanelBackground}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource PanelBorder}"/>
|
||||
<Setter Property="CaretBrush" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="3,2"/>
|
||||
<Setter Property="SnapsToDevicePixels" Value="True"/>
|
||||
</Style>
|
||||
|
||||
<!-- Flat button that looks right in both themes (no light-blue Aero hover). -->
|
||||
<Style TargetType="Button">
|
||||
<Setter Property="Background" Value="{DynamicResource ButtonBackground}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource ButtonBorder}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="10,4"/>
|
||||
<Setter Property="SnapsToDevicePixels" Value="True"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="Button">
|
||||
<Border x:Name="border"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="{TemplateBinding BorderThickness}">
|
||||
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"
|
||||
Margin="{TemplateBinding Padding}" RecognizesAccessKey="True"/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="border" Property="Background" Value="{DynamicResource ButtonHover}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsPressed" Value="True">
|
||||
<Setter TargetName="border" Property="Background" Value="{DynamicResource ButtonPressed}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsEnabled" Value="False">
|
||||
<Setter TargetName="border" Property="Opacity" Value="0.5"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="CheckBox">
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="Background" Value="{DynamicResource ControlBackground}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource PanelBorder}"/>
|
||||
<Setter Property="SnapsToDevicePixels" Value="True"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="CheckBox">
|
||||
<StackPanel Orientation="Horizontal" Background="Transparent">
|
||||
<Border x:Name="box" Width="15" Height="15" VerticalAlignment="Center"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1">
|
||||
<Path x:Name="check" Margin="2" Stretch="Uniform"
|
||||
Data="M0,4 L3,8 L9,0" Visibility="Collapsed"
|
||||
Stroke="White" StrokeThickness="1.6"
|
||||
StrokeEndLineCap="Round" StrokeStartLineCap="Round"/>
|
||||
</Border>
|
||||
<ContentPresenter Margin="6,0,0,0" VerticalAlignment="Center" RecognizesAccessKey="True"/>
|
||||
</StackPanel>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsChecked" Value="True">
|
||||
<Setter TargetName="check" Property="Visibility" Value="Visible"/>
|
||||
<Setter TargetName="box" Property="Background" Value="{DynamicResource Accent}"/>
|
||||
<Setter TargetName="box" Property="BorderBrush" Value="{DynamicResource Accent}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="box" Property="BorderBrush" Value="{DynamicResource Accent}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsEnabled" Value="False">
|
||||
<Setter Property="Opacity" Value="0.5"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="GroupBox">
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource PanelBorder}"/>
|
||||
<Setter Property="Margin" Value="0,0,0,10"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="GroupBox">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Grid.Row="0" Text="{TemplateBinding Header}"
|
||||
FontWeight="SemiBold" Margin="2,0,0,4"
|
||||
Foreground="{DynamicResource PrimaryText}"/>
|
||||
<Border Grid.Row="1" Padding="10"
|
||||
BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1"
|
||||
SnapsToDevicePixels="True">
|
||||
<ContentPresenter/>
|
||||
</Border>
|
||||
</Grid>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="ComboBoxItem">
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="Padding" Value="6,3"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="ComboBoxItem">
|
||||
<Border x:Name="bd" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}">
|
||||
<ContentPresenter/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsHighlighted" Value="True">
|
||||
<Setter TargetName="bd" Property="Background" Value="{DynamicResource Accent}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- Minimal flat dark/light scroll bar (thumb on a track, no arrow buttons). -->
|
||||
<Style x:Key="ScrollBarThumb" TargetType="Thumb">
|
||||
<Setter Property="OverridesDefaultStyle" Value="True"/>
|
||||
<Setter Property="IsTabStop" Value="False"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="Thumb">
|
||||
<Border CornerRadius="3" Margin="2" Background="{DynamicResource ScrollThumb}"/>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
<Style x:Key="ScrollBarPageButton" TargetType="RepeatButton">
|
||||
<Setter Property="OverridesDefaultStyle" Value="True"/>
|
||||
<Setter Property="Focusable" Value="False"/>
|
||||
<Setter Property="IsTabStop" Value="False"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="RepeatButton">
|
||||
<Border Background="Transparent"/>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
<Style TargetType="ScrollBar">
|
||||
<Setter Property="Background" Value="{DynamicResource ScrollTrack}"/>
|
||||
<Setter Property="Width" Value="12"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="ScrollBar">
|
||||
<Grid Background="{TemplateBinding Background}">
|
||||
<Track Name="PART_Track" IsDirectionReversed="True">
|
||||
<Track.DecreaseRepeatButton>
|
||||
<RepeatButton Style="{StaticResource ScrollBarPageButton}" Command="ScrollBar.PageUpCommand"/>
|
||||
</Track.DecreaseRepeatButton>
|
||||
<Track.Thumb>
|
||||
<Thumb Style="{StaticResource ScrollBarThumb}"/>
|
||||
</Track.Thumb>
|
||||
<Track.IncreaseRepeatButton>
|
||||
<RepeatButton Style="{StaticResource ScrollBarPageButton}" Command="ScrollBar.PageDownCommand"/>
|
||||
</Track.IncreaseRepeatButton>
|
||||
</Track>
|
||||
</Grid>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="Orientation" Value="Horizontal">
|
||||
<Setter Property="Width" Value="Auto"/>
|
||||
<Setter Property="Height" Value="12"/>
|
||||
<Setter TargetName="PART_Track" Property="IsDirectionReversed" Value="False"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="ComboBox">
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="Background" Value="{DynamicResource ControlBackground}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource PanelBorder}"/>
|
||||
<Setter Property="SnapsToDevicePixels" Value="True"/>
|
||||
<Setter Property="Height" Value="24"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="ComboBox">
|
||||
<Grid>
|
||||
<ToggleButton Name="ToggleButton" Focusable="False" ClickMode="Press"
|
||||
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}">
|
||||
<ToggleButton.Template>
|
||||
<ControlTemplate TargetType="ToggleButton">
|
||||
<Border Background="{DynamicResource ControlBackground}"
|
||||
BorderBrush="{DynamicResource PanelBorder}" BorderThickness="1">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="20"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Path Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"
|
||||
Data="M0,0 L4,4 L8,0 Z" Fill="{DynamicResource PrimaryText}"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
</ToggleButton.Template>
|
||||
</ToggleButton>
|
||||
<ContentPresenter Name="ContentSite" IsHitTestVisible="False"
|
||||
Content="{TemplateBinding SelectionBoxItem}"
|
||||
ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
|
||||
VerticalAlignment="Center" HorizontalAlignment="Left"
|
||||
Margin="7,0,24,0"/>
|
||||
<Popup Name="Popup" Placement="Bottom" Focusable="False" AllowsTransparency="True"
|
||||
IsOpen="{TemplateBinding IsDropDownOpen}" PopupAnimation="Slide">
|
||||
<Border Background="{DynamicResource ControlBackground}"
|
||||
BorderBrush="{DynamicResource PanelBorder}" BorderThickness="1"
|
||||
MinWidth="{Binding ActualWidth, RelativeSource={RelativeSource TemplatedParent}}"
|
||||
MaxHeight="{TemplateBinding MaxDropDownHeight}">
|
||||
<ScrollViewer>
|
||||
<StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained"/>
|
||||
</ScrollViewer>
|
||||
</Border>
|
||||
</Popup>
|
||||
</Grid>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- ===== Tabs ===== -->
|
||||
<Style TargetType="TabControl">
|
||||
<Setter Property="Background" Value="{DynamicResource WindowBackground}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource PanelBorder}"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="TabControl">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<TabPanel Grid.Row="0" Panel.ZIndex="1" IsItemsHost="True" Margin="2,2,2,0" Background="Transparent"/>
|
||||
<Border Grid.Row="1" Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1">
|
||||
<ContentPresenter ContentSource="SelectedContent"/>
|
||||
</Border>
|
||||
</Grid>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="TabItem">
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="TabItem">
|
||||
<Border x:Name="bd" Margin="0,0,2,0" Padding="11,5"
|
||||
Background="{DynamicResource TabBackground}"
|
||||
BorderBrush="{DynamicResource PanelBorder}" BorderThickness="1,1,1,0">
|
||||
<ContentPresenter ContentSource="Header" VerticalAlignment="Center" RecognizesAccessKey="True"/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="bd" Property="Background" Value="{DynamicResource ButtonHover}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsSelected" Value="True">
|
||||
<Setter TargetName="bd" Property="Background" Value="{DynamicResource WindowBackground}"/>
|
||||
<Setter TargetName="bd" Property="Margin" Value="0,0,2,-1"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- ===== Menu ===== -->
|
||||
<Style TargetType="Menu">
|
||||
<Setter Property="Background" Value="{DynamicResource MenuBar}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
</Style>
|
||||
|
||||
<ControlTemplate x:Key="TopLevelMenuHeaderTemplate" TargetType="MenuItem">
|
||||
<Border x:Name="bd" Background="{TemplateBinding Background}" Padding="9,4">
|
||||
<Grid>
|
||||
<ContentPresenter ContentSource="Header" RecognizesAccessKey="True"/>
|
||||
<Popup x:Name="Popup" Placement="Bottom" Focusable="False" AllowsTransparency="True"
|
||||
IsOpen="{TemplateBinding IsSubmenuOpen}" PopupAnimation="Fade">
|
||||
<Border Background="{DynamicResource MenuPopup}" BorderBrush="{DynamicResource PanelBorder}"
|
||||
BorderThickness="1" Padding="0,2">
|
||||
<StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle"/>
|
||||
</Border>
|
||||
</Popup>
|
||||
</Grid>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsHighlighted" Value="True">
|
||||
<Setter TargetName="bd" Property="Background" Value="{DynamicResource MenuHighlight}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsSubmenuOpen" Value="True">
|
||||
<Setter TargetName="bd" Property="Background" Value="{DynamicResource MenuHighlight}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
|
||||
<ControlTemplate x:Key="SubmenuItemTemplate" TargetType="MenuItem">
|
||||
<Border x:Name="bd" Background="{TemplateBinding Background}">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="26"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="14"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Border x:Name="check" Grid.Column="0" Width="15" Height="15" Visibility="Collapsed"
|
||||
Background="{DynamicResource Accent}" BorderBrush="{DynamicResource Accent}" BorderThickness="1">
|
||||
<Path Data="M0,4 L3,8 L9,0" Stroke="White" StrokeThickness="1.6" Margin="2"/>
|
||||
</Border>
|
||||
<ContentPresenter Grid.Column="1" ContentSource="Header" RecognizesAccessKey="True"
|
||||
VerticalAlignment="Center" Margin="2,5"/>
|
||||
<TextBlock Grid.Column="2" Text="{TemplateBinding InputGestureText}" Opacity="0.7"
|
||||
VerticalAlignment="Center" Margin="24,0,8,0"/>
|
||||
<Path x:Name="arrow" Grid.Column="3" Data="M0,0 L4,4 L0,8 Z" Fill="{DynamicResource PrimaryText}"
|
||||
VerticalAlignment="Center" Visibility="Collapsed"/>
|
||||
<Popup x:Name="Popup" Placement="Right" Focusable="False" AllowsTransparency="True"
|
||||
IsOpen="{TemplateBinding IsSubmenuOpen}">
|
||||
<Border Background="{DynamicResource MenuPopup}" BorderBrush="{DynamicResource PanelBorder}"
|
||||
BorderThickness="1" Padding="0,2">
|
||||
<StackPanel IsItemsHost="True"/>
|
||||
</Border>
|
||||
</Popup>
|
||||
</Grid>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="Role" Value="SubmenuHeader">
|
||||
<Setter TargetName="arrow" Property="Visibility" Value="Visible"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsChecked" Value="True">
|
||||
<Setter TargetName="check" Property="Visibility" Value="Visible"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsHighlighted" Value="True">
|
||||
<Setter TargetName="bd" Property="Background" Value="{DynamicResource MenuHighlight}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsEnabled" Value="False">
|
||||
<Setter Property="Opacity" Value="0.5"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
|
||||
<Style TargetType="MenuItem">
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
<Setter Property="Template" Value="{StaticResource SubmenuItemTemplate}"/>
|
||||
<Style.Triggers>
|
||||
<Trigger Property="Role" Value="TopLevelHeader">
|
||||
<Setter Property="Template" Value="{StaticResource TopLevelMenuHeaderTemplate}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="Role" Value="TopLevelItem">
|
||||
<Setter Property="Template" Value="{StaticResource TopLevelMenuHeaderTemplate}"/>
|
||||
</Trigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="Separator">
|
||||
<Setter Property="Background" Value="{DynamicResource PanelBorder}"/>
|
||||
<Setter Property="Margin" Value="6,3"/>
|
||||
<Setter Property="Height" Value="1"/>
|
||||
</Style>
|
||||
|
||||
<!-- Explicit opaque template: the default ContextMenu popup is semi-transparent, which
|
||||
looked glitchy over the constantly-redrawing LogView. -->
|
||||
<Style TargetType="ContextMenu">
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="ContextMenu">
|
||||
<Border Background="{DynamicResource MenuPopup}" BorderBrush="{DynamicResource PanelBorder}"
|
||||
BorderThickness="1" Padding="0,2" SnapsToDevicePixels="True">
|
||||
<StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle"/>
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="PasswordBox">
|
||||
<Setter Property="Background" Value="{DynamicResource PanelBackground}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource PanelBorder}"/>
|
||||
<Setter Property="CaretBrush" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="Padding" Value="3,2"/>
|
||||
<Setter Property="SnapsToDevicePixels" Value="True"/>
|
||||
</Style>
|
||||
|
||||
<!-- ===== Status bar / progress / misc ===== -->
|
||||
<Style TargetType="StatusBar">
|
||||
<Setter Property="Background" Value="{DynamicResource MenuBar}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
</Style>
|
||||
<Style TargetType="StatusBarItem">
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="ProgressBar">
|
||||
<Setter Property="Background" Value="{DynamicResource ControlBackground}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource PanelBorder}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource Accent}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="RichTextBox">
|
||||
<Setter Property="Background" Value="{DynamicResource LogBackground}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource PanelBorder}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
<Setter Property="CaretBrush" Value="{DynamicResource PrimaryText}"/>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="ListBox">
|
||||
<Setter Property="Background" Value="{DynamicResource PanelBackground}"/>
|
||||
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource PanelBorder}"/>
|
||||
<Setter Property="BorderThickness" Value="1"/>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="GridSplitter">
|
||||
<Setter Property="Background" Value="{DynamicResource PanelBorder}"/>
|
||||
</Style>
|
||||
|
||||
<!-- ===== NumericUpDown ===== -->
|
||||
<Style x:Key="SpinnerButton" TargetType="RepeatButton">
|
||||
<Setter Property="Focusable" Value="False"/>
|
||||
<Setter Property="Background" Value="{DynamicResource ButtonBackground}"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="RepeatButton">
|
||||
<Border x:Name="b" Background="{TemplateBinding Background}"
|
||||
BorderBrush="{DynamicResource PanelBorder}" BorderThickness="1,0,0,0">
|
||||
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||
</Border>
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="b" Property="Background" Value="{DynamicResource ButtonHover}"/>
|
||||
</Trigger>
|
||||
<Trigger Property="IsPressed" Value="True">
|
||||
<Setter TargetName="b" Property="Background" Value="{DynamicResource ButtonPressed}"/>
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style TargetType="{x:Type ctrl:NumericUpDown}">
|
||||
<Setter Property="Height" Value="24"/>
|
||||
<Setter Property="Background" Value="{DynamicResource PanelBackground}"/>
|
||||
<Setter Property="BorderBrush" Value="{DynamicResource PanelBorder}"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="{x:Type ctrl:NumericUpDown}">
|
||||
<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}"
|
||||
BorderThickness="1" SnapsToDevicePixels="True">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="17"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBox x:Name="PART_TextBox" Grid.Column="0" BorderThickness="0" Background="Transparent"
|
||||
Foreground="{DynamicResource PrimaryText}" CaretBrush="{DynamicResource PrimaryText}"
|
||||
VerticalContentAlignment="Center" Padding="4,0"/>
|
||||
<Grid Grid.Column="1">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition/>
|
||||
<RowDefinition/>
|
||||
</Grid.RowDefinitions>
|
||||
<RepeatButton x:Name="PART_Up" Grid.Row="0" Style="{StaticResource SpinnerButton}">
|
||||
<Path Data="M0,4 L4,0 L8,4 Z" Fill="{DynamicResource PrimaryText}"/>
|
||||
</RepeatButton>
|
||||
<RepeatButton x:Name="PART_Down" Grid.Row="1" Style="{StaticResource SpinnerButton}">
|
||||
<Path Data="M0,0 L4,4 L8,0 Z" Fill="{DynamicResource PrimaryText}"/>
|
||||
</RepeatButton>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Border>
|
||||
</ControlTemplate>
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
</ResourceDictionary>
|
||||
@@ -0,0 +1,376 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Ionic.Zip; // DotNetZip NuGet: Install-Package DotNetZip
|
||||
|
||||
namespace APKToolGUI.Utils
|
||||
{
|
||||
// Resolves an APK's launcher icon by parsing resources.arsc directly. Handles apps whose
|
||||
// resource names have been optimized/obfuscated (so the aapt-reported path no longer maps to a
|
||||
// real entry) and adaptive icons (defined only as anydpi XML, no pixels) by falling back to the
|
||||
// foreground layer raster. Returns the raw PNG/WebP/JPG bytes, or null when nothing usable is found.
|
||||
public static class ApkIconExtractor
|
||||
{
|
||||
private const int DENSITY_MDPI = 160;
|
||||
private const int DENSITY_HDPI = 240;
|
||||
private const int DENSITY_XHDPI = 320;
|
||||
private const int DENSITY_XXHDPI = 480;
|
||||
private const int DENSITY_XXXHDPI = 640;
|
||||
|
||||
private const ushort CHUNK_STRING_POOL = 0x0001;
|
||||
private const ushort CHUNK_TABLE = 0x0002;
|
||||
private const ushort CHUNK_PACKAGE = 0x0200;
|
||||
private const ushort CHUNK_TYPE_SPEC = 0x0202;
|
||||
private const ushort CHUNK_TYPE = 0x0201;
|
||||
|
||||
private const byte VALUE_TYPE_STRING = 0x03;
|
||||
private const uint NO_ENTRY = 0xFFFFFFFF;
|
||||
|
||||
// Launcher-icon entry-key names to match exactly (the real app icon).
|
||||
private static readonly string[] PrimaryIconKeys =
|
||||
{ "ic_launcher", "icon", "app_icon", "ic_launcher_round", "icon_round", "launcher_icon" };
|
||||
|
||||
// Raster extensions we can actually decode into a Bitmap. Adaptive-icon XML
|
||||
// definitions (.xml) are intentionally excluded — they carry no pixels.
|
||||
private static readonly string[] RasterExtensions = { ".png", ".webp", ".jpg", ".jpeg" };
|
||||
|
||||
// Best → worst density bucket. Anything outside the standard set (tvdpi, nodpi,
|
||||
// anydpi, default, …) gets the lowest rank but is still accepted as a last resort.
|
||||
private static int DensityRank(int density)
|
||||
{
|
||||
switch (density)
|
||||
{
|
||||
case DENSITY_XXXHDPI: return 6;
|
||||
case DENSITY_XXHDPI: return 5;
|
||||
case DENSITY_XHDPI: return 4;
|
||||
case DENSITY_HDPI: return 3;
|
||||
case DENSITY_MDPI: return 2;
|
||||
default: return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// ── Public API ───────────────────────────────────────────────
|
||||
|
||||
public static byte[] ExtractIcon(string apkPath)
|
||||
{
|
||||
if (string.IsNullOrEmpty(apkPath) || !File.Exists(apkPath))
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
using (var zip = ZipFile.Read(apkPath)) // Ionic.Zip API
|
||||
{
|
||||
byte[] arsc = ReadEntry(zip, "resources.arsc");
|
||||
if (arsc == null)
|
||||
{
|
||||
Debug.WriteLine("resources.arsc not present in " + Path.GetFileName(apkPath));
|
||||
return null;
|
||||
}
|
||||
|
||||
string iconPath = FindBestIconPath(arsc);
|
||||
if (string.IsNullOrEmpty(iconPath))
|
||||
{
|
||||
Debug.WriteLine("No launcher icon raster found in resources.arsc of " + Path.GetFileName(apkPath));
|
||||
return null;
|
||||
}
|
||||
|
||||
Debug.WriteLine($"[ApkIconExtractor] {Path.GetFileName(apkPath)} → {iconPath}");
|
||||
return ReadEntry(zip, iconPath); // null if listed but physically absent (e.g. in a split)
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine("ApkIconExtractor failed for " + Path.GetFileName(apkPath) + ": " + ex.Message);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// ── Ionic.Zip entry reader ───────────────────────────────────
|
||||
|
||||
/// <summary>
|
||||
/// Reads a ZIP entry by name into a byte array.
|
||||
/// Ionic.Zip uses forward-slash paths and is case-sensitive on most platforms.
|
||||
/// </summary>
|
||||
private static byte[] ReadEntry(ZipFile zip, string entryName)
|
||||
{
|
||||
// Ionic.Zip indexer returns null if not found (no exception)
|
||||
ZipEntry entry = zip[entryName];
|
||||
if (entry == null)
|
||||
{
|
||||
// Try case-insensitive fallback (some APKs use mixed casing)
|
||||
foreach (ZipEntry e in zip)
|
||||
{
|
||||
if (string.Equals(e.FileName, entryName, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
entry = e;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (entry == null)
|
||||
return null;
|
||||
|
||||
using (var ms = new MemoryStream())
|
||||
{
|
||||
entry.Extract(ms); // Ionic.Zip extracts directly into a stream
|
||||
return ms.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
// ── resources.arsc parser ────────────────────────────────────
|
||||
|
||||
// Scans the resource table for the app's launcher icon and returns the best raster
|
||||
// file path. Prefers a real launcher-icon raster (ic_launcher/icon/...); if the icon
|
||||
// is an adaptive icon (defined only as anydpi XML, so no pixels), falls back to its
|
||||
// foreground layer, which is a real PNG/WebP. Returns null if nothing usable is found.
|
||||
private static string FindBestIconPath(byte[] d)
|
||||
{
|
||||
if (d == null || d.Length < 12 || ReadU16(d, 0) != CHUNK_TABLE)
|
||||
return null;
|
||||
|
||||
ushort tableHdrSize = ReadU16(d, 2);
|
||||
uint packageCount = ReadU32(d, 8);
|
||||
int pos = tableHdrSize;
|
||||
|
||||
var globalStrings = ReadStringPool(d, pos, out int globalPoolSize);
|
||||
pos += globalPoolSize;
|
||||
|
||||
string bestPrimary = null; int bestPrimaryRank = 0;
|
||||
string bestForeground = null; int bestForegroundRank = 0;
|
||||
|
||||
for (int p = 0; p < packageCount && pos + 8 <= d.Length; p++)
|
||||
{
|
||||
int pkgStart = pos;
|
||||
ushort pkgHdrSize = ReadU16(d, pkgStart + 2);
|
||||
uint pkgSize = ReadU32(d, pkgStart + 4);
|
||||
uint typeStrOff = ReadU32(d, pkgStart + 268);
|
||||
uint keyStrOff = ReadU32(d, pkgStart + 276);
|
||||
|
||||
var typeStrings = ReadStringPool(d, pkgStart + (int)typeStrOff, out _);
|
||||
var keyStrings = ReadStringPool(d, pkgStart + (int)keyStrOff, out _);
|
||||
|
||||
// Launcher icons live under the mipmap or drawable type.
|
||||
int mipmapTypeId = FindIndex(typeStrings, "mipmap") + 1;
|
||||
int drawableTypeId = FindIndex(typeStrings, "drawable") + 1;
|
||||
|
||||
// Pre-resolve the key-pool indices we care about so per-entry checks are O(1).
|
||||
var primaryKeyIdx = new HashSet<int>();
|
||||
var foregroundKeyIdx = new HashSet<int>();
|
||||
for (int i = 0; i < keyStrings.Count; i++)
|
||||
{
|
||||
string k = keyStrings[i];
|
||||
if (string.IsNullOrEmpty(k)) continue;
|
||||
if (Array.IndexOf(PrimaryIconKeys, k) >= 0)
|
||||
primaryKeyIdx.Add(i);
|
||||
else if (k.IndexOf("foreground", StringComparison.OrdinalIgnoreCase) >= 0 &&
|
||||
(k.IndexOf("launcher", StringComparison.OrdinalIgnoreCase) >= 0 ||
|
||||
k.IndexOf("icon", StringComparison.OrdinalIgnoreCase) >= 0))
|
||||
foregroundKeyIdx.Add(i);
|
||||
}
|
||||
|
||||
if ((mipmapTypeId == 0 && drawableTypeId == 0) ||
|
||||
(primaryKeyIdx.Count == 0 && foregroundKeyIdx.Count == 0))
|
||||
{
|
||||
pos = pkgStart + (int)pkgSize;
|
||||
continue;
|
||||
}
|
||||
|
||||
int chunkPos = pkgStart + pkgHdrSize;
|
||||
int pkgEnd = pkgStart + (int)pkgSize;
|
||||
|
||||
while (chunkPos + 8 <= d.Length && chunkPos < pkgEnd)
|
||||
{
|
||||
ushort chunkType = ReadU16(d, chunkPos);
|
||||
ushort chunkHdrSize = ReadU16(d, chunkPos + 2);
|
||||
uint chunkSize = ReadU32(d, chunkPos + 4);
|
||||
if (chunkSize == 0) break;
|
||||
|
||||
if (chunkType == CHUNK_TYPE)
|
||||
{
|
||||
byte typeId = d[chunkPos + 8];
|
||||
if (typeId == mipmapTypeId || typeId == drawableTypeId)
|
||||
ScanTypeChunk(d, chunkPos, chunkHdrSize, globalStrings,
|
||||
primaryKeyIdx, foregroundKeyIdx,
|
||||
ref bestPrimary, ref bestPrimaryRank,
|
||||
ref bestForeground, ref bestForegroundRank);
|
||||
}
|
||||
|
||||
chunkPos += (int)chunkSize;
|
||||
}
|
||||
|
||||
pos = pkgStart + (int)pkgSize;
|
||||
}
|
||||
|
||||
// A genuine launcher-icon raster wins; otherwise use the adaptive foreground layer.
|
||||
return bestPrimary ?? bestForeground;
|
||||
}
|
||||
|
||||
// Inspects every entry in one TYPE (config) chunk, updating the best primary/foreground
|
||||
// raster seen so far. Entries are matched by their `key` pool index, not by position.
|
||||
private static void ScanTypeChunk(
|
||||
byte[] d, int chunkPos, ushort chunkHdrSize,
|
||||
List<string> globalStrings,
|
||||
HashSet<int> primaryKeyIdx, HashSet<int> foregroundKeyIdx,
|
||||
ref string bestPrimary, ref int bestPrimaryRank,
|
||||
ref string bestForeground, ref int bestForegroundRank)
|
||||
{
|
||||
byte typeFlags = d[chunkPos + 9]; // FLAG_SPARSE = 0x01
|
||||
uint entryCount = ReadU32(d, chunkPos + 12);
|
||||
uint entriesStart = ReadU32(d, chunkPos + 16);
|
||||
int density = ReadU16(d, chunkPos + 20 + 14);
|
||||
int rank = DensityRank(density);
|
||||
|
||||
// The offset table starts right after the chunk header (which includes the
|
||||
// ResTable_config block). Each slot is a dense uint32 offset, or — when
|
||||
// FLAG_SPARSE is set — a packed { uint16 entryIdx; uint16 offset/4 } pair.
|
||||
int offsetTablePos = chunkPos + chunkHdrSize;
|
||||
bool sparse = (typeFlags & 0x01) != 0;
|
||||
|
||||
for (int i = 0; i < (int)entryCount; i++)
|
||||
{
|
||||
uint entryOffset;
|
||||
if (sparse)
|
||||
{
|
||||
entryOffset = (uint)ReadU16(d, offsetTablePos + i * 4 + 2) * 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
entryOffset = ReadU32(d, offsetTablePos + i * 4);
|
||||
if (entryOffset == NO_ENTRY) continue;
|
||||
}
|
||||
|
||||
int entryPos = chunkPos + (int)entriesStart + (int)entryOffset;
|
||||
if (entryPos + 8 > d.Length) continue;
|
||||
|
||||
ushort entryFlags = ReadU16(d, entryPos + 2);
|
||||
int entryKey = (int)ReadU32(d, entryPos + 4);
|
||||
|
||||
bool isPrimary = primaryKeyIdx.Contains(entryKey);
|
||||
bool isForeground = !isPrimary && foregroundKeyIdx.Contains(entryKey);
|
||||
if (!isPrimary && !isForeground) continue;
|
||||
|
||||
if ((entryFlags & 0x0001) != 0) continue; // complex (<adaptive-icon>) — no file path
|
||||
|
||||
int valuePos = entryPos + 8;
|
||||
if (valuePos + 8 > d.Length) continue;
|
||||
|
||||
byte dataType = d[valuePos + 3];
|
||||
uint dataVal = ReadU32(d, valuePos + 4);
|
||||
if (dataType != VALUE_TYPE_STRING || dataVal >= (uint)globalStrings.Count) continue;
|
||||
|
||||
string path = globalStrings[(int)dataVal];
|
||||
if (string.IsNullOrEmpty(path) || !HasRasterExtension(path)) continue; // skip .xml adaptive defs
|
||||
|
||||
if (isPrimary && rank > bestPrimaryRank)
|
||||
{
|
||||
bestPrimary = path;
|
||||
bestPrimaryRank = rank;
|
||||
}
|
||||
else if (isForeground && rank > bestForegroundRank)
|
||||
{
|
||||
bestForeground = path;
|
||||
bestForegroundRank = rank;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static bool HasRasterExtension(string path)
|
||||
{
|
||||
foreach (var ext in RasterExtensions)
|
||||
if (path.EndsWith(ext, StringComparison.OrdinalIgnoreCase))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
// ── String pool parser ───────────────────────────────────────
|
||||
|
||||
private static List<string> ReadStringPool(byte[] d, int pos, out int chunkSizeOut)
|
||||
{
|
||||
ushort headerSize = ReadU16(d, pos + 2);
|
||||
uint chunkSize = ReadU32(d, pos + 4);
|
||||
uint stringCount = ReadU32(d, pos + 8);
|
||||
uint flags = ReadU32(d, pos + 16);
|
||||
uint stringsStart = ReadU32(d, pos + 20);
|
||||
|
||||
bool isUtf8 = (flags & 0x100) != 0;
|
||||
int offsetsBase = pos + headerSize;
|
||||
int stringsBase = pos + (int)stringsStart;
|
||||
|
||||
var strings = new List<string>((int)stringCount);
|
||||
|
||||
for (int i = 0; i < (int)stringCount; i++)
|
||||
{
|
||||
uint strOffset = ReadU32(d, offsetsBase + i * 4);
|
||||
int strPos = stringsBase + (int)strOffset;
|
||||
|
||||
try
|
||||
{
|
||||
strings.Add(isUtf8
|
||||
? DecodeUtf8String(d, strPos)
|
||||
: DecodeUtf16String(d, strPos));
|
||||
}
|
||||
catch
|
||||
{
|
||||
strings.Add(string.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
chunkSizeOut = (int)chunkSize;
|
||||
return strings;
|
||||
}
|
||||
|
||||
private static string DecodeUtf8String(byte[] d, int pos)
|
||||
{
|
||||
if ((d[pos] & 0x80) != 0) pos += 2; else pos++;
|
||||
|
||||
int byteLen;
|
||||
if ((d[pos] & 0x80) != 0)
|
||||
{
|
||||
byteLen = ((d[pos] & 0x7F) << 8) | d[pos + 1];
|
||||
pos += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
byteLen = d[pos];
|
||||
pos++;
|
||||
}
|
||||
|
||||
return Encoding.UTF8.GetString(d, pos, byteLen);
|
||||
}
|
||||
|
||||
private static string DecodeUtf16String(byte[] d, int pos)
|
||||
{
|
||||
int charLen;
|
||||
if ((ReadU16(d, pos) & 0x8000) != 0)
|
||||
{
|
||||
charLen = ((ReadU16(d, pos) & 0x7FFF) << 16) | ReadU16(d, pos + 2);
|
||||
pos += 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
charLen = ReadU16(d, pos);
|
||||
pos += 2;
|
||||
}
|
||||
|
||||
return Encoding.Unicode.GetString(d, pos, charLen * 2);
|
||||
}
|
||||
|
||||
// ── Low-level helpers ────────────────────────────────────────
|
||||
|
||||
private static int FindIndex(List<string> list, string value)
|
||||
{
|
||||
for (int i = 0; i < list.Count; i++)
|
||||
if (list[i] == value) return i;
|
||||
return -1;
|
||||
}
|
||||
|
||||
private static ushort ReadU16(byte[] d, int pos) =>
|
||||
(ushort)(d[pos] | (d[pos + 1] << 8));
|
||||
|
||||
private static uint ReadU32(byte[] d, int pos) =>
|
||||
(uint)(d[pos] | (d[pos + 1] << 8) | (d[pos + 2] << 16) | (d[pos + 3] << 24));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace APKToolGUI.Utils
|
||||
{
|
||||
internal class BitmapUtils
|
||||
{
|
||||
public static Bitmap LoadBitmap(string path)
|
||||
{
|
||||
if (File.Exists(path))
|
||||
{
|
||||
// open file in read only mode
|
||||
using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
|
||||
// get a binary reader for the file stream
|
||||
using (BinaryReader reader = new BinaryReader(stream))
|
||||
{
|
||||
// copy the content of the file into a memory stream
|
||||
var memoryStream = new MemoryStream(reader.ReadBytes((int)stream.Length));
|
||||
// make a new Bitmap object the owner of the MemoryStream
|
||||
return new Bitmap(memoryStream);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Decodes raw image bytes (e.g. an APK launcher icon resolved in memory) into a Bitmap.
|
||||
// Returns a standalone copy so the backing MemoryStream can be disposed immediately and
|
||||
// the result remains usable for saving. Returns null on null/empty input or a format
|
||||
// GDI+ can't decode (e.g. WebP).
|
||||
public static Bitmap LoadBitmap(byte[] data)
|
||||
{
|
||||
if (data == null || data.Length == 0)
|
||||
return null;
|
||||
try
|
||||
{
|
||||
using (var memoryStream = new MemoryStream(data))
|
||||
using (var temp = new Bitmap(memoryStream))
|
||||
{
|
||||
return new Bitmap(temp);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,13 +13,12 @@ namespace APKToolGUI.Utils
|
||||
{
|
||||
public class CMD
|
||||
{
|
||||
public static string output;
|
||||
static public Process p = new Process();
|
||||
|
||||
public static string ProcessStartWithOutput(string FileName, string Arguments)
|
||||
{
|
||||
// Debug.WriteLine("CMD: " + FileName + " " + Arguments);
|
||||
Log.d("CMD: " + FileName + " " + Arguments);
|
||||
|
||||
string result = string.Empty;
|
||||
|
||||
try
|
||||
{
|
||||
using (Process process = new Process())
|
||||
@@ -33,13 +32,14 @@ namespace APKToolGUI.Utils
|
||||
process.StartInfo.StandardOutputEncoding = Encoding.GetEncoding("utf-8");
|
||||
process.Start();
|
||||
result = process.StandardOutput.ReadToEnd().Trim();
|
||||
process.WaitForExit(4000);
|
||||
process.WaitForExit();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.WriteLine("Start", e);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace APKToolGUI.Utils
|
||||
{
|
||||
if (mf.Contains("<application"))
|
||||
{
|
||||
return StringExt.Regex(@"(?<=android:name=\"")(.*?)(?=\"")", mf);
|
||||
return StringExt.RegexExtract(@"(?<=android:name=\"")(.*?)(?=\"")", mf);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
@@ -31,11 +31,11 @@ namespace APKToolGUI.Utils
|
||||
foreach (string mf in Manifest)
|
||||
{
|
||||
if (String.IsNullOrEmpty(packageName))
|
||||
packageName = StringExt.Regex(@"(?<=package=\"")(.*?)(?=\"")", mf);
|
||||
packageName = StringExt.RegexExtract(@"(?<=package=\"")(.*?)(?=\"")", mf);
|
||||
|
||||
if (mf.Contains("<activity"))
|
||||
{
|
||||
mainActivity = StringExt.Regex(@"(?<=android:name=\"")(.*?)(?=\"")", mf);
|
||||
mainActivity = StringExt.RegexExtract(@"(?<=android:name=\"")(.*?)(?=\"")", mf);
|
||||
}
|
||||
if (mf.Contains("android.intent.action.MAIN"))
|
||||
{
|
||||
|
||||
@@ -15,161 +15,131 @@ namespace APKToolGUI.Utils
|
||||
public static void Delete(string path)
|
||||
{
|
||||
if (Directory.Exists(path))
|
||||
Directory.Delete(path, true);
|
||||
Directory.Delete("\\\\?\\" + path, true);
|
||||
}
|
||||
|
||||
public static void Copy(string sourceDirName, string destDirName, bool copySubDirs)
|
||||
public static void Copy(string source, string target)
|
||||
{
|
||||
if (Directory.Exists(sourceDirName))
|
||||
var sourcePath = source.TrimEnd('\\', ' ');
|
||||
var targetPath = target.TrimEnd('\\', ' ');
|
||||
var files = Directory.EnumerateFiles(sourcePath, "*", SearchOption.AllDirectories)
|
||||
.GroupBy(s => Path.GetDirectoryName(s));
|
||||
foreach (var folder in files)
|
||||
{
|
||||
// Get the subdirectories for the specified directory.
|
||||
DirectoryInfo dir = new DirectoryInfo(sourceDirName);
|
||||
var targetFolder = folder.Key.Replace(sourcePath, targetPath);
|
||||
|
||||
if (!dir.Exists)
|
||||
//Debug.WriteLine("Create directory: " + folder);
|
||||
Directory.CreateDirectory(targetFolder);
|
||||
foreach (var file in folder)
|
||||
{
|
||||
throw new DirectoryNotFoundException(
|
||||
"Source directory does not exist or could not be found: "
|
||||
+ sourceDirName);
|
||||
}
|
||||
|
||||
DirectoryInfo[] dirs = dir.GetDirectories();
|
||||
// If the destination directory doesn't exist, create it.
|
||||
if (!Directory.Exists(destDirName))
|
||||
{
|
||||
Directory.CreateDirectory(destDirName);
|
||||
}
|
||||
|
||||
// Get the files in the directory and copy them to the new location.
|
||||
FileInfo[] files = dir.GetFiles();
|
||||
foreach (FileInfo file in files)
|
||||
{
|
||||
Debug.WriteLine(file);
|
||||
string temppath = Path.Combine(destDirName, file.Name);
|
||||
file.CopyTo(temppath, true);
|
||||
}
|
||||
|
||||
// If copying subdirectories, copy them and their contents to new location.
|
||||
if (copySubDirs)
|
||||
{
|
||||
foreach (DirectoryInfo subdir in dirs)
|
||||
{
|
||||
string temppath = Path.Combine(destDirName, subdir.Name);
|
||||
Copy(subdir.FullName, temppath, copySubDirs);
|
||||
}
|
||||
var targetFile = Path.Combine(targetFolder, Path.GetFileName(file));
|
||||
File.Copy("\\\\?\\" + file, "\\\\?\\" + targetFile, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void Move(string sourceDirName, string destDirName, bool copySubDirs)
|
||||
public static void Move(string source, string target)
|
||||
{
|
||||
try
|
||||
var sourcePath = source.TrimEnd('\\', ' ');
|
||||
var targetPath = target.TrimEnd('\\', ' ');
|
||||
var files = Directory.EnumerateFiles(sourcePath, "*", SearchOption.AllDirectories)
|
||||
.GroupBy(s => Path.GetDirectoryName(s));
|
||||
foreach (var folder in files)
|
||||
{
|
||||
// Get the subdirectories for the specified directory.
|
||||
DirectoryInfo dir = new DirectoryInfo(sourceDirName);
|
||||
var targetFolder = folder.Key.Replace(sourcePath, targetPath);
|
||||
|
||||
if (!dir.Exists)
|
||||
//Debug.WriteLine("Create directory: " + folder);
|
||||
Directory.CreateDirectory(targetFolder);
|
||||
foreach (var file in folder)
|
||||
{
|
||||
return;
|
||||
//throw new DirectoryNotFoundException(
|
||||
// "Source directory does not exist or could not be found: "
|
||||
// + sourceDirName);
|
||||
}
|
||||
|
||||
DirectoryInfo[] dirs = dir.GetDirectories();
|
||||
// If the destination directory doesn't exist, create it.
|
||||
if (!Directory.Exists(destDirName))
|
||||
{
|
||||
Directory.CreateDirectory(destDirName);
|
||||
}
|
||||
|
||||
// Get the files in the directory and move them to the new location.
|
||||
FileInfo[] files = dir.GetFiles();
|
||||
foreach (FileInfo file in files)
|
||||
{
|
||||
//string s = Path.Combine(Path.GetTempPath(), "AutoToaster", "Debugggg.txt");
|
||||
// File.AppendAllText(s, Path.Combine(destDirName, file.Name) + "\n");
|
||||
//HaveError(Environment.NewLine + ex, MainResources.Some_Error_Found);
|
||||
string temppath = Path.Combine(destDirName, file.Name);
|
||||
file.MoveTo(temppath, true);
|
||||
}
|
||||
|
||||
// If copying subdirectories, copy them and their contents to new location.
|
||||
if (copySubDirs)
|
||||
{
|
||||
foreach (DirectoryInfo subdir in dirs)
|
||||
{
|
||||
string temppath = Path.Combine(destDirName, subdir.Name);
|
||||
Move(subdir.FullName, temppath, copySubDirs);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (PathTooLongException)
|
||||
{
|
||||
throw new PathTooLongException("Path too long. Skipped");
|
||||
}
|
||||
}
|
||||
|
||||
public static void ReplaceinFiles(string folderPath, string old, string replace, string extenstion = "*")
|
||||
{
|
||||
if (Directory.Exists(folderPath))
|
||||
{
|
||||
string[] filePaths = Directory.GetFiles(folderPath, extenstion, SearchOption.AllDirectories);
|
||||
foreach (string filePath in filePaths)
|
||||
{
|
||||
if (File.Exists(filePath))
|
||||
{
|
||||
string file = File.ReadAllText(filePath);
|
||||
if (file.Contains(old))
|
||||
{
|
||||
file = file.Replace(old, replace);
|
||||
File.WriteAllText(filePath, file);
|
||||
}
|
||||
}
|
||||
var targetFile = Path.Combine(targetFolder, Path.GetFileName(file));
|
||||
if (File.Exists(targetFile))
|
||||
File.Delete(targetFile);
|
||||
File.Move(file, targetFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void ReplaceinFilesRegex(string folderPath,string pattern, string replace, string extenstion = "*"
|
||||
)
|
||||
{
|
||||
if (Directory.Exists(folderPath))
|
||||
{
|
||||
string[] filePaths = Directory.GetFiles(folderPath, extenstion, SearchOption.AllDirectories);
|
||||
foreach (string filePath in filePaths)
|
||||
{
|
||||
if (File.Exists(filePath))
|
||||
{
|
||||
string file = File.ReadAllText(filePath);
|
||||
if (Regex.IsMatch(file, pattern))
|
||||
{
|
||||
file = Regex.Replace(file, pattern, replace);
|
||||
File.WriteAllText(filePath, file);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void ReplaceinFilesRegex( string folderPath,string[] pattern,string replace,
|
||||
public static void ReplaceinFiles(
|
||||
string folderPath,
|
||||
string old,
|
||||
string replace,
|
||||
string extenstion = "*"
|
||||
)
|
||||
{
|
||||
if (Directory.Exists(folderPath))
|
||||
{
|
||||
string[] filePaths = Directory.GetFiles(folderPath, extenstion, SearchOption.AllDirectories);
|
||||
foreach (string filePath in filePaths)
|
||||
DirectoryInfo DR = new DirectoryInfo(folderPath);
|
||||
var filePaths = DR.EnumerateFiles(extenstion, SearchOption.AllDirectories).AsParallel();
|
||||
foreach (FileInfo filePath in filePaths)
|
||||
{
|
||||
if (File.Exists(filePath))
|
||||
if (File.Exists(filePath.FullName))
|
||||
{
|
||||
string file = File.ReadAllText(filePath);
|
||||
string file = File.ReadAllText(filePath.FullName);
|
||||
if (file.Contains(old))
|
||||
{
|
||||
file = file.Replace(old, replace);
|
||||
File.WriteAllText(filePath.FullName, file);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void ReplaceinFilesRegex(
|
||||
string folderPath,
|
||||
string pattern,
|
||||
string replace,
|
||||
string extenstion = "*"
|
||||
)
|
||||
{
|
||||
if (Directory.Exists(folderPath))
|
||||
{
|
||||
DirectoryInfo DR = new DirectoryInfo(folderPath);
|
||||
var filePaths = DR.EnumerateFiles(extenstion, SearchOption.AllDirectories).AsParallel();
|
||||
foreach (FileInfo filePath in filePaths)
|
||||
{
|
||||
if (File.Exists(filePath.FullName))
|
||||
{
|
||||
string file = File.ReadAllText(filePath.FullName);
|
||||
if (Regex.IsMatch(file, pattern))
|
||||
{
|
||||
file = Regex.Replace(file, pattern, replace);
|
||||
File.WriteAllText(filePath.FullName, file);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void ReplaceinFilesRegex(
|
||||
string folderPath,
|
||||
string[] pattern,
|
||||
string replace,
|
||||
string extenstion = "*.*"
|
||||
)
|
||||
{
|
||||
if (Directory.Exists(folderPath))
|
||||
{
|
||||
DirectoryInfo DR = new DirectoryInfo(folderPath);
|
||||
var filePaths = DR.EnumerateFiles(extenstion, SearchOption.AllDirectories).AsParallel();
|
||||
foreach (FileInfo filePath in filePaths)
|
||||
{
|
||||
if (File.Exists(filePath.FullName))
|
||||
{
|
||||
bool match = false;
|
||||
string file = File.ReadAllText(filePath.FullName);
|
||||
foreach (string pat in pattern)
|
||||
{
|
||||
if (Regex.IsMatch(file, pat))
|
||||
{
|
||||
file = Regex.Replace(file, pat, replace);
|
||||
File.WriteAllText(filePath, file);
|
||||
match = true;
|
||||
}
|
||||
}
|
||||
if (match)
|
||||
File.WriteAllText(filePath.FullName, file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,133 +0,0 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace SaveToGameWpf.Logic.Utils
|
||||
{
|
||||
public static class DragDropUtils
|
||||
{
|
||||
private static readonly string[] EmptyStrings = new string[0];
|
||||
|
||||
public static string[] GetFilesDrop(this DragEventArgs args)
|
||||
{
|
||||
return (string[])args.Data.GetData(DataFormats.FileDrop) ?? EmptyStrings;
|
||||
}
|
||||
|
||||
public static string[] GetFilesDrop(this DragEventArgs args, string ending)
|
||||
{
|
||||
// ReSharper disable once ConvertIfStatementToReturnStatement
|
||||
if (string.IsNullOrEmpty(ending))
|
||||
return args.GetFilesDrop();
|
||||
|
||||
return args.GetFilesDrop(it => it.EndsWith(ending, StringComparison.Ordinal));
|
||||
}
|
||||
|
||||
public static string[] GetFilesDrop(this DragEventArgs args, Func<string, bool> filter)
|
||||
{
|
||||
var items = args.GetFilesDrop();
|
||||
|
||||
if (items == null)
|
||||
return EmptyStrings;
|
||||
|
||||
return filter == null ? items : items.Where(filter).ToArray();
|
||||
}
|
||||
public static void CheckDragEnter(this DragEventArgs e, string extensions)
|
||||
{
|
||||
if (!e.Data.GetDataPresent(DataFormats.FileDrop)) return;
|
||||
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
|
||||
foreach (var file in files)
|
||||
{
|
||||
var ext = Path.GetExtension(file);
|
||||
if (!String.IsNullOrEmpty(extensions) && ext.Equals(extensions))
|
||||
{
|
||||
e.Effect = DragDropEffects.Copy;
|
||||
return;
|
||||
}
|
||||
else if (String.IsNullOrEmpty(extensions) && File.Exists(Path.Combine(file, "AndroidManifest.xml")))
|
||||
{
|
||||
e.Effect = DragDropEffects.Copy;
|
||||
return;
|
||||
}
|
||||
}
|
||||
e.Effect = DragDropEffects.None;
|
||||
}
|
||||
|
||||
public static bool CheckDragOver(this DragEventArgs e, string extensions)
|
||||
{
|
||||
if (!e.Data.GetDataPresent(DataFormats.FileDrop)) return false;
|
||||
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
|
||||
foreach (var file in files)
|
||||
{
|
||||
var ext = Path.GetExtension(file);
|
||||
if (!String.IsNullOrEmpty(extensions) && ext.Equals(extensions))
|
||||
{
|
||||
e.Effect = DragDropEffects.Copy;
|
||||
return true;
|
||||
}
|
||||
else if (String.IsNullOrEmpty(extensions) && File.Exists(Path.Combine(file, "AndroidManifest.xml")))
|
||||
{
|
||||
e.Effect = DragDropEffects.Copy;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool CheckManyDragOver(this DragEventArgs e, params string[] extensions)
|
||||
{
|
||||
string[] files = e.GetFilesDrop();
|
||||
if (extensions.Any(ext => files[0].EndsWith(ext, StringComparison.Ordinal)))
|
||||
{
|
||||
e.Effect = DragDropEffects.Move;
|
||||
return true;
|
||||
}
|
||||
e.Effect = DragDropEffects.None;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool DropOneByEnd(this DragEventArgs e, string ext, Action<string> onSuccess)
|
||||
{
|
||||
string[] files = e.GetFilesDrop(ext);
|
||||
|
||||
if (files.Length == 1)
|
||||
{
|
||||
onSuccess(files[0]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static string DropOneByEnd(this DragEventArgs e, string ext)
|
||||
{
|
||||
string[] files = e.GetFilesDrop(ext);
|
||||
|
||||
if (files.Length == 1)
|
||||
return files[0];
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void DropManyByEnd(this DragEventArgs e, string ext, Action<string[]> onSuccess)
|
||||
{
|
||||
string[] files = e.GetFilesDrop(ext);
|
||||
|
||||
if (files.Length > 0)
|
||||
onSuccess(files);
|
||||
}
|
||||
|
||||
public static string[] DropManyByEnd(this DragEventArgs e, string ext)
|
||||
{
|
||||
string[] files = e.GetFilesDrop(ext);
|
||||
|
||||
if (files.Length > 0)
|
||||
return files;
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,8 @@
|
||||
using Microsoft.Win32;
|
||||
using APKToolGUI.Languages;
|
||||
using APKToolGUI.Utils;
|
||||
using Microsoft.Build.Framework.XamlTypes;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace APKToolGUI
|
||||
{
|
||||
@@ -23,25 +25,19 @@ namespace APKToolGUI
|
||||
try
|
||||
{
|
||||
#region Add context menu to registry
|
||||
RegistryKey apkToolGUIFolderShell = Registry.ClassesRoot.OpenSubKey(@"Directory\shell", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl).CreateSubKey("APKToolGUI", RegistryKeyPermissionCheck.ReadWriteSubTree);
|
||||
RegistryKey apkToolGUIFolderShell = Registry.ClassesRoot.OpenSubKey(@"Directory\shell", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl).CreateSubKey(Application.ProductName, RegistryKeyPermissionCheck.ReadWriteSubTree);
|
||||
apkToolGUIFolderShell.SetValue("Icon", executablePath);
|
||||
apkToolGUIFolderShell.SetValue("MUIVerb", "APKToolGUI");
|
||||
apkToolGUIFolderShell.SetValue("MUIVerb", Application.ProductName);
|
||||
apkToolGUIFolderShell.SetValue("SubCommands", "APKToolGUI.Build;APKToolGUI.Smali");
|
||||
apkToolGUIFolderShell.Close();
|
||||
|
||||
Registry.ClassesRoot.OpenSubKey("SystemFileAssociations", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl).CreateSubKey(".apk", RegistryKeyPermissionCheck.ReadWriteSubTree).CreateSubKey("DefaultIcon", RegistryKeyPermissionCheck.ReadWriteSubTree).SetValue("", executablePath, RegistryValueKind.ExpandString);
|
||||
RegistryKey shellAPK = Registry.ClassesRoot.OpenSubKey(@"SystemFileAssociations\.apk", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.CreateSubKey).CreateSubKey("shell", RegistryKeyPermissionCheck.ReadWriteSubTree).CreateSubKey("APKToolGUI", RegistryKeyPermissionCheck.ReadWriteSubTree);
|
||||
shellAPK.SetValue("Icon", "\"" + executablePath + "\"");
|
||||
shellAPK.SetValue("MUIVerb", "APKToolGUI");
|
||||
shellAPK.SetValue("SubCommands", "APKToolGUI.Decompile;APKToolGUI.Sign;APKToolGUI.Zipalign");
|
||||
shellAPK.Close();
|
||||
CreateFileAssociationsSubKey(executablePath, ".apk", "APKToolGUI.Apkinfo;APKToolGUI.Decompile;APKToolGUI.Sign;APKToolGUI.Zipalign");
|
||||
CreateFileAssociationsSubKey(executablePath, ".xapk", "APKToolGUI.Decompile");
|
||||
CreateFileAssociationsSubKey(executablePath, ".apks", "APKToolGUI.Decompile");
|
||||
CreateFileAssociationsSubKey(executablePath, ".zip", "APKToolGUI.Decompile");
|
||||
CreateFileAssociationsSubKey(executablePath, ".apkm", "APKToolGUI.Decompile");
|
||||
|
||||
Registry.ClassesRoot.OpenSubKey("SystemFileAssociations", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl).CreateSubKey(".dex", RegistryKeyPermissionCheck.ReadWriteSubTree).CreateSubKey("DefaultIcon", RegistryKeyPermissionCheck.ReadWriteSubTree).SetValue("", executablePath, RegistryValueKind.ExpandString);
|
||||
RegistryKey shellDEX = Registry.ClassesRoot.OpenSubKey(@"SystemFileAssociations\.dex", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.CreateSubKey).CreateSubKey("shell", RegistryKeyPermissionCheck.ReadWriteSubTree).CreateSubKey("APKToolGUI", RegistryKeyPermissionCheck.ReadWriteSubTree);
|
||||
shellDEX.SetValue("Icon", "\"" + executablePath + "\"");
|
||||
shellDEX.SetValue("MUIVerb", "APKToolGUI");
|
||||
shellDEX.SetValue("SubCommands", "APKToolGUI.Baksmali");
|
||||
shellDEX.Close();
|
||||
CreateFileAssociationsSubKey(executablePath, ".dex", "APKToolGUI.Baksmali");
|
||||
#endregion
|
||||
|
||||
#region Add command to registry
|
||||
@@ -90,7 +86,7 @@ namespace APKToolGUI
|
||||
RegistryKey apkinfo = shell.CreateSubKey("APKToolGUI.Apkinfo", RegistryKeyPermissionCheck.ReadWriteSubTree);
|
||||
apkinfo.SetValue("", Language.GetApkInfo, RegistryValueKind.String);
|
||||
apkinfo.SetValue("Icon", executablePath, RegistryValueKind.String);
|
||||
apkinfo.CreateSubKey("command").SetValue("", "\"" + executablePath + "\" \"apkinfo\" \"%1\"", RegistryValueKind.String);
|
||||
apkinfo.CreateSubKey("command").SetValue("", "\"" + executablePath + "\" \"viewinfo\" \"%1\"", RegistryValueKind.String);
|
||||
apkinfo.Close();
|
||||
|
||||
shell.Close();
|
||||
@@ -104,6 +100,18 @@ namespace APKToolGUI
|
||||
return new Status(true, "Done!");
|
||||
}
|
||||
|
||||
public static void CreateFileAssociationsSubKey(string executablePath, string fileExtension, string subCommands)
|
||||
{
|
||||
Registry.ClassesRoot.OpenSubKey("SystemFileAssociations", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl).CreateSubKey(fileExtension, RegistryKeyPermissionCheck.ReadWriteSubTree).CreateSubKey("DefaultIcon", RegistryKeyPermissionCheck.ReadWriteSubTree).SetValue("", executablePath, RegistryValueKind.ExpandString);
|
||||
|
||||
RegistryKey shell = Registry.ClassesRoot.OpenSubKey(@"SystemFileAssociations\" + fileExtension, RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.CreateSubKey).CreateSubKey("shell", RegistryKeyPermissionCheck.ReadWriteSubTree).CreateSubKey(Application.ProductName, RegistryKeyPermissionCheck.ReadWriteSubTree);
|
||||
|
||||
shell.SetValue("Icon", "\"" + executablePath + "\"");
|
||||
shell.SetValue("MUIVerb", Application.ProductName);
|
||||
shell.SetValue("SubCommands", subCommands);
|
||||
shell.Close();
|
||||
}
|
||||
|
||||
public static Status Remove()
|
||||
{
|
||||
try
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace APKToolGUI.Utils
|
||||
{
|
||||
internal class FileUtils
|
||||
{
|
||||
public static void Move(string sourceFileName, string destFileName, bool overwrite = false)
|
||||
{
|
||||
if (File.Exists(destFileName) && overwrite)
|
||||
File.Delete(destFileName);
|
||||
File.Move(sourceFileName, destFileName);
|
||||
}
|
||||
|
||||
public static void Copy(string sourceFileName, string destFileName, bool overwrite = false)
|
||||
{
|
||||
if (File.Exists(sourceFileName))
|
||||
File.Copy(sourceFileName, destFileName, overwrite);
|
||||
}
|
||||
|
||||
public static void Delete(string sourceFileName)
|
||||
{
|
||||
if (File.Exists(sourceFileName))
|
||||
File.Delete(sourceFileName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
using APKToolGUI;
|
||||
using APKToolGUI.Properties;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace APKToolGUI.Utils
|
||||
{
|
||||
/// <summary>
|
||||
/// simple logging wrapper class
|
||||
/// </summary>
|
||||
public static class Log
|
||||
{
|
||||
/// <summary>
|
||||
/// Active log sink. Set by the main window (<c>MainWindow.ToLog</c>) at startup.
|
||||
/// </summary>
|
||||
public static Action<ApktoolEventType, string> Output;
|
||||
|
||||
private static void Send(ApktoolEventType type, string s)
|
||||
{
|
||||
Output?.Invoke(type, s);
|
||||
}
|
||||
|
||||
/// <summary>log message with level VERBOSE (may be disabled)</summary>
|
||||
public static void v(string s)
|
||||
{
|
||||
if (!Settings.Default.DebugMode) return;
|
||||
Send(ApktoolEventType.None, s);
|
||||
}
|
||||
|
||||
/// <summary>log message with level DEBUG (may be disabled)</summary>
|
||||
public static void d(string s)
|
||||
{
|
||||
if (!Settings.Default.DebugMode) return;
|
||||
Send(ApktoolEventType.Infomation, s);
|
||||
}
|
||||
|
||||
/// <summary>log message with level INFO</summary>
|
||||
public static void i(string s) => Send(ApktoolEventType.Infomation, s);
|
||||
|
||||
/// <summary>log message with level WARNING</summary>
|
||||
public static void w(string s) => Send(ApktoolEventType.Warning, s);
|
||||
|
||||
/// <summary>log message with level ERROR</summary>
|
||||
public static void e(string s) => Send(ApktoolEventType.Error, s);
|
||||
}
|
||||
}
|
||||
@@ -32,5 +32,19 @@ namespace APKToolGUI.Utils
|
||||
{
|
||||
return Path.Combine(Path.GetDirectoryName(path), Path.GetFileNameWithoutExtension(path));
|
||||
}
|
||||
|
||||
public static string GetRelativePath(string basePath, string fullPath)
|
||||
{
|
||||
// Ensure both paths are absolute
|
||||
basePath = Path.GetFullPath(basePath);
|
||||
fullPath = Path.GetFullPath(fullPath);
|
||||
|
||||
if (!fullPath.StartsWith(basePath, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
throw new ArgumentException("The fullPath is not within the basePath.");
|
||||
}
|
||||
|
||||
return fullPath.Substring(basePath.Length).TrimStart(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
using Microsoft.Build.Utilities;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Management;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace APKToolGUI.Utils
|
||||
{
|
||||
internal class ProcessUtils
|
||||
{
|
||||
public static void KillAllProcessesSpawnedBy(UInt32 parentProcessId)
|
||||
{
|
||||
// NOTE: Process Ids are reused!
|
||||
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(
|
||||
"SELECT * " +
|
||||
"FROM Win32_Process " +
|
||||
"WHERE ParentProcessId=" + parentProcessId))
|
||||
{
|
||||
using (ManagementObjectCollection collection = searcher.Get())
|
||||
{
|
||||
if (collection.Count > 0)
|
||||
{
|
||||
foreach (var item in collection)
|
||||
{
|
||||
UInt32 childProcessId = (UInt32)item["ProcessId"];
|
||||
if ((int)childProcessId != Process.GetCurrentProcess().Id)
|
||||
{
|
||||
Debug.WriteLine($"Kill child process {childProcessId}");
|
||||
|
||||
// Recursively kill child processes
|
||||
KillAllProcessesSpawnedBy(childProcessId);
|
||||
|
||||
// Kill and dispose the child process
|
||||
try
|
||||
{
|
||||
using (Process childProcess = Process.GetProcessById((int)childProcessId))
|
||||
{
|
||||
childProcess.Kill();
|
||||
}
|
||||
}
|
||||
catch (ArgumentException)
|
||||
{
|
||||
// Process already exited
|
||||
Debug.WriteLine($"Process {childProcessId} already exited");
|
||||
}
|
||||
catch (InvalidOperationException ex)
|
||||
{
|
||||
// Process is terminating or has exited
|
||||
Debug.WriteLine($"Process {childProcessId} is terminating: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,21 +1,40 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace APKToolGUI.Utils
|
||||
{
|
||||
public static class StringExt
|
||||
{
|
||||
static readonly Random random = new Random();
|
||||
|
||||
public static string Regex(string text, string match)
|
||||
[ThreadStatic]
|
||||
private static Random threadRandom;
|
||||
|
||||
private static Random ThreadRandom
|
||||
{
|
||||
Regex myRegex = new Regex(text);
|
||||
Match matched = myRegex.Match(match);
|
||||
get
|
||||
{
|
||||
if (threadRandom == null)
|
||||
threadRandom = new Random(unchecked(Environment.TickCount * 31 + Thread.CurrentThread.ManagedThreadId));
|
||||
return threadRandom;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Extracts a string from the input using the provided regex pattern.
|
||||
/// </summary>
|
||||
/// <param name="pattern">The regex pattern to match.</param>
|
||||
/// <param name="input">The input string to search.</param>
|
||||
/// <returns>The matched string or empty string if no match found.</returns>
|
||||
public static string RegexExtract(string pattern, string input)
|
||||
{
|
||||
Regex regex = new Regex(pattern);
|
||||
Match matched = regex.Match(input);
|
||||
return matched.ToString();
|
||||
}
|
||||
|
||||
@@ -23,14 +42,14 @@ namespace APKToolGUI.Utils
|
||||
{
|
||||
const string chars = "abcdefghijklmnopqrstuvwxyz";
|
||||
return new string(Enumerable.Repeat(chars, length)
|
||||
.Select(s => s[random.Next(s.Length)]).ToArray());
|
||||
.Select(s => s[ThreadRandom.Next(s.Length)]).ToArray());
|
||||
}
|
||||
|
||||
public static string RandStrWithCaps(int length)
|
||||
{
|
||||
const string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
return new string(Enumerable.Repeat(chars, length)
|
||||
.Select(s => s[random.Next(s.Length)]).ToArray());
|
||||
.Select(s => s[ThreadRandom.Next(s.Length)]).ToArray());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -64,10 +83,27 @@ namespace APKToolGUI.Utils
|
||||
if (text.Length < 1) return text;
|
||||
return text.Remove(text.ToString().LastIndexOf(character), character.Length);
|
||||
}
|
||||
catch
|
||||
catch (ArgumentOutOfRangeException ex)
|
||||
{
|
||||
Debug.WriteLine($"[StringExt] Character not found in text: {ex.Message}");
|
||||
return text;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[StringExt] Failed to remove last character: {ex.Message}");
|
||||
return text;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool ContainsAny(this string haystack, params string[] needles)
|
||||
{
|
||||
foreach (string needle in needles)
|
||||
{
|
||||
if (haystack.Contains(needle))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Documents;
|
||||
|
||||
namespace APKToolGUI.Utils
|
||||
{
|
||||
@@ -112,6 +113,15 @@ namespace APKToolGUI.Utils
|
||||
}
|
||||
}
|
||||
|
||||
public static void ExtractAll(string path, string destination, bool flattenFoldersOnExtract = false)
|
||||
{
|
||||
using (ZipFile zip = ZipFile.Read(path))
|
||||
{
|
||||
zip.FlattenFoldersOnExtract = flattenFoldersOnExtract;
|
||||
zip.ExtractAll(destination, ExtractExistingFileAction.OverwriteSilently);
|
||||
}
|
||||
}
|
||||
|
||||
public static void AddDirectory(string path, string fileName, string directoryPathInArchive = "")
|
||||
{
|
||||
ZipFile zip = new ZipFile();
|
||||
@@ -136,15 +146,6 @@ namespace APKToolGUI.Utils
|
||||
|
||||
public static void ExtractDirectory(string path, string folderName, string destination, bool flattenFoldersOnExtract = false)
|
||||
{
|
||||
//using (ZipFile zip = ZipFile.Read(path))
|
||||
//{
|
||||
// bool chkresult2 = zip.Any(entry => entry.FileName.Contains(folderName));
|
||||
// if (chkresult2)
|
||||
// {
|
||||
// zip.FlattenFoldersOnExtract = flattenFoldersOnExtract;
|
||||
// zip.ExtractSelectedEntries("name = *", folderName, destination, ExtractExistingFileAction.OverwriteSilently);
|
||||
// }
|
||||
//}
|
||||
using (ZipFile zip = ZipFile.Read(path))
|
||||
{
|
||||
zip.FlattenFoldersOnExtract = flattenFoldersOnExtract;
|
||||
@@ -154,5 +155,6 @@ namespace APKToolGUI.Utils
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -25,9 +25,6 @@
|
||||
<setting name="Decode_InputAppPath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="Decode_FrameDir" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="BuildProjectDir" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
@@ -59,7 +56,7 @@
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="ClearLogBeforeAction" serializeAs="String">
|
||||
<value>False</value>
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="Decode_MatchOriginal" serializeAs="String">
|
||||
<value>False</value>
|
||||
@@ -70,9 +67,6 @@
|
||||
<setting name="Build_CopyOriginal" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Build_FrameDir" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="Build_UseFramework" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
@@ -91,7 +85,7 @@
|
||||
<setting name="Build_InputDir" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="InstallFramework_UseFrameDir" serializeAs="String">
|
||||
<setting name="Framework_UseFrameDir" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="InstallFramework_UseTag" serializeAs="String">
|
||||
@@ -100,7 +94,7 @@
|
||||
<setting name="InstallFramework_Tag" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="InstallFramework_FrameDir" serializeAs="String">
|
||||
<setting name="Framework_FrameDir" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="Zipalign_AlignmentInBytes" serializeAs="String">
|
||||
@@ -155,7 +149,7 @@
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Zipalign_SignAfterZipAlign" serializeAs="String">
|
||||
<value>False</value>
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="Sign_Alias" serializeAs="String">
|
||||
<value>CERT</value>
|
||||
@@ -188,10 +182,10 @@
|
||||
<value>0</value>
|
||||
</setting>
|
||||
<setting name="Sign_Schemev4" serializeAs="String">
|
||||
<value>2</value>
|
||||
<value>0</value>
|
||||
</setting>
|
||||
<setting name="Decode_ApiLevel" serializeAs="String">
|
||||
<value>29</value>
|
||||
<value>4</value>
|
||||
</setting>
|
||||
<setting name="Build_ApiLevel" serializeAs="String">
|
||||
<value>29</value>
|
||||
@@ -226,6 +220,90 @@
|
||||
<setting name="IgnoreOutputDirContextMenu" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Build_UseAapt2" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="PlaySoundWhenDone" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="UseCustomTempDir" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="TempDir" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="UseCustomJavaExe" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="AutoDeleteIdsigFile" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="Utf8FilenameSupport" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Sign_OverwriteInputFile" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Adb_SetVendor" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Adb_SelectedApkPath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="Sign_InstallApkAfterSign" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="UseCustomApktool" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="ApktoolPath" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="Theme" serializeAs="String">
|
||||
<value>0</value>
|
||||
</setting>
|
||||
<setting name="DebugMode" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Build_NetSecConf" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Decode_DontParseApkInfo" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="UseCustomJVMArgs" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="CustomJVMArgs" serializeAs="String">
|
||||
<value>-Dfile.encoding=UTF8 -Djdk.util.zip.disableZip64ExtraFieldValidation=true -Djdk.nio.zipfs.allowDotZipEntry=true</value>
|
||||
</setting>
|
||||
<setting name="SplitApk_InputFile" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="UseApkeditor" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Adb_OverrideAbi" serializeAs="String">
|
||||
<value>0</value>
|
||||
</setting>
|
||||
<setting name="Adb_SetOverrideAbi" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Build_Jobs" serializeAs="String">
|
||||
<value>4</value>
|
||||
</setting>
|
||||
<setting name="Decode_Jobs" serializeAs="String">
|
||||
<value>4</value>
|
||||
</setting>
|
||||
<setting name="Decode_SetJobs" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Build_SetJobs" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Sign_KeyPassword" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
</APKToolGUI.Properties.Settings>
|
||||
</userSettings>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /></startup>
|
||||
@@ -233,8 +311,36 @@
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-6.0.3.0" newVersion="6.0.3.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="WinCopies.WindowsAPICodePack.Win32Native" publicKeyToken="ac0f4cf54a027a4d" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-2.10.1.0" newVersion="2.10.1.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="WinCopies.Util" publicKeyToken="cb02bf7a62cec965" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-2.17.0.0" newVersion="2.17.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Microsoft.Bcl.HashCode" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Text.Encoding.CodePages" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-9.0.0.10" newVersion="9.0.0.10" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Security.Permissions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-9.0.0.10" newVersion="9.0.0.10" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
||||
|
||||
@@ -1,61 +1,71 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Costura.Fody" version="5.7.0" targetFramework="net48" developmentDependency="true" />
|
||||
<package id="DotNetZip" version="1.16.0" targetFramework="net48" />
|
||||
<package id="Fody" version="6.6.0" targetFramework="net48" developmentDependency="true" />
|
||||
<package id="Microsoft.NETCore.Platforms" version="6.0.2" targetFramework="net48" />
|
||||
<package id="Costura.Fody" version="6.0.0" targetFramework="net48" developmentDependency="true" />
|
||||
<package id="Fody" version="6.9.3" targetFramework="net48" developmentDependency="true" />
|
||||
<package id="Microsoft.Bcl.HashCode" version="6.0.0" targetFramework="net48" />
|
||||
<package id="Microsoft.NETCore.Platforms" version="7.0.4" targetFramework="net48" />
|
||||
<package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net48" />
|
||||
<package id="Microsoft-WindowsAPICodePack-Core" version="1.1.5" targetFramework="net48" />
|
||||
<package id="Microsoft-WindowsAPICodePack-Shell" version="1.1.5" targetFramework="net48" />
|
||||
<package id="NETStandard.Library" version="2.0.3" targetFramework="net48" />
|
||||
<package id="Ookii.Dialogs.WinForms" version="4.0.0" targetFramework="net48" />
|
||||
<package id="PortableSettingsProvider" version="0.2.4" targetFramework="net48" />
|
||||
<package id="OSVersionExt" version="3.0.0" targetFramework="net48" />
|
||||
<package id="PortableSettingsProvider" version="0.2.5" targetFramework="net48" />
|
||||
<package id="ProDotNetZip" version="1.20.0" targetFramework="net48" />
|
||||
<package id="Resource.Embedder" version="2.2.0" targetFramework="net48" />
|
||||
<package id="ResourceLoader" version="3.2.4" targetFramework="net48" />
|
||||
<package id="ResourceLoader" version="3.3.1" targetFramework="net48" />
|
||||
<package id="System.AppContext" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Buffers" version="4.5.1" targetFramework="net48" />
|
||||
<package id="System.Buffers" version="4.6.1" targetFramework="net48" />
|
||||
<package id="System.Collections" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Collections.Concurrent" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Collections.Immutable" version="9.0.10" targetFramework="net48" />
|
||||
<package id="System.Console" version="4.3.1" targetFramework="net48" />
|
||||
<package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Diagnostics.DiagnosticSource" version="6.0.0" targetFramework="net48" />
|
||||
<package id="System.Diagnostics.DiagnosticSource" version="9.0.10" targetFramework="net48" />
|
||||
<package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Formats.Nrbf" version="9.0.10" targetFramework="net48" />
|
||||
<package id="System.Globalization" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Globalization.Calendars" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.IO" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.IO.Compression" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.IO.Compression.ZipFile" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.IO.FileSystem" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Linq" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Linq.Expressions" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Memory" version="4.5.4" targetFramework="net48" />
|
||||
<package id="System.Memory" version="4.6.3" targetFramework="net48" />
|
||||
<package id="System.Net.Http" version="4.3.4" targetFramework="net48" />
|
||||
<package id="System.Net.Primitives" version="4.3.1" targetFramework="net48" />
|
||||
<package id="System.Net.Sockets" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
|
||||
<package id="System.Numerics.Vectors" version="4.6.1" targetFramework="net48" />
|
||||
<package id="System.ObjectModel" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Reflection" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Reflection.Metadata" version="9.0.10" targetFramework="net48" />
|
||||
<package id="System.Reflection.Primitives" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Resources.Extensions" version="6.0.0" targetFramework="net48" />
|
||||
<package id="System.Resources.Extensions" version="9.0.10" targetFramework="net48" />
|
||||
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Runtime" version="4.3.1" targetFramework="net48" />
|
||||
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net48" />
|
||||
<package id="System.Runtime.CompilerServices.Unsafe" version="6.1.2" targetFramework="net48" />
|
||||
<package id="System.Runtime.Extensions" version="4.3.1" targetFramework="net48" />
|
||||
<package id="System.Runtime.Handles" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Runtime.Numerics" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Security.AccessControl" version="6.0.1" targetFramework="net48" />
|
||||
<package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="net48" />
|
||||
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="net48" />
|
||||
<package id="System.Security.Permissions" version="9.0.10" targetFramework="net48" />
|
||||
<package id="System.Security.Principal.Windows" version="5.0.0" targetFramework="net48" />
|
||||
<package id="System.Text.Encoding" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Text.Encoding.CodePages" version="9.0.10" targetFramework="net48" />
|
||||
<package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Text.RegularExpressions" version="4.3.1" targetFramework="net48" />
|
||||
<package id="System.Threading" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Threading.Tasks" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Threading.Timer" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.ValueTuple" version="4.6.1" targetFramework="net48" />
|
||||
<package id="System.Xml.ReaderWriter" version="4.3.1" targetFramework="net48" />
|
||||
<package id="System.Xml.XDocument" version="4.3.0" targetFramework="net48" />
|
||||
</packages>
|
||||
|
After Width: | Height: | Size: 27 KiB |