//file:noinspection DependencyNotationArgument import groovy.json.JsonBuilder import groovy.json.JsonSlurper plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-kapt' id 'kotlin-parcelize' id 'img-optimizer' id 'com.yanzhenjie.andserver' //AspectJX: https://github.com/wurensen/gradle_plugin_android_aspectjx //id "io.github.wurensen.android-aspectjx" version "3.3.2" } def keyProps = new Properties() def keyPropsFile = rootProject.file('keystore/keystore.properties') if (keyPropsFile.exists()) { keyProps.load(new FileInputStream(keyPropsFile)) } //打包时,记得设置true启用 if (isNeedPackage.toBoolean() && isUseBooster.toBoolean()) { apply plugin: 'com.didiglobal.booster' } android { // 禁用过时 API 警告 configure(allprojects) { gradle.projectsEvaluated { tasks.withType(JavaCompile).tap { configureEach { options.compilerArgs << "-Xlint:-removal" } } } } buildToolsVersion build_versions.build_tools compileSdkVersion build_versions.target_sdk testOptions { unitTests.returnDefaultValues = true } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } buildFeatures { viewBinding true } //编译日期 def buildDate = new Date().format("yyMMdd", TimeZone.getTimeZone("GMT+08")) //编译时间 def buildTime = new Date().format("yyyy-MM-dd HH:mm:ss", TimeZone.getTimeZone("GMT+08")) //Git 的 Commit ID def gitCommitId = getGitCommitId() defaultConfig { applicationId "com.idormy.sms.forwarder" minSdkVersion build_versions.min_sdk targetSdkVersion build_versions.target_sdk versionCode build_versions.version_code versionName = "${build_versions.version_name}.${buildDate}" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" buildConfigField "String", "BUILD_TIME", "\"${buildTime}\"" buildConfigField "String", "GIT_COMMIT_ID", "\"${gitCommitId}\"" multiDexEnabled true //vectorDrawables.useSupportLibrary = true javaCompileOptions { annotationProcessorOptions { arguments = [moduleName: project.getName()] } } ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } signingConfigs { release { keyAlias keyProps['keyAlias'] keyPassword keyProps['keyPassword'] storeFile keyProps['storeFile'] ? file(keyProps['storeFile']) : null storePassword keyProps['storePassword'] } debug { keyAlias keyProps['keyAlias'] keyPassword keyProps['keyPassword'] storeFile keyProps['storeFile'] ? file(keyProps['storeFile']) : null storePassword keyProps['storePassword'] } } buildTypes { release { // 调试模式开关 debuggable false jniDebuggable false // 移除无用的资源 shrinkResources true // 代码混淆开关 minifyEnabled true // 混淆配置 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' if (isNeedPackage.toBoolean()) { signingConfig signingConfigs.release if (file('local.properties').exists()) { Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) def appID = properties.getProperty("APP_ID_UMENG") if (appID != null) { buildConfigField "String", "APP_ID_UMENG", appID } else { buildConfigField "String", "APP_ID_UMENG", '"60254fc7425ec25f10f4293e"' } } else { buildConfigField "String", "APP_ID_UMENG", '"60254fc7425ec25f10f4293e"' } } else { signingConfig signingConfigs.debug buildConfigField "String", "APP_ID_UMENG", '"60254fc7425ec25f10f4293e"' } } debug { // 调试模式开关 debuggable true jniDebuggable true // 移除无用的资源 shrinkResources true // 代码混淆开关 minifyEnabled true // 混淆配置 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' if (isNeedPackage.toBoolean()) { signingConfig signingConfigs.release if (file('local.properties').exists()) { Properties properties = new Properties() properties.load(project.rootProject.file('local.properties').newDataInputStream()) def appID = properties.getProperty("APP_ID_UMENG") if (appID != null) { buildConfigField "String", "APP_ID_UMENG", appID } else { buildConfigField "String", "APP_ID_UMENG", '"60254fc7425ec25f10f4293e"' } } else { buildConfigField "String", "APP_ID_UMENG", '"60254fc7425ec25f10f4293e"' } } else { signingConfig signingConfigs.debug buildConfigField "String", "APP_ID_UMENG", '"60254fc7425ec25f10f4293e"' } } } //ABI配置——按CPU架构分别打包 splits { abi { enable true reset() include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' universalApk true } } def abiCodes = ['universal': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'x86': 4, 'x86_64': 5] packagingOptions { //去除FrpcLib的so,用时下载并动态加载 if (excludeFrpclib.toBoolean()) { exclude 'lib/armeabi-v7a/libgojni.so' exclude 'lib/arm64-v8a/libgojni.so' exclude 'lib/x86/libgojni.so' exclude 'lib/x86_64/libgojni.so' } jniLibs { excludes += ["kotlin/**"] } resources { merge 'META-INF/mailcap' pickFirst 'META-INF/LICENSE.md' pickFirst 'META-INF/NOTICE.md' excludes += ['META-INF/DEPENDENCIES.txt', 'META-INF/LICENSE.txt', 'META-INF/NOTICE.txt', 'META-INF/NOTICE', 'META-INF/LICENSE', 'META-INF/DEPENDENCIES', 'META-INF/notice.txt', 'META-INF/license.txt', 'META-INF/dependencies.txt', 'META-INF/LGPL2.1'] excludes += ["META-INF/*.kotlin_module", "META-INF/*.version", "kotlin/**", "DebugProbesKt.bin"] } } android.applicationVariants.configureEach { variant -> variant.outputs.each { output -> //noinspection GrDeprecatedAPIUsage def abiName = output.getFilter(com.android.build.OutputFile.ABI) if (abiName == null) abiName = "universal" output.versionCodeOverride = abiCodes.get(abiName, 0) * 100000 + variant.versionCode output.outputFileName = "SmsF_${versionName}_${output.versionCode}_${abiName}_${variant.name}.apk" // 修改 output-metadata.json 追加编译日期、编译时间、Git Commit ID def assembleTaskName = "assemble${variant.name.capitalize()}" tasks.named(assembleTaskName) { doLast { def metadataFile = file("${output.outputFile.parent}/output-metadata.json") def metadata = new JsonSlurper().parseText(metadataFile.text) metadata.buildDate = buildDate metadata.buildTime = buildTime metadata.gitCommitId = gitCommitId metadataFile.text = new JsonBuilder(metadata).toPrettyString() } } } } bundle { language { enableSplit = false } } sourceSets { main { jniLibs.srcDirs = ['libs'] } } lint { abortOnError false } namespace 'com.idormy.sms.forwarder' if (isNeedClean.toBoolean()) { //编译前清理项目缓存 preBuild.dependsOn clean //编译后清理垃圾文件 gradle.buildFinished { buildResult -> if (buildResult.failure == null) { println "Build succeeded, cleaning text files..." //delete rootProject.buildDir FileTree rootTree = fileTree(dir: rootDir) rootTree.each { File file -> if ((file.toString().contains("ajcore") || file.toString().contains("mapping") || file.toString().contains("seeds") || file.toString().contains("unused")) && file.toString().endsWith(".txt")) { delete file } } } else { println "Build failed, cleanTxt not executed." } } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //frpc implementation files('libs/frpclib.aar') //MQTT协议 implementation("org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5") testImplementation deps.junit androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation deps.espresso.core //noinspection GradleDependency implementation 'androidx.core:core-ktx:1.9.0' //noinspection GradleDependency implementation 'androidx.activity:activity-ktx:1.6.1' //noinspection GradleDependency implementation 'androidx.fragment:fragment-ktx:1.5.5' implementation "androidx.cardview:cardview:1.0.0" implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.preference:preference-ktx:1.2.1' //分包 implementation deps.androidx.multidex //vLayout:https://github.com/alibaba/vlayout implementation 'com.alibaba.android:vlayout:1.3.0' //下拉刷新 implementation 'com.github.xuexiangjys.SmartRefreshLayout:refresh-header:1.1.5' implementation 'com.github.xuexiangjys.SmartRefreshLayout:refresh-layout:1.1.5' //WebView implementation 'com.github.xuexiangjys.AgentWeb:agentweb-core:1.0.1' implementation 'com.github.xuexiangjys.AgentWeb:agentweb-download:1.0.1'//选填 //屏幕适配AutoSize:https://github.com/JessYanCoding/AndroidAutoSize implementation 'me.jessyan:autosize:1.2.1' //友盟统计 implementation 'com.umeng.umsdk:common:9.6.7' implementation 'com.umeng.umsdk:asms:1.8.2' //预加载占位控件 implementation 'me.samlss:broccoli:1.0.0' //RichText:https://github.com/zzhoujay/RichText implementation 'com.zzhoujay.richtext:richtext:3.0.8' //美团多渠道打包 //implementation 'com.meituan.android.walle:library:1.1.6' def work_version = '2.8.1' //noinspection GradleDependency api("androidx.work:work-multiprocess:$work_version") //noinspection GradleDependency api("androidx.work:work-runtime-ktx:$work_version") //Android Room def room_version = '2.5.2' //noinspection GradleDependency implementation "androidx.room:room-ktx:$room_version" //noinspection GradleDependency implementation "androidx.room:room-runtime:$room_version" //noinspection GradleDependency implementation "androidx.room:room-paging:$room_version" //noinspection GradleDependency implementation "androidx.room:room-rxjava2:$room_version" //noinspection KaptUsageInsteadOfKsp kapt "androidx.room:room-compiler:$room_version" //CodeView:https://github.com/AmrDeveloper/CodeView implementation 'io.github.amrdeveloper:codeview:1.3.9' //LiveEventBus:https://github.com/JeremyLiao/LiveEventBus implementation 'io.github.jeremyliao:live-event-bus-x:1.8.0' //MarkdownView:https://github.com/tiagohm/MarkdownView implementation 'com.github.tiagohm.MarkdownView:library:0.19.0' //implementation 'com.github.tiagohm.MarkdownView:emoji:0.19.0' def retrofit2_version = '2.9.0' //noinspection GradleDependency implementation "com.squareup.retrofit2:retrofit:$retrofit2_version" //noinspection GradleDependency implementation "com.squareup.retrofit2:converter-gson:$retrofit2_version" //noinspection GradleDependency implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit2_version" def paging_version = "3.1.1" //noinspection GradleDependency implementation "androidx.paging:paging-runtime-ktx:$paging_version" // alternatively - without Android dependencies for tests //noinspection GradleDependency testImplementation "androidx.paging:paging-common-ktx:$paging_version" //权限请求框架:https://github.com/getActivity/XXPermissions implementation 'com.github.getActivity:XXPermissions:18.6' //语种切换框架:https://github.com/getActivity/MultiLanguages implementation 'com.github.getActivity:MultiLanguages:b47f7be' //9.3 def mail_version = '1.6.7' implementation "com.sun.mail:android-mail:$mail_version" implementation "com.sun.mail:android-activation:$mail_version" //国密算法SM4 的JAVA实现(基于BC实现) def bouncycastle_version = '1.77' api "org.bouncycastle:bcprov-jdk18on:$bouncycastle_version" //邮件 S/MIME 加密和签名 //implementation "org.spongycastle:bcmail-jdk18on:$bouncycastle_version" //Android下报错 implementation "org.bouncycastle:bcpkix-jdk18on:$bouncycastle_version" //implementation "org.bouncycastle:bctls-jdk18on:$bouncycastle_version" //邮件 PGP 加密和签名 //implementation "org.bouncycastle:bcpg-jdk18on:$bouncycastle_version" //Thunderbird无法解密 //PGPainless: https://github.com/pgpainless/pgpainless implementation 'org.pgpainless:pgpainless-core:1.6.7' //Android Keep Alive(安卓保活),Cactus 集成双进程前台服务,JobScheduler,onePix(一像素),WorkManager,无声音乐 //https://github.com/gyf-dev/Cactus implementation 'com.gyf.cactus:cactus:1.1.3-beta13' //HTTP服务器:https://github.com/yanzhenjie/AndServer implementation 'cn.ppps.andserver:api:2.1.12' kapt 'cn.ppps.andserver:processor:2.1.12' //Location 是一个通过 Android 自带的 LocationManager 来实现的定位功能:https://github.com/jenly1314/Location implementation 'com.github.pppscn:location:1.0.0' //Partial implementation of Quartz Cron Java for Android: https://github.com/gatewayapps/crondroid implementation 'gatewayapps.crondroid:crondroid:1.0.0' //Java Parser For Cron Expressions: https://github.com/grahamar/cron-parser implementation 'net.redhogs.cronparser:cron-parser-core:3.5' //侧边栏菜单:https://github.com/yarolegovich/SlidingRootNav implementation 'com.yarolegovich:sliding-root-nav:1.1.1' } //自动添加X-Library依赖 apply from: 'x-library.gradle' //walle多渠道打包 //apply from: 'multiple-channel.gradle' //获取 commit ID static def getGitCommitId() { try { return 'git rev-parse --short HEAD'.execute().text.trim() } catch (Exception e) { e.printStackTrace() return "" } }