yinds 7 ay önce
ebeveyn
işleme
ca8c61957c

+ 4 - 0
app/build.gradle

@@ -37,6 +37,8 @@ android {
             buildConfigField "String", "prjectName", rootProject.ext.release.prjectName
             buildConfigField "String", "FILEAPI_HOST", rootProject.ext.release.fileApiHost
             buildConfigField "String", "FILEAPI_PATH", rootProject.ext.release.fileApiName
+            buildConfigField "String", "APKLOGAPI_HOST", rootProject.ext.release.apkLogApiHost
+            buildConfigField "String", "APKLOGAPI_PATH", rootProject.ext.release.apkLogApiName
         }
         debug {
 //            debuggable true // 是否调试
@@ -49,6 +51,8 @@ android {
             buildConfigField "String", "prjectName", rootProject.ext.debug.prjectName
             buildConfigField "String", "FILEAPI_HOST", rootProject.ext.debug.fileApiHost
             buildConfigField "String", "FILEAPI_PATH", rootProject.ext.debug.fileApiName
+            buildConfigField "String", "APKLOGAPI_HOST", rootProject.ext.release.apkLogApiHost
+            buildConfigField "String", "APKLOGAPI_PATH", rootProject.ext.release.apkLogApiName
         }
     }
 

+ 1 - 0
app/src/main/AndroidManifest.xml

@@ -14,6 +14,7 @@
     <!-- Required  一些系统要求的权限,如访问网络等 -->
     <uses-permission android:name="${applicationId}.permission.JPUSH_MESSAGE" />
     <!-- jpush end -->
+    <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
     <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

+ 23 - 0
app/src/main/java/com/hw/nativeapp/MApplication.java

@@ -12,13 +12,16 @@ import com.hw.nativeapp.config.exceptions.CrashHandler;
 import com.hw.nativeapp.httpnet.ApiService;
 import com.hw.nativeapp.httpnet.ErrorConsumer;
 import com.hw.nativeapp.httpnet.FileApiService;
+import com.hw.nativeapp.httpnet.LogApiService;
 import com.hw.nativeapp.httpnet.ResponseConsumer;
+import com.hw.nativeapp.httpnet.RetrofitApkLogManager;
 import com.hw.nativeapp.httpnet.RetrofitFileManager;
 import com.hw.nativeapp.httpnet.RetrofitManager;
 import com.hw.nativeapp.ui.activity.LoginActivity;
 import com.hw.nativeapp.ui.dialogs.DialogCommon;
 import com.hw.nativeapp.utils.ActivityUtils;
 import com.hw.nativeapp.utils.LogUtils;
+import com.hw.nativeapp.utils.RemoteLogUtils;
 import com.hw.nativeapp.utils.RxUtil;
 import com.hw.nativeapp.utils.ToastUtils;
 import com.hw.nativeapp.utils.sunmi.SunmiPrintHelper;
@@ -37,6 +40,7 @@ public class MApplication extends Application {
 //    private static String defaultDeviceId;
     private static volatile ApiService mApiService;
     private static volatile FileApiService mFileApiService;
+    private static volatile LogApiService logApiService;
 
     /**
      * 线程池
@@ -76,6 +80,7 @@ public class MApplication extends Application {
         RetrofitManager.init(this);
         RetrofitManager.setBaseUrl(BuildConfig.API_HOST);
         RetrofitFileManager.init(this);
+        RetrofitApkLogManager.init(this);
         LogUtils.init(this, true,false, 'd', "aleyds");
 
         Utils.init(this);
@@ -92,6 +97,8 @@ public class MApplication extends Application {
         StrictMode.setVmPolicy(builder.build());
         builder.detectFileUriExposure();
 
+        RemoteLogUtils.log("aleyds", "APK启动");
+
         printInit();
     }
 
@@ -166,6 +173,22 @@ public class MApplication extends Application {
         return mFileApiService;
     }
 
+    /**
+     * 获取api接口实例
+     *
+     * @return ApiService
+     */
+    public static LogApiService getLogApi() {
+        if (logApiService == null) {
+            synchronized (MApplication.class) {
+                if (logApiService == null) {
+                    logApiService = RetrofitApkLogManager.create(LogApiService.class);
+                }
+            }
+        }
+        return logApiService;
+    }
+
     public static void loginout(boolean showdig, String msg, Context context ) {
         SPUtils.getInstance().remove(Contents.SPU_TOKEN_KEY);
 //            SPUtils.getInstance().remove(Contents.SPU_USERLOGININFO_KEY);

+ 4 - 0
app/src/main/java/com/hw/nativeapp/config/Contents.java

@@ -6,6 +6,10 @@ public class Contents {
 
     public static final String TOKEN_HEAD = "Authorization";
 
+    /**
+     * 应用名称
+     */
+    public static final String APP_NAME = "伟大转账核销端";
     //APPID  - 升级使用
     public static final String APPID = "pda_key";
 

+ 37 - 0
app/src/main/java/com/hw/nativeapp/httpnet/LogApiService.java

@@ -0,0 +1,37 @@
+package com.hw.nativeapp.httpnet;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.hw.nativeapp.BuildConfig;
+import com.hw.nativeapp.httpnet.entity.ApkLog;
+import com.hw.nativeapp.httpnet.entity.ChangePsdRequestBean;
+import com.hw.nativeapp.httpnet.entity.LoginBean;
+import com.hw.nativeapp.httpnet.entity.ResponseData;
+
+import io.reactivex.Observable;
+import okhttp3.MultipartBody;
+import retrofit2.http.Body;
+import retrofit2.http.Multipart;
+import retrofit2.http.POST;
+import retrofit2.http.Part;
+import retrofit2.http.Query;
+
+/**
+ * @create by ywq
+ * @date 2020/5/12
+ * @description :
+ */
+public interface LogApiService {
+
+    String COMMON = BuildConfig.APKLOGAPI_PATH;
+
+    //修改密码
+    @POST(COMMON + "/common/logSave")
+    Observable<ResponseData<JSONObject>> remoteLog(
+            @Body ApkLog apkLog,
+            @Query("t") Long currtime
+    );
+
+
+
+}

+ 130 - 0
app/src/main/java/com/hw/nativeapp/httpnet/RetrofitApkLogManager.java

@@ -0,0 +1,130 @@
+package com.hw.nativeapp.httpnet;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+
+import com.hw.nativeapp.BuildConfig;
+
+import java.lang.reflect.Field;
+import java.security.SecureRandom;
+import java.util.Collections;
+import java.util.concurrent.TimeUnit;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+
+import okhttp3.Cache;
+import okhttp3.OkHttpClient;
+import okhttp3.Protocol;
+import retrofit2.Retrofit;
+import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
+import retrofit2.converter.gson.GsonConverterFactory;
+
+/**
+ * Created by kaka on 2018/3/14.
+ * email:375120706@qq.com
+ */
+
+public class RetrofitApkLogManager {
+
+
+    private static volatile OkHttpClient mOkHttpClient;
+
+    private static Cache cache;
+
+    public static void init(@NonNull Context context) {
+        cache = new Cache(context.getApplicationContext().getCacheDir(), 1024 * 1024 * 10);//缓存10mib
+    }
+
+
+    private static OkHttpClient getOkHttpClient() {
+        if (mOkHttpClient == null) {
+            synchronized (RetrofitApkLogManager.class) {
+                if (mOkHttpClient == null) {
+                    mOkHttpClient = new OkHttpClient.Builder()
+                            .addInterceptor(new OkHttpInterceptor())
+                            .connectTimeout(30, TimeUnit.SECONDS)//连接超时时间
+                            .readTimeout(15, TimeUnit.SECONDS)//读取超时时间
+                            .writeTimeout(15, TimeUnit.SECONDS)//写入超时时间
+                            .cache(cache)
+                            .protocols(Collections.singletonList(Protocol.HTTP_1_1))
+                            .build();
+                }
+            }
+        }
+        return mOkHttpClient;
+    }
+
+    public static <T> T create(Class<T> clazz) {
+        ignoreSSLCheck();
+        Retrofit retrofit = new Retrofit.Builder()
+                .client(getOkHttpClient())
+                .baseUrl(BuildConfig.APKLOGAPI_HOST)
+                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
+                .addConverterFactory(GsonConverterFactory.create())
+                .build();
+        return retrofit.create(clazz);
+    }
+
+    public static <T> T createNoBase(Class<T> clazz, String baseUrl) {
+        Retrofit retrofit = new Retrofit.Builder()
+                .client(getOkHttpClient())
+                .baseUrl(baseUrl)
+                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
+                .addConverterFactory(GsonConverterFactory.create())
+                .build();
+        return retrofit.create(clazz);
+    }
+
+    private static void ignoreSSLCheck() {
+//        Log.e(TAG, "ignoreSSLCheck()");
+        SSLContext sc = null;
+        try {
+            sc = SSLContext.getInstance("SSL");
+            sc.init(null, new TrustManager[]{new X509TrustManager() {
+                @Override
+                public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
+
+                }
+
+                @Override
+                public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {
+
+                }
+
+                @Override
+                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+                    return null;
+                }
+            }}, new SecureRandom());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        HostnameVerifier hv1 = new HostnameVerifier() {
+            @Override
+            public boolean verify(String hostname, SSLSession session) {
+                return true;
+            }
+        };
+
+        String workerClassName = "okhttp3.OkHttpClient";
+        try {
+            Class workerClass = Class.forName(workerClassName);
+            Field hostnameVerifier = workerClass.getDeclaredField("hostnameVerifier");
+            hostnameVerifier.setAccessible(true);
+            hostnameVerifier.set(getOkHttpClient(), hv1);
+
+            Field sslSocketFactory = workerClass.getDeclaredField("sslSocketFactory");
+            sslSocketFactory.setAccessible(true);
+            sslSocketFactory.set(getOkHttpClient(), sc.getSocketFactory());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}

+ 86 - 0
app/src/main/java/com/hw/nativeapp/httpnet/entity/ApkLog.java

@@ -0,0 +1,86 @@
+package com.hw.nativeapp.httpnet.entity;
+
+import java.util.Date;
+
+
+/**
+ * APK日志
+ */
+
+public class ApkLog  {
+	/** APK名称 */
+      private String apkName;
+	/** APKID */
+      private String apkId;
+	/** IP地址 */
+      private String apkIp;
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+    /**
+     * 运行环境:dev test pro
+     */
+    private String runEnv;
+    /** 日志TAG */
+      private String logTag;
+	/** 日志内容 */
+      private String logContent;
+
+
+    public String getApkName() {
+        return apkName;
+    }
+
+    public void setApkName(String apkName) {
+        this.apkName = apkName;
+    }
+
+    public String getApkId() {
+        return apkId;
+    }
+
+    public void setApkId(String apkId) {
+        this.apkId = apkId;
+    }
+
+    public String getApkIp() {
+        return apkIp;
+    }
+
+    public void setApkIp(String apkIp) {
+        this.apkIp = apkIp;
+    }
+
+    public String getDeviceId() {
+        return deviceId;
+    }
+
+    public void setDeviceId(String deviceId) {
+        this.deviceId = deviceId;
+    }
+
+    public String getRunEnv() {
+        return runEnv;
+    }
+
+    public void setRunEnv(String runEnv) {
+        this.runEnv = runEnv;
+    }
+
+    public String getLogTag() {
+        return logTag;
+    }
+
+    public void setLogTag(String logTag) {
+        this.logTag = logTag;
+    }
+
+    public String getLogContent() {
+        return logContent;
+    }
+
+    public void setLogContent(String logContent) {
+        this.logContent = logContent;
+    }
+}

+ 3 - 3
app/src/main/java/com/hw/nativeapp/utils/DeviceUtils.java

@@ -13,6 +13,7 @@ import androidx.core.app.ActivityCompat;
 import java.net.NetworkInterface;
 import java.net.SocketException;
 import java.security.MessageDigest;
+import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -123,7 +124,7 @@ public class DeviceUtils {
      * @param context
      * @return
      */
-    private static String getIMIEStatus(Context context) {
+    public static String getDeviceId(Context context) {
         TelephonyManager tm = (TelephonyManager) context
                 .getSystemService(Context.TELEPHONY_SERVICE);
         if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
@@ -136,8 +137,7 @@ public class DeviceUtils {
             // for ActivityCompat#requestPermissions for more details.
             return "";
         }
-        String deviceId = tm.getDeviceId();
-        return deviceId;
+        return tm.getDeviceId();
     }
 
 

+ 40 - 0
app/src/main/java/com/hw/nativeapp/utils/RemoteLogUtils.java

@@ -0,0 +1,40 @@
+package com.hw.nativeapp.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.hw.nativeapp.BuildConfig;
+import com.hw.nativeapp.MApplication;
+import com.hw.nativeapp.config.Contents;
+import com.hw.nativeapp.httpnet.ErrorConsumer;
+import com.hw.nativeapp.httpnet.ResponseConsumer;
+import com.hw.nativeapp.httpnet.entity.ApkLog;
+import com.hw.nativeapp.httpnet.entity.LoginBean;
+import com.hw.nativeapp.httpnet.entity.ResponseData;
+
+import io.reactivex.functions.Consumer;
+
+public class RemoteLogUtils {
+
+
+    public static void log(String tag, String msg){
+        ApkLog apkLog = new ApkLog();
+        apkLog.setApkName(Contents.APP_NAME);
+        apkLog.setApkId(Contents.APPID);
+        apkLog.setRunEnv(BuildConfig.BUILD_TYPE);
+        apkLog.setDeviceId(DeviceUtils.getDeviceId(MApplication.context()));
+        apkLog.setLogTag(tag);
+        apkLog.setLogContent(msg);
+        MApplication.getLogApi().remoteLog( apkLog, System.currentTimeMillis() / 1000)
+                .compose(RxUtil.applyObservableAsync())
+                .subscribe( new ResponseConsumer<JSONObject>() {
+                    @Override
+                    public void onSuccess(JSONObject data) {
+                        LogUtils.d("log", "onSuccess: ");
+                    }
+
+                    @Override
+                    public void onFailed(int code, String msg) {
+
+                    }
+                }, new ErrorConsumer());
+    }
+}

+ 4 - 0
config.gradle

@@ -23,6 +23,8 @@ ext {
             "fileApiHost"      : '""',
             "fileApiName"      : '""',
             "prjectName" : '"正式"',
+            "apkLogApiHost" : '"https://dazesoft.cn"',
+            "apkLogApiName"      : '"t"',
 
             // 高德地图
             "AMAP_API_KEY" : "565ad55bec6d286e33a95a9ff1911b55",
@@ -36,6 +38,8 @@ ext {
             "fileApiHost"      : '"https://fileupload.dev.dazesoft.cn"',
             "fileApiName"      : '""',
             "prjectName" : '"测试"',
+            "apkLogApiHost" : '"https://dztools.dev.dazesoft.cn"',
+            "apkLogApiName"      : '"t"',
 
             // 高德地图
             "AMAP_API_KEY" : "565ad55bec6d286e33a95a9ff1911b55",