Skip to content

Commit

Permalink
Merge branch 'Tencent#31' into 'master'
Browse files Browse the repository at this point in the history
修改固定类名com.tencent.shadow.sdk.pluginloader.PluginLoaderImpl的逻辑。将其改为Factory模式,避免Hardcode参数。 fixed Tencent#31.

修改固定类名com.tencent.shadow.sdk.pluginloader.PluginLoaderImpl的逻辑。将其改为Factory模式,避免Hardcode参数。
fixed Tencent#31.


See merge request !86
  • Loading branch information
shifujun committed May 21, 2019
2 parents 7b8a552 + 5ffadac commit bab5528
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 47 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.tencent.shadow.dynamic.loader.impl

import android.content.Context
import com.tencent.shadow.core.loader.ShadowPluginLoader

interface CoreLoaderFactory {
fun build(hostAppContext: Context): ShadowPluginLoader
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,19 @@ import com.tencent.shadow.runtime.container.DelegateProviderHolder
import java.util.concurrent.CountDownLatch

internal class DynamicPluginLoader(hostContext: Context, uuid: String) {
companion object {
private const val CORE_LOADER_FACTORY_IMPL_NAME =
"com.tencent.shadow.dynamic.loader.impl.CoreLoaderFactoryImpl"
}
fun setUuidManager(p0: UuidManager?) {
if (p0 != null)
mUuidManager = p0
//todo #30 兼容mUuidManager为null时的逻辑
}

companion object {

private val CLASSS_PLUGIN_LOADER_IMPL = "com.tencent.shadow.sdk.pluginloader.PluginLoaderImpl"//todo #31 这个类名的包名不规范
}

private val mPluginLoader: ShadowPluginLoader

private val mApkClassLoader = DynamicPluginLoader::class.java.classLoader
private val mDynamicLoaderClassLoader: ClassLoader = DynamicPluginLoader::class.java.classLoader!!

private var mContext: Context;

Expand All @@ -44,9 +43,11 @@ internal class DynamicPluginLoader(hostContext: Context, uuid: String) {

init {
try {
val parameterTypes: Array<Class<*>> = arrayOf(Context::class.java)
val parameters: Array<Any> = arrayOf(hostContext)
mPluginLoader = mApkClassLoader.getInterface(ShadowPluginLoader::class.java, CLASSS_PLUGIN_LOADER_IMPL, parameterTypes, parameters)
val coreLoaderFactory = mDynamicLoaderClassLoader.getInterface(
CoreLoaderFactory::class.java,
CORE_LOADER_FACTORY_IMPL_NAME
)
mPluginLoader = coreLoaderFactory.build(hostContext)
DelegateProviderHolder.setDelegateProvider(mPluginLoader)
ContentProviderDelegateProviderHolder.setContentProviderDelegateProvider(mPluginLoader)
mPluginLoader.onCreate()
Expand Down Expand Up @@ -208,32 +209,4 @@ internal class DynamicPluginLoader(hostContext: Context, uuid: String) {
}
}

/**
* 从apk中读取接口的实现
*
* @param clazz 接口类
* @param className 实现类的类名
* @param <T> 接口类型
* @return 所需接口
* @throws Exception
</T> */
@Throws(Exception::class)
fun <T> ClassLoader.getInterface(clazz: Class<T>, className: String, parameterTypes: Array<Class<*>>, parameters: Array<Any>): T {
try {
val interfaceImplementClass = loadClass(className)
val constructor = interfaceImplementClass.getConstructor(*parameterTypes)
val interfaceImplement = constructor.newInstance(*parameters)
return clazz.cast(interfaceImplement)
} catch (e: ClassNotFoundException) {
throw Exception(e)
} catch (e: InstantiationException) {
throw Exception(e)
} catch (e: ClassCastException) {
throw Exception(e)
} catch (e: IllegalAccessException) {
throw Exception(e)
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,12 @@
-keep class org.slf4j.**{*;}
-dontwarn org.slf4j.impl.**

-keep class com.tencent.shadow.sdk.pluginloader.**{*;}
-keep class com.tencent.shadow.dynamic.host.**{*;}
-keep class com.tencent.shadow.dynamic.impl.**{*;}
-keep class com.tencent.shadow.dynamic.loader.**{*;}
-keep class com.tencent.shadow.core.common.**{*;}
-keep class com.tencent.shadow.core.loader.**{*;}

-dontwarn com.tencent.shadow.sdk.pluginloader.**
-dontwarn com.tencent.shadow.dynamic.host.**
-dontwarn com.tencent.shadow.dynamic.impl.**
-dontwarn com.tencent.shadow.dynamic.loader.**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.tencent.shadow.dynamic.loader.impl;

import android.content.Context;

import com.tencent.shadow.core.loader.ShadowPluginLoader;
import com.tencent.shadow.test.dynamic.loader.TestPluginLoader;

/**
* 这个类的包名类名是固定的。
* <p>
* 见com.tencent.shadow.dynamic.loader.impl.DynamicPluginLoader#CORE_LOADER_FACTORY_IMPL_NAME
*/
public class CoreLoaderFactoryImpl implements CoreLoaderFactory {
@Override
public ShadowPluginLoader build(Context hostAppContext) {
return new TestPluginLoader(hostAppContext);
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,18 @@
package com.tencent.shadow.sdk.pluginloader;
package com.tencent.shadow.test.dynamic.loader;

import android.content.Context;

import com.tencent.shadow.core.loader.Reporter;
import com.tencent.shadow.core.loader.ShadowPluginLoader;
import com.tencent.shadow.core.loader.managers.ComponentManager;
import com.tencent.shadow.test.dynamic.loader.TestComponentManager;

/**
* 这里的类名和包名需要固定
* com.tencent.shadow.sdk.pluginloader.PluginLoaderImpl
*/
public class PluginLoaderImpl extends ShadowPluginLoader {
public class TestPluginLoader extends ShadowPluginLoader {

private final static String TAG = "shadow";

private ComponentManager componentManager;

public PluginLoaderImpl(Context hostAppContext) {
public TestPluginLoader(Context hostAppContext) {
super(hostAppContext);
componentManager = new TestComponentManager(hostAppContext);
}
Expand Down

0 comments on commit bab5528

Please sign in to comment.