mirror of https://github.com/termux/termux-app
Revert "Include bootstrap zips as shared libraries"
This reverts commit e334db0c5b
.
This commit is contained in:
parent
0e8b83c09f
commit
18cb23ec16
|
@ -8,7 +8,6 @@ build/
|
||||||
*.so
|
*.so
|
||||||
.externalNativeBuild
|
.externalNativeBuild
|
||||||
.cxx
|
.cxx
|
||||||
*.zip
|
|
||||||
|
|
||||||
# Crashlytics configuations
|
# Crashlytics configuations
|
||||||
com_crashlytics_export_strings.xml
|
com_crashlytics_export_strings.xml
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
plugins {
|
apply plugin: 'com.android.application'
|
||||||
id "com.android.application"
|
|
||||||
}
|
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 28
|
compileSdkVersion 28
|
||||||
|
@ -28,7 +26,6 @@ android {
|
||||||
ndk {
|
ndk {
|
||||||
abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
|
abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
|
@ -56,12 +53,6 @@ android {
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
|
|
||||||
externalNativeBuild {
|
|
||||||
ndkBuild {
|
|
||||||
path "src/main/cpp/Android.mk"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
@ -73,69 +64,3 @@ task versionName {
|
||||||
print android.defaultConfig.versionName
|
print android.defaultConfig.versionName
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def downloadBootstrap(String arch, String expectedChecksum, int version) {
|
|
||||||
def digest = java.security.MessageDigest.getInstance("SHA-256")
|
|
||||||
|
|
||||||
def localUrl = "src/main/cpp/bootstrap-legacy-" + arch + ".zip"
|
|
||||||
def file = new File(projectDir, localUrl)
|
|
||||||
if (file.exists()) {
|
|
||||||
def buffer = new byte[8192]
|
|
||||||
def input = new FileInputStream(file)
|
|
||||||
while (true) {
|
|
||||||
def readBytes = input.read(buffer)
|
|
||||||
if (readBytes < 0) break
|
|
||||||
digest.update(buffer, 0, readBytes)
|
|
||||||
}
|
|
||||||
def checksum = new BigInteger(1, digest.digest()).toString(16)
|
|
||||||
if (checksum == expectedChecksum) {
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
logger.quiet("Deleting old local file with wrong hash: " + localUrl)
|
|
||||||
file.delete()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def remoteUrl = "https://bintray.com/termux/bootstrap/download_file?file_path=legacy%2Fbootstrap-" + arch + "-v" + version + ".zip"
|
|
||||||
logger.quiet("Downloading " + remoteUrl + " ...")
|
|
||||||
|
|
||||||
file.parentFile.mkdirs()
|
|
||||||
def out = new BufferedOutputStream(new FileOutputStream(file))
|
|
||||||
|
|
||||||
def connection = new URL(remoteUrl).openConnection()
|
|
||||||
connection.setInstanceFollowRedirects(true)
|
|
||||||
def digestStream = new java.security.DigestInputStream(connection.inputStream, digest)
|
|
||||||
out << digestStream
|
|
||||||
out.close()
|
|
||||||
|
|
||||||
def checksum = new BigInteger(1, digest.digest()).toString(16)
|
|
||||||
if (checksum != expectedChecksum) {
|
|
||||||
file.delete()
|
|
||||||
throw new GradleException("Wrong checksum for " + remoteUrl + ": expected: " + expectedChecksum + ", actual: " + checksum)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
clean {
|
|
||||||
doLast {
|
|
||||||
def tree = fileTree(new File(projectDir, 'src/main/cpp'))
|
|
||||||
tree.include 'bootstrap-*.zip'
|
|
||||||
tree.each { it.delete() }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task downloadBootstraps(){
|
|
||||||
doLast {
|
|
||||||
def version = 1
|
|
||||||
downloadBootstrap("aarch64", "1386ae83d0ac5be19016d9ed2776a1c7bec40e04031041e04229158acc3a63a6", version)
|
|
||||||
downloadBootstrap("arm", "412add7f71e185ab204da0446e5cd3187fbdde705ce18a0fa695ffc9b7a8302f", version)
|
|
||||||
downloadBootstrap("i686", "c84c1aa780aea70c41e1a4f827fd4974015ca962a936f95b53d37eacc72aabe3", version)
|
|
||||||
downloadBootstrap("x86_64", "d2ff5338d1f506dac8ef11df9398a854bb9ec11233ef0387103d40641696bcca", version)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
afterEvaluate {
|
|
||||||
android.applicationVariants.all { variant ->
|
|
||||||
variant.javaCompiler.dependsOn(downloadBootstraps)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
LOCAL_PATH:= $(call my-dir)
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
LOCAL_MODULE := libtermux-bootstrap
|
|
||||||
LOCAL_SRC_FILES := termux-bootstrap-zip.S termux-bootstrap.c
|
|
||||||
include $(BUILD_SHARED_LIBRARY)
|
|
|
@ -1,18 +0,0 @@
|
||||||
.global blob
|
|
||||||
.global blob_size
|
|
||||||
.section .rodata
|
|
||||||
blob:
|
|
||||||
#if defined __i686__
|
|
||||||
.incbin "bootstrap-legacy-i686.zip"
|
|
||||||
#elif defined __x86_64__
|
|
||||||
.incbin "bootstrap-legacy-x86_64.zip"
|
|
||||||
#elif defined __aarch64__
|
|
||||||
.incbin "bootstrap-legacy-aarch64.zip"
|
|
||||||
#elif defined __arm__
|
|
||||||
.incbin "bootstrap-legacy-arm.zip"
|
|
||||||
#else
|
|
||||||
# error Unsupported arch
|
|
||||||
#endif
|
|
||||||
1:
|
|
||||||
blob_size:
|
|
||||||
.int 1b - blob
|
|
|
@ -1,11 +0,0 @@
|
||||||
#include <jni.h>
|
|
||||||
|
|
||||||
extern jbyte blob[];
|
|
||||||
extern int blob_size;
|
|
||||||
|
|
||||||
JNIEXPORT jbyteArray JNICALL Java_com_termux_app_TermuxInstaller_getZip(JNIEnv *env, __attribute__((__unused__)) jobject This)
|
|
||||||
{
|
|
||||||
jbyteArray ret = (*env)->NewByteArray(env, blob_size);
|
|
||||||
(*env)->SetByteArrayRegion(env, ret, 0, blob_size, blob);
|
|
||||||
return ret;
|
|
||||||
}
|
|
|
@ -16,7 +16,6 @@ import com.termux.R;
|
||||||
import com.termux.terminal.EmulatorDebug;
|
import com.termux.terminal.EmulatorDebug;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -39,7 +38,7 @@ import java.util.zip.ZipInputStream;
|
||||||
* <p/>
|
* <p/>
|
||||||
* (3) A staging folder, $STAGING_PREFIX, is {@link #deleteFolder(File)} if left over from broken installation below.
|
* (3) A staging folder, $STAGING_PREFIX, is {@link #deleteFolder(File)} if left over from broken installation below.
|
||||||
* <p/>
|
* <p/>
|
||||||
* (4) The zip file is loaded from a shared library.
|
* (4) The architecture is determined and an appropriate bootstrap zip url is determined in {@link #determineZipUrl()}.
|
||||||
* <p/>
|
* <p/>
|
||||||
* (5) The zip, containing entries relative to the $PREFIX, is is downloaded and extracted by a zip input stream
|
* (5) The zip, containing entries relative to the $PREFIX, is is downloaded and extracted by a zip input stream
|
||||||
* continuously encountering zip file entries:
|
* continuously encountering zip file entries:
|
||||||
|
@ -83,8 +82,8 @@ final class TermuxInstaller {
|
||||||
final byte[] buffer = new byte[8096];
|
final byte[] buffer = new byte[8096];
|
||||||
final List<Pair<String, String>> symlinks = new ArrayList<>(50);
|
final List<Pair<String, String>> symlinks = new ArrayList<>(50);
|
||||||
|
|
||||||
final byte[] zipBytes = loadZipBytes();
|
final URL zipUrl = determineZipUrl();
|
||||||
try (ZipInputStream zipInput = new ZipInputStream(new ByteArrayInputStream(zipBytes))) {
|
try (ZipInputStream zipInput = new ZipInputStream(zipUrl.openStream())) {
|
||||||
ZipEntry zipEntry;
|
ZipEntry zipEntry;
|
||||||
while ((zipEntry = zipInput.getNextEntry()) != null) {
|
while ((zipEntry = zipInput.getNextEntry()) != null) {
|
||||||
if (zipEntry.getName().equals("SYMLINKS.txt")) {
|
if (zipEntry.getName().equals("SYMLINKS.txt")) {
|
||||||
|
@ -168,13 +167,34 @@ final class TermuxInstaller {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] loadZipBytes() {
|
/** Get bootstrap zip url for this systems cpu architecture. */
|
||||||
// Only load the shared library when necessary to save memory usage.
|
private static URL determineZipUrl() throws MalformedURLException {
|
||||||
System.loadLibrary("termux-bootstrap");
|
String archName = determineTermuxArchName();
|
||||||
return getZip();
|
String url = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
|
||||||
|
? "https://termux.org/bootstrap-" + archName + ".zip"
|
||||||
|
: "https://termux.net/bootstrap/bootstrap-" + archName + ".zip";
|
||||||
|
return new URL(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static native byte[] getZip();
|
private static String determineTermuxArchName() {
|
||||||
|
// Note that we cannot use System.getProperty("os.arch") since that may give e.g. "aarch64"
|
||||||
|
// while a 64-bit runtime may not be installed (like on the Samsung Galaxy S5 Neo).
|
||||||
|
// Instead we search through the supported abi:s on the device, see:
|
||||||
|
// http://developer.android.com/ndk/guides/abis.html
|
||||||
|
// Note that we search for abi:s in preferred order (the ordering of the
|
||||||
|
// Build.SUPPORTED_ABIS list) to avoid e.g. installing arm on an x86 system where arm
|
||||||
|
// emulation is available.
|
||||||
|
for (String androidArch : Build.SUPPORTED_ABIS) {
|
||||||
|
switch (androidArch) {
|
||||||
|
case "arm64-v8a": return "aarch64";
|
||||||
|
case "armeabi-v7a": return "arm";
|
||||||
|
case "x86_64": return "x86_64";
|
||||||
|
case "x86": return "i686";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new RuntimeException("Unable to determine arch from Build.SUPPORTED_ABIS = " +
|
||||||
|
Arrays.toString(Build.SUPPORTED_ABIS));
|
||||||
|
}
|
||||||
|
|
||||||
/** Delete a folder and all its content or throw. Don't follow symlinks. */
|
/** Delete a folder and all its content or throw. Don't follow symlinks. */
|
||||||
static void deleteFolder(File fileOrDirectory) throws IOException {
|
static void deleteFolder(File fileOrDirectory) throws IOException {
|
||||||
|
|
Loading…
Reference in New Issue