From e520717e719a969a23d25bb6638a7f431afe8cbd Mon Sep 17 00:00:00 2001 From: Miepee Date: Wed, 28 Sep 2022 17:58:20 +0200 Subject: [PATCH] Make Android name replacement not crash APK --- AM2RPortHelperCLI/Program.cs | 3 ++- AM2RPortHelperLib/PortHelper.cs | 38 ++++++++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/AM2RPortHelperCLI/Program.cs b/AM2RPortHelperCLI/Program.cs index 59f6114..7977f2c 100644 --- a/AM2RPortHelperCLI/Program.cs +++ b/AM2RPortHelperCLI/Program.cs @@ -19,7 +19,7 @@ internal static class Program private static int Main(string[] args) { - //PortHelper.PortLauncherMod("/home/narr/Downloads/Multitroid1_4_2VM_Linux.zip", "Windows", false, "./foo.zip"); + //PortHelper.PortLauncherMod("/home/narr/Downloads/UnofficialMultitroidAPKTest1_6a.zip", "Linux", true, "./foo.zip"); var interactiveOption = new Option(new[] { "-i", "--interactive" }, "Use an interactive mode. This will ignore all other options."); var fileOption = new Option(new[] { "-f", "--file" }, "The file path to the raw mod that should be ported. *REQUIRED IN NON-INTERACTIVE*"); @@ -199,6 +199,7 @@ internal static class Program Console.WriteLine("Successfully finished!"); } + // TODO: we should probably check for magic header instead of just file extension private static bool IsValidInputZip(string path) { return path != null && (File.Exists(path) || Path.GetExtension(path).ToLower() == ".zip"); diff --git a/AM2RPortHelperLib/PortHelper.cs b/AM2RPortHelperLib/PortHelper.cs index e459303..c12eff0 100644 --- a/AM2RPortHelperLib/PortHelper.cs +++ b/AM2RPortHelperLib/PortHelper.cs @@ -282,12 +282,40 @@ public static partial class PortHelper if (modName != null || usesInternet) { string manifestFile = File.ReadAllText(apkDir + "/AndroidManifest.xml"); - - // If a custom name was given, replace it. - //TODO: handle errors + + // If a custom name was given, replace it everywhere. + //TODO: handle errors: + // A-Z, a-z, digits, underscore and needs to start with letters if (modName != null) - manifestFile = manifestFile.Replace("com.companyname.AM2RWrapper", "com.companyname." + modName); - + { + // first in the manifest + manifestFile = manifestFile.Replace("com.companyname.AM2RWrapper", $"com.companyname.{modName}"); + + // then in the rest + // TODO: create some sort of function for it to avoid copy paste + foreach (var file in Directory.GetFiles($"{apkDir}/smali/com/yoyogames/runner")) + { + var content = File.ReadAllText(file); + content = content.Replace("com.companyname.AM2RWrapper", $"com.companyname.{modName}") + .Replace("com/companyname/AM2RWrapper", $"com/companyname/{modName}"); + File.WriteAllText(file, content); + } + var am2rWrapperDir = new DirectoryInfo($"{apkDir}/smali/com/companyname/AM2RWrapper"); + foreach (var file in am2rWrapperDir.GetFiles()) + { + var content = File.ReadAllText(file.FullName); + content = content.Replace("com.companyname.AM2RWrapper", $"com.companyname.{modName}") + .Replace("com/companyname/AM2RWrapper", $"com/companyname/{modName}") + .Replace("com$companyname$AM2RWrapper", $"com$companyname${modName}"); + File.WriteAllText(file.FullName, content); + } + am2rWrapperDir.MoveTo($"{apkDir}/smali/com/companyname/{modName}"); + + var layoutContent = File.ReadAllText($"{apkDir}/res/layout/main.xml"); + layoutContent = layoutContent.Replace("com.companyname.AM2RWrapper", $"com.companyname.{modName}"); + File.WriteAllText($"{apkDir}/res/layout/main.xml", layoutContent); + } + // Add internet permission, keying off the Bluetooth permission. if (usesInternet) {