mirror of https://github.com/termux/termux-app
236 lines
8.1 KiB
Groovy
236 lines
8.1 KiB
Groovy
plugins {
|
|
id "com.android.application"
|
|
}
|
|
|
|
android {
|
|
flavorDimensions "version"
|
|
productFlavors {
|
|
current {
|
|
dimension "version"
|
|
targetSdkVersion project.properties.targetSdkVersion.toInteger()
|
|
}
|
|
updated {
|
|
dimension "version"
|
|
targetSdkVersion project.properties.updatedTargetSdkVersion.toInteger()
|
|
}
|
|
}
|
|
|
|
compileSdkVersion project.properties.compileSdkVersion.toInteger()
|
|
ndkVersion project.properties.ndkVersion
|
|
|
|
dependencies {
|
|
implementation "androidx.annotation:annotation:1.2.0"
|
|
implementation "androidx.core:core:1.5.0-rc01"
|
|
implementation "androidx.drawerlayout:drawerlayout:1.1.1"
|
|
implementation "androidx.preference:preference:1.1.1"
|
|
implementation "androidx.viewpager:viewpager:1.0.0"
|
|
implementation "com.google.guava:guava:24.1-jre"
|
|
implementation "io.noties.markwon:core:$markwonVersion"
|
|
implementation "io.noties.markwon:ext-strikethrough:$markwonVersion"
|
|
implementation "io.noties.markwon:linkify:$markwonVersion"
|
|
implementation "io.noties.markwon:recycler:$markwonVersion"
|
|
|
|
implementation project(":terminal-view")
|
|
implementation project(":termux-shared")
|
|
}
|
|
|
|
defaultConfig {
|
|
applicationId "com.termux"
|
|
minSdkVersion project.properties.minSdkVersion.toInteger()
|
|
versionCode 112
|
|
versionName "0.112"
|
|
|
|
manifestPlaceholders.TERMUX_PACKAGE_NAME = "com.termux"
|
|
manifestPlaceholders.TERMUX_APP_NAME = "Termux"
|
|
manifestPlaceholders.TERMUX_API_APP_NAME = "Termux:API"
|
|
manifestPlaceholders.TERMUX_BOOT_APP_NAME = "Termux:Boot"
|
|
manifestPlaceholders.TERMUX_FLOAT_APP_NAME = "Termux:Float"
|
|
manifestPlaceholders.TERMUX_STYLING_APP_NAME = "Termux:Styling"
|
|
manifestPlaceholders.TERMUX_TASKER_APP_NAME = "Termux:Tasker"
|
|
manifestPlaceholders.TERMUX_WIDGET_APP_NAME = "Termux:Widget"
|
|
|
|
externalNativeBuild {
|
|
ndkBuild {
|
|
cFlags "-std=c11", "-Wall", "-Wextra", "-Werror", "-Os", "-fno-stack-protector", "-Wl,--gc-sections"
|
|
}
|
|
}
|
|
|
|
ndk {
|
|
abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
|
|
}
|
|
|
|
}
|
|
|
|
signingConfigs {
|
|
debug {
|
|
storeFile file('dev_keystore.jks')
|
|
keyAlias 'alias'
|
|
storePassword 'xrj45yWGLbsO7W0v'
|
|
keyPassword 'xrj45yWGLbsO7W0v'
|
|
}
|
|
}
|
|
|
|
buildTypes {
|
|
release {
|
|
minifyEnabled true
|
|
shrinkResources true
|
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
|
}
|
|
|
|
debug {
|
|
signingConfig signingConfigs.debug
|
|
}
|
|
}
|
|
|
|
compileOptions {
|
|
sourceCompatibility JavaVersion.VERSION_1_8
|
|
targetCompatibility JavaVersion.VERSION_1_8
|
|
}
|
|
|
|
externalNativeBuild {
|
|
ndkBuild {
|
|
path "src/main/cpp/Android.mk"
|
|
}
|
|
}
|
|
|
|
lintOptions {
|
|
disable 'ProtectedPermissions'
|
|
}
|
|
|
|
testOptions {
|
|
unitTests {
|
|
includeAndroidResources = true
|
|
}
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
testImplementation "junit:junit:4.13.2"
|
|
testImplementation "org.robolectric:robolectric:4.4"
|
|
}
|
|
|
|
task versionName {
|
|
doLast {
|
|
print android.defaultConfig.versionName
|
|
}
|
|
}
|
|
|
|
def expandBootstrap(File bootstrapZip, String expectedChecksum, String arch) {
|
|
def doneMarkerFile = new File(bootstrapZip.getAbsolutePath() + "." + expectedChecksum + ".done")
|
|
if (doneMarkerFile.exists()) return
|
|
|
|
def archDirName
|
|
if (arch == "aarch64") archDirName = "arm64-v8a";
|
|
if (arch == "arm") archDirName = "armeabi-v7a";
|
|
if (arch == "i686") archDirName = "x86";
|
|
if (arch == "x86_64") archDirName = "x86_64";
|
|
|
|
def outputPath = project.getRootDir().getAbsolutePath() + "/app/src/main/jniLibs/" + archDirName + "/"
|
|
def outputDir = new File(outputPath).getAbsoluteFile()
|
|
if (!outputDir.exists()) outputDir.mkdirs()
|
|
|
|
def symlinksFile = new File(outputDir, "libsymlinks.so").getAbsoluteFile()
|
|
if (symlinksFile.exists()) symlinksFile.delete();
|
|
|
|
def mappingsFile = new File(outputDir, "libfiles.so").getAbsoluteFile()
|
|
if (mappingsFile.exists()) mappingsFile.delete()
|
|
mappingsFile.createNewFile()
|
|
def mappingsFileWriter = new BufferedWriter(new FileWriter(mappingsFile))
|
|
|
|
def counter = 100
|
|
new java.util.zip.ZipInputStream(new FileInputStream(bootstrapZip)).withCloseable { zipInput ->
|
|
def zipEntry
|
|
while ((zipEntry = zipInput.getNextEntry()) != null) {
|
|
if (zipEntry.getName() == "SYMLINKS.txt") {
|
|
zipInput.transferTo(new FileOutputStream(symlinksFile))
|
|
} else if (!zipEntry.isDirectory()) {
|
|
def soName = "lib" + counter + ".so"
|
|
def targetFile = new File(outputDir, soName).getAbsoluteFile()
|
|
|
|
println "target file path is ${targetFile}"
|
|
|
|
try {
|
|
zipInput.transferTo(new FileOutputStream(targetFile))
|
|
} catch (Exception e) {
|
|
println "Error ${e}"
|
|
}
|
|
|
|
|
|
mappingsFileWriter.writeLine(soName + "←" + zipEntry.getName())
|
|
counter++
|
|
}
|
|
}
|
|
}
|
|
|
|
mappingsFileWriter.close()
|
|
doneMarkerFile.createNewFile()
|
|
}
|
|
|
|
def downloadBootstrap(String arch, String expectedChecksum, String version, boolean isPackagesInApk) {
|
|
def digest = java.security.MessageDigest.getInstance("SHA-256")
|
|
|
|
def file = isPackagesInApk ? new File(project.buildDir, "./gradle/bootstrap-" + arch + "-" + version + ".zip")
|
|
: new File(projectDir, "src/main/cpp/bootstrap-" + arch + ".zip");
|
|
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) {
|
|
if (isPackagesInApk) expandBootstrap(file, expectedChecksum, arch)
|
|
return
|
|
} else {
|
|
logger.quiet("Deleting old local file with wrong hash: " + file)
|
|
file.delete()
|
|
}
|
|
}
|
|
|
|
def remoteUrl = "https://github.com/termux/termux-packages/releases/download/bootstrap-" + version + "/bootstrap-" + arch + ".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)
|
|
}
|
|
if (isPackagesInApk) expandBootstrap(file, expectedChecksum, arch)
|
|
}
|
|
|
|
clean {
|
|
doLast {
|
|
def tree = fileTree(new File(projectDir, 'src/main/cpp'))
|
|
tree.include 'bootstrap-*.zip'
|
|
tree.each { it.delete() }
|
|
}
|
|
}
|
|
|
|
task downloadBootstraps() {
|
|
boolean isPackagesInApk = getGradle().getStartParameter().getTaskRequests().toString().contains("Updated");
|
|
doLast {
|
|
def version = "2021.04.13-r1"
|
|
downloadBootstrap("aarch64", "ff82e5755d947cd1f3e0b30916d125c6ddd8ba3254801ca7499d73653417e158", version, isPackagesInApk)
|
|
downloadBootstrap("arm", "53a7df2d6d0a36a8c9ab5259c8b5457c93b8bae8aec2321a470236b6da54e59a", version, isPackagesInApk)
|
|
downloadBootstrap("i686", "f0e1399a13ebed6c5229fde161f9848d9f5eeae7b8cd82f31250a813b52e371", version, isPackagesInApk)
|
|
downloadBootstrap("x86_64", "e36c4d8c933dc12b3f48937b7747c7a4dcfaa70f0dd89ad5e8b4465930075ae9", version, isPackagesInApk)
|
|
}
|
|
}
|
|
|
|
afterEvaluate {
|
|
android.applicationVariants.all { variant ->
|
|
variant.javaCompileProvider.get().dependsOn(downloadBootstraps)
|
|
}
|
|
}
|