From 7f2e724df3e5dcd131fd50063af807bf4d706f8c Mon Sep 17 00:00:00 2001 From: jjLv <1981429112@qq.com> Date: Fri, 25 Jul 2025 15:55:36 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/.gitignore | 1 + app/build.gradle | 179 ++++++++++ app/channel | 25 ++ app/debug.jks | Bin 0 -> 2270 bytes app/multiple-channel.gradle | 10 + app/proguard-rules.pro | 314 ++++++++++++++++++ .../com/bonus/canteen/ExampleUnitTest.java | 53 +++ app/x-library.gradle | 48 +++ 8 files changed, 630 insertions(+) create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/channel create mode 100644 app/debug.jks create mode 100644 app/multiple-channel.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/test/java/com/bonus/canteen/ExampleUnitTest.java create mode 100644 app/x-library.gradle 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 0000000000000000000000000000000000000000..d49fb2b1706b01b3a04d10844d6b450d11319d52 GIT binary patch literal 2270 zcmc&#XIB#n7ED4&B#|IR>O%+*q>2eWf(QmFL3(>2hzNx8=pldsgoG+hArTNGMS_4d z5%5Tp;DR&-ED&6g-g_}3(w4Wo?;Q6R?1%X002P80R9`C9-cRe zUdPN&7kOO<0N@0oDBuGW0s>Qn0Kq^75HAqO2>?^Ti(;}V2jYdo%-;Q%ylf*wa7L?IUQ$<{wR^R!y!7OdB48Z)*BuWotgwd2n(q3)9QwxP5Itv~l zoz3jrQ`Lcd@NocI?))61MwmGt>Rna`yL>=AYe=+YBnVQAf#_$%9LMvg(cpi)Pe@SR zKPa|H2|2T0FG3pK;{J}&)?MQ=%Cz;n{PUwx&#L;Zxa&k+&eup{ne8dJXD-`CM-S>?cQnc4Lt^^F=s^FdBH7|r;?9bO zZ5Ezo{KJAjFz4~ud+&mYY?c=AQ}*cD9OH)YJh+QNSMC?Lxm&{W1Sl^qt9f-g#-ANi z%aAJ#`k=jPiQDM1PzGlaBJWgxH(C`gQ8>`7}uv0QfmpPMfFW4D35!3E2-;v2< zigl)XS2^N;Pj-aw%@fvYUb$7&3f@whn|9LOuFZUuQUUnw_R`nLsh~TlYP;5b z;!TmUo4GqIge3DudJ3s#tXk@l)X!qJfe)|i%Bky0&5xuaNa)gtUSHj-NBLp(@zPVl zFpNSpxngi4R3y#Fr@RF@kC(2mx2!Iq7$fg8@?g!51DjPkaZXR?0?qpA}S?>a&T zkE-#U-sGk?Sm#tc@6gpG0%R%O)wuf8jwLzwK2okn1d->M3I-i5+^`-BBVckXJyoDc zv%0X(cKK$1UbTxrx|}GTJDDbc_a7R)v7}R)&7c`Sc?i0rvN3-a7UNky=Yo@^4`08e zZ2fj(Wk5mFz`^pQq);gfN*#G@0vgEv5p>QMRNL<*p`P<8RxIEM)&e8QRkVQu`;jqT zX1c!9&YK7siLHPZmdPmh6O0AlnB@ZfH^u3ZQRD$uQ9xogS}K%a0?_y@@&D8#Ub{xVtm_E1o;gedwPVS6VkV<1(`ur=3nlui5zf zRFx!s$RUKp%dEUmJS;D=SLF?wC>zrc*D#yX_zt=2oQigtiGDaIf3d`=+4+{P`?8YB zvc>Lb;iDdrg)gdw5q#;09Q!5Lp^ny7aqE5k!SwgKdtrSqkVouD(ZqYT#E)6Px5NyF z7n@^Ve8u}JzT|c$?lhPAy2RccL#j#P6nJTmetXE!mpySs1&Q|x_!eAXu3nN5`#b8N zYov!hPia;OrqiMF6;cX1Swy{TKwKejoiAjYJb6f#C}+xaU~@*D2r7>@D@6ezFG;SJ z0(%?M7axqtxUXx{ROp>mm-&Uh8yV9t8mnT(L7Wo%4J{D@*kxw=S!cp-!BT{Fwz=88 z%0$%x729itF^!?cSGHTt`f_EEg0`2RMV7N-oPjl@PY94_^9cLiUsz}i37wI zjkI_U+J#NDM6O?8B&TxbXg#i)dVae*YRiO>A9BMmH*vuL|DRs`Ls=b#0RT91P!tX- ziUNu(iR)t?MqE>eJ?#WW^vX?U|5m%Ujwiw~-e;gVeE%~Y^Y87H!F|xxY znzNs%md{X1Ul#SHtu*oVlrxB~=)m7Xs0jC10i@I{N$SGYWy;1B-I#}HGyEcRWuz`)$(jm{eUA6t+_wrp2WYKx z)ZlkeaQjV{b0SO15J+&Qfx6cCFxqeYDoLV`fH0t-bInD?ShuEOxE? zO_`1j^VPl$&e`-q%uN6M7eDx`wJ|-9CVBlZ4@pJ71fgm8VY#S~c-oj+$KE#=%FVlK z{kMm#3>n_vB4$tk#`K3i7B>?8pEB literal 0 HcmV?d00001 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/src/test/java/com/bonus/canteen/ExampleUnitTest.java b/app/src/test/java/com/bonus/canteen/ExampleUnitTest.java new file mode 100644 index 0000000..03ebb7e --- /dev/null +++ b/app/src/test/java/com/bonus/canteen/ExampleUnitTest.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2025 xuexiangjys(xuexiangjys@163.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.bonus.canteen; + +import com.bonus.canteen.core.http.entity.TipInfo; +import com.xuexiang.xhttp2.model.ApiResult; +import com.xuexiang.xutil.net.JsonUtil; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + + + TipInfo info = new TipInfo(); + info.setTitle("微信公众号"); + info.setContent("获取更多资讯,欢迎关注我的微信公众号:【我的Android开源之旅】"); + List list = new ArrayList<>(); + for (int i = 0; i <5 ; i++) { + list.add(info); + } + ApiResult> result = new ApiResult<>(); + result.setData(list); + System.out.println(JsonUtil.toJson(result)); + } +} \ 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