mirror of
https://github.com/AndnixSH/APKToolGUI.git
synced 2026-05-04 11:02:27 +00:00
Compare commits
63 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 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 |
@@ -92,6 +92,7 @@ body:
|
||||
- type: input
|
||||
attributes:
|
||||
label: Operating system and version
|
||||
placeholder: (Example: Windows 11 2h22)
|
||||
placeholder: |
|
||||
(Example: Windows 11 2h22)
|
||||
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
|
||||
|
||||
@@ -112,8 +112,8 @@
|
||||
</Reference>
|
||||
<Reference Include="PresentationCore" />
|
||||
<Reference Include="PresentationFramework" />
|
||||
<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="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">
|
||||
@@ -133,8 +133,8 @@
|
||||
</Reference>
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Design" />
|
||||
<Reference Include="System.Diagnostics.DiagnosticSource, Version=7.0.0.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.7.0.2\lib\net462\System.Diagnostics.DiagnosticSource.dll</HintPath>
|
||||
<Reference Include="System.Diagnostics.DiagnosticSource, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.8.0.0\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>
|
||||
@@ -205,8 +205,8 @@
|
||||
<Private>True</Private>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Resources.Extensions, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Resources.Extensions.7.0.0\lib\net462\System.Resources.Extensions.dll</HintPath>
|
||||
<Reference Include="System.Resources.Extensions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Resources.Extensions.8.0.0\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>
|
||||
@@ -274,23 +274,6 @@
|
||||
<Reference Include="WindowsFormsIntegration" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="AndroidRes\AndroidResourceMerger.cs" />
|
||||
<Compile Include="AndroidRes\AndroidResources.cs" />
|
||||
<Compile Include="AndroidRes\Model\AndroidAttribute.cs" />
|
||||
<Compile Include="AndroidRes\Model\AndroidBool.cs" />
|
||||
<Compile Include="AndroidRes\Model\AndroidInteger.cs" />
|
||||
<Compile Include="AndroidRes\Model\AndroidPlural.cs" />
|
||||
<Compile Include="AndroidRes\Model\AndroidPublic.cs" />
|
||||
<Compile Include="AndroidRes\Model\AndroidString.cs" />
|
||||
<Compile Include="AndroidRes\Model\AndroidStyle.cs" />
|
||||
<Compile Include="AndroidRes\Model\AndroidStyleable.cs" />
|
||||
<Compile Include="AndroidRes\Model\AndroidTypedItem.cs" />
|
||||
<Compile Include="AndroidRes\Model\GenericArrayTypes.cs" />
|
||||
<Compile Include="AndroidRes\Model\GenericTypes.cs" />
|
||||
<Compile Include="AndroidRes\Model\Generic\AndroidGeneric.cs" />
|
||||
<Compile Include="AndroidRes\Model\Generic\AndroidGenericArray.cs" />
|
||||
<Compile Include="AndroidRes\Model\Generic\AndroidResource.cs" />
|
||||
<Compile Include="AndroidRes\Util\ClassExtensions.cs" />
|
||||
<Compile Include="TaskBar\TaskBarJumpList.cs" />
|
||||
<Compile Include="Utils\Log.cs" />
|
||||
<Compile Include="ApkTool\AaptParser.cs" />
|
||||
@@ -370,24 +353,44 @@
|
||||
<Compile Include="Web\WebDownload.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<EmbeddedResource Include="Forms\FormAboutBox.de.resx">
|
||||
<DependentUpon>FormAboutBox.cs</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\FormAboutBox.resx">
|
||||
<DependentUpon>FormAboutBox.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\FormAboutBox.ru.resx">
|
||||
<DependentUpon>FormAboutBox.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\FormAboutBox.zh-CN.resx">
|
||||
<DependentUpon>FormAboutBox.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\FormMain.de.resx">
|
||||
<DependentUpon>FormMain.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\FormMain.zh-CN.resx">
|
||||
<DependentUpon>FormMain.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\FormSettings.de.resx">
|
||||
<DependentUpon>FormSettings.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="Forms\FormSettings.zh-CN.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" />
|
||||
|
||||
@@ -1,562 +0,0 @@
|
||||
//https://github.com/shadow578/ApksMerger
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Xml;
|
||||
using APKSMerger.AndroidRes.Model;
|
||||
using APKSMerger.AndroidRes.Model.Generic;
|
||||
using APKSMerger.Util;
|
||||
using APKToolGUI.Utils;
|
||||
|
||||
namespace APKSMerger.AndroidRes
|
||||
{
|
||||
/// <summary>
|
||||
/// merges android resource files
|
||||
/// </summary>
|
||||
public sealed class AndroidMerger
|
||||
{
|
||||
/// <summary>
|
||||
/// check capabilities of the base and splits, warn if (common) libs are missing
|
||||
/// </summary>
|
||||
/// <param name="locales">list of supported locales; key is locale, value is name of dir that first included it</param>
|
||||
/// <param name="abis">list of supported abis; key is abi, value is name of dir that first included it</param>
|
||||
/// <param name="baseDir">base project dir</param>
|
||||
/// <param name="splits">split dirs</param>
|
||||
public void CollectCapabilities(out Dictionary<string, string> locales, out Dictionary<string, string> abis,
|
||||
DirectoryInfo baseDir, params DirectoryInfo[] splits)
|
||||
{
|
||||
//init dicts
|
||||
Log.i("collecting info about splits...");
|
||||
locales = new Dictionary<string, string>();
|
||||
abis = new Dictionary<string, string>();
|
||||
|
||||
//combine base and splits into one list
|
||||
List<DirectoryInfo> allDir = new List<DirectoryInfo>();
|
||||
allDir.Add(baseDir);
|
||||
allDir.AddRange(splits);
|
||||
|
||||
//check all dirs, collect infos about them
|
||||
foreach (DirectoryInfo d in allDir)
|
||||
{
|
||||
//check exists
|
||||
if (!d.Exists)
|
||||
{
|
||||
Directory.CreateDirectory(baseDir.FullName);
|
||||
Log.w($"Create baseDir {baseDir.FullName}");
|
||||
continue;
|
||||
}
|
||||
|
||||
//get all library archs included in this dir
|
||||
//a decompiled apk dir may have a lib directory that contains native libraries for all archs supported by that apk (or split)
|
||||
//the archs are splitted into their own directories, depending on the arch they're for
|
||||
string libsDir = Path.Combine(d.FullName, "lib");
|
||||
if (Directory.Exists(libsDir))
|
||||
{
|
||||
foreach (string arch in Directory.EnumerateDirectories(libsDir))
|
||||
{
|
||||
//get name of arch
|
||||
string archName = Path.GetFileName(arch);
|
||||
|
||||
//add arch to lists of abis
|
||||
if (!abis.ContainsKey(archName))
|
||||
{
|
||||
Log.v($"{d.Name} includes abi {archName}");
|
||||
abis.Add(archName, d.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
//double arch?
|
||||
Log.w($"arch {archName} already included by {abis[archName]} - in {d.Name}");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.v($"{d.Name} does not include abis");
|
||||
}
|
||||
|
||||
//get all locales included in this dir
|
||||
//extra locales are defined in strings.xml files in directories named values-<LOCALE_NAME>
|
||||
//locale name seems to be formatted as ISO 639, but with an extra r (so en-GB == en-rGB)
|
||||
string resDir = Path.Combine(d.FullName, "res");
|
||||
if (Directory.Exists(resDir))
|
||||
{
|
||||
//add all dirs matching pattern (like values-en-rGB)
|
||||
foreach (string lang in Directory.EnumerateDirectories(resDir, @"values-*"))
|
||||
{
|
||||
//check directory contains a strings.xml
|
||||
if (!File.Exists(Path.Combine(lang, "strings.xml")))
|
||||
continue;
|
||||
|
||||
//get name of lang
|
||||
string langName = Path.GetFileName(lang).ReplaceFirst("values-", "");
|
||||
|
||||
//add lang to list of locales
|
||||
if (!locales.ContainsKey(langName))
|
||||
{
|
||||
Log.v($"{d.Name} included locale {langName}");
|
||||
locales.Add(langName, d.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
//double lang?
|
||||
Log.w($"locale {langName} already included by {locales[langName]} - in {d.Name}");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.v($"{d.Name} does not include locales");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// merge all splits into the base project dir
|
||||
/// </summary>
|
||||
/// <param name="baseDir">base project dir</param>
|
||||
/// <param name="splits">split dirs to merge</param>
|
||||
public void MergeSplits(DirectoryInfo baseDir, params DirectoryInfo[] splits)
|
||||
{
|
||||
//Log.v($"Base dir: {baseDir.FullName}");
|
||||
//check all dirs exists
|
||||
if (!baseDir.Exists)
|
||||
{
|
||||
Directory.CreateDirectory(baseDir.FullName);
|
||||
Log.w($"Create baseDir {baseDir.FullName}");
|
||||
//return;
|
||||
}
|
||||
|
||||
foreach (DirectoryInfo dir in splits)
|
||||
{
|
||||
//Debug.WriteLine(dir);
|
||||
if (!dir.Exists)
|
||||
{
|
||||
Log.e($"split dir {dir.FullName} dos not exist!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
List<string> assetPacks = new List<string>();
|
||||
//enumarate all splitted files
|
||||
Dictionary</*original*/string, /*replacement*/string> globalNameReplacements = new Dictionary<string, string>();
|
||||
foreach (DirectoryInfo split in splits)
|
||||
{
|
||||
//Log.v($"Split dir: {split.FullName}");
|
||||
split.EnumerateAllFiles("*.*", true, (FileInfo splittedFile) =>
|
||||
{
|
||||
if (splittedFile.FullName.Contains("AndroidManifest.xml"))
|
||||
{
|
||||
string manifest = File.ReadAllText(splittedFile.FullName);
|
||||
string splitModule = StringExt.Regex(@"(?<= split=\"")(.*?)(?=\"")", manifest);
|
||||
|
||||
if (!String.IsNullOrEmpty(splitModule) && manifest.Contains("dist:type=\"asset-pack\""))
|
||||
{
|
||||
Log.v($"Add module: {splitModule}");
|
||||
assetPacks.Add(splitModule);
|
||||
}
|
||||
}
|
||||
|
||||
//Debug.WriteLine($"Splited file: {splittedFile.FullName}");
|
||||
//check if should process
|
||||
string splitRel = PathUtils.GetRelativePath(split.FullName, splittedFile.FullName);
|
||||
if (!ShouldProcess(splittedFile, split))
|
||||
{
|
||||
//Log.v($"skip excluded split file {splitRel}");
|
||||
return;
|
||||
}
|
||||
|
||||
//Debug.WriteLine($"Split rel dir: {splitRel}");
|
||||
//Debug.WriteLine($"base Dir: {baseDir.FullName}");
|
||||
List<string> splitList = splitRel.Split('\\').ToList();
|
||||
splitList.RemoveAt(0);
|
||||
string outputString = string.Join("\\", splitList);
|
||||
|
||||
//get file path for base dir
|
||||
FileInfo baseFile = new FileInfo(Path.Combine(baseDir.FullName, outputString));
|
||||
//Debug.WriteLine($"Base file: {baseFile}");
|
||||
//Log.v($"Base file: {baseFile}");
|
||||
|
||||
//create target dir in base if needed
|
||||
string baseFileDir = Path.GetDirectoryName(baseFile.FullName);
|
||||
//Log.v($"Base file´dir: {baseFileDir}");
|
||||
//Debug.WriteLine($"Base file dir: {baseFileDir}");
|
||||
if (!Directory.Exists(baseFileDir))
|
||||
{
|
||||
Directory.CreateDirectory(baseFileDir);
|
||||
}
|
||||
|
||||
//check file exists in base and is resource xml
|
||||
if (!IsResourceXml(baseFile))
|
||||
{
|
||||
//nothing to merge, just copy
|
||||
Log.v($"Move split file {splitRel} to {baseFile}");
|
||||
if (File.Exists(baseFile.FullName))
|
||||
File.Delete(baseFile.FullName);
|
||||
splittedFile.MoveTo(baseFile.FullName);
|
||||
}
|
||||
else
|
||||
{
|
||||
//already exists, merge
|
||||
//Debug.WriteLine($"Merge split file {splitRel} with {baseFile}");
|
||||
|
||||
//skip if files are equal
|
||||
if (baseFile.HasSameHash(splittedFile))
|
||||
{
|
||||
Log.vv($"base and split of {splitRel} have same hash, skipping...");
|
||||
return;
|
||||
}
|
||||
|
||||
//check base and split are both resource xmls, if not skip
|
||||
if (/*!IsResourceXml(baseFile) ||*/ !IsResourceXml(splittedFile))
|
||||
{
|
||||
Log.vv($"split of {splitRel} is not resource xml, skipping...");
|
||||
return;
|
||||
}
|
||||
|
||||
if (splittedFile.FullName.Contains("styles.xml"))
|
||||
{
|
||||
Debug.WriteLine("Break");
|
||||
}
|
||||
|
||||
//merge
|
||||
MergeResourceXML(baseFile, splittedFile, globalNameReplacements);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//skip replacement if no global name replacements are available
|
||||
if (globalNameReplacements.Count <= 0)
|
||||
{
|
||||
Log.d("skip global name replacements: count is 0");
|
||||
}
|
||||
|
||||
//replace names globally (in xml only)
|
||||
Log.d($"process {globalNameReplacements.Count} global name replacements...");
|
||||
foreach (string org in globalNameReplacements.Keys)
|
||||
{
|
||||
Log.v($"Replace {org} with {globalNameReplacements[org]}");
|
||||
//Debug.Write($"replace {org} with {globalNameReplacements[org]}");
|
||||
}
|
||||
|
||||
baseDir.EnumerateAllFiles("*.xml", true, (FileInfo file) =>
|
||||
{
|
||||
//Debug.WriteLine($"Name replace in {file.FullName}");
|
||||
|
||||
//create temp file
|
||||
FileInfo temp = new FileInfo(Path.GetTempFileName());
|
||||
|
||||
//copy from input to temp, replace everything on replace list
|
||||
using (StreamReader inp = file.OpenText())
|
||||
using (StreamWriter oup = temp.CreateText())
|
||||
{
|
||||
|
||||
string ln;
|
||||
while ((ln = inp.ReadLine()) != null)
|
||||
{
|
||||
//replace all
|
||||
foreach (string org in globalNameReplacements.Keys)
|
||||
{
|
||||
string dummy = StringExt.Regex(@"APKTOOL_DUMMY_([A-Za-z0-9])\w", ln);
|
||||
|
||||
if (ln.Contains(dummy))
|
||||
{
|
||||
//To avoid replacing wrong dummies. Don't know if there is better way
|
||||
ln = ln.Replace(org + "<", globalNameReplacements[org] + "<");
|
||||
ln = ln.Replace(org + "\"", globalNameReplacements[org] + "\"");
|
||||
//Debug.WriteLine($"Replaced {org} with {globalNameReplacements[org]} in {file.FullName}");
|
||||
}
|
||||
//if (ln.Contains(org))
|
||||
// ln = Regex.Replace(ln, @"APKTOOL_DUMMY_([A-Za-z0-9])\w", globalNameReplacements[org]);
|
||||
}
|
||||
|
||||
//write back
|
||||
oup.WriteLine(ln);
|
||||
}
|
||||
}
|
||||
|
||||
//move temp to input and delete temp if still exists
|
||||
string tempPath = temp.FullName;
|
||||
|
||||
if (File.Exists(file.FullName))
|
||||
{
|
||||
File.Delete(file.FullName);
|
||||
}
|
||||
|
||||
temp.MoveTo(file.FullName);
|
||||
|
||||
if (File.Exists(tempPath))
|
||||
{
|
||||
File.Delete(tempPath);
|
||||
}
|
||||
});
|
||||
|
||||
//remove splits from android manifest
|
||||
FileInfo baseManifest = new FileInfo(Path.Combine(baseDir.FullName, "AndroidManifest.xml"));
|
||||
PatchManifest(baseManifest, assetPacks);
|
||||
|
||||
FileInfo baseYml = new FileInfo(Path.Combine(baseDir.FullName, "apktool.yml"));
|
||||
PatchYml(baseYml, assetPacks);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Patch the AndroidManifest.xml to not use splits
|
||||
/// </summary>
|
||||
/// <param name="manifest">the manifest xml to patch</param>
|
||||
void PatchManifest(FileInfo manifest, List<string> assetPacks)
|
||||
{
|
||||
Log.d($"patching manifest {manifest.FullName}...");
|
||||
|
||||
//check the file exists
|
||||
if (!manifest.Exists)
|
||||
{
|
||||
Log.e("manifest to patch does not exist!");
|
||||
return;
|
||||
}
|
||||
|
||||
string modules = null;
|
||||
if (assetPacks.Count != 0)
|
||||
{
|
||||
foreach (string asset in assetPacks)
|
||||
{
|
||||
modules += "," + asset;
|
||||
}
|
||||
}
|
||||
|
||||
//prepare targets to remove
|
||||
string[] replaceTargets = { @"android:isSplitRequired=""true""" };
|
||||
|
||||
List<string> removeTargets = new List<string> { @"meta-data android:name=""com.android.stamp.source""",
|
||||
@"meta-data android:name=""com.android.vending.derived.apk.id""",
|
||||
@"meta-data android:name=""com.android.vending.splits.required""",
|
||||
@"meta-data android:name=""com.android.vending.splits"""};
|
||||
|
||||
//create temp file
|
||||
FileInfo temp = new FileInfo(Path.GetTempFileName());
|
||||
|
||||
//copy from input to temp, replace everything on replace list
|
||||
using (StreamReader inp = manifest.OpenText())
|
||||
using (StreamWriter oup = temp.CreateText())
|
||||
{
|
||||
string ln;
|
||||
while ((ln = inp.ReadLine()) != null)
|
||||
{
|
||||
//remove all
|
||||
foreach (string target in replaceTargets)
|
||||
{
|
||||
ln = ln.Replace(target, "");
|
||||
}
|
||||
|
||||
if (removeTargets.Any(w => ln.Contains(w)))
|
||||
continue;
|
||||
|
||||
if (ln.Contains("STAMP_TYPE_DISTRIBUTION_APK"))
|
||||
ln = ln.Replace("STAMP_TYPE_DISTRIBUTION_APK", "STAMP_TYPE_STANDALONE_APK");
|
||||
|
||||
if (ln.Contains("</application>") && !String.IsNullOrEmpty(modules))
|
||||
{
|
||||
oup.WriteLine(@" <meta-data android:name=""com.android.dynamic.apk.fused.modules"" android:value=""base" + modules + @"""/>");
|
||||
}
|
||||
|
||||
//write back
|
||||
oup.WriteLine(ln);
|
||||
}
|
||||
}
|
||||
|
||||
//move temp to input and delete temp if still exists
|
||||
string tempPath = temp.FullName;
|
||||
|
||||
if (File.Exists(manifest.FullName))
|
||||
{
|
||||
File.Delete(manifest.FullName);
|
||||
}
|
||||
|
||||
temp.MoveTo(manifest.FullName);
|
||||
|
||||
if (File.Exists(tempPath))
|
||||
{
|
||||
File.Delete(tempPath);
|
||||
}
|
||||
}
|
||||
|
||||
void PatchYml(FileInfo yml, List<string> assetPacks)
|
||||
{
|
||||
Log.d($"patching apktool.yml {yml.FullName}...");
|
||||
|
||||
//check the file exists
|
||||
if (!yml.Exists)
|
||||
{
|
||||
Log.e("manifest to patch does not exist!");
|
||||
return;
|
||||
}
|
||||
|
||||
//create temp file
|
||||
FileInfo temp = new FileInfo(Path.GetTempFileName());
|
||||
|
||||
//copy from input to temp, replace everything on replace list
|
||||
using (StreamReader inp = yml.OpenText())
|
||||
using (StreamWriter oup = temp.CreateText())
|
||||
{
|
||||
string ln;
|
||||
while ((ln = inp.ReadLine()) != null)
|
||||
{
|
||||
if (ln.Contains("doNotCompress:") && assetPacks.Count != 0)
|
||||
{
|
||||
oup.WriteLine(ln);
|
||||
foreach (string asset in assetPacks)
|
||||
{
|
||||
oup.WriteLine("- assets/assetpack/" + asset);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
//write back
|
||||
oup.WriteLine(ln);
|
||||
}
|
||||
}
|
||||
|
||||
//move temp to input and delete temp if still exists
|
||||
string tempPath = temp.FullName;
|
||||
|
||||
if (File.Exists(yml.FullName))
|
||||
{
|
||||
File.Delete(yml.FullName);
|
||||
}
|
||||
|
||||
temp.MoveTo(yml.FullName);
|
||||
|
||||
if (File.Exists(tempPath))
|
||||
{
|
||||
File.Delete(tempPath);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// merge two splitted resource xmls, overwrite a with merged
|
||||
/// </summary>
|
||||
/// <param name="a">file a to merge</param>
|
||||
/// <param name="b">file b to merge</param>
|
||||
/// <param name="globalNameReplacements">dictionary that can be used to replace names of resources globally</param>
|
||||
void MergeResourceXML(FileInfo a, FileInfo b, Dictionary</*original*/string, /*replacement*/string> globalNameReplacements)
|
||||
{
|
||||
//deserialize both
|
||||
AndroidResources resBase = AndroidResources.FromFile(a.FullName);
|
||||
AndroidResources resSplit = AndroidResources.FromFile(b.FullName);
|
||||
|
||||
//merge resources to resA
|
||||
foreach (AndroidResource res in resSplit.Values)
|
||||
{
|
||||
if (res is AndroidPublic splitP)
|
||||
{
|
||||
//entry of public.xml, special merge (Id has to be unique)
|
||||
//try to find public with same id in base apk
|
||||
AndroidPublic baseP = resBase.FindPublicWithId(splitP.Id);
|
||||
if (baseP == null || !baseP.Type.Equals(splitP.Type))
|
||||
{
|
||||
//id not found or wrong type, add from split
|
||||
resBase.Values.Add(splitP);
|
||||
}
|
||||
else
|
||||
{
|
||||
//id with correct type found in base,
|
||||
//check if name of base is apktool dummy and name of split is not
|
||||
if (baseP.Name.StartsWith("APKTOOL_DUMMY") && !splitP.Name.StartsWith("APKTOOL_DUMMY"))
|
||||
{
|
||||
try
|
||||
{
|
||||
Log.v($"Replace {baseP.Name} with {splitP.Name}...");
|
||||
globalNameReplacements.Add(baseP.Name, splitP.Name);
|
||||
baseP.Name = splitP.Name;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.v($"Error replacing {baseP.Name} with {splitP.Name}...");
|
||||
Debug.WriteLine(ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//normal resource entry (string / color / ...)
|
||||
if (!resBase.Values.Contains(res))
|
||||
{
|
||||
|
||||
resBase.Values.Add(res);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//serialize back to a
|
||||
resBase.ToFile(a.FullName);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// check if the xml file contains the resources xml tag
|
||||
/// </summary>
|
||||
/// <param name="xml">the xml to check</param>
|
||||
/// <returns>does the xml contain the tag?</returns>
|
||||
bool IsResourceXml(FileInfo f)
|
||||
{
|
||||
//check file exists
|
||||
if (!f.Exists) return false;
|
||||
|
||||
try
|
||||
{
|
||||
//Net reactor cause error
|
||||
//check xml root
|
||||
XmlDocument xml = new XmlDocument();
|
||||
|
||||
xml.Load(f.FullName);
|
||||
//Log.v($"IsResourceXml 5");
|
||||
return xml.DocumentElement.Name.Equals("resources", StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
catch
|
||||
{
|
||||
//probably bad xml
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// should the file be processed?
|
||||
/// Example for files to exclude from processing are AndroidManifest.xml, apktool.yml, and META-INF/*
|
||||
/// </summary>
|
||||
/// <param name="file">the file to check</param>
|
||||
/// <param name="projDir">the project dir the file is in</param>
|
||||
/// <returns>process the file?</returns>
|
||||
bool ShouldProcess(FileInfo file, DirectoryInfo projDir)
|
||||
{
|
||||
//get relative path
|
||||
string filePathRel = PathUtils.GetRelativePath(projDir.FullName, file.FullName).TrimStart('/').TrimStart('\\');
|
||||
|
||||
//check if in META-INF (exclude all)
|
||||
//if (filePathRel.StartsWith("META-INF", StringComparison.OrdinalIgnoreCase))
|
||||
// return false;
|
||||
|
||||
//check if in original (exlude all)
|
||||
if (filePathRel.StartsWith("original", StringComparison.OrdinalIgnoreCase))
|
||||
return false;
|
||||
|
||||
//check if AndroidManifest.xml OR apktool.yml
|
||||
if (file.Name.Equals("androidmanifest.xml", StringComparison.OrdinalIgnoreCase)
|
||||
|| file.Name.Equals("apktool.yml", StringComparison.OrdinalIgnoreCase))
|
||||
return false;
|
||||
|
||||
//check if AndroidManifest.xml OR apktool.yml
|
||||
if (file.Name.Equals("resources.arsc", StringComparison.OrdinalIgnoreCase))
|
||||
return false;
|
||||
|
||||
//check if drawables.yml
|
||||
//if (file.Name.Equals("drawables.xml", StringComparison.OrdinalIgnoreCase))
|
||||
// return false;
|
||||
|
||||
//all ok, include
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,103 +0,0 @@
|
||||
//https://github.com/shadow578/ApksMerger
|
||||
|
||||
using APKSMerger.AndroidRes.Model;
|
||||
using APKSMerger.AndroidRes.Model.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace APKSMerger.AndroidRes
|
||||
{
|
||||
[XmlRoot("resources")]
|
||||
public sealed class AndroidResources
|
||||
{
|
||||
//basic
|
||||
[XmlElement("bool", Type = typeof(AndroidBool))]
|
||||
[XmlElement("integer", Type = typeof(AndroidInteger))]
|
||||
[XmlElement("dimen", Type = typeof(AndroidDimension))]
|
||||
[XmlElement("drawable", Type = typeof(AndroidDrawable))]
|
||||
[XmlElement("color", Type = typeof(AndroidColor))]
|
||||
[XmlElement("fraction", Type = typeof(AndroidFraction))]
|
||||
|
||||
//extended
|
||||
[XmlElement("attr", Type = typeof(AndroidAttribute))]
|
||||
[XmlElement("string", Type = typeof(AndroidString))]
|
||||
[XmlElement("item", Type = typeof(AndroidTypedItem))]
|
||||
[XmlElement("public", Type = typeof(AndroidPublic))]
|
||||
|
||||
//complex
|
||||
[XmlElement("style", Type = typeof(AndroidStyle))]
|
||||
[XmlElement("plurals", Type = typeof(AndroidPlural))]
|
||||
[XmlElement("string-array", Type = typeof(AndroidStringArray))]
|
||||
[XmlElement("integer-array", Type = typeof(AndroidIntegerArray))]
|
||||
[XmlElement("array", Type = typeof(AndroidGenericArray))]
|
||||
[XmlElement("declare-styleable", Type = typeof(AndroidStyleable))]
|
||||
public List<AndroidResource> Values { get; set; } = new List<AndroidResource>();
|
||||
|
||||
/// <summary>
|
||||
/// Find a AndroidPublic with matching id
|
||||
/// </summary>
|
||||
/// <param name="id">the id to find</param>
|
||||
/// <returns>matching public, or null if not found</returns>
|
||||
public AndroidPublic FindPublicWithId(string id)
|
||||
{
|
||||
foreach(AndroidResource res in Values)
|
||||
{
|
||||
if((res is AndroidPublic pub) && pub.Id.Equals(id))
|
||||
{
|
||||
return pub;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deserialize a file into a object
|
||||
/// </summary>
|
||||
/// <param name="file">the file to deserialize</param>
|
||||
/// <returns>the object</returns>
|
||||
public static AndroidResources FromFile(string file)
|
||||
{
|
||||
//check file
|
||||
if (!File.Exists(file)) return null;
|
||||
|
||||
//deserialize
|
||||
try
|
||||
{
|
||||
XmlSerializer ser = new XmlSerializer(typeof(AndroidResources));
|
||||
using (StreamReader reader = File.OpenText(file))
|
||||
{
|
||||
return ser.Deserialize(reader) as AndroidResources;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// serialize into a file
|
||||
/// </summary>
|
||||
/// <param name="file">the file to serialize to, will be overwritten if exists</param>
|
||||
/// <returns>write file ok?</returns>
|
||||
public bool ToFile(string file)
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlSerializer ser = new XmlSerializer(typeof(AndroidResources));
|
||||
using (StreamWriter writer = File.CreateText(file))
|
||||
{
|
||||
ser.Serialize(writer, this, new XmlSerializerNamespaces());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
using APKSMerger.AndroidRes.Model.Generic;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace APKSMerger.AndroidRes.Model
|
||||
{
|
||||
public sealed class AndroidAttribute : AndroidResource
|
||||
{
|
||||
[XmlAttribute("format")]
|
||||
public string Format { get; set; }
|
||||
|
||||
//[XmlText]
|
||||
//[XmlAttribute("value")]
|
||||
public string Value { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
using APKSMerger.AndroidRes.Model.Generic;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace APKSMerger.AndroidRes.Model
|
||||
{
|
||||
public sealed class AndroidBool : AndroidResource
|
||||
{
|
||||
//[XmlText]
|
||||
//[XmlAttribute("value")]
|
||||
public bool Value { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
using APKSMerger.AndroidRes.Model.Generic;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace APKSMerger.AndroidRes.Model
|
||||
{
|
||||
public sealed class AndroidInteger : AndroidResource
|
||||
{
|
||||
//[XmlText]
|
||||
//[XmlAttribute("value")]
|
||||
public int Value { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
using APKSMerger.AndroidRes.Model.Generic;
|
||||
using System.Collections.Generic;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace APKSMerger.AndroidRes.Model
|
||||
{
|
||||
public sealed class AndroidPlural : AndroidResource
|
||||
{
|
||||
public sealed class Plural
|
||||
{
|
||||
[XmlAttribute("quantitiy")]
|
||||
public string Quantity { get; set; }
|
||||
|
||||
[XmlText]
|
||||
public string Value { get; set; }
|
||||
}
|
||||
|
||||
[XmlElement("item", Type = typeof(Plural))]
|
||||
public List<Plural> Values { get; set; } = new List<Plural>();
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
using APKSMerger.AndroidRes.Model.Generic;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace APKSMerger.AndroidRes.Model
|
||||
{
|
||||
public sealed class AndroidPublic : AndroidResource
|
||||
{
|
||||
[XmlAttribute("type")]
|
||||
public string Type { get; set; }
|
||||
|
||||
[XmlAttribute("id")]
|
||||
public string Id { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
using APKSMerger.AndroidRes.Model.Generic;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace APKSMerger.AndroidRes.Model
|
||||
{
|
||||
public sealed class AndroidString : AndroidResource
|
||||
{
|
||||
//[XmlAttribute("formatted")]
|
||||
//public bool Formatted { get; set; }
|
||||
|
||||
//[XmlAttribute("translatable")]
|
||||
//public bool Translateable { get; set; }
|
||||
|
||||
// [XmlText]
|
||||
//[XmlAttribute("value")]
|
||||
public string Value { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
using APKSMerger.AndroidRes.Model.Generic;
|
||||
using System.Collections.Generic;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace APKSMerger.AndroidRes.Model
|
||||
{
|
||||
public sealed class AndroidStyle : AndroidResource
|
||||
{
|
||||
[XmlAttribute("parent")]
|
||||
public string Parent { get; set; }
|
||||
|
||||
[XmlElement("item", Type = typeof(AndroidGeneric))]
|
||||
public List<AndroidGeneric> Items { get; set; } = new List<AndroidGeneric>();
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
using APKSMerger.AndroidRes.Model.Generic;
|
||||
using System.Collections.Generic;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace APKSMerger.AndroidRes.Model
|
||||
{
|
||||
public sealed class AndroidStyleable : AndroidResource
|
||||
{
|
||||
[XmlElement("attr", Type = typeof(AndroidAttribute))]
|
||||
public List<AndroidAttribute> Values { get; set; } = new List<AndroidAttribute>();
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
using APKSMerger.AndroidRes.Model.Generic;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace APKSMerger.AndroidRes.Model
|
||||
{
|
||||
public sealed class AndroidTypedItem : AndroidResource
|
||||
{
|
||||
[XmlAttribute("type")]
|
||||
public string Type { get; set; }
|
||||
|
||||
//[XmlText]
|
||||
//[XmlAttribute("value")]
|
||||
public string Value { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace APKSMerger.AndroidRes.Model.Generic
|
||||
{
|
||||
public class AndroidGeneric : AndroidResource
|
||||
{
|
||||
[XmlText]
|
||||
//[XmlAttribute("value")]
|
||||
public string Value { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace APKSMerger.AndroidRes.Model.Generic
|
||||
{
|
||||
public class AndroidGenericArray : AndroidResource
|
||||
{
|
||||
public sealed class Item
|
||||
{
|
||||
// [XmlText]
|
||||
//[XmlAttribute("value")]
|
||||
public string Value { get; set; }
|
||||
}
|
||||
|
||||
[XmlElement("item", Type = typeof(Item))]
|
||||
public List<Item> Values { get; set; } = new List<Item>();
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace APKSMerger.AndroidRes.Model.Generic
|
||||
{
|
||||
public class AndroidResource
|
||||
{
|
||||
[XmlAttribute(AttributeName = "name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
//check other object is of correct type, otherwise not equal
|
||||
if (!(obj is AndroidResource other)) return false;
|
||||
|
||||
//check if name is equal
|
||||
//Debug.WriteLine("Xml name: " + other.Name);
|
||||
return Name.Equals(other.Name, StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
using APKSMerger.AndroidRes.Model.Generic;
|
||||
|
||||
namespace APKSMerger.AndroidRes.Model
|
||||
{
|
||||
public sealed class AndroidStringArray : AndroidGenericArray { }
|
||||
|
||||
public sealed class AndroidIntegerArray : AndroidGenericArray { }
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
using APKSMerger.AndroidRes.Model.Generic;
|
||||
|
||||
namespace APKSMerger.AndroidRes.Model
|
||||
{
|
||||
public sealed class AndroidDimension : AndroidGeneric { }
|
||||
|
||||
public sealed class AndroidDrawable : AndroidGeneric { }
|
||||
|
||||
public sealed class AndroidColor : AndroidGeneric { }
|
||||
|
||||
public sealed class AndroidFraction : AndroidGeneric { }
|
||||
}
|
||||
@@ -1,115 +0,0 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Security.Cryptography;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace APKSMerger.Util
|
||||
{
|
||||
/// <summary>
|
||||
/// extension methods
|
||||
/// </summary>
|
||||
public static class ClassExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// replaces the first occurance of the pattern with the replacement
|
||||
/// </summary>
|
||||
/// <param name="s">the string to replace in</param>
|
||||
/// <param name="pattern">the pattern to replace</param>
|
||||
/// <param name="replacement">the replacement for the pattern</param>
|
||||
/// <returns>a string in wich the first occurance of the pattern was replaced</returns>
|
||||
public static string ReplaceFirst(this string s, string pattern, string replacement)
|
||||
{
|
||||
int pos = s.IndexOf(pattern);
|
||||
if (pos < 0)
|
||||
{
|
||||
return s;
|
||||
}
|
||||
return s.Substring(0, pos) + replacement + s.Substring(pos + pattern.Length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// does the array contain the string a, ignoring case?
|
||||
/// </summary>
|
||||
/// <param name="s">the array to check</param>
|
||||
/// <param name="a">the string to check for</param>
|
||||
/// <returns>contains it?</returns>
|
||||
public static bool ContainsIgnoreCase(this string[] s, string a)
|
||||
{
|
||||
foreach (string sa in s)
|
||||
{
|
||||
if (sa.Equals(a, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// enumerates all files in the directory (and subdirs if enabled)
|
||||
/// </summary>
|
||||
/// <param name="dir">the directory to enumerate in</param>
|
||||
/// <param name="pattern">the pattern to filter with, eg. *.* or *.txt</param>
|
||||
/// <param name="includeSubDirs">should files in subdirs be included?</param>
|
||||
/// <param name="action">the action to execute for all files</param>
|
||||
public static void EnumerateAllFiles(this DirectoryInfo dir, string pattern, bool includeSubDirs, Action<FileInfo> action)
|
||||
{
|
||||
foreach (FileInfo file in dir.EnumerateFiles(pattern, includeSubDirs ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly))
|
||||
{
|
||||
action.Invoke(file);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// enumerates all files in the directory (and subdirs if enabled) in parallel
|
||||
/// </summary>
|
||||
/// <param name="dir">the directory to enumerate in</param>
|
||||
/// <param name="pattern">the pattern to filter with, eg. *.* or *.txt</param>
|
||||
/// <param name="includeSubDirs">should files in subdirs be included?</param>
|
||||
/// <param name="action">the action to execute for all files</param>
|
||||
public static void EnumerateAllFilesParallel(this DirectoryInfo dir, string pattern, bool includeSubDirs, Action<FileInfo> action)
|
||||
{
|
||||
Parallel.ForEach(dir.EnumerateFiles(pattern, includeSubDirs ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly), action);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// checks if the two files have the same hash (MD5)
|
||||
/// </summary>
|
||||
/// <param name="a">the first file</param>
|
||||
/// <param name="b">the file to compare</param>
|
||||
/// <returns>do they have the same hash?</returns>
|
||||
public static bool HasSameHash(this FileInfo a, FileInfo b)
|
||||
{
|
||||
return a.GetMD5().Equals(b.GetMD5());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the md5 of the file
|
||||
/// </summary>
|
||||
/// <param name="f">the file to get md5 of</param>
|
||||
/// <returns>md5 string of the file</returns>
|
||||
public static string GetMD5(this FileInfo f)
|
||||
{
|
||||
using (MD5 md5 = MD5.Create())
|
||||
using (FileStream stream = f.OpenRead())
|
||||
{
|
||||
return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLowerInvariant();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// repeat the char n times
|
||||
/// </summary>
|
||||
/// <param name="c">char to repeat</param>
|
||||
/// <param name="n">how often to repeat</param>
|
||||
/// <returns>string with n time c</returns>
|
||||
public static string Repeat(this char c, int n)
|
||||
{
|
||||
string s = "";
|
||||
for (int i = 0; i < n; i++)
|
||||
s += c;
|
||||
|
||||
return s;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -197,76 +197,81 @@ namespace APKToolGUI.Utils
|
||||
}
|
||||
}
|
||||
|
||||
//https://apilevels.com/
|
||||
public string SdkToAndroidVer(string sdk)
|
||||
{
|
||||
switch (sdk)
|
||||
{
|
||||
case "35":
|
||||
return sdk + ": Android 15";
|
||||
case "34":
|
||||
return sdk + ": Android 14";
|
||||
case "33":
|
||||
return "31: Android 13";
|
||||
return sdk + ": Android 14";
|
||||
case "32":
|
||||
return "31: Android 12.0L";
|
||||
return sdk + ": Android 12.0L";
|
||||
case "31":
|
||||
return "31: Android 12";
|
||||
return sdk + ": Android 12";
|
||||
case "30":
|
||||
return "30: Android 11";
|
||||
return sdk + ": Android 11";
|
||||
case "29":
|
||||
return "29: Android 10";
|
||||
return sdk + ": Android 10";
|
||||
case "28":
|
||||
return "28: Android 9 (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 (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;
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace APKToolGUI
|
||||
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 armeabi-v7a";
|
||||
public const string Abi = " --abi"; //override platform's default ABI
|
||||
}
|
||||
|
||||
public event DataReceivedEventHandler OutputDataReceived
|
||||
@@ -79,11 +79,29 @@ namespace APKToolGUI
|
||||
Regex regex = new Regex(@"^(\S+)\s+.*model:(\w+).*");
|
||||
Match mdevice = regex.Match(device);
|
||||
|
||||
string setVendor = null;
|
||||
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} \"{inputApk}\"");
|
||||
string args = String.Format($"{Keys.Serial} {mdevice.Groups[1].Value} install {setVendor} {abi} \"{inputApk}\"");
|
||||
|
||||
Log.d("ADB: " + adbFileName + " " + args);
|
||||
Debug.WriteLine("Adb: " + args);
|
||||
|
||||
@@ -102,6 +102,62 @@ namespace APKToolGUI
|
||||
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 class ApkEditorExitedEventArgs : EventArgs
|
||||
|
||||
@@ -0,0 +1,144 @@
|
||||
<?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" />
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="$this.Text" xml:space="preserve">
|
||||
<value>Über</value>
|
||||
</data>
|
||||
<data name="labelCopyright.Text" xml:space="preserve">
|
||||
<value>Copyright</value>
|
||||
</data>
|
||||
<data name="labelProductName.Text" xml:space="preserve">
|
||||
<value>Produktname</value>
|
||||
</data>
|
||||
<data name="labelVersion.Text" xml:space="preserve">
|
||||
<value>Version</value>
|
||||
</data>
|
||||
<data name="linkLabel1.Text" xml:space="preserve">
|
||||
<value>Github Repo</value>
|
||||
</data>
|
||||
<data name="okButton.Text" xml:space="preserve">
|
||||
<value>&ОК</value>
|
||||
</data>
|
||||
<data name="textBoxDescription.Text" xml:space="preserve">
|
||||
<value>Beschreibung</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -0,0 +1,138 @@
|
||||
<?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="textBoxDescription.Text" xml:space="preserve">
|
||||
<value>描述</value>
|
||||
</data>
|
||||
<data name="linkLabel1.Text" xml:space="preserve">
|
||||
<value>Github反馈</value>
|
||||
</data>
|
||||
<data name="$this.Text" xml:space="preserve">
|
||||
<value>关于</value>
|
||||
</data>
|
||||
</root>
|
||||
Generated
+814
-731
File diff suppressed because it is too large
Load Diff
+165
-178
@@ -14,7 +14,6 @@ using System.Collections.Generic;
|
||||
using APKToolGUI.Handlers;
|
||||
using Microsoft.WindowsAPICodePack.Taskbar;
|
||||
using System.Media;
|
||||
using APKSMerger.AndroidRes;
|
||||
using Ionic.Zip;
|
||||
using System.Linq;
|
||||
using System.Windows.Interop;
|
||||
@@ -92,6 +91,12 @@ namespace APKToolGUI
|
||||
schemev4ComboBox.SelectedIndex = v4;
|
||||
Settings.Default.Sign_Schemev4 = v4;
|
||||
|
||||
int overrideAbi = (overrideAbiComboBox.Items.Count + 1 > Settings.Default.Adb_OverrideAbi) ? Settings.Default.Adb_OverrideAbi : 0;
|
||||
overrideAbiComboBox.SelectedIndex = overrideAbi;
|
||||
Settings.Default.Adb_OverrideAbi = overrideAbi;
|
||||
|
||||
useAPKEditorForDecompilingItem.Checked = Settings.Default.UseApkeditor;
|
||||
|
||||
new DecodeControlEventHandlers(this);
|
||||
new BuildControlEventHandlers(this);
|
||||
new SignControlEventHandlers(this);
|
||||
@@ -128,10 +133,16 @@ namespace APKToolGUI
|
||||
{
|
||||
ToLog(ApktoolEventType.None, javaVersion);
|
||||
string apktoolVersion = apktool.GetVersion();
|
||||
string apkeditorVersion = apkeditor.GetVersion();
|
||||
if (!String.IsNullOrWhiteSpace(apktoolVersion))
|
||||
ToLog(ApktoolEventType.None, String.Format(Language.APKToolVersion + " {0}", apktoolVersion));
|
||||
else
|
||||
ToLog(ApktoolEventType.Error, Language.CantDetectApktoolVersion);
|
||||
|
||||
if (!String.IsNullOrWhiteSpace(apkeditorVersion))
|
||||
ToLog(ApktoolEventType.None, apkeditorVersion);
|
||||
else
|
||||
ToLog(ApktoolEventType.Error, Language.CantDetectApkeditorVersion);
|
||||
}
|
||||
else
|
||||
ToLog(ApktoolEventType.Error, Language.ErrorJavaDetect);
|
||||
@@ -183,16 +194,8 @@ namespace APKToolGUI
|
||||
case "decapk":
|
||||
if (file.ContainsAny(".xapk", ".zip", ".apks", ".apkm"))
|
||||
{
|
||||
if (Settings.Default.Decode_UseApkEditorMergeApk)
|
||||
{
|
||||
if (await MergeUsingApkEditor(file) == 0)
|
||||
Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (await Merge(file) == 0)
|
||||
Close();
|
||||
}
|
||||
if (await MergeAndDecompile(file) == 0)
|
||||
Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -512,6 +515,15 @@ namespace APKToolGUI
|
||||
ToStatus(Language.Done, Resources.done);
|
||||
}
|
||||
|
||||
internal void Error(Exception ex)
|
||||
{
|
||||
#if DEBUG
|
||||
Error(ex.ToString());
|
||||
#else
|
||||
Error(ex.Message);
|
||||
#endif
|
||||
}
|
||||
|
||||
internal void Error(string msg, string status = null)
|
||||
{
|
||||
isRunning = false;
|
||||
@@ -553,108 +565,6 @@ namespace APKToolGUI
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Merge APK
|
||||
internal async Task<int> Merge(string inputSplitApk)
|
||||
{
|
||||
int code = 0;
|
||||
|
||||
Running(Language.MergingApk);
|
||||
|
||||
ToLog(ApktoolEventType.None, String.Format(Language.InputFile, inputSplitApk));
|
||||
|
||||
string apkFileName = Path.GetFileName(inputSplitApk);
|
||||
|
||||
string tempApk = Path.Combine(Program.TEMP_PATH, "dec.apk");
|
||||
|
||||
string extractedSplitDir = Path.Combine(Program.TEMP_PATH, "SplitApk");
|
||||
string decompileDir = Path.Combine(Program.TEMP_PATH, "Decompiled");
|
||||
string mergedDir = Path.Combine(Program.TEMP_PATH, "Merged");
|
||||
|
||||
string outputDir = PathUtils.GetDirectoryNameWithoutExtension(inputSplitApk);
|
||||
if (Settings.Default.Decode_UseOutputDir && !IgnoreOutputDirContextMenu)
|
||||
outputDir = Path.Combine(Settings.Default.Decode_OutputDir, Path.GetFileNameWithoutExtension(inputSplitApk));
|
||||
|
||||
try
|
||||
{
|
||||
DirectoryUtils.Delete(extractedSplitDir);
|
||||
Directory.CreateDirectory(extractedSplitDir);
|
||||
DirectoryUtils.Delete(mergedDir);
|
||||
Directory.CreateDirectory(mergedDir);
|
||||
|
||||
await Task.Factory.StartNew(() =>
|
||||
{
|
||||
if (Settings.Default.Framework_ClearBeforeDecode)
|
||||
{
|
||||
ToLog(ApktoolEventType.Infomation, Language.ClearingFramework);
|
||||
if (apktool.ClearFramework() == 0)
|
||||
{
|
||||
ToLog(ApktoolEventType.Success, Language.FrameworkCacheCleared);
|
||||
}
|
||||
else
|
||||
ToLog(ApktoolEventType.Error, Language.ErrorClearingFw);
|
||||
}
|
||||
|
||||
//Extract all apk files
|
||||
ToLog(ApktoolEventType.None, Language.ExtractingAllApkFiles);
|
||||
ZipUtils.ExtractAll(inputSplitApk, extractedSplitDir, true);
|
||||
|
||||
//Decompile all apk files
|
||||
ToLog(ApktoolEventType.None, Language.DecompilingAllApkFiles);
|
||||
|
||||
List<DirectoryInfo> splitDirs = new List<DirectoryInfo>();
|
||||
var apkfiles = Directory.EnumerateFiles(extractedSplitDir, "*.apk");
|
||||
|
||||
foreach (string apk in apkfiles)
|
||||
{
|
||||
string output = Path.Combine(decompileDir, Path.GetFileNameWithoutExtension(apk));
|
||||
|
||||
code = apktool.Decompile(apk, output);
|
||||
if (code != 0)
|
||||
{
|
||||
Error(Language.ErrorDecompiling);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Directory.Exists(Path.Combine(output, "smali")) || File.Exists(Path.Combine(output, "classes.dex")))
|
||||
{
|
||||
ToLog(ApktoolEventType.Infomation, String.Format(Language.DetectedAsBase, apk));
|
||||
|
||||
ToLog(ApktoolEventType.None, String.Format(Language.MovingBasedirectory, decompileDir));
|
||||
DirectoryUtils.Move(output, mergedDir);
|
||||
continue;
|
||||
}
|
||||
|
||||
DirectoryInfo splitI = new DirectoryInfo(output);
|
||||
ToLog(ApktoolEventType.Infomation, String.Format(Language.DetectedAsSplit, apk));
|
||||
splitDirs.Add(splitI);
|
||||
}
|
||||
|
||||
AndroidMerger merger = new AndroidMerger();
|
||||
DirectoryInfo baseDir = new DirectoryInfo(mergedDir);
|
||||
|
||||
Dictionary<string, string> locales, abis;
|
||||
|
||||
ToLog(ApktoolEventType.None, Language.MergingApk);
|
||||
merger.CollectCapabilities(out locales, out abis, baseDir, splitDirs.ToArray());
|
||||
merger.MergeSplits(baseDir, splitDirs.ToArray());
|
||||
|
||||
ToLog(ApktoolEventType.None, String.Format(Language.MergeFinishedMoveDir, outputDir));
|
||||
DirectoryUtils.Move(mergedDir, outputDir);
|
||||
});
|
||||
|
||||
Done();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
code = 1;
|
||||
ToLog(ApktoolEventType.Error, ex.ToString());
|
||||
Error(ex.Message);
|
||||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region ApkEditor
|
||||
private void InitializeApkEditor()
|
||||
{
|
||||
@@ -673,7 +583,7 @@ namespace APKToolGUI
|
||||
ToLog(ApktoolEventType.None, e.Message);
|
||||
}
|
||||
|
||||
internal async Task<int> MergeUsingApkEditor(string inputSplitApk)
|
||||
internal async Task<int> MergeAndDecompile(string inputSplitApk)
|
||||
{
|
||||
int code = 0;
|
||||
|
||||
@@ -774,8 +684,52 @@ namespace APKToolGUI
|
||||
catch (Exception ex)
|
||||
{
|
||||
code = 1;
|
||||
ToLog(ApktoolEventType.Error, ex.Message);
|
||||
Error(ex.Message);
|
||||
Error(ex);
|
||||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
internal async Task<int> Merge(string inputSplitApk)
|
||||
{
|
||||
int code = 0;
|
||||
|
||||
Running(Language.MergingApk);
|
||||
|
||||
string apkFileName = Path.GetFileName(inputSplitApk);
|
||||
string tempFile = Path.Combine(Program.TEMP_PATH, "tempsplit");
|
||||
string tempFileMerged = Path.Combine(Program.TEMP_PATH, "tempsplitmerged");
|
||||
|
||||
string outputFile = PathUtils.GetDirectoryNameWithoutExtension(inputSplitApk) + " merged.apk";
|
||||
|
||||
try
|
||||
{
|
||||
await Task.Factory.StartNew(() =>
|
||||
{
|
||||
ToLog(ApktoolEventType.None, String.Format(Language.InputFile, inputSplitApk));
|
||||
|
||||
ToLog(ApktoolEventType.None, Language.MergingApkEditor);
|
||||
|
||||
ToLog(ApktoolEventType.None, String.Format(Language.CopyFileToTemp, inputSplitApk, tempFile));
|
||||
FileUtils.Copy(inputSplitApk, tempFile, true);
|
||||
|
||||
code = apkeditor.Merge(tempFile, tempFileMerged);
|
||||
if (code == 0)
|
||||
{
|
||||
ToLog(ApktoolEventType.None, String.Format(Language.MoveTempApkToOutput, tempFile, outputFile));
|
||||
FileUtils.Move(tempFileMerged, outputFile, true);
|
||||
Done();
|
||||
}
|
||||
else
|
||||
{
|
||||
Error(Language.ErrorMerging);
|
||||
}
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
code = 1;
|
||||
Error(ex);
|
||||
}
|
||||
|
||||
return code;
|
||||
@@ -828,8 +782,38 @@ namespace APKToolGUI
|
||||
ToLog(e.EventType, e.Message);
|
||||
}
|
||||
|
||||
internal async Task<int> ClearFramework()
|
||||
{
|
||||
int code = 0;
|
||||
|
||||
ToLog(ApktoolEventType.Infomation, "=====[ " + Language.ClearingFramework + " ]=====");
|
||||
ToStatus(Language.ClearingFramework, Resources.waiting);
|
||||
|
||||
try
|
||||
{
|
||||
await Task.Factory.StartNew(() =>
|
||||
{
|
||||
if (apktool.ClearFramework() == 0)
|
||||
{
|
||||
Done(Language.FrameworkCacheCleared);
|
||||
}
|
||||
else
|
||||
Error(Language.ErrorClearingFw);
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Error(ex);
|
||||
code = 1;
|
||||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
internal async Task<int> Decompile(string inputApk)
|
||||
{
|
||||
Debug.WriteLine(useAPKEditorForDecompilingItem.Checked);
|
||||
|
||||
int code = 0;
|
||||
|
||||
Running(Language.Decoding);
|
||||
@@ -841,6 +825,7 @@ namespace APKToolGUI
|
||||
|
||||
string tempApk = Path.Combine(Program.TEMP_PATH, "dec.apk");
|
||||
string outputTempDir = tempApk.Replace(".apk", "");
|
||||
string outputDecDir = outputDir;
|
||||
|
||||
try
|
||||
{
|
||||
@@ -851,9 +836,7 @@ namespace APKToolGUI
|
||||
}
|
||||
await Task.Factory.StartNew(() =>
|
||||
{
|
||||
DirectoryUtils.Delete(outputTempDir);
|
||||
|
||||
if (Settings.Default.Framework_ClearBeforeDecode)
|
||||
if (Settings.Default.Framework_ClearBeforeDecode && !Settings.Default.UseApkeditor)
|
||||
{
|
||||
ToLog(ApktoolEventType.Infomation, Language.ClearingFramework);
|
||||
if (apktool.ClearFramework() == 0)
|
||||
@@ -866,14 +849,20 @@ namespace APKToolGUI
|
||||
|
||||
if (Settings.Default.Utf8FilenameSupport)
|
||||
{
|
||||
DirectoryUtils.Delete(outputTempDir);
|
||||
|
||||
ToLog(ApktoolEventType.None, String.Format(Language.CopyFileToTemp, inputApk, tempApk));
|
||||
|
||||
FileUtils.Copy(inputApk, tempApk, true);
|
||||
|
||||
code = apktool.Decompile(tempApk, outputTempDir);
|
||||
inputApk = tempApk;
|
||||
outputDecDir = outputTempDir;
|
||||
}
|
||||
|
||||
if (useAPKEditorForDecompilingItem.Checked)
|
||||
code = apkeditor.Decompile(inputApk, outputDecDir);
|
||||
else
|
||||
code = apktool.Decompile(inputApk, outputDir);
|
||||
code = apktool.Decompile(inputApk, outputDecDir);
|
||||
|
||||
if (code == 0)
|
||||
{
|
||||
@@ -890,7 +879,7 @@ namespace APKToolGUI
|
||||
}));
|
||||
|
||||
ToLog(ApktoolEventType.None, String.Format(Language.DecompilingSuccessfullyCompleted, outputDir));
|
||||
if (Settings.Default.Decode_FixError)
|
||||
if (Settings.Default.Decode_FixError && !useAPKEditorForDecompilingItem.Checked)
|
||||
{
|
||||
if (ApkFixer.FixAndroidManifest(outputDir))
|
||||
ToLog(ApktoolEventType.None, Language.FixAndroidManifest);
|
||||
@@ -915,34 +904,6 @@ namespace APKToolGUI
|
||||
return code;
|
||||
}
|
||||
|
||||
internal async Task<int> ClearFramework()
|
||||
{
|
||||
int code = 0;
|
||||
|
||||
ToLog(ApktoolEventType.Infomation, "=====[ " + Language.ClearingFramework + " ]=====");
|
||||
ToStatus(Language.ClearingFramework, Resources.waiting);
|
||||
|
||||
try
|
||||
{
|
||||
await Task.Factory.StartNew(() =>
|
||||
{
|
||||
if (apktool.ClearFramework() == 0)
|
||||
{
|
||||
Done(Language.FrameworkCacheCleared);
|
||||
}
|
||||
else
|
||||
Error(Language.ErrorClearingFw);
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Error(ex.Message);
|
||||
code = 1;
|
||||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
internal async Task<int> Build(string inputFolder)
|
||||
{
|
||||
int code = 0;
|
||||
@@ -955,6 +916,7 @@ namespace APKToolGUI
|
||||
await Task.Factory.StartNew(() =>
|
||||
{
|
||||
string outputFile = inputFolder + " compiled.apk";
|
||||
string outputUnsignedApk = inputFolder + " unsigned.apk";
|
||||
if (Settings.Default.Build_SignAfterBuild)
|
||||
outputFile = inputFolder + " signed.apk";
|
||||
if (Settings.Default.Build_UseOutputAppPath && !IgnoreOutputDirContextMenu)
|
||||
@@ -969,6 +931,8 @@ namespace APKToolGUI
|
||||
string tempDecApkFolder = Path.Combine(Program.TEMP_PATH, "dec");
|
||||
string outputTempApk = tempDecApkFolder + ".apk";
|
||||
|
||||
bool isDecompiledUsingApkEditor = File.Exists(Path.Combine(inputFolder, "path-map.json"));
|
||||
|
||||
if (Settings.Default.Utf8FilenameSupport)
|
||||
{
|
||||
ToLog(ApktoolEventType.None, String.Format(Language.CopyFolderToTemp, inputFolder, tempDecApkFolder));
|
||||
@@ -979,12 +943,31 @@ namespace APKToolGUI
|
||||
outputFile = outputTempApk;
|
||||
}
|
||||
|
||||
code = apktool.Build(inputFolder, outputFile);
|
||||
if (isDecompiledUsingApkEditor)
|
||||
code = apkeditor.Build(inputFolder, outputFile);
|
||||
else
|
||||
code = apktool.Build(inputFolder, outputFile);
|
||||
|
||||
if (code == 0)
|
||||
{
|
||||
ToLog(ApktoolEventType.None, String.Format(Language.CompilingSuccessfullyCompleted, outputFile));
|
||||
|
||||
if (Settings.Default.Build_CreateUnsignedApk)
|
||||
{
|
||||
ToStatus(Language.CreateUnsignedApk, Resources.waiting);
|
||||
ToLog(ApktoolEventType.Infomation, "=====[ " + Language.CreateUnsignedApk + " ]=====");
|
||||
|
||||
if (Directory.Exists(Path.Combine(inputFolder, "original", "META-INF")))
|
||||
{
|
||||
string unsignedApkPath = Path.Combine(Path.GetDirectoryName(outputCompiledApkFile), Path.GetFileName(outputUnsignedApk));
|
||||
ZipUtils.UpdateDirectory(outputFile, Path.Combine(inputFolder, "original", "META-INF"), "META-INF");
|
||||
ToLog(ApktoolEventType.Infomation, String.Format(Language.CopyFileTo, outputFile, unsignedApkPath));
|
||||
File.Copy(outputFile, unsignedApkPath, true);
|
||||
}
|
||||
else
|
||||
ToLog(ApktoolEventType.Warning, Language.MetainfNotExist);
|
||||
}
|
||||
|
||||
if (Settings.Default.Build_ZipalignAfterBuild)
|
||||
{
|
||||
ToStatus(Language.Aligning, Resources.waiting);
|
||||
@@ -994,20 +977,6 @@ namespace APKToolGUI
|
||||
if (zipalign.Align(outputFile, outputFile) == 0)
|
||||
{
|
||||
ToLog(ApktoolEventType.None, Language.Done);
|
||||
if (Settings.Default.Build_CreateUnsignedApk)
|
||||
{
|
||||
ToStatus(Language.CreateUnsignedApk, Resources.waiting);
|
||||
ToLog(ApktoolEventType.Infomation, "=====[ " + Language.CreateUnsignedApk + " ]=====");
|
||||
|
||||
if (Directory.Exists(Path.Combine(inputFolder, "original", "META-INF")))
|
||||
{
|
||||
ZipUtils.UpdateDirectory(outputFile, Path.Combine(inputFolder, "original", "META-INF"), "META-INF");
|
||||
File.Copy(outputFile, Path.Combine(Path.GetDirectoryName(outputFile), Path.GetFileName(inputFolder) + " unsigned.apk"), true);
|
||||
ToLog(ApktoolEventType.None, Language.Done);
|
||||
}
|
||||
else
|
||||
ToLog(ApktoolEventType.Warning, Language.MetainfNotExist);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1069,7 +1038,7 @@ namespace APKToolGUI
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Error(ex.Message);
|
||||
Error(ex);
|
||||
code = 1;
|
||||
}
|
||||
|
||||
@@ -1125,7 +1094,7 @@ namespace APKToolGUI
|
||||
catch (Exception ex)
|
||||
{
|
||||
code = 1;
|
||||
ToLog(ApktoolEventType.Error, ex.Message);
|
||||
Error(ex);
|
||||
}
|
||||
|
||||
return code;
|
||||
@@ -1174,7 +1143,7 @@ namespace APKToolGUI
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Error(ex.Message);
|
||||
Error(ex);
|
||||
code = 1;
|
||||
}
|
||||
|
||||
@@ -1264,7 +1233,7 @@ namespace APKToolGUI
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Error(ex.Message);
|
||||
Error(ex);
|
||||
code = 1;
|
||||
}
|
||||
|
||||
@@ -1364,7 +1333,7 @@ namespace APKToolGUI
|
||||
catch (Exception ex)
|
||||
{
|
||||
code = 1;
|
||||
Error(ex.Message);
|
||||
Error(ex);
|
||||
}
|
||||
|
||||
return code;
|
||||
@@ -1467,30 +1436,35 @@ namespace APKToolGUI
|
||||
catch (Exception ex)
|
||||
{
|
||||
code = 1;
|
||||
ToLog(ApktoolEventType.Error, ex.ToString());
|
||||
Error(ex.Message);
|
||||
Error(ex);
|
||||
}
|
||||
|
||||
AdbActionButtonsEnabled = true;
|
||||
|
||||
return code;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Form handlers
|
||||
private void clearTempFolderToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
private async void clearTempFolderToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
Running(Language.ClearTempFolder);
|
||||
try
|
||||
{
|
||||
foreach (var subDir in new DirectoryInfo(Program.TEMP_MAIN).EnumerateDirectories())
|
||||
await Task.Factory.StartNew(() =>
|
||||
{
|
||||
ToLog(ApktoolEventType.None, String.Format(Language.DeletingFolder, subDir));
|
||||
subDir.Delete(true);
|
||||
}
|
||||
foreach (var subDir in new DirectoryInfo(Program.TEMP_MAIN).EnumerateDirectories())
|
||||
{
|
||||
ToLog(ApktoolEventType.None, String.Format(Language.DeletingFolder, subDir));
|
||||
DirectoryUtils.Delete(subDir.FullName);
|
||||
}
|
||||
Directory.CreateDirectory(Program.TEMP_PATH);
|
||||
});
|
||||
Done();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ToLog(ApktoolEventType.Error, ex.Message);
|
||||
Error(ex);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1574,6 +1548,14 @@ namespace APKToolGUI
|
||||
}));
|
||||
else
|
||||
comSmaliBtn.Enabled = value;
|
||||
|
||||
if (mergeApkBtn.InvokeRequired)
|
||||
mergeApkBtn.BeginInvoke(new Action(delegate
|
||||
{
|
||||
mergeApkBtn.Enabled = value;
|
||||
}));
|
||||
else
|
||||
mergeApkBtn.Enabled = value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1588,8 +1570,11 @@ namespace APKToolGUI
|
||||
apkPathAdbTxtBox.Enabled = value;
|
||||
selApkAdbBtn.Enabled = value;
|
||||
setVendorChkBox.Enabled = value;
|
||||
overrideAbiCheckBox.Enabled = value;
|
||||
overrideAbiComboBox.Enabled = value;
|
||||
}
|
||||
}
|
||||
|
||||
internal void ShowMessage(string message, MessageBoxIcon status)
|
||||
{
|
||||
MessageBox.Show(message, Application.ProductName, MessageBoxButtons.OK, status);
|
||||
@@ -1603,6 +1588,8 @@ namespace APKToolGUI
|
||||
Settings.Default.Sign_Schemev2 = schemev2ComboBox.SelectedIndex;
|
||||
Settings.Default.Sign_Schemev3 = schemev3ComboBox.SelectedIndex;
|
||||
Settings.Default.Sign_Schemev4 = schemev4ComboBox.SelectedIndex;
|
||||
Settings.Default.Adb_OverrideAbi = overrideAbiComboBox.SelectedIndex;
|
||||
Settings.Default.UseApkeditor = useAPKEditorForDecompilingItem.Checked;
|
||||
Settings.Default.Save();
|
||||
}
|
||||
#endregion
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+511
-277
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,537 @@
|
||||
<?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="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="button_SIGN_Sign.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="tabPageMain.Text" xml:space="preserve">
|
||||
<value>首页</value>
|
||||
</data>
|
||||
<data name="basicInfoTabPage.Text" xml:space="preserve">
|
||||
<value>基本信息</value>
|
||||
</data>
|
||||
<data name="tabPage3.Text" xml:space="preserve">
|
||||
<value>完整信息</value>
|
||||
</data>
|
||||
<data name="tabPageApkInfo.Text" xml:space="preserve">
|
||||
<value>APK信息</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="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="label14.Text" xml:space="preserve">
|
||||
<value>密度:</value>
|
||||
</data>
|
||||
<data name="label31.Text" xml:space="preserve">
|
||||
<value>桌面启动项</value>
|
||||
</data>
|
||||
<data name="label30.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="settingsToolStripMenuItem.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="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_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="createUnsignApkChkBox.ToolTip" xml:space="preserve">
|
||||
<value>只兼容核心补丁模块,需要root设备。</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_OutputAppPath.ToolTip" xml:space="preserve">
|
||||
<value>编译后的输出目录也将用于Zipalign和签名</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="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="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="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="schemev4ComboBox.Items" xml:space="preserve">
|
||||
<value>默认</value>
|
||||
</data>
|
||||
<data name="schemev4ComboBox.Items1" xml:space="preserve">
|
||||
<value>开启</value>
|
||||
</data>
|
||||
<data name="schemev4ComboBox.Items2" xml:space="preserve">
|
||||
<value>关闭</value>
|
||||
</data>
|
||||
<data name="label27.Text" xml:space="preserve">
|
||||
<value>签名方案 v4:</value>
|
||||
</data>
|
||||
<data name="schemev3ComboBox.Items" xml:space="preserve">
|
||||
<value>默认</value>
|
||||
</data>
|
||||
<data name="schemev3ComboBox.Items1" xml:space="preserve">
|
||||
<value>开启</value>
|
||||
</data>
|
||||
<data name="schemev3ComboBox.Items2" xml:space="preserve">
|
||||
<value>关闭</value>
|
||||
</data>
|
||||
<data name="label26.Text" xml:space="preserve">
|
||||
<value>签名方案 v3:</value>
|
||||
</data>
|
||||
<data name="schemev2ComboBox.Items" xml:space="preserve">
|
||||
<value>默认</value>
|
||||
</data>
|
||||
<data name="schemev2ComboBox.Items1" xml:space="preserve">
|
||||
<value>选择</value>
|
||||
</data>
|
||||
<data name="schemev2ComboBox.Items2" xml:space="preserve">
|
||||
<value>关闭</value>
|
||||
</data>
|
||||
<data name="label25.Text" xml:space="preserve">
|
||||
<value>签名方案 v2:</value>
|
||||
</data>
|
||||
<data name="schemev1ComboBox.Items" xml:space="preserve">
|
||||
<value>默认</value>
|
||||
</data>
|
||||
<data name="schemev1ComboBox.Items1" xml:space="preserve">
|
||||
<value>开启</value>
|
||||
</data>
|
||||
<data name="schemev1ComboBox.Items2" xml:space="preserve">
|
||||
<value>关闭</value>
|
||||
</data>
|
||||
<data name="label24.Text" xml:space="preserve">
|
||||
<value>签名方案 v1:</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="checkBox7.Text" xml:space="preserve">
|
||||
<value>在选择APK进行反编译时,不要解析APK信息</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_UseApkEditorMerge.Text" xml:space="preserve">
|
||||
<value>使用APKEditor.jar合并、分离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_FixError.ToolTip" xml:space="preserve">
|
||||
<value>将删除extractNativeLibs, useEmbeddedDex, APKTOOL_DUMMY,拆分相关属性并将sparseresource设置为false</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_OnlyMainClasses.Text" xml:space="preserve">
|
||||
<value>只反汇编根目录中的主索引类(classes[0-9]*.dex)。</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_OnlyMainClasses.ToolTip" xml:space="preserve">
|
||||
<value>修复异常的ApkTool错误</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_Force.Text" xml:space="preserve">
|
||||
<value>强制删除目标目录</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="useAliasChkBox.Text" xml:space="preserve">
|
||||
<value>别名</value>
|
||||
</data>
|
||||
<data name="label22.Text" xml:space="preserve">
|
||||
<value>强烈建议您使用自己的密钥,通过Android Studio或其他工具创建</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="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>Tag frameworks 使用:</value>
|
||||
</data>
|
||||
<data name="checkBox_IF_FramePath.Text" xml:space="preserve">
|
||||
<value>将framework文件存储到:</value>
|
||||
</data>
|
||||
<data name="groupBox_IF_Options.Text" xml:space="preserve">
|
||||
<value>选项</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="label4.Text" xml:space="preserve">
|
||||
<value>APK签名:</value>
|
||||
</data>
|
||||
<data name="button_ZIPALIGN_Align.Text" xml:space="preserve">
|
||||
<value>对齐优化</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoSrc.Text" xml:space="preserve">
|
||||
<value>不反编译源码</value>
|
||||
</data>
|
||||
<data name="checkBox_DECODE_NoRes.Text" xml:space="preserve">
|
||||
<value>不反编译resouces</value>
|
||||
</data>
|
||||
<data name="button_IF_InstallFramework.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="label2.Text" xml:space="preserve">
|
||||
<value>反编译APK目录:</value>
|
||||
</data>
|
||||
<data name="label3.Text" xml:space="preserve">
|
||||
<value>APK文件对齐优化:</value>
|
||||
</data>
|
||||
<data name="label1.Text" xml:space="preserve">
|
||||
<value>APK/XAPK/APKS/ZIP/APKM文件:</value>
|
||||
</data>
|
||||
<data name="button_OpenMainActivity.Text" xml:space="preserve">
|
||||
<value>启动项smail</value>
|
||||
</data>
|
||||
<data name="tabPageZipAlign.Text" xml:space="preserve">
|
||||
<value>Zip对齐</value>
|
||||
</data>
|
||||
</root>
|
||||
+130
-130
@@ -32,34 +32,34 @@
|
||||
this.tabControl1 = new System.Windows.Forms.TabControl();
|
||||
this.tabPage1 = new System.Windows.Forms.TabPage();
|
||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||
this.textBox1 = new System.Windows.Forms.TextBox();
|
||||
this.checkBox7 = new System.Windows.Forms.CheckBox();
|
||||
this.checkBox6 = new System.Windows.Forms.CheckBox();
|
||||
this.themeComboBox = new System.Windows.Forms.ComboBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.customApkToolTxtBox = new System.Windows.Forms.TextBox();
|
||||
this.customApktoolBtn = new System.Windows.Forms.Button();
|
||||
this.useCustomApktoolChk = new System.Windows.Forms.CheckBox();
|
||||
this.label6 = new System.Windows.Forms.Label();
|
||||
this.checkBox5 = new System.Windows.Forms.CheckBox();
|
||||
this.checkBox4 = new System.Windows.Forms.CheckBox();
|
||||
this.customTempLocationTxtBox = new System.Windows.Forms.TextBox();
|
||||
this.textBoxCustomJavaLocation = new System.Windows.Forms.TextBox();
|
||||
this.buttonCustomTempLocation = new System.Windows.Forms.Button();
|
||||
this.checkBox3 = new System.Windows.Forms.CheckBox();
|
||||
this.buttonCustomJavaLocation = new System.Windows.Forms.Button();
|
||||
this.checkBox2 = new System.Windows.Forms.CheckBox();
|
||||
this.checkBox1 = new System.Windows.Forms.CheckBox();
|
||||
this.checkBoxCheckUpdateStartup = new System.Windows.Forms.CheckBox();
|
||||
this.groupBoxLanguage = new System.Windows.Forms.GroupBox();
|
||||
this.comboBox1 = new System.Windows.Forms.ComboBox();
|
||||
this.groupBoxContextMenu = new System.Windows.Forms.GroupBox();
|
||||
this.ignoreOutputContextMenuBox = new System.Windows.Forms.CheckBox();
|
||||
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.textBox1 = new System.Windows.Forms.TextBox();
|
||||
this.checkBox7 = new System.Windows.Forms.CheckBox();
|
||||
this.checkBox6 = new System.Windows.Forms.CheckBox();
|
||||
this.customApkToolTxtBox = new System.Windows.Forms.TextBox();
|
||||
this.useCustomApktoolChk = new System.Windows.Forms.CheckBox();
|
||||
this.checkBox5 = new System.Windows.Forms.CheckBox();
|
||||
this.checkBox4 = new System.Windows.Forms.CheckBox();
|
||||
this.customTempLocationTxtBox = new System.Windows.Forms.TextBox();
|
||||
this.textBoxCustomJavaLocation = new System.Windows.Forms.TextBox();
|
||||
this.checkBox3 = new System.Windows.Forms.CheckBox();
|
||||
this.checkBox2 = new System.Windows.Forms.CheckBox();
|
||||
this.checkBox1 = new System.Windows.Forms.CheckBox();
|
||||
this.checkBoxCheckUpdateStartup = new System.Windows.Forms.CheckBox();
|
||||
this.ignoreOutputContextMenuBox = new System.Windows.Forms.CheckBox();
|
||||
this.tabControl1.SuspendLayout();
|
||||
this.tabPage1.SuspendLayout();
|
||||
this.groupBox1.SuspendLayout();
|
||||
@@ -108,14 +108,38 @@
|
||||
this.groupBox1.Name = "groupBox1";
|
||||
this.groupBox1.TabStop = false;
|
||||
//
|
||||
// textBox1
|
||||
//
|
||||
resources.ApplyResources(this.textBox1, "textBox1");
|
||||
this.textBox1.BackColor = System.Drawing.SystemColors.Window;
|
||||
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", global::APKToolGUI.Properties.Settings.Default, "CustomJVMArgs", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.textBox1.Name = "textBox1";
|
||||
this.textBox1.Text = global::APKToolGUI.Properties.Settings.Default.CustomJVMArgs;
|
||||
//
|
||||
// checkBox7
|
||||
//
|
||||
resources.ApplyResources(this.checkBox7, "checkBox7");
|
||||
this.checkBox7.Checked = global::APKToolGUI.Properties.Settings.Default.UseCustomJVMArgs;
|
||||
this.checkBox7.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "UseCustomJVMArgs", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkBox7.Name = "checkBox7";
|
||||
this.checkBox7.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBox6
|
||||
//
|
||||
resources.ApplyResources(this.checkBox6, "checkBox6");
|
||||
this.checkBox6.Checked = global::APKToolGUI.Properties.Settings.Default.DebugMode;
|
||||
this.checkBox6.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "DebugMode", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkBox6.Name = "checkBox6";
|
||||
this.checkBox6.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// themeComboBox
|
||||
//
|
||||
resources.ApplyResources(this.themeComboBox, "themeComboBox");
|
||||
this.themeComboBox.FormattingEnabled = true;
|
||||
this.themeComboBox.Items.AddRange(new object[] {
|
||||
resources.GetString("themeComboBox.Items"),
|
||||
resources.GetString("themeComboBox.Items1"),
|
||||
resources.GetString("themeComboBox.Items2")});
|
||||
resources.ApplyResources(this.themeComboBox, "themeComboBox");
|
||||
this.themeComboBox.Name = "themeComboBox";
|
||||
//
|
||||
// label1
|
||||
@@ -123,6 +147,14 @@
|
||||
resources.ApplyResources(this.label1, "label1");
|
||||
this.label1.Name = "label1";
|
||||
//
|
||||
// customApkToolTxtBox
|
||||
//
|
||||
resources.ApplyResources(this.customApkToolTxtBox, "customApkToolTxtBox");
|
||||
this.customApkToolTxtBox.BackColor = System.Drawing.SystemColors.Window;
|
||||
this.customApkToolTxtBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", global::APKToolGUI.Properties.Settings.Default, "ApktoolPath", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.customApkToolTxtBox.Name = "customApkToolTxtBox";
|
||||
this.customApkToolTxtBox.Text = global::APKToolGUI.Properties.Settings.Default.ApktoolPath;
|
||||
//
|
||||
// customApktoolBtn
|
||||
//
|
||||
resources.ApplyResources(this.customApktoolBtn, "customApktoolBtn");
|
||||
@@ -130,12 +162,52 @@
|
||||
this.customApktoolBtn.UseVisualStyleBackColor = true;
|
||||
this.customApktoolBtn.Click += new System.EventHandler(this.customApktoolBtn_Click);
|
||||
//
|
||||
// useCustomApktoolChk
|
||||
//
|
||||
resources.ApplyResources(this.useCustomApktoolChk, "useCustomApktoolChk");
|
||||
this.useCustomApktoolChk.Checked = global::APKToolGUI.Properties.Settings.Default.UseCustomApktool;
|
||||
this.useCustomApktoolChk.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "UseCustomApktool", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.useCustomApktoolChk.Name = "useCustomApktoolChk";
|
||||
this.useCustomApktoolChk.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// label6
|
||||
//
|
||||
resources.ApplyResources(this.label6, "label6");
|
||||
this.label6.ForeColor = System.Drawing.Color.DimGray;
|
||||
this.label6.Name = "label6";
|
||||
//
|
||||
// checkBox5
|
||||
//
|
||||
resources.ApplyResources(this.checkBox5, "checkBox5");
|
||||
this.checkBox5.Checked = global::APKToolGUI.Properties.Settings.Default.Utf8FilenameSupport;
|
||||
this.checkBox5.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "Utf8FilenameSupport", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkBox5.Name = "checkBox5";
|
||||
this.checkBox5.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBox4
|
||||
//
|
||||
resources.ApplyResources(this.checkBox4, "checkBox4");
|
||||
this.checkBox4.Checked = global::APKToolGUI.Properties.Settings.Default.UseCustomJavaExe;
|
||||
this.checkBox4.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "UseCustomJavaExe", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkBox4.Name = "checkBox4";
|
||||
this.checkBox4.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// customTempLocationTxtBox
|
||||
//
|
||||
resources.ApplyResources(this.customTempLocationTxtBox, "customTempLocationTxtBox");
|
||||
this.customTempLocationTxtBox.BackColor = System.Drawing.SystemColors.Window;
|
||||
this.customTempLocationTxtBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", global::APKToolGUI.Properties.Settings.Default, "TempDir", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.customTempLocationTxtBox.Name = "customTempLocationTxtBox";
|
||||
this.customTempLocationTxtBox.Text = global::APKToolGUI.Properties.Settings.Default.TempDir;
|
||||
//
|
||||
// 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;
|
||||
//
|
||||
// buttonCustomTempLocation
|
||||
//
|
||||
resources.ApplyResources(this.buttonCustomTempLocation, "buttonCustomTempLocation");
|
||||
@@ -143,6 +215,14 @@
|
||||
this.buttonCustomTempLocation.UseVisualStyleBackColor = true;
|
||||
this.buttonCustomTempLocation.Click += new System.EventHandler(this.buttonCustomTempLocation_Click);
|
||||
//
|
||||
// checkBox3
|
||||
//
|
||||
resources.ApplyResources(this.checkBox3, "checkBox3");
|
||||
this.checkBox3.Checked = global::APKToolGUI.Properties.Settings.Default.UseCustomTempDir;
|
||||
this.checkBox3.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "UseCustomTempDir", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkBox3.Name = "checkBox3";
|
||||
this.checkBox3.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// buttonCustomJavaLocation
|
||||
//
|
||||
resources.ApplyResources(this.buttonCustomJavaLocation, "buttonCustomJavaLocation");
|
||||
@@ -150,6 +230,32 @@
|
||||
this.buttonCustomJavaLocation.UseVisualStyleBackColor = true;
|
||||
this.buttonCustomJavaLocation.Click += new System.EventHandler(this.buttonCustomJavaLocation_Click);
|
||||
//
|
||||
// checkBox2
|
||||
//
|
||||
resources.ApplyResources(this.checkBox2, "checkBox2");
|
||||
this.checkBox2.Checked = global::APKToolGUI.Properties.Settings.Default.PlaySoundWhenDone;
|
||||
this.checkBox2.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "PlaySoundWhenDone", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkBox2.Name = "checkBox2";
|
||||
this.checkBox2.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBox1
|
||||
//
|
||||
resources.ApplyResources(this.checkBox1, "checkBox1");
|
||||
this.checkBox1.Checked = global::APKToolGUI.Properties.Settings.Default.ClearLogBeforeAction;
|
||||
this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
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;
|
||||
//
|
||||
// groupBoxLanguage
|
||||
//
|
||||
resources.ApplyResources(this.groupBoxLanguage, "groupBoxLanguage");
|
||||
@@ -159,8 +265,8 @@
|
||||
//
|
||||
// comboBox1
|
||||
//
|
||||
this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
resources.ApplyResources(this.comboBox1, "comboBox1");
|
||||
this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.comboBox1.FormattingEnabled = true;
|
||||
this.comboBox1.Name = "comboBox1";
|
||||
//
|
||||
@@ -174,6 +280,14 @@
|
||||
this.groupBoxContextMenu.Name = "groupBoxContextMenu";
|
||||
this.groupBoxContextMenu.TabStop = false;
|
||||
//
|
||||
// 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;
|
||||
//
|
||||
// labelAdminRights
|
||||
//
|
||||
resources.ApplyResources(this.labelAdminRights, "labelAdminRights");
|
||||
@@ -207,120 +321,6 @@
|
||||
this.buttonОК.UseVisualStyleBackColor = true;
|
||||
this.buttonОК.Click += new System.EventHandler(this.buttonОК_Click);
|
||||
//
|
||||
// textBox1
|
||||
//
|
||||
this.textBox1.BackColor = System.Drawing.SystemColors.Window;
|
||||
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", global::APKToolGUI.Properties.Settings.Default, "CustomJVMArgs", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
resources.ApplyResources(this.textBox1, "textBox1");
|
||||
this.textBox1.Name = "textBox1";
|
||||
this.textBox1.Text = global::APKToolGUI.Properties.Settings.Default.CustomJVMArgs;
|
||||
//
|
||||
// checkBox7
|
||||
//
|
||||
resources.ApplyResources(this.checkBox7, "checkBox7");
|
||||
this.checkBox7.Checked = global::APKToolGUI.Properties.Settings.Default.UseCustomJVMArgs;
|
||||
this.checkBox7.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "UseCustomJVMArgs", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkBox7.Name = "checkBox7";
|
||||
this.checkBox7.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBox6
|
||||
//
|
||||
resources.ApplyResources(this.checkBox6, "checkBox6");
|
||||
this.checkBox6.Checked = global::APKToolGUI.Properties.Settings.Default.DebugMode;
|
||||
this.checkBox6.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "DebugMode", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkBox6.Name = "checkBox6";
|
||||
this.checkBox6.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// customApkToolTxtBox
|
||||
//
|
||||
this.customApkToolTxtBox.BackColor = System.Drawing.SystemColors.Window;
|
||||
this.customApkToolTxtBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", global::APKToolGUI.Properties.Settings.Default, "ApktoolPath", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
resources.ApplyResources(this.customApkToolTxtBox, "customApkToolTxtBox");
|
||||
this.customApkToolTxtBox.Name = "customApkToolTxtBox";
|
||||
this.customApkToolTxtBox.Text = global::APKToolGUI.Properties.Settings.Default.ApktoolPath;
|
||||
//
|
||||
// useCustomApktoolChk
|
||||
//
|
||||
resources.ApplyResources(this.useCustomApktoolChk, "useCustomApktoolChk");
|
||||
this.useCustomApktoolChk.Checked = global::APKToolGUI.Properties.Settings.Default.UseCustomApktool;
|
||||
this.useCustomApktoolChk.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "UseCustomApktool", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.useCustomApktoolChk.Name = "useCustomApktoolChk";
|
||||
this.useCustomApktoolChk.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBox5
|
||||
//
|
||||
resources.ApplyResources(this.checkBox5, "checkBox5");
|
||||
this.checkBox5.Checked = global::APKToolGUI.Properties.Settings.Default.Utf8FilenameSupport;
|
||||
this.checkBox5.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "Utf8FilenameSupport", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkBox5.Name = "checkBox5";
|
||||
this.checkBox5.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBox4
|
||||
//
|
||||
resources.ApplyResources(this.checkBox4, "checkBox4");
|
||||
this.checkBox4.Checked = global::APKToolGUI.Properties.Settings.Default.UseCustomJavaExe;
|
||||
this.checkBox4.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "UseCustomJavaExe", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkBox4.Name = "checkBox4";
|
||||
this.checkBox4.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// customTempLocationTxtBox
|
||||
//
|
||||
this.customTempLocationTxtBox.BackColor = System.Drawing.SystemColors.Window;
|
||||
this.customTempLocationTxtBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", global::APKToolGUI.Properties.Settings.Default, "TempDir", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
resources.ApplyResources(this.customTempLocationTxtBox, "customTempLocationTxtBox");
|
||||
this.customTempLocationTxtBox.Name = "customTempLocationTxtBox";
|
||||
this.customTempLocationTxtBox.Text = global::APKToolGUI.Properties.Settings.Default.TempDir;
|
||||
//
|
||||
// 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));
|
||||
resources.ApplyResources(this.textBoxCustomJavaLocation, "textBoxCustomJavaLocation");
|
||||
this.textBoxCustomJavaLocation.Name = "textBoxCustomJavaLocation";
|
||||
this.textBoxCustomJavaLocation.Text = global::APKToolGUI.Properties.Settings.Default.JavaExe;
|
||||
//
|
||||
// checkBox3
|
||||
//
|
||||
resources.ApplyResources(this.checkBox3, "checkBox3");
|
||||
this.checkBox3.Checked = global::APKToolGUI.Properties.Settings.Default.UseCustomTempDir;
|
||||
this.checkBox3.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "UseCustomTempDir", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkBox3.Name = "checkBox3";
|
||||
this.checkBox3.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBox2
|
||||
//
|
||||
resources.ApplyResources(this.checkBox2, "checkBox2");
|
||||
this.checkBox2.Checked = global::APKToolGUI.Properties.Settings.Default.PlaySoundWhenDone;
|
||||
this.checkBox2.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::APKToolGUI.Properties.Settings.Default, "PlaySoundWhenDone", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
|
||||
this.checkBox2.Name = "checkBox2";
|
||||
this.checkBox2.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBox1
|
||||
//
|
||||
resources.ApplyResources(this.checkBox1, "checkBox1");
|
||||
this.checkBox1.Checked = global::APKToolGUI.Properties.Settings.Default.ClearLogBeforeAction;
|
||||
this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
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;
|
||||
//
|
||||
// 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");
|
||||
|
||||
@@ -12,6 +12,8 @@ using System.Windows.Shapes;
|
||||
using static APKToolGUI.UpdateChecker;
|
||||
using APKToolGUI.Properties;
|
||||
using APKToolGUI.Controls;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
|
||||
namespace APKToolGUI
|
||||
{
|
||||
@@ -81,20 +83,24 @@ namespace APKToolGUI
|
||||
|
||||
private void LoadSettings()
|
||||
{
|
||||
String sysLang = Language.SystemLanguage;
|
||||
string sysLang = Language.SystemLanguage;
|
||||
|
||||
comboBox1.Items.Add(sysLang);
|
||||
comboBox1.Items.Add(CultureInfo.GetCultureInfo("en"));
|
||||
|
||||
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
|
||||
String _culture = Properties.Settings.Default.Culture;
|
||||
string _culture = Settings.Default.Culture;
|
||||
|
||||
foreach (CultureInfo culture in cultures)
|
||||
{
|
||||
foreach (string resourceName in Assembly.GetExecutingAssembly().GetManifestResourceNames())
|
||||
{
|
||||
string[] cultNamw = resourceName.Split('.');
|
||||
if (cultNamw[1] == culture.Name)
|
||||
//Debug.WriteLine(resourceName);
|
||||
string[] cultName = resourceName.Split('.');
|
||||
if (cultName[1] == culture.Name)
|
||||
{
|
||||
string lang = String.Format("{0} [{1}]", culture.DisplayName, culture.Name);
|
||||
//Debug.WriteLine("Lang: " + cultName[1] + " " + culture.Name);
|
||||
string lang = string.Format("{0} [{1}]", culture.DisplayName, culture.Name);
|
||||
comboBox1.Items.Add(lang);
|
||||
|
||||
if (culture.Name == _culture)
|
||||
@@ -111,11 +117,15 @@ namespace APKToolGUI
|
||||
currentLanguage = sysLang;
|
||||
comboBox1.SelectedItem = sysLang;
|
||||
}
|
||||
else if (string.IsNullOrEmpty(_culture))
|
||||
{
|
||||
comboBox1.SelectedIndex = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
currentLanguage = Properties.Settings.Default.Culture;
|
||||
currentLanguage = Settings.Default.Culture;
|
||||
comboBox1.SelectedItem = _culture;
|
||||
}
|
||||
catch { }
|
||||
@@ -134,6 +144,11 @@ namespace APKToolGUI
|
||||
Settings.Default.Theme = themeComboBox.SelectedIndex;
|
||||
Settings.Default.Save();
|
||||
|
||||
if (string.IsNullOrEmpty(currentLanguage))
|
||||
currentLanguage = "en";
|
||||
|
||||
Debug.WriteLine("Combobox: " + comboBox1.SelectedItem.ToString() + " Language: " + currentLanguage);
|
||||
|
||||
if (!comboBox1.SelectedItem.ToString().Contains(currentLanguage) || themeComboBox.SelectedIndex != currentTheme)
|
||||
if (MessageBox.Show(Language.RestartApplicationPrompt, Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
|
||||
Application.Restart();
|
||||
|
||||
@@ -0,0 +1,235 @@
|
||||
<?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="checkBox7.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>206, 17</value>
|
||||
</data>
|
||||
<data name="checkBox7.Text" xml:space="preserve">
|
||||
<value>Benutzerdefinierte JVM-Argumente</value>
|
||||
</data>
|
||||
<data name="checkBox6.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>101, 17</value>
|
||||
</data>
|
||||
<data name="checkBox6.Text" xml:space="preserve">
|
||||
<value>Debug-Modus</value>
|
||||
</data>
|
||||
<data name="themeComboBox.Items" xml:space="preserve">
|
||||
<value>Automatisch</value>
|
||||
</data>
|
||||
<data name="themeComboBox.Items1" xml:space="preserve">
|
||||
<value>Hell</value>
|
||||
</data>
|
||||
<data name="themeComboBox.Items2" xml:space="preserve">
|
||||
<value>Dunkel</value>
|
||||
</data>
|
||||
<data name="label1.Text" xml:space="preserve">
|
||||
<value>Thema</value>
|
||||
</data>
|
||||
<data name="customApktoolBtn.Text" xml:space="preserve">
|
||||
<value>…</value>
|
||||
</data>
|
||||
<data name="useCustomApktoolChk.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>232, 17</value>
|
||||
</data>
|
||||
<data name="useCustomApktoolChk.Text" xml:space="preserve">
|
||||
<value>Benutzerdefinierter APKTool-Speicherort</value>
|
||||
</data>
|
||||
<data name="label6.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>502, 13</value>
|
||||
</data>
|
||||
<data name="label6.Text" xml:space="preserve">
|
||||
<value>Der Vorgang wird langsamer sein, da die Dateien in den temporären Ordner verschoben werden</value>
|
||||
</data>
|
||||
<data name="checkBox5.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>218, 17</value>
|
||||
</data>
|
||||
<data name="checkBox5.Text" xml:space="preserve">
|
||||
<value>Unterstützung für UTF-8-Dateinamen</value>
|
||||
</data>
|
||||
<data name="checkBox4.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>212, 17</value>
|
||||
</data>
|
||||
<data name="checkBox4.Text" xml:space="preserve">
|
||||
<value>Benutzerdefinierter Java-Speicherort</value>
|
||||
</data>
|
||||
<data name="buttonCustomTempLocation.Text" xml:space="preserve">
|
||||
<value>…</value>
|
||||
</data>
|
||||
<data name="checkBox3.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>233, 17</value>
|
||||
</data>
|
||||
<data name="checkBox3.Text" xml:space="preserve">
|
||||
<value>Benutzerdefinierter temporärer Standort</value>
|
||||
</data>
|
||||
<data name="buttonCustomJavaLocation.Text" xml:space="preserve">
|
||||
<value>…</value>
|
||||
</data>
|
||||
<data name="checkBox2.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>203, 17</value>
|
||||
</data>
|
||||
<data name="checkBox2.Text" xml:space="preserve">
|
||||
<value>Ton abspielen, wenn du fertig bist</value>
|
||||
</data>
|
||||
<data name="checkBox1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>281, 17</value>
|
||||
</data>
|
||||
<data name="checkBox1.Text" xml:space="preserve">
|
||||
<value>Protokoll löschen, bevor du Maßnahmen ergreifst</value>
|
||||
</data>
|
||||
<data name="checkBoxCheckUpdateStartup.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>191, 17</value>
|
||||
</data>
|
||||
<data name="checkBoxCheckUpdateStartup.Text" xml:space="preserve">
|
||||
<value>Beim Start nach Updates suchen</value>
|
||||
</data>
|
||||
<data name="groupBox1.Text" xml:space="preserve">
|
||||
<value>Allgemein</value>
|
||||
</data>
|
||||
<data name="groupBoxLanguage.Text" xml:space="preserve">
|
||||
<value>Sprache</value>
|
||||
</data>
|
||||
<data name="ignoreOutputContextMenuBox.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>376, 17</value>
|
||||
</data>
|
||||
<data name="ignoreOutputContextMenuBox.Text" xml:space="preserve">
|
||||
<value>Benutzerdefiniertes Ausgabeverzeichnis für Kontextmenü ignorieren</value>
|
||||
</data>
|
||||
<data name="labelAdminRights.Text" xml:space="preserve">
|
||||
<value>Administratorrechte erforderlich</value>
|
||||
</data>
|
||||
<data name="buttonAddContextMenu.Text" xml:space="preserve">
|
||||
<value>Install …</value>
|
||||
</data>
|
||||
<data name="buttonRemoveContextMenu.Text" xml:space="preserve">
|
||||
<value>Deinstall …</value>
|
||||
</data>
|
||||
<data name="groupBoxContextMenu.Text" xml:space="preserve">
|
||||
<value>Kontextmenü</value>
|
||||
</data>
|
||||
<data name="tabPage1.Text" xml:space="preserve">
|
||||
<value>Allgemein</value>
|
||||
</data>
|
||||
<data name="buttonCancel.Text" xml:space="preserve">
|
||||
<value>Abbrechen</value>
|
||||
</data>
|
||||
<data name="$this.Text" xml:space="preserve">
|
||||
<value>Einstellungen</value>
|
||||
</data>
|
||||
</root>
|
||||
+859
-862
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,195 @@
|
||||
<?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="checkBox7.Text" xml:space="preserve">
|
||||
<value>自定义JVM命令</value>
|
||||
</data>
|
||||
<data name="checkBox6.Text" xml:space="preserve">
|
||||
<value>调试模式</value>
|
||||
</data>
|
||||
<data name="themeComboBox.Items" xml:space="preserve">
|
||||
<value>自动</value>
|
||||
</data>
|
||||
<data name="themeComboBox.Items1" xml:space="preserve">
|
||||
<value>浅色</value>
|
||||
</data>
|
||||
<data name="themeComboBox.Items2" xml:space="preserve">
|
||||
<value>深色</value>
|
||||
</data>
|
||||
<data name="label1.Text" xml:space="preserve">
|
||||
<value>主题</value>
|
||||
</data>
|
||||
<data name="useCustomApktoolChk.Text" xml:space="preserve">
|
||||
<value>自定义apktool位置</value>
|
||||
</data>
|
||||
<data name="label6.Text" xml:space="preserve">
|
||||
<value>操作过程的文件移动到缓存目录中需要时间,请耐心等待</value>
|
||||
</data>
|
||||
<data name="checkBox5.Text" xml:space="preserve">
|
||||
<value>UTF-8文件名支持,中文乱码开启</value>
|
||||
</data>
|
||||
<data name="checkBox4.Text" xml:space="preserve">
|
||||
<value>自定义Java位置</value>
|
||||
</data>
|
||||
<data name="checkBox3.Text" xml:space="preserve">
|
||||
<value>自定义缓存位置</value>
|
||||
</data>
|
||||
<data name="checkBox2.Text" xml:space="preserve">
|
||||
<value>完成提示音</value>
|
||||
</data>
|
||||
<data name="checkBox1.Text" xml:space="preserve">
|
||||
<value>动作前清理日志</value>
|
||||
</data>
|
||||
<data name="checkBoxCheckUpdateStartup.Text" xml:space="preserve">
|
||||
<value>启动时检查更新</value>
|
||||
</data>
|
||||
<data name="groupBox1.Text" xml:space="preserve">
|
||||
<value>常规</value>
|
||||
</data>
|
||||
<data name="groupBoxLanguage.Text" xml:space="preserve">
|
||||
<value>语言</value>
|
||||
</data>
|
||||
<data name="ignoreOutputContextMenuBox.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="buttonОК.Text" xml:space="preserve">
|
||||
<value>确定</value>
|
||||
</data>
|
||||
<data name="$this.Text" xml:space="preserve">
|
||||
<value>设置</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,4 +1,5 @@
|
||||
using APKToolGUI.Languages;
|
||||
using APKToolGUI.Properties;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
@@ -20,6 +21,12 @@ namespace APKToolGUI.Handlers
|
||||
main.refreshDevicesBtn.Click += refreshDevicesBtn_Click;
|
||||
main.selApkAdbBtn.Click += selApkAdbBtn_Click;
|
||||
main.devicesListBox.SelectedValueChanged += devicesListBox_SelectedValueChanged;
|
||||
main.overrideAbiComboBox.SelectedIndexChanged += ComboBoxChanged;
|
||||
}
|
||||
|
||||
private void ComboBoxChanged(object sender, EventArgs e)
|
||||
{
|
||||
Settings.Default.Adb_OverrideAbi = main.overrideAbiComboBox.SelectedIndex;
|
||||
}
|
||||
|
||||
private async void refreshDevicesBtn_Click(object sender, EventArgs e)
|
||||
|
||||
@@ -54,6 +54,8 @@ namespace APKToolGUI.Handlers
|
||||
{
|
||||
using (OpenFileDialog ofd = new OpenFileDialog())
|
||||
{
|
||||
ofd.Filter = "Android Package (*.apk;*.xapk;*.zip*.apkm;*.apks)|*.apk;*.xapk;*.zip*.apkm;*.apks";
|
||||
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
main.textBox_DECODE_InputAppPath.Text = ofd.FileName;
|
||||
@@ -94,16 +96,9 @@ namespace APKToolGUI.Handlers
|
||||
}
|
||||
}
|
||||
|
||||
if (inputFile.ContainsAny(".xapk", ".zip", ".apks", ".apkm"))
|
||||
if (inputFile.ContainsAny(".xapk", ".zip", ".apks", ".apkm") && !main.useAPKEditorForDecompilingItem.Checked)
|
||||
{
|
||||
if (Settings.Default.Decode_UseApkEditorMergeApk)
|
||||
{
|
||||
await main.MergeUsingApkEditor(inputFile);
|
||||
}
|
||||
else
|
||||
{
|
||||
await main.Merge(inputFile);
|
||||
}
|
||||
await main.MergeAndDecompile(inputFile);
|
||||
}
|
||||
else
|
||||
await main.Decompile(inputFile);
|
||||
|
||||
@@ -46,6 +46,11 @@ namespace APKToolGUI.Handlers
|
||||
Register(main.textBox_SIGN_InputFile, main.signPanel, signEventHandler, apks);
|
||||
Register(main.button_SIGN_Sign, main.signPanel, signEventHandler, apks);
|
||||
|
||||
DragEventHandler mergeEventHandler = new DragEventHandler((sender, e) => { DropApkToMerge(e); });
|
||||
Register(main.splitApkTxt, null, signEventHandler, apks);
|
||||
Register(main.splitApkPathTxtBox, main.mergePanel, mergeEventHandler, apks);
|
||||
Register(main.mergeApkBtn, main.mergePanel, mergeEventHandler, apks);
|
||||
|
||||
DragEventHandler baksmaliEventHandler = new DragEventHandler((sender, e) => { DropDexToBaksmali(e); });
|
||||
Register(main.bakSmaliGroupBox, null, baksmaliEventHandler, new string[] { ".dex" });
|
||||
main.bakSmaliGroupBox.AllowDrop = true;
|
||||
@@ -87,16 +92,9 @@ namespace APKToolGUI.Handlers
|
||||
if (!Settings.Default.Decode_DontParseApkInfo)
|
||||
await main.GetApkInfo(apkFile);
|
||||
|
||||
if (apkFile.ContainsAny(".xapk", ".zip", ".apks", ".apkm"))
|
||||
if (apkFile.ContainsAny(".xapk", ".zip", ".apks", ".apkm") && !main.useAPKEditorForDecompilingItem.Checked)
|
||||
{
|
||||
if (Settings.Default.Decode_UseApkEditorMergeApk)
|
||||
{
|
||||
await main.MergeUsingApkEditor(apkFile);
|
||||
}
|
||||
else
|
||||
{
|
||||
await main.Merge(apkFile);
|
||||
}
|
||||
await main.MergeAndDecompile(apkFile);
|
||||
}
|
||||
else
|
||||
await main.Decompile(apkFile);
|
||||
@@ -155,6 +153,22 @@ namespace APKToolGUI.Handlers
|
||||
}
|
||||
}
|
||||
|
||||
private async void DropApkToMerge(DragEventArgs e)
|
||||
{
|
||||
string[] apkFiles = null;
|
||||
if (e.DropManyByEnd(file => apkFiles = file, apks))
|
||||
{
|
||||
main.mergePanel.BackColor = PanelBackColor();
|
||||
|
||||
foreach (var apkFile in apkFiles)
|
||||
{
|
||||
main.splitApkPathTxtBox.Text = apkFile;
|
||||
|
||||
await main.Merge(apkFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async void DropDexToBaksmali(DragEventArgs e)
|
||||
{
|
||||
string apkFile = null;
|
||||
|
||||
@@ -5,10 +5,7 @@ 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;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace APKToolGUI.Handlers
|
||||
{
|
||||
@@ -29,6 +26,40 @@ namespace APKToolGUI.Handlers
|
||||
main.comApkOpenDir.Click += comApkOpenDir_Click;
|
||||
main.signApkOpenDirBtn.Click += signApkOpenDirBtn_Click;
|
||||
main.alignApkOpenDirBtn.Click += alignApkOpenDirBtn_Click;
|
||||
main.mergeApkBtn.Click += mergeApkBtn_Click;
|
||||
main.selSplitApkBtn.Click += selSplitApkBtn_Click;
|
||||
}
|
||||
|
||||
internal void selSplitApkBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
using (OpenFileDialog ofd = new OpenFileDialog())
|
||||
{
|
||||
ofd.Filter = "Split APK Package (*.xapk;*.zip*.apkm;*.apks)|*.xapk;*.zip*.apkm;*.apks";
|
||||
|
||||
if (ofd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
main.splitApkPathTxtBox.Text = ofd.FileName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal async void mergeApkBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
main.Save();
|
||||
if (!File.Exists(Settings.Default.SplitApk_InputFile))
|
||||
{
|
||||
main.ShowMessage(Language.SplitApkNotFound, MessageBoxIcon.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
await main.Merge(Settings.Default.SplitApk_InputFile);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
main.ToLog(ApktoolEventType.Error, ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
private void clearLogToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
@@ -40,7 +71,7 @@ namespace APKToolGUI.Handlers
|
||||
{
|
||||
try
|
||||
{
|
||||
Clipboard.SetText(main.logTxtBox.SelectedText);
|
||||
System.Windows.Forms.Clipboard.SetText(main.logTxtBox.SelectedText);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -48,7 +79,6 @@ namespace APKToolGUI.Handlers
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
internal void decApkOpenDirBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (Directory.Exists(main.textBox_BUILD_InputProjectDir.Text))
|
||||
|
||||
@@ -73,6 +73,11 @@ namespace APKToolGUI.Handlers
|
||||
{
|
||||
if (Directory.Exists(Program.TEMP_PATH))
|
||||
Process.Start("explorer.exe", Program.TEMP_PATH);
|
||||
else
|
||||
{
|
||||
Directory.CreateDirectory(Program.TEMP_PATH);
|
||||
Process.Start("explorer.exe", Program.TEMP_PATH);
|
||||
}
|
||||
}
|
||||
|
||||
private void menuItemCheckUpdate_Click(object sender, EventArgs e)
|
||||
|
||||
+27
@@ -150,6 +150,15 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <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>
|
||||
@@ -249,6 +258,15 @@ namespace APKToolGUI.Languages {
|
||||
}
|
||||
}
|
||||
|
||||
/// <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>
|
||||
@@ -1176,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>
|
||||
|
||||
@@ -0,0 +1,549 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
Das Hauptziel dieses Formats ist es, ein einfaches XML-Format zu ermöglichen
|
||||
das größtenteils für den Menschen lesbar ist. Die Erzeugung und das Parsen der
|
||||
verschiedenen Datentypen erfolgt durch die TypeConverter-Klassen
|
||||
die mit den Datentypen verbunden sind.
|
||||
|
||||
Beispiel:
|
||||
|
||||
… 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>Über</value>
|
||||
</data>
|
||||
<data name="APKToolVersion" xml:space="preserve">
|
||||
<value>Apktool-Version</value>
|
||||
</data>
|
||||
<data name="CheckForUpdate" xml:space="preserve">
|
||||
<value>Auf Aktualisierung prüfen</value>
|
||||
</data>
|
||||
<data name="DebugMode" xml:space="preserve">
|
||||
<value>Debug-Modus</value>
|
||||
</data>
|
||||
<data name="Exit" xml:space="preserve">
|
||||
<value>Beenden</value>
|
||||
</data>
|
||||
<data name="File" xml:space="preserve">
|
||||
<value>Datei</value>
|
||||
</data>
|
||||
<data name="Help" xml:space="preserve">
|
||||
<value>Hilfe</value>
|
||||
</data>
|
||||
<data name="Settings" xml:space="preserve">
|
||||
<value>Einstellungen</value>
|
||||
</data>
|
||||
<data name="ErrorJavaDetect" xml:space="preserve">
|
||||
<value>Java ist nicht oder nicht korrekt installiert. Java installieren oder einen eigenen Speicherort in den Einstellungen festlegen.</value>
|
||||
</data>
|
||||
<data name="ErrorReadSettings" xml:space="preserve">
|
||||
<value>Einstellungen für das Fehlerlesen</value>
|
||||
</data>
|
||||
<data name="UpdateNewVersion" xml:space="preserve">
|
||||
<value>Eine neue Version ist verfügbar. Möchtest du aktualisieren?</value>
|
||||
</data>
|
||||
<data name="UpdateNoUpdates" xml:space="preserve">
|
||||
<value>Aktualisierung verfügbar</value>
|
||||
</data>
|
||||
<data name="WarningDecodingFolderNotSelected" xml:space="preserve">
|
||||
<value>Dekompilierungsordner nicht ausgewählt!</value>
|
||||
</data>
|
||||
<data name="WarningFileForDecodingNotSelected" xml:space="preserve">
|
||||
<value>Datei zum Dekompilieren nicht ausgewählt!</value>
|
||||
</data>
|
||||
<data name="WarningFileForSigningNotSelected" xml:space="preserve">
|
||||
<value>Datei zum Signieren nicht ausgewählt!</value>
|
||||
</data>
|
||||
<data name="WarningFrameworkNotSelected" xml:space="preserve">
|
||||
<value>Framework nicht ausgewählt!</value>
|
||||
</data>
|
||||
<data name="ErrorSaveSettings" xml:space="preserve">
|
||||
<value>Fehler beim Einstellungen speichern!</value>
|
||||
</data>
|
||||
<data name="NeedRestart" xml:space="preserve">
|
||||
<value>Damit die Änderungen wirksam werden, musst du das Programm neu starten. Willst du es jetzt tun?</value>
|
||||
</data>
|
||||
<data name="FileNotFound" xml:space="preserve">
|
||||
<value>Datei wird nicht gefunden</value>
|
||||
</data>
|
||||
<data name="FolderNotExist" xml:space="preserve">
|
||||
<value>Der Ordner existiert nicht</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Fehler</value>
|
||||
</data>
|
||||
<data name="Build" xml:space="preserve">
|
||||
<value>Build</value>
|
||||
</data>
|
||||
<data name="Decode" xml:space="preserve">
|
||||
<value>Dekompilieren</value>
|
||||
</data>
|
||||
<data name="InstallFramework" xml:space="preserve">
|
||||
<value>Framework installieren</value>
|
||||
</data>
|
||||
<data name="Sign" xml:space="preserve">
|
||||
<value>Signieren</value>
|
||||
</data>
|
||||
<data name="SystemLanguage" xml:space="preserve">
|
||||
<value>Systemsprache</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToInstallCM" xml:space="preserve">
|
||||
<value>Möchtest du das Kontextmenü wirklich installieren?</value>
|
||||
</data>
|
||||
<data name="DoYouRealyWantToRemoveCM" xml:space="preserve">
|
||||
<value>Möchtest du das Kontextmenü wirklich entfernen?</value>
|
||||
</data>
|
||||
<data name="Done" xml:space="preserve">
|
||||
<value>Fertig</value>
|
||||
</data>
|
||||
<data name="CantDetectApktoolVersion" xml:space="preserve">
|
||||
<value>Apktool-Version wird nicht erkannt</value>
|
||||
</data>
|
||||
<data name="DecompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Dekompilieren erfolgreich abgeschlossen. Ausgabeverzeichnis "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorUpdateChecking" xml:space="preserve">
|
||||
<value>Fehlerhafte Aktualisierungsprüfung:</value>
|
||||
</data>
|
||||
<data name="SignSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Signieren erfolgreich abgeschlossen. Datei gespeichert unter "{0}"</value>
|
||||
</data>
|
||||
<data name="Aligning" xml:space="preserve">
|
||||
<value>Abgleichen</value>
|
||||
</data>
|
||||
<data name="ErrorCompiling" xml:space="preserve">
|
||||
<value>Kompilieren fehlgeschlagen</value>
|
||||
</data>
|
||||
<data name="ErrorEnteringFrameworkTag" xml:space="preserve">
|
||||
<value>Fehler bei der Eingabe des Framework-Tags</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFileNotExist" xml:space="preserve">
|
||||
<value>Ausgewählte Datei nicht vorhanden</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkDirectory" xml:space="preserve">
|
||||
<value>Fehler bei Auswahl des Framework-Verzeichnisses</value>
|
||||
</data>
|
||||
<data name="ErrorSelectingFrameworkFile" xml:space="preserve">
|
||||
<value>Fehler bei Auswahl der Framework-Datei. Datei existiert nicht.</value>
|
||||
</data>
|
||||
<data name="ErrorSigning" xml:space="preserve">
|
||||
<value>Signieren fehlgeschlagen</value>
|
||||
</data>
|
||||
<data name="FrameworkInstallationNotStarted" xml:space="preserve">
|
||||
<value>Fehler - Framework-Installation wird nicht gestartet</value>
|
||||
</data>
|
||||
<data name="InstallingFramework" xml:space="preserve">
|
||||
<value>Framework installieren</value>
|
||||
</data>
|
||||
<data name="Signing" xml:space="preserve">
|
||||
<value>Signieren</value>
|
||||
</data>
|
||||
<data name="SignInputFileNotFound" xml:space="preserve">
|
||||
<value>Eingabedatei nicht gefunden</value>
|
||||
</data>
|
||||
<data name="SignPrivateKeyNotFound" xml:space="preserve">
|
||||
<value>Privater Schlüssel - nicht gefunden</value>
|
||||
</data>
|
||||
<data name="SignPublicKeyNotFound" xml:space="preserve">
|
||||
<value>Öffentlicher Schlüssel - nicht gefunden</value>
|
||||
</data>
|
||||
<data name="ZIPArchives" xml:space="preserve">
|
||||
<value>ZIP archivieren</value>
|
||||
</data>
|
||||
<data name="DecodeCouldNotCreate" xml:space="preserve">
|
||||
<value>Ausgewähltes Dekompilierungsverzeichnis konnte nicht erstellt werden, da es ungültige Zeichen enthält.</value>
|
||||
</data>
|
||||
<data name="DecodeDirNotSelected" xml:space="preserve">
|
||||
<value>Dekompilierungsverzeichnis nicht ausgewählt</value>
|
||||
</data>
|
||||
<data name="DecodeSelectedFrameworkNotExist" xml:space="preserve">
|
||||
<value>Ausgewähltes Framework-Verzeichnis nicht vorhanden</value>
|
||||
</data>
|
||||
<data name="Decoding" xml:space="preserve">
|
||||
<value>Dekompilieren</value>
|
||||
</data>
|
||||
<data name="ErrorDecompiling" xml:space="preserve">
|
||||
<value>Dekompilieren fehlgeschlagen</value>
|
||||
</data>
|
||||
<data name="ExecutableFile" xml:space="preserve">
|
||||
<value>Ausführbare Datei</value>
|
||||
</data>
|
||||
<data name="ChangedTargetSdkTo29" xml:space="preserve">
|
||||
<value>Ziel-SDK auf 29 geändert</value>
|
||||
</data>
|
||||
<data name="ErrorVersionParsing" xml:space="preserve">
|
||||
<value>Version parsen nicht möglich</value>
|
||||
</data>
|
||||
<data name="FixAndroidManifest" xml:space="preserve">
|
||||
<value>AndroidManifest.xml repariert</value>
|
||||
</data>
|
||||
<data name="RemoveApkToolDummies" xml:space="preserve">
|
||||
<value>Alle Apk-Tool-Dummys entfernt</value>
|
||||
</data>
|
||||
<data name="APKSelected" xml:space="preserve">
|
||||
<value>APK ausgewählt:</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedFolderNotExist" xml:space="preserve">
|
||||
<value>Ausgewählter Ordner nicht vorhanden</value>
|
||||
</data>
|
||||
<data name="AndroidManifestNotExist" xml:space="preserve">
|
||||
<value>AndroidManifest.xml nicht vorhanden</value>
|
||||
</data>
|
||||
<data name="DecompiledAPKNotExist" xml:space="preserve">
|
||||
<value>Dekompiliertes APK-Verzeichnis existiert nicht</value>
|
||||
</data>
|
||||
<data name="MainActivityFound" xml:space="preserve">
|
||||
<value>Hauptaktivität gefunden in "{0}"</value>
|
||||
</data>
|
||||
<data name="MainActivityNotFoundPleaseFindManually" xml:space="preserve">
|
||||
<value>MainActivity konnte nicht gefunden werden, manuell suchen.</value>
|
||||
</data>
|
||||
<data name="ClearingFramework" xml:space="preserve">
|
||||
<value>Framework bereinigen</value>
|
||||
</data>
|
||||
<data name="CompilingSuccessfullyCompleted" xml:space="preserve">
|
||||
<value>Kompilieren erfolgreich abgeschlossen. Ausgabeverzeichnis "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorZipalign" xml:space="preserve">
|
||||
<value>Zipaligning fehlgeschlagen</value>
|
||||
</data>
|
||||
<data name="ZipalignFileSavedTo" xml:space="preserve">
|
||||
<value>Zipalign erfolgreich abgeschlossen. Datei gespeichert unter "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorClearingFw" xml:space="preserve">
|
||||
<value>Framework-Fehler bereinigen</value>
|
||||
</data>
|
||||
<data name="FrameworkCacheCleared" xml:space="preserve">
|
||||
<value>Framework Fehlerbereinigung</value>
|
||||
</data>
|
||||
<data name="AllDone" xml:space="preserve">
|
||||
<value>Alles fertig!</value>
|
||||
</data>
|
||||
<data name="FrameworkInstalled" xml:space="preserve">
|
||||
<value>Framework erfolgreich installiert</value>
|
||||
</data>
|
||||
<data name="FrameworkDirNotExist" xml:space="preserve">
|
||||
<value>Framework-Verzeichnis nicht vorhanden</value>
|
||||
</data>
|
||||
<data name="DecompilingDex" xml:space="preserve">
|
||||
<value>Dex dekompilieren</value>
|
||||
</data>
|
||||
<data name="ErrorSelectedOutputFolderNotExist" xml:space="preserve">
|
||||
<value>Ausgewählter Ausgabeordner nicht vorhanden</value>
|
||||
</data>
|
||||
<data name="CompilingDex" xml:space="preserve">
|
||||
<value>Dex dekompilieren</value>
|
||||
</data>
|
||||
<data name="DragDropNotSupported" xml:space="preserve">
|
||||
<value>Wird als Administrator ausgeführt. Drag & Drop wird möglicherweise nicht unterstützt</value>
|
||||
</data>
|
||||
<data name="DragDropSupported" xml:space="preserve">
|
||||
<value>Drag & Drop wird unterstützt</value>
|
||||
</data>
|
||||
<data name="ErrorNotAnApk" xml:space="preserve">
|
||||
<value>Verzeichnis ist kein Android-Paket</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 kompilieren</value>
|
||||
</data>
|
||||
<data name="CompileDex" xml:space="preserve">
|
||||
<value>DEX kompilieren</value>
|
||||
</data>
|
||||
<data name="DecompileApk" xml:space="preserve">
|
||||
<value>APK dekompilieren</value>
|
||||
</data>
|
||||
<data name="DecompileDex" xml:space="preserve">
|
||||
<value>DEX dekompilieren</value>
|
||||
</data>
|
||||
<data name="GetApkInfo" xml:space="preserve">
|
||||
<value>APK-Info anzeigen</value>
|
||||
</data>
|
||||
<data name="NotDecompiledApk" xml:space="preserve">
|
||||
<value>Ordner ist keine dekompilierte APK</value>
|
||||
</data>
|
||||
<data name="NotDecompiledDex" xml:space="preserve">
|
||||
<value>Ordner ist kein dekompilierte DEX</value>
|
||||
</data>
|
||||
<data name="RequiredFilesMissing" xml:space="preserve">
|
||||
<value>Erforderliche Dateien fehlen</value>
|
||||
</data>
|
||||
<data name="SignApk" xml:space="preserve">
|
||||
<value>APK signieren</value>
|
||||
</data>
|
||||
<data name="TextFile" xml:space="preserve">
|
||||
<value>Textdatei</value>
|
||||
</data>
|
||||
<data name="ZipalignApk" xml:space="preserve">
|
||||
<value>Zipalign APK</value>
|
||||
</data>
|
||||
<data name="CreateUnsignedApk" xml:space="preserve">
|
||||
<value>Unsignierte APK erstellen</value>
|
||||
</data>
|
||||
<data name="MetainfNotExist" xml:space="preserve">
|
||||
<value>Ordner META-INF existiert nicht. Übersprungen</value>
|
||||
</data>
|
||||
<data name="ErrorGettingApkInfo" xml:space="preserve">
|
||||
<value>Fehler beim Abrufen von APK-Informationen</value>
|
||||
</data>
|
||||
<data name="InputDirectory" xml:space="preserve">
|
||||
<value>Eingabeverzeichnis: {0}</value>
|
||||
</data>
|
||||
<data name="InputFile" xml:space="preserve">
|
||||
<value>Eingabedatei: {0}</value>
|
||||
</data>
|
||||
<data name="DeleteFile" xml:space="preserve">
|
||||
<value>Datei löschen "{0}"</value>
|
||||
</data>
|
||||
<data name="CopyFileToTemp" xml:space="preserve">
|
||||
<value>Datei "{0}" in temporäres Verzeichnis "{1}" kopieren</value>
|
||||
</data>
|
||||
<data name="CopyFolderToTemp" xml:space="preserve">
|
||||
<value>Dekompilierten Apk-Ordner "{0}" in temporäre Verzeichnis "{1}" kopieren</value>
|
||||
</data>
|
||||
<data name="DecodeDesDirExists" xml:space="preserve">
|
||||
<value>Zielverzeichnis "{0}" existiert bereits. Aktivieren "Löschen des Zielverzeichnisses erzwingen", wenn du es überschreiben möchtest.</value>
|
||||
</data>
|
||||
<data name="MoveTempApkFileToOutput" xml:space="preserve">
|
||||
<value>Temporären Ordner "{0}" in das Ausgabeverzeichnis "{1}" verschieben</value>
|
||||
</data>
|
||||
<data name="MoveTempApkToOutput" xml:space="preserve">
|
||||
<value>Temporäre Apk "{0}" in das Ausgabeverzeichnis "{1}" verschieben</value>
|
||||
</data>
|
||||
<data name="ParsingApkInfo" xml:space="preserve">
|
||||
<value>APK-Informationen parsen …</value>
|
||||
</data>
|
||||
<data name="RestartApplicationPrompt" xml:space="preserve">
|
||||
<value>Ein Neustart ist erforderlich, um die Änderungen zu übernehmen. Möchtest du die Anwendung neu starten?</value>
|
||||
</data>
|
||||
<data name="DecompilingAllApkFiles" xml:space="preserve">
|
||||
<value>Alle APK-Dateien dekompilieren</value>
|
||||
</data>
|
||||
<data name="DetectedAsBase" xml:space="preserve">
|
||||
<value>{0} als Basis erkannt</value>
|
||||
</data>
|
||||
<data name="DetectedAsSplit" xml:space="preserve">
|
||||
<value>{0} als gesplittet erkannt</value>
|
||||
</data>
|
||||
<data name="ExtractingAllApkFiles" xml:space="preserve">
|
||||
<value>Alle APK-Dateien extrahieren</value>
|
||||
</data>
|
||||
<data name="MergeFinishedMoveDir" xml:space="preserve">
|
||||
<value>Zusammenführen abgeschlossen. Verzeichnis verschieben nach "{0}"</value>
|
||||
</data>
|
||||
<data name="MergingApk" xml:space="preserve">
|
||||
<value>APK zusammenführen</value>
|
||||
</data>
|
||||
<data name="MovingBasedirectory" xml:space="preserve">
|
||||
<value>Basisverzeichnis verschieben nach "{0}"</value>
|
||||
</data>
|
||||
<data name="DirNotExist" xml:space="preserve">
|
||||
<value>Verzeichnis "{0}" existiert nicht</value>
|
||||
</data>
|
||||
<data name="TempDirectory" xml:space="preserve">
|
||||
<value>Temp-Verzeichnis: "{0}"</value>
|
||||
</data>
|
||||
<data name="ErrorMerging" xml:space="preserve">
|
||||
<value>Zusammenführen fehlgeschlagen</value>
|
||||
</data>
|
||||
<data name="ExtractOrigSignature" xml:space="preserve">
|
||||
<value>Originale Signatur extrahieren</value>
|
||||
</data>
|
||||
<data name="MergingApkEditor" xml:space="preserve">
|
||||
<value>APK mit APKEditor.jar zusammenführen</value>
|
||||
</data>
|
||||
<data name="Aborted" xml:space="preserve">
|
||||
<value>Abgebrochen</value>
|
||||
</data>
|
||||
<data name="CancelProcess" xml:space="preserve">
|
||||
<value>Sicher, dass du den Vorgang abbrechen willst?</value>
|
||||
</data>
|
||||
<data name="GettingDevices" xml:space="preserve">
|
||||
<value>Geräte erkennen …</value>
|
||||
</data>
|
||||
<data name="PleaseWait" xml:space="preserve">
|
||||
<value>Bitte warten …</value>
|
||||
</data>
|
||||
<data name="ConfirmKillingAdbServer" xml:space="preserve">
|
||||
<value>Sicher, dass du den ADB-Server beenden willst? Möglicherweise musst du dein Gerät neu anschließen oder den Emulator neu starten.</value>
|
||||
</data>
|
||||
<data name="DeviceNotSelected" xml:space="preserve">
|
||||
<value>Kein Gerät ausgewählt</value>
|
||||
</data>
|
||||
<data name="DeviceSelected" xml:space="preserve">
|
||||
<value>Gerät ausgewählt "{0}"</value>
|
||||
</data>
|
||||
<data name="DevicesFound" xml:space="preserve">
|
||||
<value>{0} Gerät gefunden</value>
|
||||
</data>
|
||||
<data name="InstallApkFailed" xml:space="preserve">
|
||||
<value>APK Installation fehlgeschlagen</value>
|
||||
</data>
|
||||
<data name="InstallApkSuccessful" xml:space="preserve">
|
||||
<value>APK Installation erfolgreich</value>
|
||||
</data>
|
||||
<data name="InstallingApk" xml:space="preserve">
|
||||
<value>APK installieren</value>
|
||||
</data>
|
||||
<data name="InstallingApkPath" xml:space="preserve">
|
||||
<value>APK installieren "{0}"</value>
|
||||
</data>
|
||||
<data name="NoDevicesFound" xml:space="preserve">
|
||||
<value>Keine Geräte gefunden. Vergewissere dich, dass dein Gerät mit dem Computer verbunden ist und das ADB-Debugging aktiviert ist. Wenn du einen Emulator verwendest, starte ihn neu und warte, bis er hochgefahren ist</value>
|
||||
</data>
|
||||
<data name="TimeEnded" xml:space="preserve">
|
||||
<value>Beendet: {0}</value>
|
||||
</data>
|
||||
<data name="TimeStarted" xml:space="preserve">
|
||||
<value>Gestartet: {0}</value>
|
||||
</data>
|
||||
<data name="ClearFrameworkPrompt" xml:space="preserve">
|
||||
<value>Es ist erforderlich, den Framework-Cache nach einer Änderung der Apktool-Version zu löschen, um unerwartete Fehler zu vermeiden. Möchtest du ihn jetzt löschen?</value>
|
||||
</data>
|
||||
<data name="ClearTempFolder" xml:space="preserve">
|
||||
<value>Temp-Ordner löschen</value>
|
||||
</data>
|
||||
<data name="DeletingFolder" xml:space="preserve">
|
||||
<value>Ordner löschen: {0}</value>
|
||||
</data>
|
||||
<data name="DirectoryNotExist" xml:space="preserve">
|
||||
<value>Verzeichnis "{0}" existiert nicht</value>
|
||||
</data>
|
||||
<data name="OpenComFolder" xml:space="preserve">
|
||||
<value>Kompilier-Ausgabeordner öffnen</value>
|
||||
</data>
|
||||
<data name="OpenDecFolder" xml:space="preserve">
|
||||
<value>Dekompilier-Ausgabeordner öffnen</value>
|
||||
</data>
|
||||
<data name="FixApktoolYml" xml:space="preserve">
|
||||
<value>Apktool.yml repariert</value>
|
||||
</data>
|
||||
<data name="CopyFileTo" xml:space="preserve">
|
||||
<value>Datei "{0}" nach "{1}" kopieren</value>
|
||||
</data>
|
||||
<data name="SplitApkNotFound" xml:space="preserve">
|
||||
<value>Split-APK nicht ausgewählt</value>
|
||||
</data>
|
||||
<data name="CantDetectApkeditorVersion" xml:space="preserve">
|
||||
<value>APKEditor Version wird nicht erkannt</value>
|
||||
</data>
|
||||
<data name="SetLanguageRestartApplication" xml:space="preserve">
|
||||
<value>Sprache installiert. Programm neu starten?</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -534,4 +534,13 @@
|
||||
<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>
|
||||
</root>
|
||||
@@ -244,7 +244,7 @@ namespace APKToolGUI
|
||||
if (Settings.Default.UseCustomTempDir)
|
||||
return Path.Combine(Settings.Default.TempDir);
|
||||
else
|
||||
return Path.Combine(LOCAL_APPDATA_PATH, ASSEMBLY_NAME);
|
||||
return Path.Combine(LOCAL_APPDATA_PATH, ASSEMBLY_NAME, "Temp");
|
||||
}
|
||||
|
||||
public static string RandTempDirectory()
|
||||
|
||||
@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("APK Tool GUI")]
|
||||
[assembly: AssemblyCopyright("Original owner: INFINUM, 2012-2015 | Maintained by: AndnixSH, 2022-2023")]
|
||||
[assembly: AssemblyCopyright("Original owner: INFINUM, 2012-2015 | Maintained by: AndnixSH, 2022-2024")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
// Можно задать все значения или принять номер построения и номер редакции по умолчанию,
|
||||
// используя "*", как показано ниже:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("3.3.0.0")]
|
||||
[assembly: AssemblyFileVersion("3.3.0.0")]
|
||||
[assembly: AssemblyVersion("3.3.1.2")]
|
||||
[assembly: AssemblyFileVersion("3.3.1.2")]
|
||||
|
||||
+70
-14
@@ -12,7 +12,7 @@ namespace APKToolGUI.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.7.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.9.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
@@ -1037,6 +1037,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1050,6 +1051,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1063,6 +1065,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1076,6 +1079,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("True")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1089,6 +1093,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1102,6 +1107,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1115,19 +1121,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("True")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
public bool Decode_UseApkEditorMergeApk {
|
||||
get {
|
||||
return ((bool)(this["Decode_UseApkEditorMergeApk"]));
|
||||
}
|
||||
set {
|
||||
this["Decode_UseApkEditorMergeApk"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1141,6 +1135,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1154,6 +1149,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1167,6 +1163,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1180,6 +1177,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1193,6 +1191,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("0")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1206,6 +1205,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1219,6 +1219,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1232,6 +1233,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1245,6 +1247,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
@@ -1258,6 +1261,7 @@ namespace APKToolGUI.Properties {
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("-Dfile.encoding=UTF8 -Djdk.util.zip.disableZip64ExtraFieldValidation=true -Djdk.n" +
|
||||
"io.zipfs.allowDotZipEntry=true")]
|
||||
@@ -1270,5 +1274,57 @@ namespace APKToolGUI.Properties {
|
||||
this["CustomJVMArgs"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
public string SplitApk_InputFile {
|
||||
get {
|
||||
return ((string)(this["SplitApk_InputFile"]));
|
||||
}
|
||||
set {
|
||||
this["SplitApk_InputFile"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Configuration.SettingsProviderAttribute(typeof(Bluegrams.Application.PortableSettingsProvider))]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
[global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)]
|
||||
public bool UseApkeditor {
|
||||
get {
|
||||
return ((bool)(this["UseApkeditor"]));
|
||||
}
|
||||
set {
|
||||
this["UseApkeditor"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("0")]
|
||||
public int Adb_OverrideAbi {
|
||||
get {
|
||||
return ((int)(this["Adb_OverrideAbi"]));
|
||||
}
|
||||
set {
|
||||
this["Adb_OverrideAbi"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
public bool Adb_SetOverrideAbi {
|
||||
get {
|
||||
return ((bool)(this["Adb_SetOverrideAbi"]));
|
||||
}
|
||||
set {
|
||||
this["Adb_SetOverrideAbi"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -221,59 +221,68 @@
|
||||
<Setting Name="PlaySoundWhenDone" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="UseCustomTempDir" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="UseCustomTempDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="TempDir" Roaming="true" Type="System.String" Scope="User">
|
||||
<Setting Name="TempDir" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="UseCustomJavaExe" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="UseCustomJavaExe" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="AutoDeleteIdsigFile" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="AutoDeleteIdsigFile" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="Utf8FilenameSupport" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Utf8FilenameSupport" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Sign_OverwriteInputFile" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Sign_OverwriteInputFile" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Decode_UseApkEditorMergeApk" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">True</Value>
|
||||
</Setting>
|
||||
<Setting Name="Adb_SetVendor" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<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" Roaming="true" Type="System.String" Scope="User">
|
||||
<Setting Name="Adb_SelectedApkPath" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Sign_InstallApkAfterSign" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Sign_InstallApkAfterSign" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="UseCustomApktool" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="UseCustomApktool" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="ApktoolPath" Roaming="true" Type="System.String" Scope="User">
|
||||
<Setting Name="ApktoolPath" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
</Setting>
|
||||
<Setting Name="Theme" Roaming="true" Type="System.Int32" Scope="User">
|
||||
<Setting Name="Theme" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Int32" Scope="User">
|
||||
<Value Profile="(Default)">0</Value>
|
||||
</Setting>
|
||||
<Setting Name="DebugMode" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="DebugMode" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Build_NetSecConf" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<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" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="Decode_DontParseApkInfo" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="UseCustomJVMArgs" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Setting Name="UseCustomJVMArgs" Provider="Bluegrams.Application.PortableSettingsProvider" Roaming="true" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="CustomJVMArgs" Roaming="true" Type="System.String" Scope="User">
|
||||
<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>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
+1
-13
@@ -12,17 +12,6 @@ namespace APKToolGUI.Utils
|
||||
/// </summary>
|
||||
public static class Log
|
||||
{
|
||||
#region direct logs
|
||||
/// <summary>
|
||||
/// log message with level VERY VERBOSE (may be disabled)
|
||||
/// </summary>
|
||||
/// <param name="s">the string to log</param>
|
||||
public static void vv(string s)
|
||||
{
|
||||
if (!Settings.Default.DebugMode) return;
|
||||
FormMain.Instance.ToLog(ApktoolEventType.None, s);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// log message with level VERBOSE (may be disabled)
|
||||
/// </summary>
|
||||
@@ -40,7 +29,7 @@ namespace APKToolGUI.Utils
|
||||
public static void d(string s)
|
||||
{
|
||||
if (!Settings.Default.DebugMode) return;
|
||||
FormMain.Instance.ToLog(ApktoolEventType.None, s);
|
||||
FormMain.Instance.ToLog(ApktoolEventType.Infomation, s);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -69,6 +58,5 @@ namespace APKToolGUI.Utils
|
||||
{
|
||||
FormMain.Instance.ToLog(ApktoolEventType.Error, s);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Documents;
|
||||
|
||||
namespace APKToolGUI.Utils
|
||||
{
|
||||
@@ -163,5 +164,6 @@ namespace APKToolGUI.Utils
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+12
-3
@@ -244,9 +244,6 @@
|
||||
<setting name="Sign_OverwriteInputFile" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Decode_UseApkEditorMergeApk" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="Adb_SetVendor" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
@@ -280,6 +277,18 @@
|
||||
<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>
|
||||
</APKToolGUI.Properties.Settings>
|
||||
</userSettings>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" /></startup>
|
||||
|
||||
@@ -13,14 +13,14 @@
|
||||
<package id="OSVersionExt" version="3.0.0" targetFramework="net48" />
|
||||
<package id="PortableSettingsProvider" version="0.2.5" 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.Collections" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Collections.Concurrent" version="4.3.0" 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="7.0.2" targetFramework="net48" />
|
||||
<package id="System.Diagnostics.DiagnosticSource" version="8.0.0" 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.Globalization" version="4.3.0" targetFramework="net48" />
|
||||
@@ -41,7 +41,7 @@
|
||||
<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.Primitives" version="4.3.0" targetFramework="net48" />
|
||||
<package id="System.Resources.Extensions" version="7.0.0" targetFramework="net48" />
|
||||
<package id="System.Resources.Extensions" version="8.0.0" 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" />
|
||||
|
||||
@@ -10,24 +10,28 @@ It is a tool for reverse engineering 3rd party, closed, binary Android apps. It
|
||||
# Download links
|
||||
https://github.com/AndnixSH/APKToolGUI/releases
|
||||
|
||||
Any such report from your antivirus is a false positive and is due to how the application works. You must manually add APKToolGUI.exe to your antivirus's whitelist/exclusion list.
|
||||
|
||||
If you don't believe this then try to compile the app by yourself or simply don't use it until you can confirm it is safe by working directly with your antiirus provider.
|
||||
|
||||
# Requirements
|
||||
- Windows 7 32-bit/64-bit and above
|
||||
- [Java](https://www.java.com/en/) or [JDK](https://www.oracle.com/java/technologies/downloads/) 8 or above. Using latest JDK is not really necessary, it tends to cause unexpected issues. Java 8 and 17 (long-term support release) is enough. Use 64-bit version if your system is 64-bit
|
||||
- [.NET Framework 4.8](https://dotnet.microsoft.com/en-us/download/dotnet-framework/net48) (Windows 8 and above already have it preinstalled)
|
||||
|
||||
# Features
|
||||
- Decompile APK
|
||||
- Decompile and merge split APK/XAPK/APKS/ZIP/APKM using build-in split merging or APKEditor.jar (Default)
|
||||
- Compile APK
|
||||
- Decompile & compile APK using Apktool
|
||||
- Decompile APK/XAPK/APKS/ZIP/APKM & compile APK using APKEditor.jar. Automatically detect if APK was decompiled using Apktool or APKEditor
|
||||
- Merge XAPK/APKS/ZIP/APKM using APKEditor.jar
|
||||
- Sign APK
|
||||
- Zipalign APK
|
||||
- Adb
|
||||
- ADB
|
||||
- Framework
|
||||
- Drag and drop
|
||||
- APK info
|
||||
- Log output
|
||||
- All features from [Apktool](https://ibotpeaches.github.io/Apktool/documentation/).
|
||||
- Additional features that can fix some Apktool errors, such as removing DUMMY_APKTOOL, clear framework before decompiling
|
||||
- All other features from [Apktool](https://ibotpeaches.github.io/Apktool/documentation/).
|
||||
- Fix some Apktool errors, such as removing DUMMY_APKTOOL, clear framework before decompiling
|
||||
- Multi language
|
||||
- Right-click context menu
|
||||
- Create unsigned APK for Core Patch
|
||||
@@ -35,11 +39,12 @@ https://github.com/AndnixSH/APKToolGUI/releases
|
||||
- Long path support (Windows 10 and above)
|
||||
|
||||
# Languages
|
||||
- Brazilian Portuguese (Incomplete)
|
||||
- English
|
||||
- Brazilian Portuguese (Incomplete)
|
||||
- Hungary (Incomplete)
|
||||
- Russian (Incomplete)
|
||||
- Chinese Simplified (Incomplete)
|
||||
- German
|
||||
|
||||
### Translation
|
||||
If you like to help translate with your native language, I recommend using Visual Studio 2022. You don't need any programming knowledge, you just edit the GUI and the `.resx` files
|
||||
@@ -56,6 +61,8 @@ https://user-images.githubusercontent.com/40742924/227244601-6f796141-ac2d-4c60-
|
||||
|
||||
If you can't use Visual Studio, you can use translator tools like [resxtranslator](https://github.com/HakanL/resxtranslator) or [RESX Translator automat](https://www.utilstudio.com/en/resx-translator/), but make sure the `.resx` file is added to [APKToolGUI.csproj](https://github.com/AndnixSH/APKToolGUI/blob/master/APKToolGUI/APKToolGUI.csproj), otherwise Visual Studio would not be able to detect it
|
||||
|
||||
3rd party tools can't be translated.
|
||||
|
||||
Make pull request when you are done
|
||||
|
||||
# Issues
|
||||
@@ -80,9 +87,6 @@ A: Download [Baksmali.jar/Smali.jar](https://bitbucket.org/JesusFreke/smali/down
|
||||
##### Q: How to reset?
|
||||
A: Simply delete the config.xml file from the directory of the executeable
|
||||
|
||||
##### Q: Why this tool is a virus?
|
||||
A: It just a false positive, anti-virus always flag tools/softwares like this as virus. Don't always believe what your anti-virus are telling you. Try to compile the source by yourself and you will see
|
||||
|
||||
##### Q: Can you make an automatic APK injecting tool?
|
||||
A: No, I'm not interested.
|
||||
|
||||
@@ -111,10 +115,9 @@ Use Visual Studio 2019 and above. NET Framework 4.8 SDK is required
|
||||
- INF1NUM (Original author of [APKToolGUI](https://github.com/INF1NUM/APKToolGUI))
|
||||
- iBotPeaches ([Apktool CLI](https://ibotpeaches.github.io/Apktool/))
|
||||
- REAndroid ([APKEditor](https://github.com/REAndroid/APKEditor))
|
||||
- shadow578 ([ApksMerger](https://github.com/shadow578/ApksMerger))
|
||||
|
||||
# Disclaimer
|
||||
Same as Apktool by iBotPeaches, It is NOT intended for piracy and other non-legal uses. It could be used for localizing, adding some features or support for custom platforms and other GOOD purposes. Just try to be fair with authors of an app, that you use and probably like.
|
||||
|
||||
# License
|
||||
The original repo does not have a license but I have permission from the author to use ane distriute this project as open source, without license. He doesn't seems to know much about licensing. For this project, I'll just add license as unlicensed
|
||||
The original repo does not have a license but I have permission from the author to use ane distribute this project as "open source"... I don't know what license to use so I'll just add license as unlicensed
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,3 +1,22 @@
|
||||
3.3.1.1
|
||||
- Fixed buttons not ungraying after ADB installation
|
||||
- Fixed "Merge APK" button not greying out during the process
|
||||
- Updated German language
|
||||
|
||||
3.3.1.0
|
||||
- Updated dependencies
|
||||
- Print exceptions
|
||||
- Support decompiling/compiling using ApkEditor
|
||||
- Adjust settings saving
|
||||
- Merge split APK to single APK without decompiling
|
||||
- Added german language
|
||||
- Updated Apktool to 2.9.3
|
||||
- Updated APKeditor to 1.3.4
|
||||
- Print APKEditor version
|
||||
|
||||
3.3.0.1
|
||||
- Fixed an issue that caused installation fail after compiling
|
||||
|
||||
3.3.0.0
|
||||
- Updated Simplified Chinese translation
|
||||
- Removed android.intent.action.MAIN from "Fix ApkTool errors after decompile"
|
||||
|
||||
Reference in New Issue
Block a user