提交 aff08b2a 编写于 作者: J jackjintai

android:add dokit sdk v3.1.4

上级 4ee54881
package com.didichuxing.doraemondemo
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.blankj.utilcode.util.ToastUtils
import com.didichuxing.doraemonkit.DoraemonKit
import kotlinx.android.synthetic.main.activity_second.*
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
findViewById<View>(R.id.tv).setOnClickListener {
ToastUtils.showShort("aaaaa")
ToastUtils.showShort("bbbbb")
//DoraemonKit.show();
tv.setOnClickListener {
DoraemonKit.show();
}
}
}
\ No newline at end of file
......@@ -9,7 +9,7 @@ buildscript {
classpath 'com.android.tools.build:gradle:3.6.2'
classpath 'com.novoda:bintray-release:0.9.2'
classpath "com.didichuxing.doraemonkit:doraemonkit-plugin:${rootProject.ext.android["pluginVersionName"]}"
// classpath "com.didichuxing.doraemonkit:doraemonkit-plugin:3.1.2"
// classpath "com.didichuxing.doraemonkit:doraemonkit-plugin:3.1.3"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${rootProject.ext.android["kotlin_version"]}"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
......@@ -29,9 +29,9 @@ task clean(type: Delete) {
}
//解决打包时由于javadocRelease校验引起的打包失败
tasks.getByPath(":doraemonkit:javadocRelease").enabled = false
tasks.getByPath(":doraemonkit-no-op:javadocRelease").enabled = false
tasks.getByPath(":doraemonkit-leakcanary:javadocRelease").enabled = false
tasks.getByPath(":doraemonkit-weex:javadocRelease").enabled = false
tasks.getByPath(":doraemonkit-weex-no-op:javadocRelease").enabled = false
//tasks.getByPath(":doraemonkit:javadocRelease").enabled = false
//tasks.getByPath(":doraemonkit-no-op:javadocRelease").enabled = false
//tasks.getByPath(":doraemonkit-leakcanary:javadocRelease").enabled = false
//tasks.getByPath(":doraemonkit-weex:javadocRelease").enabled = false
//tasks.getByPath(":doraemonkit-weex-no-op:javadocRelease").enabled = false
//tasks.getByPath(":doraemonkit-rpc:javadocRelease").enabled = false
......@@ -15,14 +15,14 @@ ext {
minSdkVersion : 16,
targetSdkVersion : 29,
//app版本号
versionCode : 313,
versionCode : 314,
//dokit 插件版本号
pluginVersionName : "3.1.3",
pluginVersionName : "3.1.4",
//jcenter dokit版本号 打包上传时 dokit的版本名字
jcenterArchivesVersionName: "3.1.3",
jcenterArchivesVersionName: "3.1.4",
//didi内部仓库版本号
didiArchivesVersionName : "1000.0.22",
versionName : "3.1.3",
versionName : "3.1.4",
glide_version : "4.9.0",
kotlin_version : "1.3.61"
]
......
......@@ -4,7 +4,8 @@ import com.didichuxing.doraemonkit.plugin.DokitExtUtil;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.AmapLocationMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.BaiduLocationMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.FlagMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.OkHttpMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.OkHttpNullConsMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.OkHttpOneParamConsMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.PlatformHttpMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.TencentLocationMethodAdapter;
import com.didichuxing.doraemonkit.plugin.bytecode.method.comm.TencentLocationSingleMethodAdapter;
......@@ -114,11 +115,18 @@ public final class DokitCommClassAdapter extends ClassVisitor {
}
//okhttp 拦截器字节码替换
if (className.equals("okhttp3/OkHttpClient$Builder") && methodName.equals("<init>")) {
//okhttp 拦截器字节码替换 空构造函数
if (className.equals("okhttp3/OkHttpClient$Builder") && methodName.equals("<init>") && getParamsSize(desc) == 0) {
//创建MethodVisitor代理
log(className, access, methodName, desc, signature);
return mv == null ? null : new OkHttpMethodAdapter(access, desc, mv);
return mv == null ? null : new OkHttpNullConsMethodAdapter(access, desc, mv);
}
//okhttp 拦截器字节码替换 一个参数的构造函数
if (className.equals("okhttp3/OkHttpClient$Builder") && methodName.equals("<init>") && getParamsSize(desc) == 1) {
//创建MethodVisitor代理
log(className, access, methodName, desc, signature);
return mv == null ? null : new OkHttpOneParamConsMethodAdapter(mv, access, methodName, desc);
}
//didi平台端 网络 拦截器字节码替换
......
......@@ -5,15 +5,14 @@ import org.objectweb.asm.Opcodes;
import org.objectweb.asm.commons.LocalVariablesSorter;
/**
* Only weave okhttp3/OkHttpClient's init method
* Created by Quinn on 09/09/2018.
* Only weave okhttp3/OkHttpClient's null init method
*/
public final class OkHttpMethodAdapter extends LocalVariablesSorter implements Opcodes {
public final class OkHttpNullConsMethodAdapter extends LocalVariablesSorter implements Opcodes {
//private static final LoggerWrapper logger = LoggerWrapper.getLogger(OkHttpMethodAdapter.class);
public OkHttpMethodAdapter(int access, String desc, MethodVisitor mv) {
public OkHttpNullConsMethodAdapter(int access, String desc, MethodVisitor mv) {
super(Opcodes.ASM7, access, desc, mv);
}
......@@ -28,7 +27,7 @@ public final class OkHttpMethodAdapter extends LocalVariablesSorter implements O
mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "addAll", "(Ljava/util/Collection;)Z", true);
mv.visitInsn(POP);
//插入application 网络拦截器
//插入NetworkInterceptor 网络拦截器
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, "okhttp3/OkHttpClient$Builder", "networkInterceptors", "Ljava/util/List;");
mv.visitFieldInsn(GETSTATIC, "com/didichuxing/doraemonkit/aop/OkHttpHook", "globalNetworkInterceptors", "Ljava/util/List;");
......
package com.didichuxing.doraemonkit.plugin.bytecode.method.comm;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.commons.AdviceAdapter;
import org.objectweb.asm.commons.LocalVariablesSorter;
/**
* Only weave okhttp3/OkHttpClient's one param init method
*/
public final class OkHttpOneParamConsMethodAdapter extends AdviceAdapter {
//private static final LoggerWrapper logger = LoggerWrapper.getLogger(OkHttpMethodAdapter.class);
public OkHttpOneParamConsMethodAdapter(MethodVisitor methodVisitor, int access, String methodName, String descriptor) {
super(Opcodes.ASM7, methodVisitor, access, methodName, descriptor);
}
@Override
protected void onMethodExit(int opcode) {
super.onMethodExit(opcode);
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKESTATIC, "com/didichuxing/doraemonkit/aop/OkHttpHook", "performOkhttpOneParamBuilderInit", "(Ljava/lang/Object;Ljava/lang/Object;)V", false);
}
}
package com.didichuxing.doraemonkit.aop;
import android.util.Log;
import com.blankj.utilcode.util.ReflectUtils;
import com.didichuxing.doraemonkit.kit.network.okhttp.interceptor.DoraemonInterceptor;
import com.didichuxing.doraemonkit.kit.network.okhttp.interceptor.DoraemonWeakNetworkInterceptor;
import com.didichuxing.doraemonkit.kit.network.okhttp.interceptor.LargePictureInterceptor;
import com.didichuxing.doraemonkit.kit.network.okhttp.interceptor.MockInterceptor;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
/**
* ================================================
......@@ -55,6 +60,40 @@ public class OkHttpHook {
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param builder 真实的对象为okHttpClient.Builder
* @param okHttpClient 真实的对象为okHttpClient
*/
public static void performOkhttpOneParamBuilderInit(Object builder, Object okHttpClient) {
try {
if (builder instanceof OkHttpClient.Builder) {
OkHttpClient.Builder localBuild = (OkHttpClient.Builder) builder;
List<Interceptor> interceptors = removeDuplicate(localBuild.interceptors());
List<Interceptor> networkInterceptors = removeDuplicate(localBuild.networkInterceptors());
ReflectUtils.reflect(localBuild).field("interceptors", interceptors);
ReflectUtils.reflect(localBuild).field("networkInterceptors", networkInterceptors);
}
} catch (Exception e) {
Log.i("Doraemon", "" + e.getMessage());
}
}
/**
* 保证顺序并去重
*
* @param list
* @return
*/
private static List<Interceptor> removeDuplicate(List<Interceptor> list) {
//保证顺序并去重
LinkedHashSet h = new LinkedHashSet<Interceptor>(list);
list.clear();
list.addAll(h);
return list;
}
}
......@@ -409,13 +409,18 @@ class NormalDokitViewManager implements DokitViewManagerInterface {
dokitRootView.requestFocus();
dokitRootView.setId(R.id.dokit_contentview_id);
FrameLayout.LayoutParams dokitParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
if (BarUtils.isStatusBarVisible(activity)) {
dokitParams.topMargin = BarUtils.getStatusBarHeight();
}
if (BarUtils.isSupportNavBar()) {
if (BarUtils.isNavBarVisible(activity)) {
dokitParams.bottomMargin = BarUtils.getNavBarHeight();
try {
//解决由于项目集成SwipeBackLayout而出现的dokit入口不显示
if (BarUtils.isStatusBarVisible(activity)) {
dokitParams.topMargin = BarUtils.getStatusBarHeight();
}
if (BarUtils.isSupportNavBar()) {
if (BarUtils.isNavBarVisible(activity)) {
dokitParams.bottomMargin = BarUtils.getNavBarHeight();
}
}
} catch (Exception e) {
//e.printStackTrace();
}
dokitRootView.setLayoutParams(dokitParams);
//添加到DecorView中 为了不和用户自己往根布局中添加view干扰
......
......@@ -81,7 +81,7 @@ public class LayoutLevelDokitView extends AbsDokitView {
if (appContentView.toString().contains("SwipeBackLayout")) {
LogHelper.i(TAG, "普通模式下布局层级功能暂不支持以SwipeBackLayout为根布局,请改用系统模式");
ToastUtils.showShort("普通模式下布局层级功能暂不支持以SwipeBackLayout为根布局");
ToastUtils.showLong("普通模式下布局层级功能暂不支持以SwipeBackLayout为根布局");
return;
}
......
DoraemonKit-Android releases
===
## 3.1.4
1.DoKit项目结构调整,对外暴露的api已全部移到com.didichuxing.doraemonkit.kit.core包名下,如果你有自定义Kit,请重新引入一下包名
2.修复okhttp拦截器被重复调用的问题
3.github issues fixed
## 3.1.3
1.DoKit项目结构调整,对外暴露的api已全部移到com.didichuxing.doraemonkit.kit.core包名下,如果你有自定义Kit,请重新引入一下包名
......
......@@ -4,15 +4,15 @@
|DoKit|最新版本|描述|
|-|-|-|-|
|支持Androidx|3.1.3|从v3.1.0版本开始支持androidx
|支持Androidx|3.1.4|从v3.1.0版本开始支持androidx
|支持android support|3.0.5|该版本为支持Android support的最后一个版本,后期也将不在提供维护,请大家尽快升级和适配Androidx
```groovy
dependencies {
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit:3.1.3'
releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-no-op:3.1.3'
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit:3.1.4'
releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-no-op:3.1.4'
}
```
......@@ -20,7 +20,7 @@ dependencies {
假如你无法通过 jcenter 下载到依赖库并报了以下的错误
```
ERROR: Failed to resolve: com.didichuxing.doraemonkit:doraemonkit:3.1.3
ERROR: Failed to resolve: com.didichuxing.doraemonkit:doraemonkit:3.1.4
```
建议你可以尝试挂载VPN或通过命令行重试(以Mac系统为例 项目根目录下)
......@@ -44,8 +44,8 @@ DoraemonKit目前已支持Weex工具,包括
```groovy
dependencies {
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit-weex:3.1.3'
releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-weex-no-op:3.1.3'
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit-weex:3.1.4'
releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-weex-no-op:3.1.4'
}
```
......@@ -55,7 +55,7 @@ dependencies {
```groovy
dependencies {
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit-leakcanary:3.1.3'
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit-leakcanary:3.1.4'
}
```
......@@ -97,7 +97,7 @@ AOP包括以下几个功能:
buildscript {
dependencies {
classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:3.1.3'
classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:3.1.4'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
......
......@@ -2,7 +2,7 @@
|DoKit|new Version|Desc|
|- |- |- |
|support Androidx|3.1.3|support Androidx from v3.1.0|
|support Androidx|3.1.4|support Androidx from v3.1.0|
|supprot android support|3.0.3|For support Android support, one or two versions will be maintained, please hug Androidx as soon as possible|
......@@ -10,8 +10,8 @@
```groovy
dependencies {
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit:3.1.3'
releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-no-op:3.1.3'
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit:3.1.4'
releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-no-op:3.1.4'
}
```
......@@ -21,7 +21,7 @@ dependencies {
If you cannot download the dependent library through jcenter and report the following error
```
ERROR: Failed to resolve: com.didichuxing.doraemonkit:doraemonkit:3.1.3
ERROR: Failed to resolve: com.didichuxing.doraemonkit:doraemonkit:3.1.4
```
You can try again from the command line (take Mac system as an example under the project root directory)
......@@ -47,8 +47,8 @@ If you need to support Weex, you can directly add the following dependencies
```groovy
dependencies {
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit-weex:3.1.3'
releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-weex-no-op:3.1.3'
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit-weex:3.1.4'
releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-weex-no-op:3.1.4'
}
```
......@@ -58,7 +58,7 @@ If you need to integrate LeakCanary, you can directly add the following dependen
```groovy
dependencies {
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit-leakcanary:3.1.3'
debugImplementation 'com.didichuxing.doraemonkit:doraemonkit-leakcanary:3.1.4'
}
```
......@@ -90,7 +90,7 @@ Plugin includes the following functions:
```groovy
buildscript {
dependencies {
classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:3.1.3'
classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:3.1.4'
}
}
......
<div align="center">
<img src="https://javer.oss-cn-shanghai.aliyuncs.com/doraemon/github/DoraemonKit_github.png" width = "150" height = "150" alt="DoraemonKit" align=left />
<img src="https://img.shields.io/github/license/didi/DoraemonKit.svg" align=left />
<img src="https://img.shields.io/badge/Android-3.1.3-blue.svg" align=left />
<img src="https://img.shields.io/badge/Android-3.1.4-blue.svg" align=left />
<img src="https://img.shields.io/badge/iOS-3.0.1-yellow.svg" align=left />
<img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg" align=left />
</div>
......@@ -112,7 +112,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.1'
classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:3.1.3'
classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:3.1.4'
}
}
......@@ -125,8 +125,8 @@ apply plugin: 'com.didi.dokit'
and then implementation DoKit SDK
```
debugImplementation "com.didichuxing.doraemonkit:doraemonkit:3.1.3"
releaseImplementation "com.didichuxing.doraemonkit:doraemonkit-no-op:3.1.3"
debugImplementation "com.didichuxing.doraemonkit:doraemonkit:3.1.4"
releaseImplementation "com.didichuxing.doraemonkit:doraemonkit-no-op:3.1.4"
```
#### 2、SDK Init
......
<div align="center">
<img src="https://javer.oss-cn-shanghai.aliyuncs.com/doraemon/github/DoraemonKit_github.png" width = "150" height = "150" alt="DoraemonKit" align=left />
<img src="https://img.shields.io/github/license/didi/DoraemonKit.svg" align=left />
<img src="https://img.shields.io/badge/Android-3.1.3-blue.svg" align=left />
<img src="https://img.shields.io/badge/Android-3.1.4-blue.svg" align=left />
<img src="https://img.shields.io/badge/iOS-3.0.1-yellow.svg" align=left />
<img src="https://img.shields.io/badge/miniapp-0.0.1-red.svg" align=left />
<img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg" align=left />
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册