Could not find method问题解决

本文介绍如何将自定义服务打包成Jar并在Android系统中集成,包括修改相关文件、编译及常见错误处理。

有时候需要把代码制作成jar包放入到项目中,如果只是一个普通的java文件导入系统都是没有问题的,但是很有可能需要将service导出jar包到,由系统启动。
1.通常只需要修改SystemService.java,比如jar包为AutoService_v0.1.jar,把该文件拷贝到framework/base/services/java/目录下。
2.修改framework/base/services/java目录下的Android.mk文件,这样才会编译到系统,通常都是编译到services.java里面,这不是绝对的。
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := AutoService:AutoService_v0.1.jar
include $(BUILD_MULTI_PREBUILT)
# the library
# ============================================================
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
            $(call all-subdir-java-files) \
        com/android/server/EventLogTags.logtags \
        com/android/server/am/EventLogTags.logtags

LOCAL_SRC_FILES += $(call all-Iaidl-files-under,com)

LOCAL_MODULE:= services

LOCAL_JAVA_LIBRARIES := android.policy conscrypt telephony-common AutoService

include $(BUILD_JAVA_LIBRARY)

include $(BUILD_DROIDDOC)
3.启动autoservice,这时需要修改SystemService.java,修改如下。
 


4.最后是编译,我们可以用mmm方式进行编译,这样会节省编译时间。
mmm framework/base/services/java
  mmm编译生成services.jar文件,把该文件push到机器的/system/framework目录下,重启机器。也许你会有很大的惊喜,也许会让你失望。不过没关系,办法总是有的。
 
5.下面来看看错误信息
 
D/SensorService( 2614): nuSensorService thread starting...
I/dalvikvm( 2614): Could not find method com.semisky.autoservice.services.AutoService.getInstance, referenced from method com.android.server.ServerThread.initAndLoop
W/dalvikvm( 2614): VFY: unable to resolve static method 14434: Lcom/semisky/autoservice/services/AutoService;.getInstance ()Lcom/semisky/autoservice/services/AutoService;
D/dalvikvm( 2614): VFY: replacing opcode 0x71 at 0x0753
I/installd( 2253): new connection
...
...
I/SystemServer( 2614): Print AutoService
W/SystemServer( 2614): ***********************************************
F/SystemServer( 2614): BOOT FAILURE starting AutoService
F/SystemServer( 2614): java.lang.NoClassDefFoundError: com.semisky.autoservice.services.AutoService
F/SystemServer( 2614):     at com.android.server.ServerThread.initAndLoop(SystemServer.java:817)
F/SystemServer( 2614):     at com.android.server.SystemServer.main(SystemServer.java:1191)
F/SystemServer( 2614):     at java.lang.reflect.Method.invokeNative(Native Method)
F/SystemServer( 2614):     at java.lang.reflect.Method.invoke(Method.java:515)
F/SystemServer( 2614):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
F/SystemServer( 2614):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
F/SystemServer( 2614):     at dalvik.system.NativeStart.main(Native Method)
 
上面的错误信息让人头痛,从字面意思来看说是找不到com.semisky.autoservice.services.AutoService.getInstance方法,其实AutoService里面是有getInstance方法的。
6.解决办法
将Android.mk文件改成如下,重新编译push到机器上,解决此问题。
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := AutoService:AutoService_v0.1.jar
include $(BUILD_MULTI_PREBUILT)
# the library
# ============================================================
include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
            $(call all-subdir-java-files) \
        com/android/server/EventLogTags.logtags \
        com/android/server/am/EventLogTags.logtags

LOCAL_SRC_FILES += $(call all-Iaidl-files-under,com)

LOCAL_MODULE:= services

LOCAL_JAVA_LIBRARIES := android.policy conscrypt telephony-common
LOCAL_STATIC_JAVA_LIBRARIES := AutoService
include $(BUILD_JAVA_LIBRARY)

include $(BUILD_DROIDDOC)
 

在 Gradle 构建脚本中遇到 `could not find method plugins` 错误通常表示构建脚本的语法或插件应用方式存在问题。以下是可能的原因及解决方案: ### 1. 使用错误的 Gradle 版本 Gradle 的 `plugins {}` 块仅在 Gradle 3.0 及以上版本中可用。如果使用的 Gradle 版本较低,则无法识别 `plugins` 方法。 **解决方法:** 确保 `gradle-wrapper.properties` 文件中的 Gradle 版本为 3.0 或更高,例如: ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip ``` ### 2. 在 `buildscript` 中错误地使用 `plugins {}` `plugins {}` 块不能嵌套在 `buildscript` 块中。若尝试在 `buildscript` 内部使用 `plugins {}`,将导致 Gradle 报错。 **解决方法:** 将插件声明移出 `buildscript` 块,并直接放在 `build.gradle` 文件的顶层: ```groovy plugins { id 'org.springframework.boot' version '2.2.2.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' } ``` ### 3. 混合使用旧式 `apply plugin:` 和新式 `plugins {}` 某些项目可能同时使用了传统方式(`apply plugin:`)和新的插件管理方式(`plugins {}`),这可能导致冲突。 **解决方法:** 统一使用 `plugins {}` 声明所有插件,并移除重复的 `apply plugin:` 调用: ```groovy plugins { id 'java' id 'org.springframework.boot' version '2.2.2.RELEASE' } ``` ### 4. 插件 ID 或版本格式不正确 如果插件的 `id` 或 `version` 格式有误,Gradle 可能会抛出异常,表现为找不到 `plugins` 方法。 **解决方法:** 确保插件的 `id` 和 `version` 正确无误,例如: ```groovy plugins { id("org.springframework.boot") version "2.2.2.RELEASE" id("io.spring.dependency-management") version "1.0.9.RELEASE" } ``` ### 5. 使用非官方支持的插件仓库 某些插件可能不在默认的 Gradle 插件门户中,需要额外配置仓库地址。 **解决方法:** 在 `settings.gradle` 文件中添加插件仓库: ```groovy pluginManagement { repositories { gradlePluginPortal() mavenCentral() } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值