diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..a0b1ee1 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,179 @@ +apply plugin: 'com.android.application' +apply plugin: 'img-optimizer' +//打包时,记得设置true启用 +if (isNeedPackage.toBoolean() && isUseBooster.toBoolean()) { + apply plugin: 'com.didiglobal.booster' +} + +android { + compileSdk 30 + defaultConfig { + applicationId "org.easydarwin.easypusher" + minSdk 29 + targetSdk 30 + versionCode 1 + versionName "1.0.1" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + multiDexEnabled true + + ndk { + abiFilters "arm64-v8a","armeabi-v7a" + } + + vectorDrawables.useSupportLibrary = true + + javaCompileOptions { + annotationProcessorOptions { + arguments = [ moduleName : project.getName(), + "room.schemaLocation": + "$projectDir/schemas".toString()] + } + } + } + + signingConfigs { + if (isNeedPackage.toBoolean()) { + release { + storeFile file(app_release.storeFile) + storePassword app_release.storePassword + keyAlias app_release.keyAlias + keyPassword app_release.keyPassword + } + } + + debug { + storeFile file("./debug.jks") + storePassword "123456" + keyAlias "debug" + keyPassword "123456" + } + release { + //注意:该签名文件的路径是以你的moudle文件夹为根路径的,而不是project,不能写错了 + storeFile file("../ks.jks") + storePassword "123456" + keyAlias "key0" + keyPassword "123456" + v1SigningEnabled true + v2SigningEnabled true + } + } + + buildTypes { + release { + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + if (isNeedPackage.toBoolean()) { + signingConfig signingConfigs.release + + 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", '""' + } + } else { + signingConfig signingConfigs.debug + buildConfigField "String", "APP_ID_UMENG", '""' + } + } + + debug { + debuggable true + minifyEnabled false + + signingConfig signingConfigs.debug + buildConfigField "String", "APP_ID_UMENG", '""' + } + } + + lintOptions { + abortOnError false + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + buildFeatures { + viewBinding true + } +} + +dependencies { + implementation fileTree(dir: 'lib', include: ['*.jar', '*.aar']) + testImplementation deps.junit + androidTestImplementation deps.runner + androidTestImplementation deps.espresso.core + + //分包 + implementation deps.androidx.multidex + + implementation 'com.alibaba.android:vlayout:1.3.0' + //下拉刷新 + implementation 'io.github.scwang90:refresh-layout-kernel:2.0.6' + implementation 'io.github.scwang90:refresh-header-material:2.0.6' + //WebView + implementation 'com.github.xuexiangjys.AgentWeb:agentweb-core:1.0.1' + implementation 'com.github.xuexiangjys.AgentWeb:agentweb-download:1.0.1'//选填 + //腾讯的键值对存储mmkv + implementation 'com.tencent:mmkv:1.2.10' + //屏幕适配AutoSize + implementation 'me.jessyan:autosize:1.2.1' + //umeng统计 + implementation 'com.umeng.umsdk:common:9.3.8' + implementation 'com.umeng.umsdk:asms:1.2.1' + + //预加载占位控件 + implementation 'me.samlss:broccoli:1.0.0' + + implementation 'com.zzhoujay.richtext:richtext:3.0.8' + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + + //ANR异常捕获 + implementation 'com.github.anrwatchdog:anrwatchdog:1.4.0' + + //美团多渠道打包 + implementation 'com.meituan.android.walle:library:1.1.6' + + implementation 'com.jakewharton:butterknife:10.2.0' + + implementation 'com.github.getActivity:XXPermissions:13.5' + + + implementation 'cn.hutool:hutool-all:5.8.22' + + // https://mvnrepository.com/artifact/com.alibaba/fastjson + implementation group: 'com.alibaba', name: 'fastjson', version: '2.0.56' + // build.gradle 添加dakewharton.threetenabp:threetenabp:1.4.0' + + implementation 'androidx.room:room-common:2.3.0' + implementation "androidx.room:room-runtime:2.3.0" // Room 库 + annotationProcessor "androidx.room:room-compiler:2.3.0" // 注解处理器(Java) + + implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' + implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' + implementation 'com.google.guava:guava:31.1-android' // Android 专用版本 + + implementation 'com.github.NewHuLe:AppUpdate:v1.7' + + // https://mvnrepository.com/artifact/org.rxtx/rxtx + implementation("org.rxtx:rxtx:2.1.7") + + implementation 'com.android.support:support-v4:28.0.0' + + implementation 'com.licheedev:android-serialport:2.1.3' + + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.3' + + implementation 'org.bouncycastle:bcprov-jdk15to18:1.77' +} +//自动添加X-Library依赖 +apply from: 'x-library.gradle' +//walle多渠道打包 +apply from: 'multiple-channel.gradle' + + diff --git a/app/channel b/app/channel new file mode 100644 index 0000000..10c8afd --- /dev/null +++ b/app/channel @@ -0,0 +1,25 @@ +# 美团 +meituan +# 三星 +samsungapps +# 小米 +xiaomi +# 91助手 +91com +# 魅族 +meizu +# 豌豆荚 +wandou +# Google Play +googleplay +# 百度 +baidu +# 360 +360cn +# 应用宝 +myapp +# 华为 +huawei +# 蒲公英 +pgyer +github \ No newline at end of file diff --git a/app/debug.jks b/app/debug.jks new file mode 100644 index 0000000..d49fb2b Binary files /dev/null and b/app/debug.jks differ diff --git a/app/lib/arcsoft_face.jar b/app/lib/arcsoft_face.jar new file mode 100644 index 0000000..a221277 Binary files /dev/null and b/app/lib/arcsoft_face.jar differ diff --git a/app/lib/arcsoft_image_util.jar b/app/lib/arcsoft_image_util.jar new file mode 100644 index 0000000..10000e6 Binary files /dev/null and b/app/lib/arcsoft_image_util.jar differ diff --git a/app/lib/autoreplyprint.aar b/app/lib/autoreplyprint.aar new file mode 100644 index 0000000..8f3e770 Binary files /dev/null and b/app/lib/autoreplyprint.aar differ diff --git a/app/multiple-channel.gradle b/app/multiple-channel.gradle new file mode 100644 index 0000000..5dc6dbf --- /dev/null +++ b/app/multiple-channel.gradle @@ -0,0 +1,10 @@ +apply plugin: 'walle' + +walle { + // 指定渠道包的输出路径 + apkOutputFolder = new File("${project.buildDir}/outputs/channels") + // 定制渠道包的APK的文件名称 + apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk' + // 渠道配置文件 + channelFile = new File("${project.getProjectDir()}/channel") +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..4b64f96 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,314 @@ +#=========================================基础不变的混淆配置=========================================## +#指定代码的压缩级别 +-optimizationpasses 5 +#包名不混合大小写 +-dontusemixedcaseclassnames +#不去忽略非公共的库类 +-dontskipnonpubliclibraryclasses +# 指定不去忽略非公共的库的类的成员 +-dontskipnonpubliclibraryclassmembers +#优化 不优化输入的类文件 +-dontoptimize +#预校验 +-dontpreverify +#混淆时是否记录日志 +-verbose +# 混淆时所采用的算法 +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* +#保护注解 +-keepattributes *Annotation* +#忽略警告 +-ignorewarnings + +# 保留 Room 的相关类 +-keep class androidx.room.** { *; } +-keep class androidx.sqlite.db.** { *; } +-keep class * extends androidx.room.RoomDatabase { + public static ; +} +-keep class * extends androidx.room.Entity { + public static ; +} + + + +##记录生成的日志数据,gradle build时在本项目根目录输出## +#apk 包内所有 class 的内部结构 +-dump class_files.txt +#未混淆的类和成员 +-printseeds seeds.txt +#列出从 apk 中删除的代码 +-printusage unused.txt +#混淆前后的映射 +-printmapping mapping.txt +# 并保留源文件名为"Proguard"字符串,而非原始的类名 并保留行号 +-keepattributes SourceFile,LineNumberTable +########记录生成的日志数据,gradle build时 在本项目根目录输出-end##### + +#需要保留的东西 +# 保持哪些类不被混淆 +-keep public class * extends android.app.Fragment +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class * extends android.support.v4.** +-keep public class com.android.vending.licensing.ILicensingService + +#如果有引用v4包可以添加下面这行 +-keep public class * extends android.support.v4.app.Fragment + +##########JS接口类不混淆,否则执行不了 +-dontwarn com.android.JsInterface.** +-keep class com.android.JsInterface.** {*; } + +#极光推送和百度lbs android sdk一起使用proguard 混淆的问题#http的类被混淆后,导致apk定位失败,保持apache 的http类不被混淆就好了 +-dontwarn org.apache.** +-keep class org.apache.**{ *; } + +-keep public class * extends android.view.View { + public (android.content.Context); + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); + public void set*(...); + } + +#保持 native 方法不被混淆 +-keepclasseswithmembernames class * { + native ; +} + +#保持自定义控件类不被混淆 +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); +} + +#保持自定义控件类不被混淆 +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +#保持 Parcelable 不被混淆 +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} + +#保持 Serializable 不被混淆 +-keepnames class * implements java.io.Serializable + +#保持 Serializable 不被混淆并且enum 类也不被混淆 +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + !static !transient ; + !private ; + !private ; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} + +#保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可 +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keepclassmembers class * { + public void *ButtonClicked(android.view.View); +} + +#不混淆资源类 +-keep class **.R$* {*;} + +#===================================混淆保护自己项目的部分代码以及引用的第三方jar包library=============================####### +#如果引用了v4或者v7包 +-dontwarn android.support.** + + +# AndroidX 防止混淆 +-dontwarn com.google.android.material.** +-dontnote com.google.android.material.** +-dontwarn androidx.** +-keep class com.google.android.material.** {*;} +-keep class androidx.** {*;} +-keep public class * extends androidx.** +-keep interface androidx.** {*;} +-keepclassmembers class * { + @androidx.annotation.Keep *; +} + +# zxing +-dontwarn com.google.zxing.** +-keep class com.google.zxing.**{*;} + +#SignalR推送 +-keep class microsoft.aspnet.signalr.** { *; } + +# 极光推送混淆 +-dontoptimize +-dontpreverify +-dontwarn cn.jpush.** +-keep class cn.jpush.** { *; } +-dontwarn cn.jiguang.** +-keep class cn.jiguang.** { *; } + +# 数据库框架OrmLite +-keepattributes *DatabaseField* +-keepattributes *DatabaseTable* +-keepattributes *SerializedName* +-keep class com.j256.** +-keepclassmembers class com.j256.** { *; } +-keep enum com.j256.** +-keepclassmembers enum com.j256.** { *; } +-keep interface com.j256.** +-keepclassmembers interface com.j256.** { *; } + +#XHttp2 +-keep class com.xuexiang.xhttp2.model.** { *; } +-keep class com.xuexiang.xhttp2.cache.model.** { *; } +-keep class com.xuexiang.xhttp2.cache.stategy.**{*;} +-keep class com.xuexiang.xhttp2.annotation.** { *; } + +#okhttp +-dontwarn com.squareup.okhttp3.** +-keep class com.squareup.okhttp3.** { *;} +-dontwarn okio.** +-dontwarn javax.annotation.Nullable +-dontwarn javax.annotation.ParametersAreNonnullByDefault +-dontwarn javax.annotation.** + +#如果用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错 +-keepattributes Signature +-keep class com.google.gson.stream.** { *; } +-keepattributes EnclosingMethod +-keep class org.xz_sale.entity.**{*;} +-keep class com.google.gson.** {*;} +-keep class com.google.**{*;} +-keep class sun.misc.Unsafe { *; } +-keep class com.google.gson.stream.** { *; } +-keep class com.google.gson.examples.android.model.** { *; } + +# Glide +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public class * extends com.bumptech.glide.module.AppGlideModule +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} + +# Retrofit +-dontwarn retrofit2.** +-keep class retrofit2.** { *; } +-keepattributes Exceptions + +# RxJava RxAndroid +-dontwarn sun.misc.** +-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* { + long producerIndex; + long consumerIndex; +} +-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { + rx.internal.util.atomic.LinkedQueueNode producerNode; +} +-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef { + rx.internal.util.atomic.LinkedQueueNode consumerNode; +} + +-dontwarn okio.** +-dontwarn javax.annotation.Nullable +-dontwarn javax.annotation.ParametersAreNonnullByDefault +-dontwarn javax.annotation.** + +# fastjson +-dontwarn com.alibaba.fastjson.** +-keep class com.alibaba.fastjson.** { *; } +-keepattributes Signature + +# xpage +-keep class com.xuexiang.xpage.annotation.** { *; } +-keep class com.xuexiang.xpage.config.** { *; } + +# xaop +-keep @com.xuexiang.xaop.annotation.* class * {*;} +-keep @org.aspectj.lang.annotation.* class * {*;} +-keep class * { + @com.xuexiang.xaop.annotation.* ; + @org.aspectj.lang.annotation.* ; +} +-keepclassmembers class * { + @com.xuexiang.xaop.annotation.* ; + @org.aspectj.lang.annotation.* ; +} + +# xrouter +-keep public class com.xuexiang.xrouter.routes.**{*;} +-keep class * implements com.xuexiang.xrouter.facade.template.ISyringe{*;} +# 如果使用了 byType 的方式获取 Service,需添加下面规则,保护接口 +-keep interface * implements com.xuexiang.xrouter.facade.template.IProvider +# 如果使用了 单类注入,即不定义接口实现 IProvider,需添加下面规则,保护实现 +-keep class * implements com.xuexiang.xrouter.facade.template.IProvider + +# xupdate +-keep class com.xuexiang.xupdate.entity.** { *; } + +# xvideo +-keep class com.xuexiang.xvideo.jniinterface.** { *; } + +# xipc +-keep @com.xuexiang.xipc.annotation.* class * {*;} +-keep class * { + @com.xuexiang.xipc.annotation.* ; +} +-keepclassmembers class * { + @com.xuexiang.xipc.annotation.* ; +} + +# umeng统计 +-keep class com.umeng.** {*;} +-keepclassmembers class * { + public (org.json.JSONObject); +} +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class com.xuexiang.xui.widget.edittext.materialedittext.** { *; } + + +# 保留所有 JNI 接口类、方法和字段 +-keep class com.arcsoft.** { *; } # 替换为虹软 SDK 的实际包名 + +# 保留所有 Native 方法 +-keepclasseswithmembernames class * { + native ; +} + +# 保留 JNI 调用的类和方法(如果存在动态注册) +-keepclasseswithmembers class * { + public static native void JNI_OnLoad(...); + public static native void JNI_OnUnload(...); +} + +# 保留类中的静态字段(如果 JNI 需要访问静态字段) +-keepclassmembers class * { + static ** JNI_*; +} + + +# 保留模型类 +-keep class com.bonus.canteen.** { *; } + +# 保留 FastJSON 注解 +-keepattributes *Annotation* +-keep class * implements com.alibaba.fastjson.annotation.JSONType { *; } + +# 保留无参构造方法 +-keepclassmembers class * { + public (); +} \ No newline at end of file diff --git a/app/x-library.gradle b/app/x-library.gradle new file mode 100644 index 0000000..4dae7c6 --- /dev/null +++ b/app/x-library.gradle @@ -0,0 +1,48 @@ +apply plugin: 'com.xuexiang.xaop' //引用XAOP插件 +apply plugin: 'com.xuexiang.xrouter' //引用XRouter-plugin插件实现自动注册 + +//自动添加依赖 +configurations.each { configuration -> + def dependencies = getProject().dependencies + if (configuration.name == "implementation") { + //为Project加入X-Library依赖 + //XUI框架 + configuration.dependencies.add(dependencies.create(deps.xlibrary.xui)) + configuration.dependencies.add(dependencies.create(deps.androidx.appcompat)) + configuration.dependencies.add(dependencies.create(deps.androidx.recyclerview)) + configuration.dependencies.add(dependencies.create(deps.androidx.design)) + configuration.dependencies.add(dependencies.create(deps.glide)) + //XUtil工具类 + configuration.dependencies.add(dependencies.create(deps.xlibrary.xutil_core)) + //XAOP切片 + configuration.dependencies.add(dependencies.create(deps.xlibrary.xaop_runtime)) + //XUpdate版本更新 + configuration.dependencies.add(dependencies.create(deps.xlibrary.xupdate)) + //XHttp2 + configuration.dependencies.add(dependencies.create(deps.xlibrary.xhttp2)) + configuration.dependencies.add(dependencies.create(deps.rxjava2)) + configuration.dependencies.add(dependencies.create(deps.rxandroid)) + configuration.dependencies.add(dependencies.create(deps.okhttp3)) + configuration.dependencies.add(dependencies.create(deps.gson)) + //XPage + configuration.dependencies.add(dependencies.create(deps.xlibrary.xpage_lib)) + //页面路由 + configuration.dependencies.add(dependencies.create(deps.xlibrary.xrouter_runtime)) + } + + if (configuration.name == "annotationProcessor") { + //XPage + configuration.dependencies.add(dependencies.create(deps.xlibrary.xpage_compiler)) + //页面路由 + configuration.dependencies.add(dependencies.create(deps.xlibrary.xrouter_compiler)) + } + + if (configuration.name == "debugImplementation") { + //内存泄漏监测leak + configuration.dependencies.add(dependencies.create(deps.leakcanary)) + } +} + +configurations.all { + resolutionStrategy.force deps.okhttp3 +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/versions.gradle b/versions.gradle new file mode 100644 index 0000000..4bea92e --- /dev/null +++ b/versions.gradle @@ -0,0 +1,220 @@ +import java.util.regex.Matcher +import java.util.regex.Pattern + +ext.deps = [:] +def versions = [:] +versions.android_gradle_plugin = '4.2.2' +versions.android_maven_gradle_plugin = "2.0" +versions.gradle_bintray_plugin = "1.8.0" +versions.booster = "3.1.0" +versions.booster_all = "1.1.1" +versions.support = "28.0.0" +versions.annotation = "1.2.0" +versions.androidx = "1.3.1" +versions.recyclerview = "1.2.1" +versions.material = "1.4.0" +versions.junit = "4.12" +versions.espresso = "3.2.0" +versions.constraint_layout = "2.1.0" +versions.glide = "4.11.0" +versions.rxjava2 = "2.2.20" +versions.rxandroid = "2.1.1" +versions.rxbinding = "2.2.0" +versions.butterknife = "10.1.0" +versions.runner = "1.2.0" +versions.gson = "2.8.5" +versions.okhttp3 = "3.12.12" +versions.leakcanary = "2.6" + +//========xlibrary start========// + +versions.xui = "1.2.0" +versions.xupdate = "2.1.3" +versions.xaop = "1.1.0" +versions.xutil = "2.0.0" +versions.xhttp2 = "2.0.4" +versions.xpage = "3.4.0" +versions.xrouter = "1.1.0" + +//========xlibrary end========// + +def deps = [:] + +def support = [:] +support.annotations = "com.android.support:support-annotations:$versions.support" +support.app_compat = "com.android.support:appcompat-v7:$versions.support" +support.recyclerview = "com.android.support:recyclerview-v7:$versions.support" +support.cardview = "com.android.support:cardview-v7:$versions.support" +support.design = "com.android.support:design:$versions.support" +support.v4 = "com.android.support:support-v4:$versions.support" +support.core_utils = "com.android.support:support-core-utils:$versions.support" +deps.support = support + +def androidx = [:] +androidx.annotations = "androidx.annotation:annotation:$versions.annotation" +androidx.appcompat = "androidx.appcompat:appcompat:$versions.androidx" +androidx.recyclerview = "androidx.recyclerview:recyclerview:$versions.recyclerview" +androidx.design = "com.google.android.material:material:$versions.material" +androidx.multidex = 'androidx.multidex:multidex:2.0.1' +deps.androidx = androidx + +def booster = [:] +booster.gradle_plugin = "com.didiglobal.booster:booster-gradle-plugin:$versions.booster" +booster.task_all = "com.didiglobal.booster:booster-task-all:$versions.booster_all" +booster.transform_all = "com.didiglobal.booster:booster-transform-all:$versions.booster_all" +//采用 cwebp 对资源进行压缩 +booster.task_compression_cwebp = "com.didiglobal.booster:booster-task-compression-cwebp:$versions.booster" +//采用 pngquant 对资源进行压缩 +booster.task_compression_pngquant = "com.didiglobal.booster:booster-task-compression-pngquant:$versions.booster" +//ap_ 文件压缩 +booster.task_processed_res = "com.didiglobal.booster:booster-task-compression-processed-res:$versions.booster" +//去冗余资源 +booster.task_resource_deredundancy = "com.didiglobal.booster:booster-task-resource-deredundancy:$versions.booster" +//检查 SNAPSHOT 版本 +booster.task_check_snapshot = "com.didiglobal.booster:booster-task-check-snapshot:$versions.booster" +//性能瓶颈检测 +booster.transform_lint = "com.didiglobal.booster:booster-transform-lint:$versions.booster" +//多线程优化 +booster.transform_thread = "com.didiglobal.booster:booster-transform-thread:$versions.booster" +//资源索引内联 +booster.transform_r_inline = "com.didiglobal.booster:booster-transform-r-inline:$versions.booster" +//WebView 预加载 +booster.transform_webview = "com.didiglobal.booster:booster-transform-webview:$versions.booster" +//SharedPreferences 优化 +booster.transform_shared_preferences = "com.didiglobal.booster:booster-transform-shared-preferences:$versions.booster" +//检查覆盖安装导致的 Resources 和 Assets 未加载的 Bug +booster.transform_res_check = "com.didiglobal.booster:booster-transform-res-check:$versions.booster" +//修复 Toast 在 Android 7.1 上的 Bug +booster.transform_toast = "com.didiglobal.booster:booster-transform-toast:$versions.booster" +//处理系统 Crash +booster.transform_activity_thread = "com.didiglobal.booster:booster-transform-activity-thread:$versions.booster" +deps.booster = booster + +def butterknife = [:] +butterknife.runtime = "com.jakewharton:butterknife:$versions.butterknife" +butterknife.compiler = "com.jakewharton:butterknife-compiler:$versions.butterknife" + +deps.butterknife = butterknife + +def espresso = [:] +espresso.core = "androidx.test.espresso:espresso-core:$versions.espresso" +espresso.contrib = "androidx.test.espresso:espresso-contrib:$versions.espresso" +espresso.intents = "androidx.test.espresso:espresso-intents:$versions.espresso" +deps.espresso = espresso + +deps.android_gradle_plugin = "com.android.tools.build:gradle:$versions.android_gradle_plugin" +deps.android_maven_gradle_plugin = "com.github.dcendents:android-maven-gradle-plugin:$versions.android_maven_gradle_plugin" +deps.gradle_bintray_plugin = "com.jfrog.bintray.gradle:gradle-bintray-plugin:$versions.gradle_bintray_plugin" +deps.glide = "com.github.bumptech.glide:glide:$versions.glide" +deps.constraint_layout = "androidx.constraint:constraint-layout:$versions.constraint_layout" +deps.junit = "junit:junit:$versions.junit" +deps.runner = "androidx.test:runner:$versions.runner" +deps.rxjava2 = "io.reactivex.rxjava2:rxjava:$versions.rxjava2" +deps.rxandroid = "io.reactivex.rxjava2:rxandroid:$versions.rxandroid" +deps.rxbinding = "com.jakewharton.rxbinding2:rxbinding:$versions.rxbinding" +deps.gson = "com.google.code.gson:gson:$versions.gson" +deps.okhttp3 = "com.squareup.okhttp3:okhttp:$versions.okhttp3" +deps.leakcanary = "com.squareup.leakcanary:leakcanary-android:$versions.leakcanary" + +//========xlibrary start=================// + +def xlibrary = [:] + +xlibrary.xui = "com.github.xuexiangjys:XUI:$versions.xui" +xlibrary.xupdate = "com.github.xuexiangjys:XUpdate:$versions.xupdate" +xlibrary.xaop_runtime = "com.github.xuexiangjys.XAOP:xaop-runtime:$versions.xaop" +xlibrary.xaop_plugin = "com.github.xuexiangjys.XAOP:xaop-plugin:$versions.xaop" +xlibrary.xutil_core = "com.github.xuexiangjys.XUtil:xutil-core:$versions.xutil" +xlibrary.xhttp2 = "com.github.xuexiangjys:XHttp2:$versions.xhttp2" +xlibrary.xpage_lib = "com.github.xuexiangjys.XPage:xpage-lib:$versions.xpage" +xlibrary.xpage_compiler = "com.github.xuexiangjys.XPage:xpage-compiler:$versions.xpage" +xlibrary.xrouter_runtime = "com.github.xuexiangjys.XRouter:xrouter-runtime:$versions.xrouter" +xlibrary.xrouter_compiler = "com.github.xuexiangjys.XRouter:xrouter-compiler:$versions.xrouter" +xlibrary.xrouter_plugin = "com.github.xuexiangjys.XRouter:xrouter-plugin:$versions.xrouter" + +deps.xlibrary = xlibrary + +//========xlibrary end=================// + +ext.deps = deps + +def build_versions = [:] +build_versions.min_sdk = 19 +build_versions.target_sdk = 30 +build_versions.build_tools = "30.0.2" +ext.build_versions = build_versions + +def app_release = [:] +app_release.storeFile = "../keystores/android.keystore" +app_release.storePassword = "xuexiang" +app_release.keyAlias = "android.keystore" +app_release.keyPassword = "xuexiang" + +ext.app_release = app_release + +/** + * @return 是否为release + */ +def isRelease() { + Gradle gradle = getGradle() + String tskReqStr = gradle.getStartParameter().getTaskRequests().toString() + + Pattern pattern + if (tskReqStr.contains("assemble")) { + println tskReqStr + pattern = Pattern.compile("assemble(\\w*)(Release|Debug)") + } else { + pattern = Pattern.compile("generate(\\w*)(Release|Debug)") + } + Matcher matcher = pattern.matcher(tskReqStr) + + if (matcher.find()) { + String task = matcher.group(0).toLowerCase() + println("[BuildType] Current task: " + task) + return task.contains("release") + } else { + println "[BuildType] NO MATCH FOUND" + return true + } +} + +ext.isRelease = this.&isRelease + +//默认添加代码仓库路径 +static def addRepos(RepositoryHandler handler) { + handler.mavenLocal() + handler.google() // 使用默认的 Google Maven 仓库 + handler.maven { url 'https://maven.aliyun.com/repository/public' } // 阿里云公共仓库 + handler.maven { url 'https://jitpack.io' } // JitPack 仓库 + handler.maven { url 'https://repo1.maven.org/maven2/' } // Maven Central + handler.maven { url 'https://oss.sonatype.org/content/repositories/public' } // Sonatype 仓库 +} +//static def addRepos(RepositoryHandler handler) { +// handler.mavenLocal() +// handler.google { url 'https://maven.aliyun.com/repository/google' } +// handler.jcenter { url 'https://maven.aliyun.com/repository/jcenter' } +// handler.mavenCentral { url 'https://maven.aliyun.com/repository/central' } +// handler.maven { url "https://jitpack.io" } +// handler.maven { url "https://maven.google.com" } +// handler.maven { url 'https://maven.aliyun.com/repository/public' } +// handler.maven { url 'https://maven.aliyun.com/repository/google' } +// handler.maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } +// handler.maven { url "https://repo1.maven.org/maven2/" } +// handler.maven { url 'https://oss.sonatype.org/content/repositories/public' } +// //Add the Local repository +// handler.maven { url 'LocalRepository' } +//} + +ext.addRepos = this.&addRepos + + +//自动添加XAOP和XRouter插件 +project.buildscript.configurations.each { configuration -> + def dependencies = getProject().dependencies + if (configuration.name == "classpath") { + //XAOP插件 + configuration.dependencies.add(dependencies.create(deps.xlibrary.xaop_plugin)) + //XRouter插件 + configuration.dependencies.add(dependencies.create(deps.xlibrary.xrouter_plugin)) + } +} \ No newline at end of file