2015-10-01 25 views
1

嗨,你的同事stackoverflowers!在android源應用程序中添加一個庫時出現「沒有規則製作目標」的錯誤

我正在AOSP構建系統中工作。我添加了另一個庫的依賴在我的應用程序(在封裝/應用程序),我得到這個奇怪的錯誤:

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庫。

尋求工作/失敗的庫之間的差異,我嘗試了一個Java反編譯器。 我能夠使用unzip和jad(java反編譯器)從restlet和ksoap2類中反編譯類。這兩個文件反編譯沒有問題。

我也嘗試使用LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES預編譯庫,但它沒有工作。

在此先感謝!

回答

1

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_LIBRARIESLOCAL_PREBUILT_STATIC_JAVA_LIBRARIES之間的定義即可。

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES的語法如下:<lib_name>:<path_to_jar_file.jar>。我的意思是,lib_name不必與jar文件名相同(但當然可以)。

BTW,我認爲你有以下行錯誤:

LOCAL_STATIC_JAVA_LIBRARIES := restlet-2.3.2-jsslutils 

應該

LOCAL_STATIC_JAVA_LIBRARIES += restlet-2.3.2-jsslutils 

:=應在第一語句中使用

EDITED1:

It可以很方便地把幾個的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

最簡單的解決方案是將庫源代碼放入應用程序項目中,如果可以接受的話。或者在提供的鏈接上查看解決方法

+0

正確答案是使用LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES。在我的特殊設置中,預建的庫位於'{root_aosp_dir}/external'中,所以在發佈之前我沒有找到它們!/facepalm 所有其他無關的建議,例如'com.mycompany.myservice.lib',它工作得很好...... – ForeverLearning

相關問題