Как запустить команду termux в другом приложении?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как запустить команду termux в другом приложении?

Сообщение Anonymous »

Мне нужно запустить скрипт в termux в Java (я хочу сделать компилятор apk). Вот файл build_script.sh:

Код: Выделить всё

#!/data/data/com.termux/files/usr/bin/sh

# Додайте PATH
export PATH=$PATH:/data/data/com.termux/files/usr/bin

echo "=== Starting script ==="

pkg update -y
pkg upgrade -y
pkg install -y openjdk-17 dx ecj aapt apksigner termux-api

echo "=== Packages installed ==="

# Параметри
APP_NAME=$1
PACKAGE_NAME=$2
MAIN_ACTIVITY=$3
SOURCE_DIR=$4
BUILD_DIR=$5
OUTPUT_DIR=$6
MANIFEST_FILE="AndroidManifest.xml"
MAIN_ACTIVITY_CODE="
package $PACKAGE_NAME;

import android.app.Activity;
import android.os.Bundle;

public class $MAIN_ACTIVITY extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Тут можна додати ваш код
}
}
"

echo "=== Parameters set ==="

MANIFEST_CONTENT="










"

# Створення необхідних директорій
mkdir -p $SOURCE_DIR/$PACKAGE_NAME
mkdir -p $BUILD_DIR
mkdir -p $OUTPUT_DIR
mkdir -p res/mipmap

echo "=== Directories created ==="

# Створення основного Java файлу
echo "$MAIN_ACTIVITY_CODE" > $SOURCE_DIR/$PACKAGE_NAME/$MAIN_ACTIVITY.java

# Створення AndroidManifest.xml
echo "$MANIFEST_CONTENT" > $MANIFEST_FILE

# Створення placeholder іконок
touch res/mipmap/ic_launcher.png
touch res/mipmap/ic_launcher_round.png

echo "=== Files created ==="

# Перевірка наявності файлів
echo "=== Checking files ==="
ls -R $SOURCE_DIR
ls -R res
cat $MANIFEST_FILE

# Компіляція Java-коду
find $SOURCE_DIR -name "*.java" >  sources.txt
ecj -d $BUILD_DIR @sources.txt
if [ $? -ne 0 ];то echo "Помилка компіляції Java файлів"
then exit 1
fi

# Перетворення класів в DEX файл
dx --dex --output=$BUILD_DIR/classes.dex $BUILD_DIR
if [ $? -ne 0 ];то echo "Помилка перетворення класів в DEX файл"
then exit 1
fi

# Створення APK файлу
aapt package -f -m -F $OUTPUT_DIR/$APP_NAME.unsigned.apk -M $MANIFEST_FILE -S res -I $PREFIX/share/aapt/android.jar
if [ $? -ne 0 ];то echo "Помилка створення APK файлу"
then exit 1
fi

# Додавання DEX файлу в APK
aapt add $OUTPUT_DIR/$APP_NAME.unsigned.apk $BUILD_DIR/classes.dex
if [ $? -ne 0 ];то echo "Помилка додавання DEX файлу в APK"
then exit 1
fi

# Підписання APK
apksigner sign --ks my-release-key.jks --out $OUTPUT_DIR/$APP_NAME.apk $OUTPUT_DIR/$APP_NAME.unsigned.apk
if [ $? -ne 0 ];то echo "Помилка підписання APK файлу"
then exit 1
fi

# Очищення
rm sources.txt
rm -rf $BUILD_DIR

echo "APK створено: $OUTPUT_DIR/$APP_NAME.apk"
Также созданы методы Java для запуска кода:

Код: Выделить всё

private static final int REQUEST_CODE = 123;
public static final String SCRIPT_NAME = "build_script.sh";
............
private void runTermuxCommand() {
try {
// Шлях до скопійованого скрипта
File scriptFile = new File(getExternalFilesDir(null), SCRIPT_NAME);

// Додати права на виконання скрипта
scriptFile.setExecutable(true);

// Параметри для скрипта
String appName = "MyApp";
String packageName = "com.example.myapp";
String mainActivity = "MainActivity";
String sourceDir = "src";
String buildDir = "build";
String outputDir = "/storage/emulated/0/Download/GenCoreLite";

// Команда для виконання скрипта з параметрами
String command = String.format(
"sh %s %s %s %s %s %s %s",
scriptFile.getAbsolutePath(), appName, packageName, mainActivity, sourceDir, buildDir, outputDir
);

Process process = Runtime.getRuntime().exec(new String[]{"sh", "-c", command});

// Отримати вивід
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder output = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
output.append(line).append("\n");
}

// Отримати помилки
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
StringBuilder errorOutput = new StringBuilder();
while ((line = errorReader.readLine()) != null) {
errorOutput.append(line).append("\n");
}

// Дочекатися завершення процесу
int exitCode = process.waitFor();

// Показати вивід та помилки
runOnUiThread(() -> {
editor.setText("Output:\n" + output.toString() + "\nErrors:\n" + errorOutput.toString());
Toast.makeText(this, "Termux command finished with exit code: " + exitCode, Toast.LENGTH_LONG).show();
});

} catch (Exception e) {
Log.e("TermuxCommand", "Error running Termux command", e);
Toast.makeText(this, "Error running Termux command: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE) {
if (grantResults.length > 0 &&  grantResults[0] == PackageManager.PERMISSION_GRANTED) {
runTermuxCommand();
} else {
Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
}
}
}
private void copyScriptToStorage() throws Exception {
// Copy the script from assets to internal storage
InputStream inputStream = getAssets().open(SCRIPT_NAME);
File outFile = new File(getExternalFilesDir(null), SCRIPT_NAME);
FileOutputStream outputStream = new FileOutputStream(outFile);

byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}

inputStream.close();
outputStream.close();
}

}
................
compile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
copyScriptToStorage();
runTermuxCommand();
} catch (Exception e) {
Log.e("TermuxCommand", "Error copying or running Termux command", e);
}
}
});

Также я добавил разрешения в androiManifest: В этом случае я добавил разрешения для termux (для пакета com.termux), и мое приложение может запускать команду termux из моего приложения:
Изображение
`/storage/emulated/0/Android/data/com.ccs.gencorelite/files/build_script.sh[8] : pkg: недоступен или не найден
I/System.out: /storage/emulated/0/Android/data/com.ccs.gencorelite/files/build_script.sh[9]: pkg: недоступен или не найден
I/System.out: /storage/emulated/0/Android/data/com.ccs.gencorelite/files/build_script.sh[10]: pkg : недоступен или не найден
...............
`
Итак, у меня проблемы с некоторыми частями команд то есть прав нету и команду не нашел, в чем проблема?

Подробнее здесь: https://stackoverflow.com/questions/785 ... nother-app
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как запустить команду termux в другом приложении?
    Anonymous » » в форуме Android
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Termux сообщает «Нет такого файла или каталога» для bash даже после использования termux-fix-shebang
    Anonymous » » в форуме Android
    0 Ответы
    164 Просмотры
    Последнее сообщение Anonymous
  • Как запустить команду в команде termux из другого приложения
    Anonymous » » в форуме JAVA
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous
  • Как запустить Termux через другое приложение для Android?
    Anonymous » » в форуме Android
    0 Ответы
    53 Просмотры
    Последнее сообщение Anonymous
  • Попытка запустить postgresql в Ubuntu в termux
    Anonymous » » в форуме Linux
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous

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