I need to launch script in termux in java (i want to make apk compiler). Here is build_script.sh file:
#!/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="
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="$PACKAGE_NAME">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="$APP_NAME"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApp">
<activity android:name=".$MAIN_ACTIVITY">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
"
# Створення необхідних директорій
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"
Also made Java methods to run code:
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);
}
}
});
Also i added permissions into androiManifest:
<uses-permission android:name="com.termux.permission.RUN_COMMAND" />
<uses-permission android:name="com.termux.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.termux.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
In this case i added perms for termux and it works not corectly:
`/storage/emulated/0/Android/data/com.ccs.gencorelite/files/build_script.sh[8]: pkg: inaccessible or not found
I/System.out: /storage/emulated/0/Android/data/com.ccs.gencorelite/files/build_script.sh[9]: pkg: inaccessible or not found
I/System.out: /storage/emulated/0/Android/data/com.ccs.gencorelite/files/build_script.sh[10]: pkg: inaccessible or not found
……………
`
So, i have troubles with some parts of commands that is have not perms and command didnt find, what trouble with?