From a96bd14704be11facd3d98fdcbe3d4267ee95144 Mon Sep 17 00:00:00 2001 From: AbdurazaaqMohammed Date: Tue, 20 Aug 2024 14:10:12 -0400 Subject: [PATCH] 1.6.4.9 Check for mismatched version codes in splits and warn or show error where appropriate Cleanup unused strings Try to fix 'Fix for ReVanced' not working on some devices --- app/build.gradle.kts | 2 +- .../AntiSplit/main/DeviceSpecsUtil.java | 10 +- .../AntiSplit/main/MainActivity.java | 14 +- .../main/MismatchedSplitsException.java | 7 + .../filepicker/view/FilePickerDialog.java | 6 +- .../j256/simplezip/format/ZipFileHeader.java | 2 +- .../java/com/reandroid/apk/ApkBundle.java | 120 +++++++++++++++--- .../com/reandroid/apkeditor/merge/Merger.java | 67 +++++----- app/src/main/res/layout-v11/dialog_footer.xml | 4 +- app/src/main/res/layout/dialog_footer.xml | 4 +- app/src/main/res/values-es/strings.xml | 7 +- app/src/main/res/values-in/strings.xml | 7 +- app/src/main/res/values-it/strings.xml | 4 +- app/src/main/res/values-ru/strings.xml | 7 +- app/src/main/res/values-tr/strings.xml | 7 +- app/src/main/res/values-uk/strings.xml | 7 +- app/src/main/res/values/strings.xml | 11 +- 17 files changed, 186 insertions(+), 100 deletions(-) create mode 100644 app/src/main/java/com/abdurazaaqmohammed/AntiSplit/main/MismatchedSplitsException.java diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 50db6cc6..8035968a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,7 +11,7 @@ android { minSdk = 4 targetSdk = 35 versionCode = 29 - versionName = "1.6.4.8" + versionName = "1.6.4.9" multiDexEnabled = true } diff --git a/app/src/main/java/com/abdurazaaqmohammed/AntiSplit/main/DeviceSpecsUtil.java b/app/src/main/java/com/abdurazaaqmohammed/AntiSplit/main/DeviceSpecsUtil.java index 0cb89c82..4c12fd5d 100644 --- a/app/src/main/java/com/abdurazaaqmohammed/AntiSplit/main/DeviceSpecsUtil.java +++ b/app/src/main/java/com/abdurazaaqmohammed/AntiSplit/main/DeviceSpecsUtil.java @@ -61,15 +61,17 @@ public List getListOfSplits(Uri splitAPKUri) throws IOException { return splits; } - public boolean isArch(String thisSplit) { + public static boolean isArch(String thisSplit) { return thisSplit.contains("armeabi") || thisSplit.contains("arm64") || thisSplit.contains("x86") || thisSplit.contains("mips"); } + public static boolean isBaseApk(String name) { + return name.equals("base.apk") + || !name.startsWith("config") && !name.startsWith("split"); // this is base.apk hopefully + } public boolean shouldIncludeSplit(String name) { - return name.equals("base.apk") - || !name.startsWith("config") && !name.startsWith("split") // this is base.apk hopefully - || shouldIncludeLang(name) || shouldIncludeArch(name) || shouldIncludeDpi(name); + return isBaseApk(name) || shouldIncludeLang(name) || shouldIncludeArch(name) || shouldIncludeDpi(name); } public boolean shouldIncludeLang(String name) { diff --git a/app/src/main/java/com/abdurazaaqmohammed/AntiSplit/main/MainActivity.java b/app/src/main/java/com/abdurazaaqmohammed/AntiSplit/main/MainActivity.java index fd3d159a..cd03d6a7 100644 --- a/app/src/main/java/com/abdurazaaqmohammed/AntiSplit/main/MainActivity.java +++ b/app/src/main/java/com/abdurazaaqmohammed/AntiSplit/main/MainActivity.java @@ -70,7 +70,7 @@ /** @noinspection deprecation*/ public class MainActivity extends Activity implements Merger.LogListener { - private static boolean ask; + private static boolean ask = true; private static boolean showDialog; private static boolean signApk; private static boolean selectSplitsForDevice; @@ -282,7 +282,7 @@ protected void onCreate(Bundle savedInstanceState) { title.setTextColor(textColor); title.setTextSize(25); styleAlertDialog( - new AlertDialog.Builder(this).setCustomTitle(title).setView(l).setPositiveButton("Close", (dialog, which) -> dialog.dismiss()).create(), null); + new AlertDialog.Builder(this).setCustomTitle(title).setView(l).setPositiveButton(R.string.close, (dialog, which) -> dialog.dismiss()).create(), null); }); findViewById(R.id.decodeButton).setOnClickListener(v -> { @@ -295,7 +295,7 @@ protected void onCreate(Bundle savedInstanceState) { properties.offset = new File(DialogConfigs.DEFAULT_DIR); properties.extensions = new String[] {"apk", "zip", "apks", "aspk", "apks", "xapk", "apkm"}; FilePickerDialog dialog = new FilePickerDialog(MainActivity.this, properties, textColor, bgColor); - dialog.setTitle(rss.getString(R.string.choose_button_label)); + dialog.setTitle(rss.getString(R.string.select)); dialog.setDialogSelectionListener(files -> { urisAreSplitApks = !files[0].endsWith(".apk"); uris = new ArrayList<>(); @@ -522,7 +522,7 @@ protected Void doInBackground(Uri... uris) { boolean splitApkContainsArch = false; for (int i = 0; i < splits.size(); i++) { final String thisSplit = splits.get(i); - if(!splitApkContainsArch && DeviceSpecsUtil.isArch(thisSplit)) { + if(!splitApkContainsArch && com.abdurazaaqmohammed.AntiSplit.main.DeviceSpecsUtil.isArch(thisSplit)) { splitApkContainsArch = true; } if (DeviceSpecsUtil.shouldIncludeSplit(thisSplit)) splits.remove(thisSplit); @@ -531,7 +531,7 @@ protected Void doInBackground(Uri... uris) { boolean selectedSplitsContainsArch = false; for (int i = 0; i < copy.size(); i++) { final String thisSplit = copy.get(i); - if (DeviceSpecsUtil.isArch(thisSplit) && !splits.contains(thisSplit)) { + if (com.abdurazaaqmohammed.AntiSplit.main.DeviceSpecsUtil.isArch(thisSplit) && !splits.contains(thisSplit)) { selectedSplitsContainsArch = true; break; } @@ -540,7 +540,7 @@ protected Void doInBackground(Uri... uris) { LogUtil.logMessage("Could not find device architecture, selecting all architectures"); for (int i = 0; i < splits.size(); i++) { final String thisSplit = splits.get(i); - if(DeviceSpecsUtil.isArch(thisSplit)) splits.remove(thisSplit); // select all to be sure + if(com.abdurazaaqmohammed.AntiSplit.main.DeviceSpecsUtil.isArch(thisSplit)) splits.remove(thisSplit); // select all to be sure } } } @@ -732,7 +732,7 @@ protected void onPostExecute(String[] result) { } else activity.startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(link))); }); if(supportsDownloadManager) builder.setNeutralButton("Go to GitHub Release", (dialog, which) -> activity.startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://github.com/AbdurazaaqMohammed/AntiSplit-M/releases/latest")))); - activity.styleAlertDialog(builder.setNegativeButton(rss.getString(R.string.cancel_button_label), (dialog, which) -> dialog.dismiss()).create(), null); + activity.styleAlertDialog(builder.setNegativeButton(rss.getString(R.string.cancel), (dialog, which) -> dialog.dismiss()).create(), null); } else if (toast) activity.runOnUiThread(() -> Toast.makeText(activity, rss.getString(R.string.no_update_found), Toast.LENGTH_SHORT).show()); } catch (Exception ignored) { } } diff --git a/app/src/main/java/com/abdurazaaqmohammed/AntiSplit/main/MismatchedSplitsException.java b/app/src/main/java/com/abdurazaaqmohammed/AntiSplit/main/MismatchedSplitsException.java new file mode 100644 index 00000000..b2d1c80b --- /dev/null +++ b/app/src/main/java/com/abdurazaaqmohammed/AntiSplit/main/MismatchedSplitsException.java @@ -0,0 +1,7 @@ +package com.abdurazaaqmohammed.AntiSplit.main; + +public class MismatchedSplitsException extends Exception { + public MismatchedSplitsException(String cancelled) { + super(cancelled); + } +} diff --git a/app/src/main/java/com/github/angads25/filepicker/view/FilePickerDialog.java b/app/src/main/java/com/github/angads25/filepicker/view/FilePickerDialog.java index 178053b1..e242001c 100644 --- a/app/src/main/java/com/github/angads25/filepicker/view/FilePickerDialog.java +++ b/app/src/main/java/com/github/angads25/filepicker/view/FilePickerDialog.java @@ -149,7 +149,7 @@ protected void onCreate(Bundle savedInstanceState) { * selected. */ positiveBtnNameStr = positiveBtnNameStr == null ? - com.abdurazaaqmohammed.AntiSplit.main.MainActivity.rss.getString(R.string.choose_button_label) : positiveBtnNameStr; + com.abdurazaaqmohammed.AntiSplit.main.MainActivity.rss.getString(R.string.select) : positiveBtnNameStr; int size1 = MarkedItemList.getFileCount(); if (size1 == 0) { select.setEnabled(false); @@ -215,7 +215,7 @@ protected void onStart() { super.onStart(); positiveBtnNameStr = ( positiveBtnNameStr == null ? - com.abdurazaaqmohammed.AntiSplit.main.MainActivity.rss.getString(R.string.choose_button_label) : + com.abdurazaaqmohammed.AntiSplit.main.MainActivity.rss.getString(R.string.select) : positiveBtnNameStr ); select.setText(positiveBtnNameStr); @@ -417,7 +417,7 @@ public void show() { } else { super.show(); positiveBtnNameStr = positiveBtnNameStr == null ? - com.abdurazaaqmohammed.AntiSplit.main.MainActivity.rss.getString(R.string.choose_button_label) : positiveBtnNameStr; + com.abdurazaaqmohammed.AntiSplit.main.MainActivity.rss.getString(R.string.select) : positiveBtnNameStr; select.setText(positiveBtnNameStr); int size = MarkedItemList.getFileCount(); if (size == 0) { diff --git a/app/src/main/java/com/j256/simplezip/format/ZipFileHeader.java b/app/src/main/java/com/j256/simplezip/format/ZipFileHeader.java index 516950e9..2d099b50 100644 --- a/app/src/main/java/com/j256/simplezip/format/ZipFileHeader.java +++ b/app/src/main/java/com/j256/simplezip/format/ZipFileHeader.java @@ -89,7 +89,7 @@ public static ZipFileHeader read(RewindableInputStream inputStream) throws IOExc int fileNameLength = IoUtils.readShort(inputStream, "ZipFileHeader.fileNameLength"); int extraLength = IoUtils.readShort(inputStream, "ZipFileHeader.extraLength"); builder.fileNameBytes = IoUtils.readBytes(inputStream, fileNameLength, "ZipFileHeader.fileName"); - //builder.extraFieldBytes = + builder.extraFieldBytes = IoUtils.readBytes(inputStream, extraLength, "ZipFileHeader.extra"); return builder.build(); } diff --git a/app/src/main/java/com/reandroid/apk/ApkBundle.java b/app/src/main/java/com/reandroid/apk/ApkBundle.java index de38c196..9cf0e19f 100644 --- a/app/src/main/java/com/reandroid/apk/ApkBundle.java +++ b/app/src/main/java/com/reandroid/apk/ApkBundle.java @@ -15,8 +15,20 @@ */ package com.reandroid.apk; -import android.util.Log; +import static com.abdurazaaqmohammed.AntiSplit.main.MainActivity.rss; +import android.app.AlertDialog; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.text.TextUtils; +import android.widget.TextView; + +import com.abdurazaaqmohammed.AntiSplit.R; +import com.abdurazaaqmohammed.AntiSplit.main.DeviceSpecsUtil; +import com.abdurazaaqmohammed.AntiSplit.main.MainActivity; +import com.abdurazaaqmohammed.AntiSplit.main.MismatchedSplitsException; +import com.android.apksig.apk.ApkUtils; import com.reandroid.apkeditor.merge.LogUtil; import com.reandroid.archive.BlockInputSource; import com.reandroid.archive.ZipEntryMap; @@ -25,22 +37,32 @@ import com.reandroid.arsc.pool.TableStringPool; import com.reandroid.arsc.pool.builder.StringPoolMerger; +import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; -import java.util.*; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.zip.ZipFile; public class ApkBundle implements Closeable { private final Map mModulesMap; - private APKLogger apkLogger; + public ApkBundle(){ this.mModulesMap=new HashMap<>(); } public ApkModule mergeModules() throws IOException { List moduleList=getApkModuleList(); - if(moduleList.size()==0){ + if(moduleList.isEmpty()){ throw new FileNotFoundException("Nothing to merge, empty modules"); } ApkModule result = new ApkModule(generateMergedModuleName(), new ZipEntryMap()); @@ -143,27 +165,87 @@ public List getApkModuleList(){ return new ArrayList<>(mModulesMap.values()); } - public void loadApkDirectory(File dir, boolean recursive) throws IOException { - if(!dir.isDirectory()){ - throw new FileNotFoundException("No such directory: "+dir); + public void loadApkDirectory(File dir, boolean recursive, Context context) throws IOException, MismatchedSplitsException, InterruptedException { + if(!dir.isDirectory()) throw new FileNotFoundException("No such directory: " + dir); + List apkList = recursive ? ApkUtil.recursiveFiles(dir, ".apk") : ApkUtil.listFiles(dir, ".apk"); + if(apkList.isEmpty()) throw new FileNotFoundException("No '*.apk' files in directory: " + dir); + LogUtil.logMessage("Found apk files: "+apkList.size()); + int size = apkList.size(); + int[] versionCodes = new int[size]; + int base = -1; + for(int i = 0; i < size; i++){ + File file = apkList.get(i); + try(ZipFile zf = new ZipFile(file); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + InputStream is = zf.getInputStream(zf.getEntry("AndroidManifest.xml"))) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = is.read(buffer)) != -1) byteArrayOutputStream.write(buffer, 0, bytesRead); + versionCodes[i] = ApkUtils.getVersionCodeFromBinaryAndroidManifest(ByteBuffer.wrap(byteArrayOutputStream.toByteArray())); + if(DeviceSpecsUtil.isBaseApk(file.getName())) base = versionCodes[i]; + } catch (Exception e) { + versionCodes[i] = -1; + } } - List apkList; - if(recursive){ - apkList = ApkUtil.recursiveFiles(dir, ".apk"); - }else { - apkList = ApkUtil.listFiles(dir, ".apk"); + if(base == -1) load(apkList); + List mismatchedDpis = new ArrayList<>(); + StringBuilder mismatchedLangs = new StringBuilder(); + for(int i = 0; i < size; i++) { + if(versionCodes[i] != base) { + File f = apkList.get(i); + String name = f.getName(); + LogUtil.logMessage(name + rss.getString(R.string.mismatch_base)); + if(DeviceSpecsUtil.isArch(name)) throw new MismatchedSplitsException("Error: Key (the app will not run without it) split (" + name + ") has a mismatched version code."); + if(name.contains("dpi")) mismatchedDpis.add(f); + else mismatchedLangs.append(", ").append(name); + } } - if(apkList.size()==0){ - throw new FileNotFoundException("No '*.apk' files in directory: "+dir); + + apkList.removeAll(mismatchedDpis); + boolean hasDpi = false; + for(File f : apkList) { + if(f.getName().contains("dpi")) { + hasDpi = true; + break; + } } - LogUtil.logMessage("Found apk files: "+apkList.size()); - for(File file:apkList){ + if(!hasDpi) throw new MismatchedSplitsException("Error: All DPI/resource splits selected have a mismatched version code."); + String s = mismatchedLangs.toString(); + if(!TextUtils.isEmpty(s)) { + final CountDownLatch latch = new CountDownLatch(1); + TextView title = new TextView(context); + title.setText(rss.getString(R.string.warning)); + title.setTextColor(MainActivity.textColor); + title.setTextSize(25); + TextView msg = new TextView(context); + msg.setText(rss.getString(R.string.mismatch, s.replaceFirst(", ", ""))); + msg.setTextColor(MainActivity.textColor); + MainActivity act = ((MainActivity) context); + act.getHandler().post(() -> act.styleAlertDialog(new AlertDialog.Builder(context).setCustomTitle(title).setView(msg).setPositiveButton("OK", (dialog, which) -> { + for(String filename : s.split(", ")) { + File f = new File(dir, filename); + f.delete(); + apkList.remove(f); + } + latch.countDown(); + }).setNegativeButton(rss.getString(R.string.cancel), (dialog, which) -> { + act.startActivity(new Intent(act, MainActivity.class)); + if(Build.VERSION.SDK_INT > 15) act.finishAffinity(); + else act.finish(); + latch.countDown(); + }).create(), null)); + latch.await(); + } + load(apkList); + } + + private void load(List apkList) throws IOException { + for(File file : apkList) { LogUtil.logMessage("Loading: "+file.getName()); - String name = ApkUtil.toModuleName(file); - ApkModule module = ApkModule.loadApkFile(file, name); - addModule(module); + addModule(ApkModule.loadApkFile(file, ApkUtil.toModuleName(file))); } } + public void addModule(ApkModule apkModule){ apkModule.setLoadDefaultFramework(false); String name = apkModule.getModuleName(); diff --git a/app/src/main/java/com/reandroid/apkeditor/merge/Merger.java b/app/src/main/java/com/reandroid/apkeditor/merge/Merger.java index d663def2..6842df19 100644 --- a/app/src/main/java/com/reandroid/apkeditor/merge/Merger.java +++ b/app/src/main/java/com/reandroid/apkeditor/merge/Merger.java @@ -23,6 +23,7 @@ import com.abdurazaaqmohammed.AntiSplit.R; import com.abdurazaaqmohammed.AntiSplit.main.DeviceSpecsUtil; import com.abdurazaaqmohammed.AntiSplit.main.MainActivity; +import com.abdurazaaqmohammed.AntiSplit.main.MismatchedSplitsException; import com.abdurazaaqmohammed.AntiSplit.main.SignUtil; import com.j256.simplezip.ZipFileInput; import com.j256.simplezip.format.GeneralPurposeFlag; @@ -57,10 +58,11 @@ public class Merger { public interface LogListener { void onLog(String log); + void onLog(int resID); } - private static void extractAndLoad(Uri in, File cacheDir, Context context, List splits, ApkBundle bundle) throws IOException { + private static void extractAndLoad(Uri in, File cacheDir, Context context, List splits, ApkBundle bundle) throws IOException, MismatchedSplitsException, InterruptedException { boolean checkSplits = splits != null && !splits.isEmpty(); try (ZipFileInput zis = new ZipFileInput(FileUtils.getInputStream(in, context))) { ZipFileHeader header; @@ -71,43 +73,49 @@ private static void extractAndLoad(Uri in, File cacheDir, Context context, List< logMessage(MainActivity.rss.getString(R.string.skipping) + name + MainActivity.rss.getString(R.string.unselected)); else { File file = new File(cacheDir, name); - if (file.getCanonicalPath().startsWith(cacheDir.getCanonicalPath() + File.separator)) zis.readFileDataToFile(file); - else throw new IOException("Zip entry is outside of the target dir: " + name); + if (file.getCanonicalPath().startsWith(cacheDir.getCanonicalPath() + File.separator)) + zis.readFileDataToFile(file); + else + throw new IOException("Zip entry is outside of the target dir: " + name); logMessage("Extracted " + name); } - } else logMessage(MainActivity.rss.getString(R.string.skipping) + name + MainActivity.rss.getString(R.string.not_apk)); + } else + logMessage(MainActivity.rss.getString(R.string.skipping) + name + MainActivity.rss.getString(R.string.not_apk)); } - bundle.loadApkDirectory(cacheDir, false); + bundle.loadApkDirectory(cacheDir, false, context); + } catch (MismatchedSplitsException ignored) { } catch (Exception e) { - // If the above failed it did not copy any files + // If the above failed it probably did not copy any files // so might as well do it this way instead of trying unreliable methods to see if we need to do this // and possibly copying the file for no reason - if(DeviceSpecsUtil.zipFile == null) { + if (DeviceSpecsUtil.zipFile == null) { File input = new File(FileUtils.getPath(in, context)); boolean couldNotRead = !input.canRead(); - if(couldNotRead) FileUtils.copyFile(FileUtils.getInputStream(in, context), input = new File(cacheDir, input.getName())); + if (couldNotRead) + FileUtils.copyFile(FileUtils.getInputStream(in, context), input = new File(cacheDir, input.getName())); ZipFile zf = new ZipFile(input); extractZipFile(zf, checkSplits, splits, cacheDir); - if(couldNotRead) input.delete(); + if (couldNotRead) input.delete(); } else extractZipFile(DeviceSpecsUtil.zipFile, checkSplits, splits, cacheDir); - bundle.loadApkDirectory(cacheDir, false); + bundle.loadApkDirectory(cacheDir, false, context); } } private static void extractZipFile(ZipFile zf, boolean checkSplits, List splits, File cacheDir) throws IOException { Enumeration entries = zf.getEntries(); - while(entries.hasMoreElements()) { + while (entries.hasMoreElements()) { ZipArchiveEntry zae = entries.nextElement(); String name = zae.getName(); if (name.endsWith(".apk")) { if ((checkSplits && splits.contains(name))) logMessage(MainActivity.rss.getString(R.string.skipping) + name + MainActivity.rss.getString(R.string.unselected)); - else try(OutputStream os = FileUtils.getOutputStream(new File(cacheDir, name)); - InputStream is = zf.getInputStream(zae)) { + else try (OutputStream os = FileUtils.getOutputStream(new File(cacheDir, name)); + InputStream is = zf.getInputStream(zae)) { FileUtils.copyFile(is, os); } - } else logMessage(MainActivity.rss.getString(R.string.skipping) + name + MainActivity.rss.getString(R.string.not_apk)); + } else + logMessage(MainActivity.rss.getString(R.string.skipping) + name + MainActivity.rss.getString(R.string.not_apk)); } zf.close(); } @@ -116,7 +124,8 @@ public static void run(Uri in, File cacheDir, Uri out, Context context, List: No seleccionado Archivo XAPK detectado, asegurándose de que pueda extraerse correctamente Buscando archivos apk… - ReVanced Manager produce un error al intentar parchear APKs fusionados. El error no es un problema real y es producido incorrectamente por una biblioteca de terceros. Para la mayoría, usar la opción para seleccionar splits para las especificaciones de tu dispositivo lo solucionará. Si aún no funciona, lo más fácil es descargar una versión de ReVanced Manager con el error corregido. - Nota para ReVanced - Descargar ReVanced Manager corregido - Cancelar - Seleccionar + Cancelar + Seleccionar Directorio padre Última edición: No se puede acceder al directorio diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index ae4f5155..32831fa9 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -29,11 +29,8 @@ : Tidak dipilih File XAPK terdeteksi, sedang memastikan agar berkasnya bisa diekstraksi dengan baik Mencari berkas APK… - ReVanced Manager menghasilkan galat saat mencoba melakukan patch APK-APK yang dileburkan. Galat tersebut sebenarnya bukan masalah dan dihasilkan secara tidak benar oleh pustaka pihak ketiga. Bagi kebanyakan orang, menggunakan opsi untuk memilih berkas terpisah sesuai spesifikasi perangkat akan memperbaikinya. Jika masih tidak berhasil, hal termudah yang dapat dilakukan adalah mengunduh versi ReVanced Manager dengan galat yang telah diberantas. - Catatan untuk ReVanced - Unduh ReVanced Manager yang sudah diperbaiki - Batalkan - Pilih + Batalkan + Pilih Direktori Induk Terakhir kali disunting: Direktorinya tidak bisa diakses diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index cc336c8e..0b6d31ca 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -29,8 +29,8 @@ : Non selezionato Rilevato file con estensione XAPK, mi assicuro che possa essere estratto correttamente Ricerca file apk… - Annulla - Seleziona + Annulla + Seleziona Cartella Superiore Ultima modifica: Impossibile accedere alla cartella diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index be5d949f..5c78d724 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -5,12 +5,11 @@ Выбор архитектуру для вашего устройства Спрашивать где сохранить файл (если отключено, сохраняет APK в том же каталоге, из которого был Splits APK файл) Автоматический выбор в соответствии вашей архитектуры устройства - Отмена + Отмена Изменить цвет фона Изменить цвет текста - Выбрать + Выбрать Обнаружен файл XAPK, что гарантирует его правильное извлечение - Скачать исправленный ReVanced Manager Выбор ширину экрана для вашего устройства Включить журналы Доступ к каталогу невозможен @@ -24,11 +23,9 @@ Выберите (Split APK) для объединения/антиразделения Не удалось найти путь к выбранному файлу : Не APK-файл - Примечание для ReVanced Ничего не выбрано "Выходной каталог: " "Удалена запись в таблице : " - ReVanced Manager выдает ошибку при попытке исправить объединенные APKs. Эта ошибка не является реальной проблемой и неправильно создается сторонней библиотекой. Для большинства людей использование опции выбора разделения в соответствии со спецификациями вашего устройства решит проблему. Если по-прежнему не работает, проще всего загрузить версию ReVanced Manager с устраненной ошибкой. Санитарная обработка манифеста… Сохранение… Поиск apk-файлов… diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 578c747d..9eaa40dc 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -29,11 +29,8 @@ Seçilmedi XAPK dosyası tespit edildi, düzgün bir şekilde çıkarılabilmesi sağlanacak APK dosyası aranıyor… - ReVanced Manager, split APK\'ları patchlemeye çalışırken bir hata ortaya çıkıyor. Bu hata gerçek bir sorun değil ve üçüncü taraf bir kütüphaneden dolayı kaynaklanıyor. Çoğu kişi için, cihaz özellikleriniz için seçme seçeneğini kullanmak sorunu çözecektir. Yine de çalışmazsa yapılacak en kolay şey ReVanced Manager\'ın hatanın kaldırıldığı sürümü indirmektir. - ReVanced için not - Hatanın düzeltildiği ReVanced Manager\'ı indir - İptal et - Seç + İptal et + Seç Ana Klasör Son düzenlenme: Klasöre erişilemedi diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 2f93d156..da1d2dea 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -5,12 +5,11 @@ Вибір архітектури для вашого пристрою Запитувати де зберегти файл (якщо вимкнено, зберігає APK у тому ж каталозі, з якого був Splits APK файл) Автоматичний вибір відповідно до вашої архітектури пристрою - Відміна + Відміна Змінити колір тла Змінити колір тексту - Вибрати + Вибрати Виявлено файл XAPK, що гарантує його правильне вилучення - Завантажити виправлений ReVanced Manager Виберіть ширину екрана для Вашого пристрою Увімкнути журнали Доступ до каталогу неможливий @@ -24,11 +23,9 @@ Виберіть (Split APK) для обєднання/антирозділення Не вдалося знайти шлях до вибраного файлу : Не APK-файл - Примітка для ReVanced Нічого не вибрано "Вихідний каталог: " "Видалено запис у таблиці : " - ReVanced Manager видає помилку під час спроби виправити обєднані APKs. Ця помилка не є реальною проблемою та неправильно створюється сторонньою бібліотекою. Для більшості людей використання опції вибору поділу відповідно до специфікацій пристрою вирішить проблему. Якщо не працює, найпростіше завантажити версію ReVanced Manager з усуненою помилкою. Санітарна обробка маніфесту… Збереження… Пошук apk-файлів… diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 273d939c..81cb7704 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -29,11 +29,8 @@ : Unselected XAPK file detected, ensuring it can be extracted properly Searching apk files… - ReVanced Manager produces an error when attempting to patch merged APKs. The error is not an actual problem and is produced incorrectly by a third party library. For most people, using the option to select splits for your device specifications will fix it. If it still doesn\'t work, the easiest thing to do is download a version of ReVanced Manager with the error removed. - Note for ReVanced - Go to fixed ReVanced Manager - Cancel - Select + Cancel + Select Parent Directory Last edited: Directory cannot be accessed @@ -48,6 +45,10 @@ Check for update now No update found Settings + Close + The following splits (%1$s) have mismatched version codes. They are only language codes, so the app can run without them, but these languages will not work in the app. Do you want to continue with merging anyway? + Warning + " version code does not match that of base.apk" English Español