Как изменить APK в .netAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как изменить APK в .net

Сообщение Anonymous »

мне нужно сделать что -то действительно простое < /p>
Я должен добавить файл json в APK < /p>
Подписанный APK хранится в контейнере Azure Blob < /p>
Модификация APK происходит в .net с использованием Apktool и Apksigner < /p>
, но и APK, но Apk, но и APK, но APK, но Apk, но и APK, но и APK, но APK, но и APK, но APK, но и APK, но APK, но и APK, но и APK, но APK, но и APK. APK становится недействительным на устройстве Android < /p>
Теперь я застрял < /p>
Вот код для изменения уже подписанного APK < /p>
public static async Task ModifyAndResignApk(byte[] apkBytes, string appId, string groupId)
{
var result = new MethodResult();

string apkToolsFolder = Path.Combine(Directory.GetCurrentDirectory(), "Apk Tools");
string apkToolPath = Path.Combine(apkToolsFolder, "apktool.jar");
string apkSignerPath = Path.Combine(apkToolsFolder, "apksigner.bat");
string keystorePath = Path.Combine(apkToolsFolder, "androidKeyStore.keystore");

string tempFolder = Path.Combine(Path.GetTempPath(), "apk_modification_" + Guid.NewGuid());
string extractedApkFolder = Path.Combine(tempFolder, "extracted");
string signedApkPath = Path.Combine(tempFolder, "signed.apk");
string tempApkPath = Path.Combine(tempFolder, "temp.apk");
string unsignedApkPath = Path.Combine(extractedApkFolder, "dist", "unsigned.apk");
string jsonFilePath = Path.Combine(extractedApkFolder, "assets", "config.json");

string keystorePassword = "myPassword";
string keyPassword = "myPassword";

try
{
Directory.CreateDirectory(extractedApkFolder);
await File.WriteAllBytesAsync(tempApkPath, apkBytes);

// Step 1: Decompile APK
if (!await RunProcessAsync("java", $"-jar \"{apkToolPath}\" d \"{tempApkPath}\" -o \"{extractedApkFolder}\" --force"))
throw new Exception("Failed to decompile APK");

// Step 2: Add config.json
Directory.CreateDirectory(Path.GetDirectoryName(jsonFilePath) ?? extractedApkFolder); // Ensure assets folder exists
var config = new { appId, groupId };
string jsonContent = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true });
await File.WriteAllTextAsync(jsonFilePath, jsonContent);

// Step 3: Rebuild APK
if (!await RunProcessAsync("java", $"-Xmx1024M -jar \"{apkToolPath}\" b \"{extractedApkFolder}\" -o \"{unsignedApkPath}\""))
throw new Exception("Failed to rebuild APK");

// Step 4: Sign the APK
if (!await RunProcessAsync(apkSignerPath, $"sign --ks \"{keystorePath}\" --ks-pass pass:{keystorePassword} --key-pass pass:{keyPassword} --out \"{signedApkPath}\" \"{unsignedApkPath}\""))
throw new Exception("Failed to sign APK");

return result.Success(await File.ReadAllBytesAsync(signedApkPath));
}
catch (Exception e)
{
return result.Fail(e, "Failed to modify and resign APK");
}
finally
{
await Task.Delay(500); // Ensure no lingering file locks
if (Directory.Exists(tempFolder))
{
Directory.Delete(tempFolder, true);
}
}
}

private static async Task RunProcessAsync(string fileName, string arguments)
{
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = fileName,
Arguments = arguments,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
}
};

process.Start();
await process.WaitForExitAsync();

string output = await process.StandardOutput.ReadToEndAsync();
string error = await process.StandardError.ReadToEndAsync();

Console.WriteLine(output);
if (!string.IsNullOrWhiteSpace(error))
Console.WriteLine($"Error: {error}");

return process.ExitCode == 0;
}


Подробнее здесь: https://stackoverflow.com/questions/794 ... apk-in-net
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»