提交 bc5a68db 编写于 作者: J jackjintai

Merge branch 'feature/androdx_from_platform' into feature/platform

......@@ -25,8 +25,6 @@ import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
......@@ -39,7 +37,6 @@ import com.baidu.location.LocationClientOption;
import com.blankj.utilcode.util.ConvertUtils;
import com.blankj.utilcode.util.ThreadUtils;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.didichuxing.doraemonkit.DoraemonKit;
import com.didichuxing.doraemonkit.kit.network.common.CommonHeaders;
import com.didichuxing.doraemonkit.kit.network.common.CommonInspectorRequest;
......@@ -86,7 +83,10 @@ import pub.devrel.easypermissions.EasyPermissions;
import pub.devrel.easypermissions.PermissionRequest;
public class MainDebugActivity extends AppCompatActivity implements View.OnClickListener {
/**
* @author jintai
*/
public class MainDebugActivity extends BaseActivity implements View.OnClickListener {
public static final String TAG = "MainDebugActivity";
......@@ -351,21 +351,22 @@ public class MainDebugActivity extends AppCompatActivity implements View.OnClick
case R.id.btn_load_img:
//Glide 加载
String picassoImgUrl = "http://b-ssl.duitang.com/uploads/item/201808/27/20180827043223_twunu.jpg";
String picassoImgUrl = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1585832555614&di=ea70ed1254b3242803d7dde56eedfe9f&imgtype=0&src=http%3A%2F%2Ft9.baidu.com%2Fit%2Fu%3D2268908537%2C2815455140%26fm%3D79%26app%3D86%26f%3DJPEG%3Fw%3D1280%26h%3D719";
String glideImageUrl = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1584969662890&di=bc7b18d8b4efa73fb88ddef4f6f56acc&imgtype=0&src=http%3A%2F%2Ft9.baidu.com%2Fit%2Fu%3D583874135%2C70653437%26fm%3D79%26app%3D86%26f%3DJPEG%3Fw%3D3607%26h%3D2408";
String frescoImageUrl = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1584969662890&di=09318a918fe9ea73a8e27c80291bf669&imgtype=0&src=http%3A%2F%2Ft8.baidu.com%2Fit%2Fu%3D1484500186%2C1503043093%26fm%3D79%26app%3D86%26f%3DJPEG%3Fw%3D1280%26h%3D853";
String imageLoaderImageUrl = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1584969662891&di=acaf549645e58b6c67c231d495e18271&imgtype=0&src=http%3A%2F%2Ft8.baidu.com%2Fit%2Fu%3D3571592872%2C3353494284%26fm%3D79%26app%3D86%26f%3DJPEG%3Fw%3D1200%26h%3D1290";
Picasso.get().load(picassoImgUrl)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.into((ImageView) findViewById(R.id.iv_picasso));
Glide.with(MainDebugActivity.this)
.asBitmap()
.load(glideImageUrl)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
//.diskCacheStrategy(DiskCacheStrategy.NONE)
//.skipMemoryCache(true)
.into((ImageView) findViewById(R.id.iv_glide));
//
Picasso.get().load(picassoImgUrl)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.into((ImageView) findViewById(R.id.iv_picasso));
//
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage(imageLoaderImageUrl, (ImageView) findViewById(R.id.iv_imageloader));
......@@ -406,7 +407,7 @@ public class MainDebugActivity extends AppCompatActivity implements View.OnClick
case R.id.btn_connection_mock:
//requestByGet("https://www.v2ex.com/api/topics/hot.json");
//requestByGet("https://gank.io/api/today?a=哈哈&b=bb");
requestByGet("http://gank.io/gateway?api=dj.map");
requestByGet("https://www.v2ex.com/api/topics/hot.json");
break;
// case R.id.btn_rpc_mock:
// break;
......
package com.didichuxing.doraemondemo;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.didichuxing.doraemonkit.aop.bigimg.glide.GlideHook;
import java.util.ArrayList;
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/4/3-14:06
* 描 述:
* 修订历史:
* ================================================
*/
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
......@@ -23,7 +23,7 @@ ext {
//didi内部仓库版本号
didiArchivesVersionName : "1000.0.22",
versionName : "3.0.0",
glide : "4.11.0",
glide_version : "4.9.0",
kotlin_version : "1.3.71"
]
dependencies = [// ###### android library start ######
......@@ -47,11 +47,11 @@ ext {
//将urlconnection代理到okhttp
//"okhttp_urlconnection" : "com.squareup.okhttp3:okhttp-urlconnection:3.12.1",
//"okio" : "com.squareup.okio:okio:1.15.0",
"utilcode" : 'com.blankj:utilcode:1.27.0',
"glide" : 'com.github.bumptech.glide:glide:4.11.0',
"utilcode" : 'com.blankj:utilcode:1.27.1',
"glide" : "com.github.bumptech.glide:glide:${android["glide_version"]}",
"glide_v3" : 'com.github.bumptech.glide:glide:3.8.0',
"glide_okhttp3" : "com.github.bumptech.glide:okhttp3-integration:4.11.0",
"glide_compiler" : "com.github.bumptech.glide:compiler:4.11.0",
"glide_okhttp3" : "com.github.bumptech.glide:okhttp3-integration:${android["glide_version"]}",
"glide_compiler" : "com.github.bumptech.glide:compiler:${android["glide_version"]}",
"picasso" : 'com.squareup.picasso:picasso:2.71828',
"fresco" : 'com.facebook.fresco:fresco:1.13.0',
"fresco-processors" : "jp.wasabeef:fresco-processors:2.1.0",
......
......@@ -68,7 +68,7 @@
android:theme="@style/leak_canary_Theme.Transparent" />
<service
android:name="com.sjtu.yifei.service.ABridgeService"
android:name="com.didichuxing.doraemonkit.abridge.service.ABridgeService"
android:enabled="true"
android:exported="true"
android:process=":aidl">
......@@ -78,7 +78,7 @@
</service>
<service
android:name="com.sjtu.yifei.service.MessengerService"
android:name="com.didichuxing.doraemonkit.abridge.service.MessengerService"
android:enabled="true"
android:exported="true"
android:process=":messenger">
......
// ICallback.aidl
package com.sjtu.yifei.aidl;
package com.didichuxing.doraemonkit.aidl;
// Declare any non-default types here with import statements
......
// ICall.aidl
package com.sjtu.yifei.aidl;
package com.didichuxing.doraemonkit.aidl;
import com.sjtu.yifei.aidl.IReceiverAidlInterface;
import com.didichuxing.doraemonkit.aidl.IReceiverAidlInterface;
interface ISenderAidlInterface {
......
package com.didichuxing.doraemonkit;
import android.app.Application;
import android.util.Log;
import com.blankj.utilcode.util.ActivityUtils;
import com.didichuxing.doraemonkit.abridge.AbridgeCallBack;
import com.didichuxing.doraemonkit.abridge.IBridge;
import com.didichuxing.doraemonkit.constant.DokitConstant;
import com.didichuxing.doraemonkit.kit.health.AppHealthInfoUtil;
import com.didichuxing.doraemonkit.kit.health.model.AppHealthInfo;
import com.didichuxing.doraemonkit.util.LogHelper;
import com.sjtu.yifei.AbridgeCallBack;
import com.sjtu.yifei.IBridge;
import com.squareup.leakcanary.LeakCanary;
/**
......@@ -45,7 +45,7 @@ class LeakCanaryManager {
@Override
public void receiveMessage(String message) {
try {
LogHelper.i(TAG, "====aidl=====>" + message);
Log.i(TAG, "====aidl=====>" + message);
if (DokitConstant.APP_HEALTH_RUNNING) {
AppHealthInfo.DataBean.LeakBean leakBean = new AppHealthInfo.DataBean.LeakBean();
leakBean.setPage(ActivityUtils.getTopActivity().getClass().getCanonicalName());
......
package com.sjtu.yifei;
package com.didichuxing.doraemonkit.abridge;
import android.app.Application;
import android.content.ComponentName;
......@@ -13,8 +13,9 @@ import android.text.TextUtils;
import android.util.Log;
;
import com.sjtu.yifei.aidl.IReceiverAidlInterface;
import com.sjtu.yifei.aidl.ISenderAidlInterface;
import com.didichuxing.doraemonkit.aidl.IReceiverAidlInterface;
import com.didichuxing.doraemonkit.aidl.ISenderAidlInterface;
import java.util.ArrayList;
import java.util.List;
......@@ -30,7 +31,7 @@ import java.util.List;
final class AbridgeManager {
private static final String TAG = "AbridgeManager";
private static final String BIND_SERVICE_ACTION = "android.intent.action.ICALL_AIDL_YIFEI";
private static final String BIND_SERVICE_COMPONENT_NAME_CLS = "com.sjtu.yifei.service.ABridgeService";
private static final String BIND_SERVICE_COMPONENT_NAME_CLS = "com.didichuxing.doraemonkit.abridge.service.ABridgeService";
private static AbridgeManager instance;
private Application sApplication;
......
package com.sjtu.yifei;
package com.didichuxing.doraemonkit.abridge;
import android.app.Application;
import android.content.ComponentName;
......@@ -26,7 +26,7 @@ import java.util.List;
final class AbridgeMessengerManager {
private static final String TAG = "AbridgeMessengerManager";
private static final String BIND_SERVICE_ACTION = "android.intent.action.ICALL_MESSENGER_YIFEI";
private static final String BIND_MESSENGER_SERVICE_COMPONENT_NAME_CLS = "com.sjtu.yifei.service.MessengerService";
private static final String BIND_MESSENGER_SERVICE_COMPONENT_NAME_CLS = "com.didichuxing.doraemonkit.abridge.service.MessengerService";
private static AbridgeMessengerManager instance;
private Application sApplication;
......
package com.sjtu.yifei;
package com.didichuxing.doraemonkit.abridge;
import android.app.Application;
import android.os.Message;
......
package com.sjtu.yifei.service;
package com.didichuxing.doraemonkit.abridge.service;
import android.app.Service;
import android.content.Intent;
......@@ -7,8 +7,9 @@ import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.util.Log;
import com.sjtu.yifei.aidl.IReceiverAidlInterface;
import com.sjtu.yifei.aidl.ISenderAidlInterface;
import com.didichuxing.doraemonkit.aidl.IReceiverAidlInterface;
import com.didichuxing.doraemonkit.aidl.ISenderAidlInterface;
import java.util.ArrayList;
import java.util.List;
......
package com.sjtu.yifei.service;
package com.didichuxing.doraemonkit.abridge.service;
import android.annotation.SuppressLint;
import android.app.Service;
......@@ -7,12 +7,9 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.text.TextUtils;
import com.sjtu.yifei.aidl.IReceiverAidlInterface;
import java.util.ArrayList;
import java.util.List;
......
......@@ -18,11 +18,9 @@ package com.squareup.leakcanary;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.didichuxing.doraemonkit.util.LogHelper;
import com.squareup.leakcanary.internal.ActivityLifecycleCallbacksAdapter;
/**
......
......@@ -15,13 +15,12 @@
*/
package com.squareup.leakcanary;
import android.os.Bundle;
import android.os.Message;
import androidx.annotation.NonNull;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.NonNull;
import com.didichuxing.doraemonkit.util.LogHelper;
import com.sjtu.yifei.IBridge;
import com.didichuxing.doraemonkit.abridge.IBridge;
import com.squareup.leakcanary.internal.DisplayLeakActivity;
/**
......@@ -48,7 +47,7 @@ public class UploadLeakService extends DisplayLeakService {
if (TextUtils.isEmpty(leakInfo)) {
return;
}
LogHelper.i(TAG, "====leakInfo====" + leakInfo);
Log.i(TAG, "====leakInfo====" + leakInfo);
try {
IBridge.sendAIDLMessage(leakInfo);
} catch (Exception e) {
......
......@@ -20,6 +20,8 @@ import android.content.Intent;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import com.blankj.utilcode.util.Utils;
import com.didichuxing.doraemonkit.DoraemonKit;
import com.squareup.leakcanary.R;
import com.squareup.leakcanary.AbstractAnalysisResultService;
import com.squareup.leakcanary.AnalysisResult;
......@@ -63,6 +65,7 @@ public final class HeapAnalyzerService extends ForegroundService
public HeapAnalyzerService() {
super(HeapAnalyzerService.class.getSimpleName(), R.string.leak_canary_notification_analysing);
// Utils.init(getApplication());
}
/**
......
......@@ -3,6 +3,7 @@ package com.didichuxing.doraemonkit.plugin.bytecode;
import com.didichuxing.doraemonkit.plugin.DokitExtUtil;
import com.didichuxing.doraemonkit.plugin.bytecode.method.bigimg.FrescoMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.bigimg.GlideMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.bigimg.GlideTransformMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.bigimg.ImageLoaderMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.bigimg.PicassoMethodAdapter;
......@@ -64,13 +65,24 @@ public final class DokitBigImageClassAdapter extends ClassVisitor {
if (!DokitExtUtil.getInstance().isDokitPluginSwitch()) {
return mv;
}
//Glide v4字节码替换 glide v4.9 通过init注入 4.11.0 通构造函数
//Glide v4字节码替换 glide v4.9 通过init注入 4.11.0 通构造函数
if (className.equals("com/bumptech/glide/request/SingleRequest") && (methodName.equals("init") || methodName.equals("<init>")) && desc != null) {
log(className, access, methodName, desc, signature);
//创建MethodVisitor代理
return mv == null ? null : new GlideMethodAdapter(mv, access, methodName, desc);
}
//Glide v4字节码替换 transform 代码注入
if (className.equals("com/bumptech/glide/request/BaseRequestOptions") && methodName.equals("transform") && desc != null) {
if (desc.equals("(Lcom/bumptech/glide/load/Transformation;Z)Lcom/bumptech/glide/request/BaseRequestOptions;")) {
log(className, access, methodName, desc, signature);
//创建MethodVisitor代理
return mv == null ? null : new GlideTransformMethodAdapter(mv, access, methodName, desc);
}
}
//Glide v3字节码替换
// if (className.equals("com/bumptech/glide/GenericRequestBuilder") && methodName.equals("listener") && desc != null) {
// log(className, access, methodName, desc, signature);
......@@ -81,6 +93,7 @@ public final class DokitBigImageClassAdapter extends ClassVisitor {
//Picasso 字节码替换
if (className.equals("com/squareup/picasso/Request") && methodName.equals("<init>") && desc != null) {
log(className, access, methodName, desc, signature);
// (Lcom/bumptech/glide/load/Transformation;Z)Lcom/bumptech/glide/request/BaseRequestOptions;
//创建MethodVisitor代理
return mv == null ? null : new PicassoMethodAdapter(mv, access, methodName, desc);
}
......
......@@ -29,7 +29,7 @@ public final class DokitCommClassAdapter extends ClassVisitor {
private String superName;
/**
* @param cv cv
* @param cv cv
*/
public DokitCommClassAdapter(final ClassVisitor cv) {
super(Opcodes.ASM7, cv);
......@@ -149,6 +149,7 @@ public final class DokitCommClassAdapter extends ClassVisitor {
if (desc == null || desc.equals("")) {
return 0;
}
//包含返回值 所以需要减1
return desc.split(";").length - 1;
}
......
......@@ -34,11 +34,16 @@ public final class GlideMethodAdapter extends AdviceAdapter {
@Override
protected void onMethodExit(int opcode) {
super.onMethodExit(opcode);
// mv.visitVarInsn(ALOAD, 0);
// mv.visitVarInsn(ALOAD, 0);
// mv.visitFieldInsn(GETFIELD, "com/bumptech/glide/request/SingleRequest", "requestListeners", "Ljava/util/List;");
// mv.visitMethodInsn(INVOKESTATIC, "com/didichuxing/doraemonkit/aop/bigimg/glide/GlideHook", "proxy", "(Ljava/util/List;)Ljava/util/List;", false);
// mv.visitFieldInsn(PUTFIELD, "com/bumptech/glide/request/SingleRequest", "requestListeners", "Ljava/util/List;");
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, "com/bumptech/glide/request/SingleRequest", "requestListeners", "Ljava/util/List;");
mv.visitMethodInsn(INVOKESTATIC, "com/didichuxing/doraemonkit/aop/bigimg/glide/GlideHook", "proxy", "(Ljava/util/List;)Ljava/util/List;", false);
mv.visitFieldInsn(PUTFIELD, "com/bumptech/glide/request/SingleRequest", "requestListeners", "Ljava/util/List;");
mv.visitMethodInsn(INVOKESTATIC, "com/didichuxing/doraemonkit/aop/bigimg/glide/GlideHook", "proxy", "(Ljava/lang/Object;)V", false);
}
}
package com.didichuxing.doraemonkit.plugin.bytecode.method.bigimg;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.AdviceAdapter;
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/4/3-13:07
* 描 述:
* 修订历史:
* ================================================
*
* @author didi
*/
public class GlideTransformMethodAdapter extends AdviceAdapter {
/**
* Constructs a new {@link AdviceAdapter}.
*
* @param methodVisitor the method visitor to which this adapter delegates calls.
* @param access the method's access flags (see {@link Opcodes}).
* @param name the method's name.
* @param descriptor the method's descriptor (see {@link Type Type}).
*/
public GlideTransformMethodAdapter(MethodVisitor methodVisitor, int access, String methodName, String descriptor) {
super(Opcodes.ASM7, methodVisitor, access, methodName, descriptor);
}
@Override
protected void onMethodEnter() {
super.onMethodEnter();
}
@Override
protected void onMethodExit(int opcode) {
super.onMethodExit(opcode);
mv.visitVarInsn(ALOAD, 0);
mv.visitLdcInsn(Type.getType("Landroid/graphics/Bitmap;"));
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESTATIC, "com/didichuxing/doraemonkit/aop/bigimg/glide/GlideTransformHook", "transform", "(Ljava/lang/Object;)Lcom/bumptech/glide/load/resource/bitmap/BitmapTransformation;", false);
mv.visitVarInsn(ILOAD, 2);
mv.visitMethodInsn(INVOKEVIRTUAL, "com/bumptech/glide/request/BaseRequestOptions", "transform", "(Ljava/lang/Class;Lcom/bumptech/glide/load/Transformation;Z)Lcom/bumptech/glide/request/BaseRequestOptions;", false);
mv.visitInsn(POP);
}
}
......@@ -49,13 +49,6 @@ public final class SlowMethodAdapter extends AdviceAdapter {
protected void onMethodEnter() {
super.onMethodEnter();
try {
// if (this.getName().equals("attachBaseContext")) {
// mv.visitMethodInsn(INVOKESTATIC, "com/didichuxing/doraemonkit/aop/MethodCostUtil", "getInstance", "()Lcom/didichuxing/doraemonkit/aop/MethodCostUtil;", false);
// mv.visitIntInsn(SIPUSH, thresholdTime);
// mv.visitLdcInsn(this.className + "&" + this.getName());
// mv.visitMethodInsn(INVOKEVIRTUAL, "com/didichuxing/doraemonkit/aop/MethodCostUtil", "recodeStaticMethodCostStart", "(ILjava/lang/String;)V", false);
// return;
// }
if (isStaticMethod) {
//静态方法需要插入的代码
......
......@@ -36,6 +36,7 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation rootProject.ext.dependencies["appcompat"]
implementation rootProject.ext.dependencies["constraintLayout"]
implementation rootProject.ext.dependencies["design"]
implementation rootProject.ext.dependencies["utilcode"]
if (rootProject.ext.config["uploadArchives"]) {
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.ConstraintLayout
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
......@@ -38,4 +38,4 @@
app:layout_constraintEnd_toEndOf="@+id/tv_tip_value"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.ConstraintLayout>
\ No newline at end of file
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -61,8 +61,6 @@ dependencies {
//远程调试db
implementation rootProject.ext.dependencies["debug-db"]
implementation rootProject.ext.dependencies["debug-db-encrypt"]
//rv
// implementation rootProject.ext.dependencies["brvah"]
implementation rootProject.ext.dependencies["android_spinkit"]
implementation rootProject.ext.dependencies["okhttp"]
implementation rootProject.ext.dependencies["okhttp_v2"]
......
......@@ -9,9 +9,11 @@ import com.amitshekhar.DebugDB;
import com.amitshekhar.debug.encrypt.sqlite.DebugDBEncryptFactory;
import com.amitshekhar.debug.sqlite.DebugDBFactory;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.FileUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.NetworkUtils;
import com.blankj.utilcode.util.ProcessUtils;
import com.blankj.utilcode.util.ThreadUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.blankj.utilcode.util.Utils;
......@@ -80,7 +82,7 @@ import java.util.List;
* DoraemonKit 真正执行的类 不建议外部app调用
*/
class DoraemonKitReal {
private static final String TAG = "DoraemonKitReal";
private static final String TAG = "Doraemon";
private static boolean sHasInit = false;
......@@ -138,12 +140,32 @@ class DoraemonKitReal {
sHasInit = true;
//赋值
APPLICATION = app;
//初始化工具类
initAndroidUtil(app);
//判断进程名
if (!ProcessUtils.isMainProcess()) {
Log.i(TAG, "======isNotMainProcess===");
return;
}
Log.i(TAG, "======isMainProcess===");
String strDokitMode = SharedPrefsUtil.getString(app, SharedPrefsKey.FLOAT_START_MODE, "normal");
if (strDokitMode.equals("normal")) {
DokitConstant.IS_NORMAL_FLOAT_MODE = true;
} else {
DokitConstant.IS_NORMAL_FLOAT_MODE = false;
}
Log.i(TAG, "IS_HOOK====>" + IS_HOOK);
//赋值全局变量
DokitConstant.IS_HOOK = IS_HOOK;
//初始化第三方工具
installLeakCanary(app);
checkLargeImgIsOpen();
registerNetworkStatusChangedListener();
startAppHealth();
checkGPSMock();
//解锁系统隐藏api限制权限以及hook Instrumentation
HandlerHooker.doHook(app);
......@@ -152,9 +174,7 @@ class DoraemonKitReal {
//OkHttp 拦截器 注入
OkHttpHook.installInterceptor();
LogHelper.i(TAG, "IS_HOOK====>" + IS_HOOK);
//赋值全局变量
DokitConstant.IS_HOOK = IS_HOOK;
//注册全局的activity生命周期回调
app.registerActivityLifecycleCallbacks(new DokitActivityLifecycleCallbacks());
DokitConstant.KIT_MAPS.clear();
......@@ -282,13 +302,7 @@ class DoraemonKitReal {
e.printStackTrace();
}
}
installLeakCanary(app);
initAndroidUtil(app);
checkLargeImgIsOpen();
registerNetworkStatusChangedListener();
//initAidlBridge(app);
startAppHealth();
checkGPSMock();
//上传埋点
DataPickManager.getInstance().postData();
}
......@@ -450,9 +464,9 @@ class DoraemonKitReal {
//反射调用
try {
Class leakCanaryManager = Class.forName("com.didichuxing.doraemonkit.LeakCanaryManager");
Method install = leakCanaryManager.getMethod("install", Application.class);
//调用静态的install方法
install.invoke(null, app);
// Method install = leakCanaryManager.getMethod("install", Application.class);
// //调用静态的install方法
// install.invoke(null, app);
Method initAidlBridge = leakCanaryManager.getMethod("initAidlBridge", Application.class);
//调用静态initAidlBridge方法
......
......@@ -24,13 +24,13 @@ import static com.facebook.imagepipeline.request.BasePostprocessor.FALLBACK_BITM
* 修订历史:
* ================================================
*/
public class DokitPostprocessor implements Postprocessor {
public class DokitFrescoPostprocessor implements Postprocessor {
private static final String TAG = "DokitPostprocessor";
@Nullable
private Postprocessor mOriginalPostprocessor;
private Uri mUri;
public DokitPostprocessor(Uri uri, Postprocessor postprocessor) {
public DokitFrescoPostprocessor(Uri uri, Postprocessor postprocessor) {
this.mOriginalPostprocessor = postprocessor;
this.mUri = uri;
}
......
......@@ -15,6 +15,6 @@ import com.facebook.imagepipeline.request.Postprocessor;
*/
public class FrescoHook {
public static Postprocessor proxy(Uri uri, Postprocessor postprocessor) {
return new DokitPostprocessor(uri, postprocessor);
return new DokitFrescoPostprocessor(uri, postprocessor);
}
}
......@@ -2,6 +2,7 @@ package com.didichuxing.doraemonkit.aop.bigimg.glide;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import androidx.annotation.Nullable;
import com.bumptech.glide.load.DataSource;
......
//package com.didichuxing.doraemonkit.aop.bigimg.glide;
//
//import android.graphics.Bitmap;
//
//import com.bumptech.glide.request.RequestListener;
//import com.bumptech.glide.request.target.Target;
//import com.didichuxing.doraemonkit.kit.largepicture.LargePictureManager;
//
///**
// * ================================================
// * 作 者:jint(金台)
// * 版 本:1.0
// * 创建日期:2020/3/20-18:23
// * 描 述:
// * 修订历史:
// * ================================================
// */
//public class DokitGlideRequestListenerV3<T, R> implements RequestListener<T, R> {
// private static final String TAG = "DokitGlideRequestListenerV3";
// private RequestListener<T, R> mOriginRequestListener;
//
// public DokitGlideRequestListenerV3(RequestListener mRequestListener) {
// this.mOriginRequestListener = mRequestListener;
// }
//
// @Override
// public boolean onException(Exception e, T model, Target<R> target, boolean isFirstResource) {
// if (mOriginRequestListener != null) {
// return mOriginRequestListener.onException(e, model, target, isFirstResource);
// }
// return false;
// }
//
// @Override
// public boolean onResourceReady(R resource, T model, Target<R> target, boolean isFromMemoryCache, boolean isFirstResource) {
// if (resource instanceof Bitmap) {
// LargePictureManager.getInstance().transform(model.toString(), (Bitmap) resource, false, "Glide_V3");
// }
// if (mOriginRequestListener != null) {
// return mOriginRequestListener.onResourceReady(resource, model, target, isFromMemoryCache, isFirstResource);
// }
// return false;
// }
//}
package com.didichuxing.doraemonkit.aop.bigimg.glide;
import android.graphics.Bitmap;
import androidx.annotation.NonNull;
import com.blankj.utilcode.util.ReflectUtils;
import com.bumptech.glide.RequestBuilder;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
import com.didichuxing.doraemonkit.kit.largepicture.LargePictureManager;
import com.didichuxing.doraemonkit.util.LogHelper;
import java.security.MessageDigest;
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/4/3-13:04
* 描 述:
* 修订历史:
* ================================================
*/
public class DokitGlideTransform extends BitmapTransformation {
private static final String ID = "com.didichuxing.doraemonkit.aop.bigimg.glide.DokitGlideTransform";
private static final byte[] ID_BYTES = ID.getBytes(CHARSET);
private static final String TAG = "DokitGlideTransform";
private Object mRequestBuilder;
public DokitGlideTransform(Object mRequestBuilder) {
this.mRequestBuilder = mRequestBuilder;
}
@Override
protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
LogHelper.i(TAG, "===transform=====");
String url = "";
if (mRequestBuilder instanceof RequestBuilder) {
url = ReflectUtils.reflect(mRequestBuilder).field("model").get();
}
toTransform = LargePictureManager.getInstance().transform(url, toTransform, false, "Glide");
return toTransform;
}
@Override
public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
messageDigest.update(ID_BYTES);
}
}
......@@ -2,7 +2,9 @@ package com.didichuxing.doraemonkit.aop.bigimg.glide;
import androidx.annotation.Nullable;
import com.blankj.utilcode.util.ReflectUtils;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.SingleRequest;
import java.util.ArrayList;
import java.util.List;
......@@ -17,9 +19,19 @@ import java.util.List;
* ================================================
*/
public class GlideHook {
/**
* hook requestListeners字段
*
* @param singleRequest
* @return
*/
public static List<RequestListener> proxy(@Nullable List<RequestListener> requestListeners) {
public static void proxy(Object singleRequest) {
try {
List<RequestListener> requestListeners = null;
if (singleRequest instanceof SingleRequest) {
requestListeners = ReflectUtils.reflect(singleRequest).field("requestListeners").get();
}
//可能存在用户没有引入okhttp的情况
if (requestListeners == null) {
requestListeners = new ArrayList<>();
......@@ -27,10 +39,12 @@ public class GlideHook {
} else {
requestListeners.add(new DokitGlideRequestListener());
}
return requestListeners;
if (singleRequest instanceof SingleRequest) {
ReflectUtils.reflect(singleRequest).field("requestListeners",requestListeners);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
//package com.didichuxing.doraemonkit.aop.bigimg.glide;
//
//import androidx.annotation.Nullable;
//
//
//import com.bumptech.glide.request.RequestListener;
//
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * ================================================
// * 作 者:jint(金台)
// * 版 本:1.0
// * 创建日期:2020/3/20-18:19
// * 描 述:注入到com.bumptech.glide.GenericRequestBuilder#listener(方法中)
// *
// * 修订历史:
// * ================================================
// */
//public class GlideHook_V3 {
//
// public static RequestListener proxy(@Nullable RequestListener requestListener) {
// try {
// //可能存在用户没有引入okhttp的情况
// return new DokitGlideRequestListenerV3(requestListener);
// } catch (Exception e) {
// e.printStackTrace();
// }
// return null;
// }
//}
package com.didichuxing.doraemonkit.aop.bigimg.glide;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/4/3-13:03
* 描 述:
* 修订历史:
* ================================================
*/
public class GlideTransformHook {
public static BitmapTransformation transform(Object baseRequestOptions) {
return new DokitGlideTransform(baseRequestOptions);
}
}
......@@ -15,11 +15,11 @@ import com.squareup.picasso.Transformation;
* 修订历史:
* ================================================
*/
public class DokitTransformation implements Transformation {
public class DokitPicassoTransformation implements Transformation {
private static final String TAG = "DokitTransformation";
private Uri mUri;
public DokitTransformation(Uri uri) {
public DokitPicassoTransformation(Uri uri) {
this.mUri = uri;
}
......
......@@ -26,9 +26,9 @@ public class PicassoHook {
try {
if (transformations == null) {
transformations = new ArrayList<>();
transformations.add(new DokitTransformation(uri));
transformations.add(new DokitPicassoTransformation(uri));
} else {
transformations.add(new DokitTransformation(uri));
transformations.add(new DokitPicassoTransformation(uri));
}
return transformations;
} catch (Exception e) {
......
......@@ -137,7 +137,7 @@ public class LargePictureManager {
Bitmap newBitmap = Bitmap.createBitmap(sourceBitmap);
saveImageInfo(imageUrl, imgSize, newBitmap.getWidth(), newBitmap.getHeight(), framework);
if (imgSize > memoryThreshold) {
newBitmap = ImageUtils.addTextWatermark(newBitmap, "MemorySize:" + strImageSize, ConvertUtils.sp2px(16), Color.RED, newBitmap.getWidth() / 2 - ConvertUtils.sp2px(16) * strImageSize.length() / 2, newBitmap.getHeight() / 2);
newBitmap = ImageUtils.addTextWatermark(newBitmap, "MS:" + strImageSize, ConvertUtils.sp2px(16), Color.RED, newBitmap.getWidth() / 2 - ConvertUtils.sp2px(16) * strImageSize.length() / 2, newBitmap.getHeight() / 2);
sourceBitmap.recycle();
return newBitmap;
} else {
......@@ -148,7 +148,7 @@ public class LargePictureManager {
saveImageInfo(imageUrl, imgSize, sourceBitmap.getWidth(), sourceBitmap.getHeight(), framework);
if (imgSize > memoryThreshold) {
sourceBitmap = ImageUtils.addTextWatermark(sourceBitmap, "MemorySize:" + strImageSize, ConvertUtils.sp2px(16), Color.RED, sourceBitmap.getWidth() / 2 - ConvertUtils.sp2px(16) * strImageSize.length() / 2, sourceBitmap.getHeight() / 2);
sourceBitmap = ImageUtils.addTextWatermark(sourceBitmap, "MS:" + strImageSize, ConvertUtils.sp2px(16), Color.RED, sourceBitmap.getWidth() / 2 - ConvertUtils.sp2px(16) * strImageSize.length() / 2, sourceBitmap.getHeight() / 2);
}
return sourceBitmap;
}
......
......@@ -25,7 +25,7 @@ public class NetworkManager {
// private static final String MOCK_HOST_DEBUG = "xyrd.intra.xiaojukeji.com";
private static final String MOCK_HOST_DEBUG = "mock.dokit.cn";
private static final String MOCK_HOST_RELEASE = "mock.dokit.cn";
private static final String MOCK_DEBUG_DOMAIN = MOCK_SCHEME_HTTP + MOCK_HOST_DEBUG;
private static final String MOCK_DEBUG_DOMAIN = MOCK_SCHEME_HTTPS + MOCK_HOST_DEBUG;
private static final String MOCK_RELEASE_DOMAIN = MOCK_SCHEME_HTTPS + MOCK_HOST_RELEASE;
public static final String MOCK_DOMAIN = BuildConfig.DEBUG ? MOCK_DEBUG_DOMAIN : MOCK_RELEASE_DOMAIN;
public static final String MOCK_HOST = BuildConfig.DEBUG ? MOCK_HOST_DEBUG : MOCK_HOST_RELEASE;
......
......@@ -58,9 +58,9 @@ public class InterceptDetailNodeProvider extends BaseNodeProvider {
holder.getView(R.id.rl_params).setVisibility(View.GONE);
}
holder.setText(R.id.tv_group, "分组:" + mockApi.getGroup());
holder.setText(R.id.tv_create, "创建人:" + mockApi.getCreatePerson());
holder.setText(R.id.tv_modify, "修改人:" + mockApi.getModifyPerson());
holder.setText(R.id.tv_group, "group:" + mockApi.getGroup());
holder.setText(R.id.tv_create, "create person:" + mockApi.getCreatePerson());
holder.setText(R.id.tv_modify, "modify person:" + mockApi.getModifyPerson());
final MultiLineRadioGroup radioGroup = holder.getView(R.id.radio_group);
if (mockApi.getSceneList() != null && mockApi.getSceneList().size() != 0) {
String[] radioButtons = new String[mockApi.getSceneList().size()];
......
......@@ -53,8 +53,8 @@ public class MockTemplatePreviewFragment extends BaseFragment {
});
TextView tvName = findViewById(R.id.tv_name);
TextView tvPath = findViewById(R.id.tv_path);
tvName.setText(String.format("mock接口名称:%s", DokitDbManager.getInstance().getGlobalTemplateApiBean().getMockApiName()));
tvPath.setText(String.format("mock接口路径:%s", DokitDbManager.getInstance().getGlobalTemplateApiBean().getPath()));
tvName.setText(String.format("mock api name:%s", DokitDbManager.getInstance().getGlobalTemplateApiBean().getMockApiName()));
tvPath.setText(String.format("mock api path:%s", DokitDbManager.getInstance().getGlobalTemplateApiBean().getPath()));
JsonRecyclerView jsonViewQuery = findViewById(R.id.json_query);
JsonRecyclerView jsonRecycleView = findViewById(R.id.jsonviewer);
......@@ -63,7 +63,7 @@ public class MockTemplatePreviewFragment extends BaseFragment {
@Override
public void onClick(View v) {
if (DokitDbManager.getInstance().getGlobalTemplateApiBean() == null) {
ToastUtils.showShort("暂无本地mock数据模板");
ToastUtils.showShort("no mock template data");
return;
}
MockTemplateApiBean mockApi = DokitDbManager.getInstance().getGlobalTemplateApiBean();
......@@ -74,14 +74,14 @@ public class MockTemplatePreviewFragment extends BaseFragment {
.execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
ToastUtils.showShort("上传模板成功");
ToastUtils.showShort("upload template succeed");
LogHelper.i(TAG, "上传模板===>" + response.body());
}
@Override
public void onError(Response<String> response) {
super.onError(response);
ToastUtils.showShort("上传模板失败");
ToastUtils.showShort("upload template failed");
LogHelper.e(TAG, "error===>" + response.body());
}
});
......@@ -89,7 +89,7 @@ public class MockTemplatePreviewFragment extends BaseFragment {
});
if (DokitDbManager.getInstance().getGlobalTemplateApiBean() == null) {
ToastUtils.showShort("暂无本地mock数据模板");
ToastUtils.showShort("no mock template data");
return;
}
try {
......@@ -107,7 +107,7 @@ public class MockTemplatePreviewFragment extends BaseFragment {
jsonRecycleView.bindJson(DokitDbManager.getInstance().getGlobalTemplateApiBean().getStrResponse());
} catch (JSONException e) {
e.printStackTrace();
ToastUtils.showShort("数据不符合json格式");
ToastUtils.showShort("the data is not json");
}
}
......
......@@ -6,6 +6,7 @@ import android.view.View;
import android.widget.TextView;
import com.blankj.utilcode.util.ToastUtils;
import com.didichuxing.doraemonkit.util.DokitUtil;
import com.didichuxing.doraemonkit.view.bravh.entity.node.BaseNode;
import com.didichuxing.doraemonkit.view.bravh.provider.BaseNodeProvider;
import com.didichuxing.doraemonkit.view.bravh.viewholder.BaseViewHolder;
......@@ -68,15 +69,15 @@ public class TemplateDetailNodeProvider extends BaseNodeProvider {
holder.getView(R.id.rl_params).setVisibility(View.GONE);
}
holder.setText(R.id.tv_group, "分组:" + mockApi.getGroup());
holder.setText(R.id.tv_create, "创建人:" + mockApi.getCreatePerson());
holder.setText(R.id.tv_modify, "修改人:" + mockApi.getModifyPerson());
holder.setText(R.id.tv_group, "group:" + mockApi.getGroup());
holder.setText(R.id.tv_create, "create person:" + mockApi.getCreatePerson());
holder.setText(R.id.tv_modify, "modify person:" + mockApi.getModifyPerson());
final TextView tvView = holder.getView(R.id.tv_view);
tvView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.isEmpty(mockApi.getStrResponse())) {
ToastUtils.showShort("暂无mock模板数据");
ToastUtils.showShort("no mock template data");
return;
}
//保存到全局
......@@ -99,13 +100,13 @@ public class TemplateDetailNodeProvider extends BaseNodeProvider {
@Override
public void onSuccess(Response<String> response) {
LogHelper.i(TAG, "上传模板===>" + response.body());
ToastUtils.showShort("上传模板成功");
ToastUtils.showShort("upload template succeed");
}
@Override
public void onError(Response<String> response) {
super.onError(response);
ToastUtils.showShort("上传模板失败");
ToastUtils.showShort("upload template failed");
LogHelper.e(TAG, "上传模板失败===>" + response.body());
}
});
......@@ -116,15 +117,15 @@ public class TemplateDetailNodeProvider extends BaseNodeProvider {
TextView tvHasLocalMockData = holder.getView(R.id.tv_local_has_mock_template);
String hasLocalMockData;
if (!TextUtils.isEmpty(mockApi.getStrResponse())) {
hasLocalMockData = "";
hasLocalMockData = "Y";
tvUpload.setClickable(true);
tvUpload.setTextColor(tvUpload.getContext().getResources().getColor(R.color.dk_color_337CC4));
} else {
hasLocalMockData = "";
hasLocalMockData = "N";
tvUpload.setClickable(false);
tvUpload.setTextColor(tvUpload.getContext().getResources().getColor(R.color.dk_color_999999));
}
tvHasLocalMockData.setText(String.format("本地是否存在mock模板数据:%s", hasLocalMockData));
tvHasLocalMockData.setText(String.format(DokitUtil.getString(R.string.dk_data_mock_template_tip), hasLocalMockData));
}
......
......@@ -14,6 +14,7 @@ import com.didichuxing.doraemonkit.R;
import com.didichuxing.doraemonkit.ui.base.AbsDokitView;
import com.didichuxing.doraemonkit.ui.base.DokitViewLayoutParams;
import com.didichuxing.doraemonkit.ui.base.DokitViewManager;
import com.didichuxing.doraemonkit.util.DokitUtil;
/**
* ================================================
......@@ -81,21 +82,21 @@ public class NetWokDokitView extends AbsDokitView {
final int type = WeakNetworkManager.get().getType();
switch (type) {
case WeakNetworkManager.TYPE_TIMEOUT:
mTvNetWork.setText("超时");
mTvNetWork.setText(DokitUtil.getString(R.string.dk_weaknet_type_timeout));
mTvTimeOutTime.setText("" + WeakNetworkManager.get().getTimeOutMillis() + " ms");
mLlTimeWrap.setVisibility(View.VISIBLE);
mLlSpeedWrap.setVisibility(View.GONE);
break;
case WeakNetworkManager.TYPE_SPEED_LIMIT:
mTvNetWork.setText("限速");
mTvNetWork.setText(DokitUtil.getString(R.string.dk_weaknet_type_speed));
mTvRequestSpeed.setText("" + WeakNetworkManager.get().getRequestSpeed() + " KB/S");
mTvResponseSpeed.setText("" + WeakNetworkManager.get().getResponseSpeed() + " KB/S");
mLlTimeWrap.setVisibility(View.GONE);
mLlSpeedWrap.setVisibility(View.VISIBLE);
break;
default:
mTvNetWork.setText("断网");
mTvNetWork.setText(DokitUtil.getString(R.string.dk_weaknet_type_off));
mLlTimeWrap.setVisibility(View.GONE);
mLlSpeedWrap.setVisibility(View.GONE);
break;
......
......@@ -248,18 +248,28 @@ class NormalDokitViewManager implements DokitViewManagerInterface {
attach(dokitIntent);
}
}
if (!mGlobalSingleDokitViews.containsKey(MainIconDokitView.class.getSimpleName())) {
attachMainIconDokitView(activity);
}
} else {
//假如不存在全局的icon这需要全局显示主icon
if (DokitConstant.AWAYS_SHOW_MAIN_ICON && !(activity instanceof UniversalActivity)) {
DokitIntent dokitIntent = new DokitIntent(MainIconDokitView.class);
dokitIntent.mode = DokitIntent.MODE_SINGLE_INSTANCE;
attach(dokitIntent);
}
attachMainIconDokitView(activity);
}
attachCountDownDokitView(activity);
}
private void attachMainIconDokitView(Activity activity) {
//假如不存在全局的icon这需要全局显示主icon
if (DokitConstant.AWAYS_SHOW_MAIN_ICON && !(activity instanceof UniversalActivity)) {
DokitIntent dokitIntent = new DokitIntent(MainIconDokitView.class);
dokitIntent.mode = DokitIntent.MODE_SINGLE_INSTANCE;
attach(dokitIntent);
}
}
@Override
public void onActivityPause(Activity activity) {
Map<String, AbsDokitView> dokitViews = getDokitViews(activity);
......
......@@ -19,7 +19,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="弱网类型:"
android:text="@string/dk_weaknet_type"
android:textColor="@color/dk_color_333333"
android:textSize="16sp" />
......@@ -27,7 +27,7 @@
android:id="@+id/tv_net_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="断网"
android:text="off"
android:textColor="@color/dk_color_333333"
android:textSize="16sp" />
</LinearLayout>
......@@ -44,7 +44,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="超时时间:"
android:text="timeout:"
android:textColor="@color/dk_color_333333"
android:textSize="16sp" />
......@@ -73,7 +73,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请求限速:"
android:text="request speed:"
android:textColor="@color/dk_color_333333"
android:textSize="16sp" />
......@@ -96,7 +96,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="响应限速:"
android:text="response speed:"
android:textColor="@color/dk_color_333333"
android:textSize="16sp" />
......
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/dk_color_FFFFFF"
......@@ -26,18 +27,18 @@
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="接口名称:"
android:textColor="@color/dk_color_333333"
android:textSize="16sp" />
android:textSize="16sp"
tools:text="接口名称:" />
<TextView
android:id="@+id/tv_path"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="接口路径:"
android:textColor="@color/dk_color_333333"
android:textSize="16sp" />
android:textSize="16sp"
tools:text="接口路径:" />
<LinearLayout
android:layout_width="match_parent"
......@@ -68,7 +69,7 @@
android:layout_marginLeft="16dp"
android:layout_marginTop="6dp"
android:layout_marginRight="16dp"
android:text="mock数据模板:"
android:text="mock tempalte:"
android:textColor="@color/dk_color_333333"
android:textSize="16sp" />
......@@ -82,7 +83,7 @@
android:gravity="center"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:text="上传模板"
android:text="@string/dk_data_mock_template_upload"
android:textColor="@color/dk_color_FFFFFF"
android:textSize="18sp" />
......
......@@ -73,7 +73,7 @@
android:id="@+id/label_timeout"
style="@style/DK.TextBig.Darker"
android:layout_centerVertical="true"
android:text="超时时间:" />
android:text="Timeout:" />
<EditText
android:id="@+id/value_timeout"
......
......@@ -77,9 +77,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="本地是否存在mock模板数据"
android:textColor="@color/dk_color_666666"
android:textSize="14sp"
android:text="本地是否存在mock模板数据" />
android:textSize="14sp" />
<LinearLayout
android:layout_width="wrap_content"
......@@ -91,7 +91,7 @@
android:id="@+id/tv_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="数据预览"
android:text="Preview"
android:textColor="@color/dk_color_337CC4"
android:textSize="14sp" />
......@@ -100,7 +100,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="24dp"
android:text="上传"
android:text="Upload"
android:textColor="@color/dk_color_337CC4"
android:textSize="14sp" />
</LinearLayout>
......
......@@ -294,4 +294,20 @@
<string name="dk_kit_net_monitor_white_host_edit_tip">Please enter whitelist host</string>
<string name="dk_kit_net_monitor_white_host_edit_toast">Please enter host first</string>
<string name="dk_data_mock_plugin_toast">Please go to https://www.dokit.cn to apply for projectId first, and refer to the use center for access</string>
<string name="dk_header_reset">Pull refresh</string>
<string name="dk_header_pull">Pull refresh</string>
<string name="dk_header_pull_over">Release Refresh</string>
<string name="dk_header_refreshing">Refreshing...</string>
<string name="dk_header_completed">refresh succeed</string>
<string name="dk_brvah_loading">loading...</string>
<string name="dk_brvah_load_failed">load failed,try again</string>
<string name="dk_brvah_load_end">no moe data</string>
<string name="dk_brvah_load_complete">click load more</string>
<string name="dk_data_mock_template_tip">has template data:%s</string>
<string name="dk_data_mock_template_upload">Upload Template</string>
<string name="dk_weaknet_type">Net Type</string>
<string name="dk_weaknet_type_speed">Limit Speed</string>
<string name="dk_weaknet_type_timeout">Timeout</string>
<string name="dk_weaknet_type_off">Off</string>
<string name="dk_weak_network_speed_unit">K/s</string>
</resources>
......@@ -291,4 +291,20 @@
<string name="dk_kit_net_monitor_white_host_edit_tip">请输入白名单host</string>
<string name="dk_kit_net_monitor_white_host_edit_toast">请先输入host</string>
<string name="dk_data_mock_plugin_toast">请先到https://www.dokit.cn申请projectId,并参考使用中心进行接入</string>
<string name="dk_header_reset">下拉刷新</string>
<string name="dk_header_pull">下拉刷新</string>
<string name="dk_header_pull_over">释放立即刷新</string>
<string name="dk_header_refreshing">正在刷新...</string>
<string name="dk_header_completed">刷新成功</string>
<string name="dk_brvah_loading">正在加载中...</string>
<string name="dk_brvah_load_failed">加载失败,请点我重试</string>
<string name="dk_brvah_load_end">没有更多数据</string>
<string name="dk_brvah_load_complete">点击加载更多</string>
<string name="dk_data_mock_template_tip">本地是否存在mock模板数据:%s</string>
<string name="dk_data_mock_template_upload">上传模板</string>
<string name="dk_weaknet_type">弱网类型</string>
<string name="dk_weaknet_type_speed">限速</string>
<string name="dk_weaknet_type_timeout">超时</string>
<string name="dk_weaknet_type_off">断网</string>
<string name="dk_weak_network_speed_unit">K/s</string>
</resources>
......@@ -291,4 +291,20 @@
<string name="dk_kit_net_monitor_white_host_edit_tip">请输入白名单host</string>
<string name="dk_kit_net_monitor_white_host_edit_toast">请先输入host</string>
<string name="dk_data_mock_plugin_toast">请先到https://www.dokit.cn申请projectId,并参考使用中心进行接入</string>
<string name="dk_header_reset">下拉刷新</string>
<string name="dk_header_pull">下拉刷新</string>
<string name="dk_header_pull_over">释放立即刷新</string>
<string name="dk_header_refreshing">正在刷新...</string>
<string name="dk_header_completed">刷新成功</string>
<string name="dk_brvah_loading">正在加载中...</string>
<string name="dk_brvah_load_failed">加载失败,请点我重试</string>
<string name="dk_brvah_load_end">没有更多数据</string>
<string name="dk_brvah_load_complete">点击加载更多</string>
<string name="dk_data_mock_template_tip">本地是否存在mock模板数据:%s</string>
<string name="dk_data_mock_template_upload">上传模板</string>
<string name="dk_weaknet_type">弱网类型</string>
<string name="dk_weaknet_type_speed">限速</string>
<string name="dk_weaknet_type_timeout">超时</string>
<string name="dk_weaknet_type_off">断网</string>
<string name="dk_weak_network_speed_unit">K/s</string>
</resources>
\ No newline at end of file
......@@ -155,7 +155,7 @@
<string name="dk_weak_network_request_limit">请求限速:</string>
<string name="dk_weak_network_response_limit">响应限速:</string>
<string name="dk_weak_network_limit_message">请求限速会在上传时限速,响应限速会在下载时限速,0则不限速</string>
<string name="dk_weak_network_speed_unit" translatable="false">K/s</string>
<string name="dk_weak_network_speed_unit">K/s</string>
<!--流量监控-->
<string name="dk_kit_network_monitor">流量监控</string>
......@@ -284,6 +284,8 @@
<string name="dk_data_mock_switch_opened">打开</string>
<string name="dk_data_mock_switch_closed">关闭</string>
<string name="dk_data_mock_plugin_toast">请先到https://www.dokit.cn申请projectId,并参考使用中心进行接入</string>
<string name="dk_data_mock_template_tip">本地是否存在mock模板数据:%s</string>
<string name="dk_data_mock_template_upload">上传模板</string>
<!--健康体检页面-->
<string name="dk_health_upload_successed">上传数据成功</string>
......@@ -326,4 +328,10 @@
<string name="dk_brvah_load_end">没有更多数据</string>
<string name="dk_brvah_load_complete">点击加载更多</string>
<!-- 弱网dokitView-->
<string name="dk_weaknet_type">弱网类型</string>
<string name="dk_weaknet_type_off">断网</string>
<string name="dk_weaknet_type_timeout">超时</string>
<string name="dk_weaknet_type_speed">限速</string>
</resources>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册