Я пытаюсь перенести Hyperledger Fabri c Java SDK v1.4 на Android (уровень API 26). SDK использует Log4j v2.13. Log4j не совсем оптимизирован для android. Я получаю следующую ошибку:
I/System.out: WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
I/icandroidsampl: Rejecting re-init on previously-failed class java.lang.Class<org.apache.logging.log4j.core.lookup.JmxRuntimeInputArgumentsLookup>: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/management/ManagementFactory;
at void org.apache.logging.log4j.core.lookup.JmxRuntimeInputArgumentsLookup.<clinit>() (JmxRuntimeInputArgumentsLookup.java:35)
at java.lang.Object java.lang.reflect.Constructor.newInstance0(java.lang.Object[]) (Constructor.java:-2)
at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:343)
at java.lang.Object org.apache.logging.log4j.util.LoaderUtil.newInstanceOf(java.lang.Class) (LoaderUtil.java:185)
at java.lang.Object org.apache.logging.log4j.util.LoaderUtil.newInstanceOf(java.lang.String) (LoaderUtil.java:207)
at java.lang.Object org.apache.logging.log4j.util.LoaderUtil.newCheckedInstanceOf(java.lang.String, java.lang.Class) (LoaderUtil.java:228)
at java.lang.Object org.apache.logging.log4j.core.util.Loader.newCheckedInstanceOf(java.lang.String, java.lang.Class) (Loader.java:311)
at void org.apache.logging.log4j.core.lookup.Interpolator.<init>(java.util.Map) (Interpolator.java:120)
at void org.apache.logging.log4j.core.config.AbstractConfiguration.<init>(org.apache.logging.log4j.core.LoggerContext, org.apache.logging.log4j.core.config.ConfigurationSource) (AbstractConfiguration.java:129)
at void org.apache.logging.log4j.core.config.NullConfiguration.<init>() (NullConfiguration.java:32)
at void org.apache.logging.log4j.core.LoggerContext.<clinit>() (LoggerContext.java:86)
at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(java.lang.String, java.net.URI) (ClassLoaderContextSelector.java:229)
at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(java.lang.ClassLoader, java.net.URI) (ClassLoaderContextSelector.java:203)
at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(java.lang.String, java.lang.ClassLoader, boolean, java.net.URI) (ClassLoaderContextSelector.java:128)
at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(java.lang.String, java.lang.ClassLoader, boolean) (ClassLoaderContextSelector.java:115)
at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(java.lang.String, java.lang.ClassLoader, java.lang.Object, boolean) (Log4jContextFactory.java:148)
at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(java.lang.String, java.lang.ClassLoader, java.lang.Object, boolean) (Log4jContextFactory.java:45)
at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.LogManager.getContext(java.lang.ClassLoader, boolean) (LogManager.java:194)
at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(java.lang.Class) (AbstractLoggerAdapter.java:138)
at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.jcl.LogAdapter.getContext() (LogAdapter.java:39)
at java.lang.Object org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(java.lang.String) (AbstractLoggerAdapter.java:48)
at org.apache.commons.logging.Log org.apache.logging.log4j.jcl.LogFactoryImpl.getInstance(java.lang.String) (LogFactoryImpl.java:40)
at org.apache.commons.logging.Log org.apache.logging.log4j.jcl.LogFactoryImpl.getInstance(java.lang.Class) (LogFactoryImpl.java:55)
at org.apache.commons.logging.Log org.apache.commons.logging.LogFactory.getLog(java.lang.Class) (LogFactory.java:655)
at void org.hyperledger.fabric.gateway.impl.GatewayImpl.<clinit>() (GatewayImpl.java:55)
at java.util.concurrent.TimeUnit org.hyperledger.fabric.gateway.impl.GatewayImpl.access$000() (GatewayImpl.java:54)
at void org.hyperledger.fabric.gateway.impl.GatewayImpl$Builder.<init>() (GatewayImpl.java:71)
at org.hyperledger.fabric.gateway.Gateway$Builder org.hyperledger.fabric.gateway.Gateway.createBuilder() (Gateway.java:87)
at java.lang.String tubs.ibr.fabricandroidsample.MainActivity$FabricRequestTask.doInBackground(java.lang.Object[]) (MainActivity.java:78)
at java.lang.Object tubs.ibr.fabricandroidsample.MainActivity$FabricRequestTask.doInBackground(java.lang.Object[]) (MainActivity.java:70)
at java.lang.Object android.os.AsyncTask$2.call() (AsyncTask.java:333)
at void java.util.concurrent.FutureTask.run() (FutureTask.java:266)
at void android.os.AsyncTask$SerialExecutor$1.run() (AsyncTask.java:245)
at void java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) (ThreadPoolExecutor.java:1167)
at void java.util.concurrent.ThreadPoolExecutor$Worker.run() (ThreadPoolExecutor.java:641)
I/icandroidsampl: at void java.lang.Thread.run() (Thread.java:764)
Caused by: java.lang.ClassNotFoundException: Didn't find class "java.lang.management.ManagementFactory" on path: DexPathList[[zip file "/data/app/tubs.ibr.fabricandroidsample-48U2GXMv9D0UPIKFDpmpOA==/base.apk"],nativeLibraryDirectories=[/data/app/tubs.ibr.fabricandroidsample-48U2GXMv9D0UPIKFDpmpOA==/lib/x86, /system/lib]]
at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:134)
at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379)
at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
at void org.apache.logging.log4j.core.lookup.JmxRuntimeInputArgumentsLookup.<clinit>() (JmxRuntimeInputArgumentsLookup.java:35)
at java.lang.Object java.lang.reflect.Constructor.newInstance0(java.lang.Object[]) (Constructor.java:-2)
at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:343)
at java.lang.Object org.apache.logging.log4j.util.LoaderUtil.newInstanceOf(java.lang.Class) (LoaderUtil.java:185)
at java.lang.Object org.apache.logging.log4j.util.LoaderUtil.newInstanceOf(java.lang.String) (LoaderUtil.java:207)
at java.lang.Object org.apache.logging.log4j.util.LoaderUtil.newCheckedInstanceOf(java.lang.String, java.lang.Class) (LoaderUtil.java:228)
at java.lang.Object org.apache.logging.log4j.core.util.Loader.newCheckedInstanceOf(java.lang.String, java.lang.Class) (Loader.java:311)
at void org.apache.logging.log4j.core.lookup.Interpolator.<init>(java.util.Map) (Interpolator.java:120)
at void org.apache.logging.log4j.core.config.AbstractConfiguration.<init>(org.apache.logging.log4j.core.LoggerContext, org.apache.logging.log4j.core.config.ConfigurationSource) (AbstractConfiguration.java:129)
at void org.apache.logging.log4j.core.config.NullConfiguration.<init>() (NullConfiguration.java:32)
at void org.apache.logging.log4j.core.LoggerContext.<clinit>() (LoggerContext.java:86)
at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(java.lang.String, java.net.URI) (ClassLoaderContextSelector.java:229)
at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(java.lang.ClassLoader, java.net.URI) (ClassLoaderContextSelector.java:203)
at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(java.lang.String, java.lang.ClassLoader, boolean, java.net.URI) (ClassLoaderContextSelector.java:128)
at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(java.lang.String, java.lang.ClassLoader, boolean) (ClassLoaderContextSelector.java:115)
at org.apache.logging.log4j.core.LoggerContext org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(java.lang.String, java.lang.ClassLoader, java.lang.Object, boolean) (Log4jContextFactory.java:148)
at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(java.lang.String, java.lang.ClassLoader, java.lang.Object, boolean) (Log4jContextFactory.java:45)
at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.LogManager.getContext(java.lang.ClassLoader, boolean) (LogManager.java:194)
at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(java.lang.Class) (AbstractLoggerAdapter.java:138)
at org.apache.logging.log4j.spi.LoggerContext org.apache.logging.log4j.jcl.LogAdapter.getContext() (LogAdapter.java:39)
at java.lang.Object org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(java.lang.String) (AbstractLoggerAdapter.java:48)
I/icandroidsampl: at org.apache.commons.logging.Log org.apache.logging.log4j.jcl.LogFactoryImpl.getInstance(java.lang.String) (LogFactoryImpl.java:40)
at org.apache.commons.logging.Log org.apache.logging.log4j.jcl.LogFactoryImpl.getInstance(java.lang.Class) (LogFactoryImpl.java:55)
at org.apache.commons.logging.Log org.apache.commons.logging.LogFactory.getLog(java.lang.Class) (LogFactory.java:655)
at void org.hyperledger.fabric.gateway.impl.GatewayImpl.<clinit>() (GatewayImpl.java:55)
at java.util.concurrent.TimeUnit org.hyperledger.fabric.gateway.impl.GatewayImpl.access$000() (GatewayImpl.java:54)
at void org.hyperledger.fabric.gateway.impl.GatewayImpl$Builder.<init>() (GatewayImpl.java:71)
at org.hyperledger.fabric.gateway.Gateway$Builder org.hyperledger.fabric.gateway.Gateway.createBuilder() (Gateway.java:87)
at java.lang.String tubs.ibr.fabricandroidsample.MainActivity$FabricRequestTask.doInBackground(java.lang.Object[]) (MainActivity.java:78)
at java.lang.Object tubs.ibr.fabricandroidsample.MainActivity$FabricRequestTask.doInBackground(java.lang.Object[]) (MainActivity.java:70)
at java.lang.Object android.os.AsyncTask$2.call() (AsyncTask.java:333)
at void java.util.concurrent.FutureTask.run() (FutureTask.java:266)
at void android.os.AsyncTask$SerialExecutor$1.run() (AsyncTask.java:245)
at void java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) (ThreadPoolExecutor.java:1167)
at void java.util.concurrent.ThreadPoolExecutor$Worker.run() (ThreadPoolExecutor.java:641)
at void java.lang.Thread.run() (Thread.java:764)
Это происходит потому, что java .lang.management.ManagementFactory не включен в Android Runtime.
Итак, я попытался отключить JMX. Нет успеха Та же ошибка. Швы, как системное свойство не находится в «области видимости» библиотеки? Как это возможно?
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.setProperty("log4j2.disable.jmx","true");
[...]
}
[...]
}
Я тоже пробовал это: https://loune.net/2016/05/using-log4j2-2-3-with-android/. Нет успеха Та же ошибка.
Проблема в том, что Log4j используется в используемой мной библиотеке. Поэтому я не ищу способ использовать вход в систему в Android, а способ настроить Log4j в Android, чтобы он не выдавал исключения.
Код на самом деле выполняется, хотя исключения.