From e780b3ff442c36935df8ba78249e51c872936085 Mon Sep 17 00:00:00 2001 From: fanhuitong <981964879@qq.com> Date: Fri, 7 May 2021 17:32:15 +0800 Subject: [PATCH] =?UTF-8?q?version:1.3.4=20update:=20fix:=20add:=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E4=BA=BA=E5=91=98=E9=80=89=E9=A1=B9=E7=AE=A1=E6=8E=A7?= =?UTF-8?q?=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 52 +++++++------- .../myappstore/activity/MainPresenter.java | 18 ++--- .../myappstore/base/BaseApplication.java | 59 +--------------- .../myappstore/network/URLAddress.java | 51 +++++++------- .../myappstore/receiver/MyJPushReceiver.java | 12 ++++ .../mjsheng/myappstore/utils/ApkUtils.java | 2 +- .../mjsheng/myappstore/utils/JGYUtils.java | 70 +++++++++++++++++++ .../com/mjsheng/myappstore/utils/Logger.java | 2 +- .../mjsheng/myappstore/utils/ToastUtil.java | 2 +- 9 files changed, 145 insertions(+), 123 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 939636d..5ea5657 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,10 +15,10 @@ android { minSdkVersion 24 targetSdkVersion 29 -// versionCode 105 -// versionName "3.1.0"//测试jiaoguanyi.cn -// versionCode 1008 -// versionName "2.0.1.8"// 正式jiaoguanyi.com 双数正式 单数测试 + //versionCode 105 + //versionName "3.1.0"//测试jiaoguanyi.cn + //versionCode 1008 + //versionName "2.0.1.8"// 正式jiaoguanyi.com 双数正式 单数测试 multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -37,9 +37,9 @@ android { jumboMode true } -// dataBinding { -// enabled = true -// } + //dataBinding { + //enabled = true + //} compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -50,8 +50,8 @@ android { productFlavors { official { flavorDimensions "default" - versionCode 1037 - versionName "2.0.3.7" + versionCode 1038 + versionName "2.0.3.8" /*********************************极光推送************************************/ manifestPlaceholders = [ JPUSH_PKGNAME: "com.jiaoguanyi.appstore", @@ -69,7 +69,7 @@ android { beta { flavorDimensions "default" versionCode 109 -// versionCode 160//出厂版本太高 + //versionCode 160//出厂版本太高 versionName "3.1.4"//测试jiaoguanyi.cn /*********************************极光推送************************************/ manifestPlaceholders = [ @@ -106,7 +106,7 @@ android { newly { flavorDimensions "default" versionCode 174 -// versionCode 1037 + //versionCode 1037 versionName "1.3.4" /*********************************极光推送************************************/ manifestPlaceholders = [ @@ -136,7 +136,7 @@ android { v2SigningEnabled false } - release {// 签名文件 + release { storeFile file("src/main/doc/xueshibaoos.jks") storePassword "123456" keyAlias "xueshibaoos" @@ -147,10 +147,12 @@ android { buildTypes { debug { - // 显示Log - buildConfigField "boolean", "LOG_DEBUG", "true" - versionNameSuffix "-debug" + // 不显示Log + //buildConfigField "boolean", "LOG_DEBUG", "false" + // + //versionNameSuffix "-debug" minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //Zipalign优化 zipAlignEnabled true signingConfig signingConfigs.debug @@ -165,17 +167,15 @@ android { } } release { - // 不显示Log - buildConfigField "boolean", "LOG_DEBUG", "false" //混淆 minifyEnabled false - //Zipalign优化 - zipAlignEnabled true //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + //Zipalign优化 + zipAlignEnabled true //签名 signingConfig signingConfigs.release -// 将release版本的包名重命名,加上版本及日期 + //将release版本的包名重命名,加上版本及日期 applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = "" @@ -190,7 +190,7 @@ android { } dependencies { -// implementation fileTree(include: ['*.jar'], dir: 'libs') + //implementation fileTree(include: ['*.jar'], dir: 'libs') compileOnly files('src/main/libs/classes.jar') implementation 'androidx.appcompat:appcompat:1.2.0' @@ -212,8 +212,8 @@ dependencies { implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' implementation 'io.reactivex.rxjava2:rxjava:2.2.5' implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' -// implementation "com.uber.autodispose:autodispose:1.3.0" -// implementation "com.uber.autodispose:autodispose-android-archcomponents:1.3.0" + //implementation "com.uber.autodispose:autodispose:1.3.0" + //implementation "com.uber.autodispose:autodispose-android-archcomponents:1.3.0" implementation 'com.google.code.gson:gson:2.8.6' implementation 'com.google.zxing:core:3.3.0' implementation 'cn.jiguang.sdk:jpush:3.8.6' // 此处以JPush 3.5.6 版本为例。 @@ -221,14 +221,14 @@ dependencies { implementation 'com.alibaba:fastjson:1.2.70' implementation 'com.lzy.net:okgo:2.1.4' implementation 'com.lzy.net:okrx:0.1.2' -// implementation 'com.lzy.net:okserver:1.1.3' + //implementation 'com.lzy.net:okserver:1.1.3' implementation 'com.blankj:utilcode:1.23.7' implementation 'com.arialyy.aria:core:3.8.15' annotationProcessor 'com.arialyy.aria:compiler:3.8.15' - implementation 'com.amap.api:location:5.1.0' //高德地图定位 - implementation 'org.zeroturnaround:zt-zip:1.13' + implementation 'com.amap.api:location:5.1.0' //压缩文件解压 + implementation 'org.zeroturnaround:zt-zip:1.13' } preBuild { diff --git a/app/src/main/java/com/mjsheng/myappstore/activity/MainPresenter.java b/app/src/main/java/com/mjsheng/myappstore/activity/MainPresenter.java index 02dec75..9334160 100644 --- a/app/src/main/java/com/mjsheng/myappstore/activity/MainPresenter.java +++ b/app/src/main/java/com/mjsheng/myappstore/activity/MainPresenter.java @@ -1283,6 +1283,10 @@ public class MainPresenter implements MainContact.Presenter { @Override public void setTopApp() { + if (JGYUtils.isOfficialVersion()) { + mView.setTopAppFinished(); + return; + } NetInterfaceManager.getInstance().getTopAppControl() .subscribe(new Observer() { @Override @@ -1333,9 +1337,9 @@ public class MainPresenter implements MainContact.Presenter { JSONObject jsonObject = (JSONObject) JSON.toJSON(baseResponse.data); int is_developer = jsonObject.getInteger("is_developer"); //后台1是0否 底层0是1否 - setDeveloper(is_developer == 0 ? 1 : 0); + JGYUtils.getInstance().setDeveloper(is_developer == 0 ? 1 : 0); } else { - setDeveloper(1); + JGYUtils.getInstance().setDeveloper(1); } } @@ -1354,16 +1358,6 @@ public class MainPresenter implements MainContact.Presenter { } - private void setDeveloper(int state) { - Settings.System.putInt(mContext.getContentResolver(), "qch_Developeroptions", state); - if (state == 1) { - Intent intent = new Intent(); - intent.setAction("qch_developeroptions_close"); - intent.setPackage("com.android.settings"); - mContext.sendBroadcast(intent); - } - } - @Override public void getScreenLockState() { int locked = Settings.System.getInt(mContext.getContentResolver(), "qch_unlock_ipad", 1); diff --git a/app/src/main/java/com/mjsheng/myappstore/base/BaseApplication.java b/app/src/main/java/com/mjsheng/myappstore/base/BaseApplication.java index ed53a3d..09aa567 100644 --- a/app/src/main/java/com/mjsheng/myappstore/base/BaseApplication.java +++ b/app/src/main/java/com/mjsheng/myappstore/base/BaseApplication.java @@ -115,7 +115,7 @@ public class BaseApplication extends MultiDexApplication { JGYUtils.init(this); XAPKUtils.init(this); FileManager.init(this); - hookWebView(); + JGYUtils.getInstance().hookWebView(); Configuration config = getResources().getConfiguration(); int smallestScreenWidthDp = config.smallestScreenWidthDp; Log.e("mjsheng", "smallestScreenWidthDp=" + smallestScreenWidthDp); @@ -162,63 +162,6 @@ public class BaseApplication extends MultiDexApplication { AmapManager.init(this); } - public void hookWebView() { - int sdkInt = Build.VERSION.SDK_INT; - try { - Class factoryClass = Class.forName("android.webkit.WebViewFactory"); - Field field = factoryClass.getDeclaredField("sProviderInstance"); - field.setAccessible(true); - Object sProviderInstance = field.get(null); - if (sProviderInstance != null) { - Log.i(TAG, "sProviderInstance isn't null"); - return; - } - - Method getProviderClassMethod; - if (sdkInt > 22) { - getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass"); - } else if (sdkInt == 22) { - getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass"); - } else { - Log.i(TAG, "Don't need to Hook WebView"); - return; - } - getProviderClassMethod.setAccessible(true); - Class factoryProviderClass = (Class) getProviderClassMethod.invoke(factoryClass); - Class delegateClass = Class.forName("android.webkit.WebViewDelegate"); - Constructor delegateConstructor = delegateClass.getDeclaredConstructor(); - delegateConstructor.setAccessible(true); - if (sdkInt < 26) {//低于Android O版本 - Constructor providerConstructor = factoryProviderClass.getConstructor(delegateClass); - if (providerConstructor != null) { - providerConstructor.setAccessible(true); - sProviderInstance = providerConstructor.newInstance(delegateConstructor.newInstance()); - } - } else { - Field chromiumMethodName = factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD"); - chromiumMethodName.setAccessible(true); - String chromiumMethodNameStr = (String) chromiumMethodName.get(null); - if (chromiumMethodNameStr == null) { - chromiumMethodNameStr = "create"; - } - Method staticFactory = factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass); - if (staticFactory != null) { - sProviderInstance = staticFactory.invoke(null, delegateConstructor.newInstance()); - } - } - - if (sProviderInstance != null) { - field.set("sProviderInstance", sProviderInstance); - Log.i(TAG, "Hook success!"); - } else { - Log.i(TAG, "Hook failed!"); - } - } catch (Throwable e) { - Log.w(TAG, e); - } - } - - /** * 忽略电池优化 diff --git a/app/src/main/java/com/mjsheng/myappstore/network/URLAddress.java b/app/src/main/java/com/mjsheng/myappstore/network/URLAddress.java index e18c36f..6e2354d 100644 --- a/app/src/main/java/com/mjsheng/myappstore/network/URLAddress.java +++ b/app/src/main/java/com/mjsheng/myappstore/network/URLAddress.java @@ -6,54 +6,57 @@ import com.mjsheng.myappstore.manager.NetInterfaceManager; * @author Administrator */ public class URLAddress { + //根网址 private static final String HTTP_TAG_HEAD_NEW = NetInterfaceManager.ROOT_URL; - public static final String HTTP_TAG_DOWNLOAD_URL = HTTP_TAG_HEAD_NEW + "count/index"; + // 下载接口 根据包名匹配 请求后更新下载次数 + public static final String HTTP_TAG_DOWNLOAD_URL = HTTP_TAG_HEAD_NEW + "count/index"; + //app下载完成发送下载次数 public static final String SEND_DOWNLOAD_FILE_INFO = HTTP_TAG_HEAD_NEW + "app/downloadApp"; - + //获取设备锁定状态 public static final String GET_DEVICES_LOCKED = HTTP_TAG_HEAD_NEW + "lock/index"; - + //发送设备信息 public static final String SEND_DEVICES = HTTP_TAG_HEAD_NEW + "Mac/getMac"; - + //发送app使用情况 public static final String SEND_USEDTIME = HTTP_TAG_HEAD_NEW + "Applog/getAppLog"; - - public static final String CHECK_UPDATE = HTTP_TAG_HEAD_NEW + "Silent/silent"; //更新接口 - public static final String GET_DEVICES_TAGS = HTTP_TAG_HEAD_NEW + "Sn/getSnTag"; + public static final String CHECK_UPDATE = HTTP_TAG_HEAD_NEW + "Silent/silent"; //获取设备标签 - public static final String DELETE_GEDEVICE_ALIAS = HTTP_TAG_HEAD_NEW + "Sn/deleteAliases"; + public static final String GET_DEVICES_TAGS = HTTP_TAG_HEAD_NEW + "Sn/getSnTag"; //删除Aliases - public static final String SET_HOMEPAG_TAG = HTTP_TAG_HEAD_NEW + "Label"; + public static final String DELETE_GEDEVICE_ALIAS = HTTP_TAG_HEAD_NEW + "Sn/deleteAliases"; //浏览器书签主页设置 - public static final String SET_APPINSIDEWEB = HTTP_TAG_HEAD_NEW + "Appground"; + public static final String SET_HOMEPAG_TAG = HTTP_TAG_HEAD_NEW + "Label"; //app内部网页管控 - public static final String SET_BROWSER_LIST = HTTP_TAG_HEAD_NEW + "browser"; + public static final String SET_APPINSIDEWEB = HTTP_TAG_HEAD_NEW + "Appground"; //浏览器黑白名单地址 - public static final String SET_WHITE_PACKAGE_LIST = HTTP_TAG_HEAD_NEW + "firmware/index"; + public static final String SET_BROWSER_LIST = HTTP_TAG_HEAD_NEW + "browser"; //应用白名单 - public static final String GET_HIDE_DESKTOPICON = HTTP_TAG_HEAD_NEW + "Icon"; + public static final String SET_WHITE_PACKAGE_LIST = HTTP_TAG_HEAD_NEW + "firmware/index"; //获取隐藏桌面图标 - public final static String NET_AND_LAUNCH_API = HTTP_TAG_HEAD_NEW + "automatic/get"; + public static final String GET_HIDE_DESKTOPICON = HTTP_TAG_HEAD_NEW + "Icon"; //获取应用升级自启 - public static final String GET_STUDENTS_INFO = HTTP_TAG_HEAD_NEW + "Sn/getStudent"; + public final static String NET_AND_LAUNCH_API = HTTP_TAG_HEAD_NEW + "automatic/get"; //通过sn获取信息 - public static final String SEND_SCREENSHOT = HTTP_TAG_HEAD_NEW + "Screenshot/addImg"; + public static final String GET_STUDENTS_INFO = HTTP_TAG_HEAD_NEW + "Sn/getStudent"; //上传截图 - //public static final String UPDATE_DEVICEINFO = HTTP_TAG_HEAD_NEW + "Mac/getInfo"; + public static final String SEND_SCREENSHOT = HTTP_TAG_HEAD_NEW + "Screenshot/addImg"; //上传我的设备 - public final static String GET_LOCK_SCREEN_STATE = HTTP_TAG_HEAD_NEW + "Sn/getSnScreen"; + //public static final String UPDATE_DEVICEINFO = HTTP_TAG_HEAD_NEW + "Mac/getInfo"; //获取霸屏状态 - public final static String GET_DESKTOP = HTTP_TAG_HEAD_NEW + "Sn/getSnDesktop"; + public final static String GET_LOCK_SCREEN_STATE = HTTP_TAG_HEAD_NEW + "Sn/getSnScreen"; //获取默认桌面升级 - public final static String GET_SN_TIME_CONTROL = HTTP_TAG_HEAD_NEW + "Sn/getSnTimeControl"; + public final static String GET_DESKTOP = HTTP_TAG_HEAD_NEW + "Sn/getSnDesktop"; //获取时间管控 - public final static String GET_TOP_APP_CONTROL = HTTP_TAG_HEAD_NEW + "Sn/getSnAppControl"; + public final static String GET_SN_TIME_CONTROL = HTTP_TAG_HEAD_NEW + "Sn/getSnTimeControl"; //获取顶部app管控 - public final static String GET_SN_APP_TEST = HTTP_TAG_HEAD_NEW + "Sn/getSnAppTest"; + public final static String GET_TOP_APP_CONTROL = HTTP_TAG_HEAD_NEW + "Sn/getSnAppControl"; //获取测试app - public final static String GET_LOGO_IMG = HTTP_TAG_HEAD_NEW + "Sn/getLogoImg"; + public final static String GET_SN_APP_TEST = HTTP_TAG_HEAD_NEW + "Sn/getSnAppTest"; //开机动画 - public final static String GET_DEVELOPER = HTTP_TAG_HEAD_NEW + "Sn/getDeveloper"; + public final static String GET_LOGO_IMG = HTTP_TAG_HEAD_NEW + "Sn/getLogoImg"; + //开发人员选项开关 + public final static String GET_DEVELOPER = HTTP_TAG_HEAD_NEW + "Sn/getDeveloper"; } diff --git a/app/src/main/java/com/mjsheng/myappstore/receiver/MyJPushReceiver.java b/app/src/main/java/com/mjsheng/myappstore/receiver/MyJPushReceiver.java index 47cbf9a..b641473 100644 --- a/app/src/main/java/com/mjsheng/myappstore/receiver/MyJPushReceiver.java +++ b/app/src/main/java/com/mjsheng/myappstore/receiver/MyJPushReceiver.java @@ -131,6 +131,8 @@ public class MyJPushReceiver extends BroadcastReceiver { private final String CLEAN_APP_CACHE = "32";//清除app数据 + private final String DEVELOPER_OPTIONS = "33";//开发人员选项 + private Context mContext; @@ -365,6 +367,9 @@ public class MyJPushReceiver extends BroadcastReceiver { case CLEAN_APP_CACHE: cleanCache(context, extras); break; + case DEVELOPER_OPTIONS: + setDeveloperoptions(extras); + break; } } @@ -1432,4 +1437,11 @@ public class MyJPushReceiver extends BroadcastReceiver { } } } + + private void setDeveloperoptions(String extras) { + com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(extras); + int is_developer = jsonObject.getInteger("is_developer"); + Log.e(TAG, "setDeveloperoptions: " + is_developer); + JGYUtils.getInstance().setDeveloper(is_developer == 0 ? 1 : 0); + } } diff --git a/app/src/main/java/com/mjsheng/myappstore/utils/ApkUtils.java b/app/src/main/java/com/mjsheng/myappstore/utils/ApkUtils.java index 4ac9936..964b9b3 100644 --- a/app/src/main/java/com/mjsheng/myappstore/utils/ApkUtils.java +++ b/app/src/main/java/com/mjsheng/myappstore/utils/ApkUtils.java @@ -1140,7 +1140,7 @@ public class ApkUtils { @Override public void onError(Throwable e) { - Log.e("RemoveTask", "onError: "); + Log.e("RemoveTask", "onError: " + e.getMessage()); } @Override diff --git a/app/src/main/java/com/mjsheng/myappstore/utils/JGYUtils.java b/app/src/main/java/com/mjsheng/myappstore/utils/JGYUtils.java index 896719e..091dcd7 100644 --- a/app/src/main/java/com/mjsheng/myappstore/utils/JGYUtils.java +++ b/app/src/main/java/com/mjsheng/myappstore/utils/JGYUtils.java @@ -32,6 +32,9 @@ import com.mjsheng.myappstore.comm.CommonDatas; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -764,4 +767,71 @@ public class JGYUtils { } } } + + public void setDeveloper(int state) { + Settings.System.putInt(mContext.getContentResolver(), "qch_Developeroptions", state); + if (state == 1) { + Intent intent = new Intent(); + intent.setAction("qch_developeroptions_close"); + intent.setPackage("com.android.settings"); + mContext.sendBroadcast(intent); + } + } + + public void hookWebView() { + int sdkInt = Build.VERSION.SDK_INT; + try { + Class factoryClass = Class.forName("android.webkit.WebViewFactory"); + Field field = factoryClass.getDeclaredField("sProviderInstance"); + field.setAccessible(true); + Object sProviderInstance = field.get(null); + if (sProviderInstance != null) { + Log.i(TAG, "sProviderInstance isn't null"); + return; + } + + Method getProviderClassMethod; + if (sdkInt > 22) { + getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass"); + } else if (sdkInt == 22) { + getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass"); + } else { + Log.i(TAG, "Don't need to Hook WebView"); + return; + } + getProviderClassMethod.setAccessible(true); + Class factoryProviderClass = (Class) getProviderClassMethod.invoke(factoryClass); + Class delegateClass = Class.forName("android.webkit.WebViewDelegate"); + Constructor delegateConstructor = delegateClass.getDeclaredConstructor(); + delegateConstructor.setAccessible(true); + if (sdkInt < 26) {//低于Android O版本 + Constructor providerConstructor = factoryProviderClass.getConstructor(delegateClass); + if (providerConstructor != null) { + providerConstructor.setAccessible(true); + sProviderInstance = providerConstructor.newInstance(delegateConstructor.newInstance()); + } + } else { + Field chromiumMethodName = factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD"); + chromiumMethodName.setAccessible(true); + String chromiumMethodNameStr = (String) chromiumMethodName.get(null); + if (chromiumMethodNameStr == null) { + chromiumMethodNameStr = "create"; + } + Method staticFactory = factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass); + if (staticFactory != null) { + sProviderInstance = staticFactory.invoke(null, delegateConstructor.newInstance()); + } + } + + if (sProviderInstance != null) { + field.set("sProviderInstance", sProviderInstance); + Log.i(TAG, "Hook success!"); + } else { + Log.i(TAG, "Hook failed!"); + } + } catch (Throwable e) { + Log.w(TAG, e); + } + } + } diff --git a/app/src/main/java/com/mjsheng/myappstore/utils/Logger.java b/app/src/main/java/com/mjsheng/myappstore/utils/Logger.java index 2236640..0a4b3ff 100644 --- a/app/src/main/java/com/mjsheng/myappstore/utils/Logger.java +++ b/app/src/main/java/com/mjsheng/myappstore/utils/Logger.java @@ -11,7 +11,7 @@ import com.mjsheng.myappstore.BuildConfig; public class Logger { //设为false关闭日志 - private static final boolean LOG_ENABLE = BuildConfig.LOG_DEBUG; + private static final boolean LOG_ENABLE = BuildConfig.DEBUG; public static void i(String tag, String msg){ if (LOG_ENABLE){ diff --git a/app/src/main/java/com/mjsheng/myappstore/utils/ToastUtil.java b/app/src/main/java/com/mjsheng/myappstore/utils/ToastUtil.java index 233996e..cb04b85 100644 --- a/app/src/main/java/com/mjsheng/myappstore/utils/ToastUtil.java +++ b/app/src/main/java/com/mjsheng/myappstore/utils/ToastUtil.java @@ -88,7 +88,7 @@ public class ToastUtil { mainHandler.post(new Runnable() { @Override public void run() { - if (BuildConfig.LOG_DEBUG) { + if (BuildConfig.DEBUG) { if (toast != null) { toast.setText(msg); toast.show();