Я хочу создать игровой движок для Android (ядро визуального романа).
Создал этот код для компиляции в файл dex и т. д. и архивирования в apk. Используя этот код, у меня возникли некоторые проблемы. Вот код
Может быть, вы знаете несколько примеров того, как создать apk-файл в ОС Android, потому что, если у нас нет root-доступа - я вижу много ошибок, таких как: доступ запрещен или разрешение отсутствует. отказано?
Я хочу создать игровой движок для Android (ядро визуального романа). Создал этот код для компиляции в файл dex и т. д. и архивирования в apk. Используя этот код, у меня возникли некоторые проблемы. Вот код [code]import android.content.Context; import android.os.Environment; import android.widget.Toast;
File valuesDir = new File(resDir, "values"); if (!valuesDir.mkdirs()) { return null; }
File stringsFile = new File(valuesDir, "strings.xml"); try (FileWriter writer = new FileWriter(stringsFile)) { writer.write("\n" + " MyApp\n" + ""); }
return projectDir; }
private void deleteRecursive(File fileOrDirectory) { if (fileOrDirectory.isDirectory()) { for (File child : fileOrDirectory.listFiles()) { deleteRecursive(child); } } fileOrDirectory.delete(); }
private boolean compileToDex(File projectDir) { try { File classesOutputDir = new File(context.getCacheDir(), "classes"); if (classesOutputDir.exists()) { deleteRecursive(classesOutputDir); } classesOutputDir.mkdirs();
File srcDir = new File(projectDir, "app/src/main/java"); List sourceFiles = getJavaFiles(srcDir); List sourceFilePaths = new ArrayList(); for (File file : sourceFiles) { sourceFilePaths.add(file.getAbsolutePath()); }
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); List compileOptions = new ArrayList(); compileOptions.add("-d"); compileOptions.add(classesOutputDir.getAbsolutePath()); compileOptions.addAll(sourceFilePaths);
int compilationResult = compiler.run(null, null, null, compileOptions.toArray(new String[0])); if (compilationResult != 0) { return false; }
File dexOutputDir = new File(context.getCacheDir(), "dex"); if (dexOutputDir.exists()) { deleteRecursive(dexOutputDir); } dexOutputDir.mkdirs();
File dexFile = new File(dexOutputDir, "classes.dex");
private List getJavaFiles(File dir) { List javaFiles = new ArrayList(); File[] files = dir.listFiles(); if (files != null) { for (File file : files) { if (file.isDirectory()) { javaFiles.addAll(getJavaFiles(file)); } else if (file.getName().endsWith(".java")) { javaFiles.add(file); } } } return javaFiles; }
private boolean packIntoApk(File projectDir) { try { File dexFile = new File(context.getCacheDir(), "dex/classes.dex"); if (!dexFile.exists()) { return false; }
File apkFile = new File(projectDir, "app.apk"); try (FileOutputStream fos = new FileOutputStream(apkFile); ZipOutputStream zos = new ZipOutputStream(fos)) {
ZipEntry manifestEntry = new ZipEntry("AndroidManifest.xml"); zos.putNextEntry(manifestEntry); try (InputStream in = new FileInputStream(new File(projectDir, "app/src/main/AndroidManifest.xml"))) { byte[] buffer = new byte[1024]; int length; while ((length = in.read(buffer)) > 0) { zos.write(buffer, 0, length); } } zos.closeEntry();
ZipEntry dexEntry = new ZipEntry("classes.dex"); zos.putNextEntry(dexEntry); try (InputStream in = new FileInputStream(dexFile)) { byte[] buffer = new byte[1024]; int length; while ((length = in.read(buffer)) > 0) { zos.write(buffer, 0, length); } } zos.closeEntry(); }
return true; } catch (IOException e) { e.printStackTrace(); return false; } } } [/code] Я использую пользовательские библиотеки: [code]implementation('com.zeoflow:jx:1.2.1') { exclude group: 'jakarta.activation', module: 'jakarta.activation-api' } implementation('com.android.tools.build:builder:8.4.0') { exclude group: 'com.sun.activation', module: 'javax.activation' } [/code] Может быть, вы знаете несколько примеров того, как создать apk-файл в ОС Android, потому что, если у нас нет root-доступа - я вижу много ошибок, таких как: доступ запрещен или разрешение отсутствует. отказано?