Calling a .jar library from System service

722 views
Skip to first unread message

Drunczyk

unread,
Jan 17, 2018, 10:29:15 AM1/17/18
to android-platform

Hello,

I added a new system service (builds as part of services.jar) and everything works fine except when I want to make calls from that service to a .jar library (extender.jar sits in /system/framework). The calling service gets a broken pipe error and in logcat I find the following:

E/AndroidRuntime(14629): *** FATAL EXCEPTION IN SYSTEM PROCESS: Binder_B
E/AndroidRuntime(14629): java.lang.NoClassDefFoundError: Failed resolution of: Lcom/android/server/extender/TestExtender;
E/AndroidRuntime(14629): at com.android.server.newservice.NewService.onTransact(NewService.java:79)
E/AndroidRuntime(14629): at android.os.Binder.execTransact(Binder.java:446)
E/AndroidRuntime(14629): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.android.server.extender.TestExtender" on path: DexPathList[[zip file "/system/framework/services.jar", zip file "/system/framework/ethernet-service.jar", zip file "/system/framework/wifi-service.jar"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
E/AndroidRuntime(14629): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
E/AndroidRuntime(14629): at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E/AndroidRuntime(14629): at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
E/AndroidRuntime(14629): ... 2 more
E/AndroidRuntime(14629): Suppressed: java.lang.ClassNotFoundException: Didn't find class "com.android.server.extender.TestExtender" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
E/AndroidRuntime(14629): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
E/AndroidRuntime(14629): at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E/AndroidRuntime(14629): at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
E/AndroidRuntime(14629): ... 3 more
E/AndroidRuntime(14629): Suppressed: java.lang.ClassNotFoundException: com.android.server.extender.TestExtender
E/AndroidRuntime(14629): at java.lang.Class.classForName(Native Method)
E/AndroidRuntime(14629): at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
E/AndroidRuntime(14629): at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
E/AndroidRuntime(14629): at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
E/AndroidRuntime(14629): ... 4 more
E/AndroidRuntime(14629): Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

What's the reason for it?

Thanks,
Drunczyk

Diogo Ferreira

unread,
Jan 19, 2018, 3:59:19 PM1/19/18
to android-...@googlegroups.com
Zygote gets the system server classpath info from the SYSTEMSERVERCLASSPATH env variable. It gets filled dynamically from your product definition via PRODUCT_SYSTEM_SERVER_JARS.

Just add PRODUCT_SYSTEM_SERVER_JARS += extender
Make sure you do it after loading core.mk or it will be overwritten.

Diogo

--
You received this message because you are subscribed to the Google Groups "android-platform" group.
To unsubscribe from this group and stop receiving emails from it, send an email to android-platform+unsubscribe@googlegroups.com.
To post to this group, send email to android-platform@googlegroups.com.
Visit this group at https://groups.google.com/group/android-platform.
For more options, visit https://groups.google.com/d/optout.

Drunczyk

unread,
Jan 23, 2018, 10:48:50 AM1/23/18
to android-platform

Tried it and it works fine. Thanks a lot!

Drunczyk
To unsubscribe from this group and stop receiving emails from it, send an email to android-platfo...@googlegroups.com.
To post to this group, send email to android-...@googlegroups.com.

Drunczyk

unread,
Jan 26, 2018, 1:16:43 PM1/26/18
to android-platform
Another hiccup here - when I'm trying to make the build include the prebuilt .jar library to /system/framework, I don't find it there when the build completes.

The Android.mk for it looks like:


$ LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := extender.jar
LOCAL_MODULE_TAGS := eng optional
LOCAL_MODULE_CLASS := ETC
#LOCAL_MODULE_CLASS := JAVA_LIBRARIES -- tried this too
LOCAL_MODULE_PATH := $(TARGET_OUT)/framework
#LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES) -- tried this one too
LOCAL_SRC_FILES := $(LOCAL_MODULE)

include $(BUILD_PREBUILT)

Drunczyk

Drunczyk

unread,
Jan 29, 2018, 12:44:48 PM1/29/18
to android-platform
Now I'm trying to understand the build problem: services.jar references my prebuilt static java library newservice, newservice uses prebuilt extender.jar. If I do a full product build, newservice gets compiled into services.jar, but extender.jar isn't installed into /system/frameworks and thus isn't found in the final FW image. Adding LOCAL_REQUIRED_MODULES doesn't seem to help.

I suspect the problem here is the the build doesn't think extender.jar is part of the built product.

Android.mk:
======================================================================
$ LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := newservice
LOCAL_MODULE_TAGS := eng optional
LOCAL_SRC_FILES := javalib.jar
LOCAL_REQUIRED_MODULES := extender
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX)
include $(BUILD_PREBUILT)

include $(CLEAR_VARS)
LOCAL_MODULE := extender
LOCAL_MODULE_TAGS := eng optional
LOCAL_SRC_FILES := extender.jar
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX)
include $(BUILD_PREBUILT)

======================================================================

Drunczyk 
Reply all
Reply to author
Forward
0 new messages