"No rule to make target" 在 android 源应用程序中添加库时出错
"No rule to make target" error when adding a library in android source application
大家好 Whosebugers !
我在 AOSP 构建系统中工作。我在我的应用程序中添加了另一个库依赖项(在 packages/apps 中),我得到了这个奇怪的错误:
mmm -B packages/apps/MyApp/
make: Entering directory `/home/user/workspace/aosp'
target R.java/Manifest.java: MyApp (out/target/common/obj/APPS/MyApp_intermediates/src/R.stamp)
make: *** No rule to make target `out/target/common/obj/JAVA_LIBRARIES/bcprov-jdk15on-152_intermediates/javalib.jar', needed by `out/target/common/obj/APPS/MyApp_intermediates/classes-full-debug.jar'. Stop.
我在使用 Android Studio 时没有出现此错误,并且库按预期工作,但我需要在 AOSP 中构建它。
这是Android.mk:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
# TAGS is test, so apk will end up in /data/app
LOCAL_MODULE_TAGS := tests
LOCAL_MODULE_OWNER := mycompany
# Java sources are in ./java
LOCAL_SRC_FILES := $(call all-java-files-under, java)
# Resources are in ./res
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
# We need all these jars
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
LOCAL_STATIC_JAVA_LIBRARIES := restlet-2.3.2-jsslutils
LOCAL_STATIC_JAVA_LIBRARIES += restlet-2.3.2-restlet-ext-nio
LOCAL_STATIC_JAVA_LIBRARIES += restlet-2.3.2-restlet
LOCAL_STATIC_JAVA_LIBRARIES += bcprov-jdk15on-152
LOCAL_STATIC_JAVA_LIBRARIES += ksoap2-android-assembly-3.4.0-jar-with-dependencies
LOCAL_JAVA_LIBRARIES := com.mycompany.myservice.lib
# The name of this application
LOCAL_PACKAGE_NAME := MyApp
# No Proguard
LOCAL_PROGUARD_ENABLED := disabled
# Build an APK
include $(BUILD_PACKAGE)
和 AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mycompany.myapp" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.sensor" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_people"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library
android:name="com.mycompany.myservice.lib"
android:required="true" />
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".ws.CommandIntentService"
android:exported="false" >
</service>
<service
android:name=".ws.WSRequestIntentService"
android:exported="false" >
</service>
<service
android:name=".ws.CloudClientService"
android:enabled="true"
android:exported="false" >
</service>
</application>
</manifest>
我在 bountycaste(bcprov...) 和 ksoap 库中都遇到了这个错误。
寻求 working/failing 库之间的差异,我尝试了 java 反编译器。
我能够使用 unzip 和 jad(java 反编译器)从 restlet 和 ksoap2 类 反编译 类。两个文件都被反编译没有问题。
我也尝试使用 LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES
将库包含为预编译的,但没有成功。
提前致谢!
LOCAL_STATIC_JAVA_LIBRARIES
必须引用其他模块或本模块中构建的库。由于您使用的是预构建的 jar 文件,因此您需要将 LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES
添加到清单中。它可能看起来像:
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := android-support-v4:libs/android-support-v4.jar \
restlet-2.3.2-jsslutils:libs/restlet-2.3.2-jsslutils.jar \
restlet-2.3.2-restlet-ext-nio:libs/restlet-2.3.2-restlet-ext-nio.jar <add here other libraries>
include $(BUILD_MULTI_PREBUILT)
它可以添加到您的 Android.mk 的底部。提到 android-support-v4 等只是库的虚拟名称,因此您可以使用其他名称,只是它们需要匹配 LOCAL_STATIC_JAVA_LIBRARIES
和 LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES
之间的定义。
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES
的语法如下:<lib_name>:<path_to_jar_file.jar>
。我的意思是 lib_name 不必与 jar 文件名相同(但当然可以)。
顺便说一句,我认为您在以下行中有误:
LOCAL_STATIC_JAVA_LIBRARIES := restlet-2.3.2-jsslutils
应该是
LOCAL_STATIC_JAVA_LIBRARIES += restlet-2.3.2-jsslutils
:=
应该用在第一个语句
EDITED1:
将几个restlet-2.3.2-*.jar文件放到一个库中可能会很方便,即restlet
:
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := restlet:libs/restlet-2.3.2-jsslutils.jar \
restlet:libs/restlet-2.3.2-restlet-ext-nio.jar restlet:libs/restlet-2.3.2-restlet.jar
我自己没用过,但我觉得可能有用。
EDITED2:
很可能共享库 android-support-v4
已经存在于您的 AOSP ROM 中,因此您无需在 LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES
中指定它
EDITED3:
我在清单中看到您正在使用 Android 项目库
<uses-library
android:name="com.mycompany.myservice.lib"
android:required="true" />
AOSP 不支持此类库 - 仅支持常规 jar 库,因此需要额外处理资源文件。在这里查看答案:Add one android project as a library in AOSP App
最简单的解决方案是将库源代码放入您的应用程序项目中(如果可以的话)。或者在提供的 link
中查看解决方法
大家好 Whosebugers !
我在 AOSP 构建系统中工作。我在我的应用程序中添加了另一个库依赖项(在 packages/apps 中),我得到了这个奇怪的错误:
mmm -B packages/apps/MyApp/
make: Entering directory `/home/user/workspace/aosp'
target R.java/Manifest.java: MyApp (out/target/common/obj/APPS/MyApp_intermediates/src/R.stamp)
make: *** No rule to make target `out/target/common/obj/JAVA_LIBRARIES/bcprov-jdk15on-152_intermediates/javalib.jar', needed by `out/target/common/obj/APPS/MyApp_intermediates/classes-full-debug.jar'. Stop.
我在使用 Android Studio 时没有出现此错误,并且库按预期工作,但我需要在 AOSP 中构建它。
这是Android.mk:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
# TAGS is test, so apk will end up in /data/app
LOCAL_MODULE_TAGS := tests
LOCAL_MODULE_OWNER := mycompany
# Java sources are in ./java
LOCAL_SRC_FILES := $(call all-java-files-under, java)
# Resources are in ./res
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
# We need all these jars
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
LOCAL_STATIC_JAVA_LIBRARIES := restlet-2.3.2-jsslutils
LOCAL_STATIC_JAVA_LIBRARIES += restlet-2.3.2-restlet-ext-nio
LOCAL_STATIC_JAVA_LIBRARIES += restlet-2.3.2-restlet
LOCAL_STATIC_JAVA_LIBRARIES += bcprov-jdk15on-152
LOCAL_STATIC_JAVA_LIBRARIES += ksoap2-android-assembly-3.4.0-jar-with-dependencies
LOCAL_JAVA_LIBRARIES := com.mycompany.myservice.lib
# The name of this application
LOCAL_PACKAGE_NAME := MyApp
# No Proguard
LOCAL_PROGUARD_ENABLED := disabled
# Build an APK
include $(BUILD_PACKAGE)
和 AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mycompany.myapp" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.sensor" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_people"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library
android:name="com.mycompany.myservice.lib"
android:required="true" />
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".ws.CommandIntentService"
android:exported="false" >
</service>
<service
android:name=".ws.WSRequestIntentService"
android:exported="false" >
</service>
<service
android:name=".ws.CloudClientService"
android:enabled="true"
android:exported="false" >
</service>
</application>
</manifest>
我在 bountycaste(bcprov...) 和 ksoap 库中都遇到了这个错误。
寻求 working/failing 库之间的差异,我尝试了 java 反编译器。 我能够使用 unzip 和 jad(java 反编译器)从 restlet 和 ksoap2 类 反编译 类。两个文件都被反编译没有问题。
我也尝试使用 LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES
将库包含为预编译的,但没有成功。
提前致谢!
LOCAL_STATIC_JAVA_LIBRARIES
必须引用其他模块或本模块中构建的库。由于您使用的是预构建的 jar 文件,因此您需要将 LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES
添加到清单中。它可能看起来像:
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := android-support-v4:libs/android-support-v4.jar \
restlet-2.3.2-jsslutils:libs/restlet-2.3.2-jsslutils.jar \
restlet-2.3.2-restlet-ext-nio:libs/restlet-2.3.2-restlet-ext-nio.jar <add here other libraries>
include $(BUILD_MULTI_PREBUILT)
它可以添加到您的 Android.mk 的底部。提到 android-support-v4 等只是库的虚拟名称,因此您可以使用其他名称,只是它们需要匹配 LOCAL_STATIC_JAVA_LIBRARIES
和 LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES
之间的定义。
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES
的语法如下:<lib_name>:<path_to_jar_file.jar>
。我的意思是 lib_name 不必与 jar 文件名相同(但当然可以)。
顺便说一句,我认为您在以下行中有误:
LOCAL_STATIC_JAVA_LIBRARIES := restlet-2.3.2-jsslutils
应该是
LOCAL_STATIC_JAVA_LIBRARIES += restlet-2.3.2-jsslutils
:=
应该用在第一个语句
EDITED1:
将几个restlet-2.3.2-*.jar文件放到一个库中可能会很方便,即restlet
:
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := restlet:libs/restlet-2.3.2-jsslutils.jar \
restlet:libs/restlet-2.3.2-restlet-ext-nio.jar restlet:libs/restlet-2.3.2-restlet.jar
我自己没用过,但我觉得可能有用。
EDITED2:
很可能共享库 android-support-v4
已经存在于您的 AOSP ROM 中,因此您无需在 LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES
EDITED3:
我在清单中看到您正在使用 Android 项目库
<uses-library
android:name="com.mycompany.myservice.lib"
android:required="true" />
AOSP 不支持此类库 - 仅支持常规 jar 库,因此需要额外处理资源文件。在这里查看答案:Add one android project as a library in AOSP App
最简单的解决方案是将库源代码放入您的应用程序项目中(如果可以的话)。或者在提供的 link
中查看解决方法