plugins { id "com.android.application" } android { compileSdkVersion 28 ndkVersion '21.1.6352462' dependencies { implementation "androidx.annotation:annotation:1.1.0" implementation "androidx.viewpager:viewpager:1.0.0" implementation "androidx.drawerlayout:drawerlayout:1.0.0" implementation project(":terminal-view") } defaultConfig { applicationId "com.termux" minSdkVersion 24 targetSdkVersion 28 versionCode 94 versionName "0.94" 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" } } testOptions { unitTests { includeAndroidResources = true } } } dependencies { testImplementation 'junit:junit:4.13' testImplementation 'org.robolectric:robolectric:4.3.1' } task versionName { doLast { 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-" + 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=bootstrap-" + 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 = 21 downloadBootstrap("aarch64", "9d362f1396e3a7d6987f09b8c3886c5aad514ab195ec7874a32000dc3b9cecde", version) downloadBootstrap("arm", "3c2f2ca9424fc984a4df54a3f9b38db3413b635ba39b89dfd8c753418730f719", version) downloadBootstrap("i686", "87afbd0fe6ebdc3abd9f2e5bc6136dbbf49991e485c9e9b03c4fe0149543ed7d", version) downloadBootstrap("x86_64", "bc91e5524d516cbe34b2ef082f6ebda1146457c8fa0373d06f7a1bb0c7be41df", version) } } afterEvaluate { android.applicationVariants.all { variant -> variant.javaCompileProvider.get().dependsOn(downloadBootstraps) } }