2016-11-08 61 views
4

我正在使用Android Studio。我正在編寫一個名爲探測器的Android庫。它在創建它的項目中完美運行。導入Android庫AAR - 沒有類定義

compile project(':detector') 

我想將它生成的AAR文件導入到另一個項目中。我這樣做的:

File > New > New Module > Import .JAR/.AAR Package 

我再放入同一行中的新項目應用的build.gradle:

compile project(':detector') 

清潔和建築後,我運行應用程序,並得到這個錯誤:

11-18 06:32:14.151 21283-21283/testing.com.test D/ResourcesManager: For user 0 new overlays fetched Null 
11-18 06:32:14.161 21283-21283/testing.com.test W/System: ClassLoader referenced unknown path: /data/app/testing.com.test-1/lib/arm 
11-18 06:32:15.131 21283-21283/testing.com.test W/System: ClassLoader referenced unknown path: /data/app/testing.com.test-1/lib/arm 
11-18 06:32:15.131 21283-21283/testing.com.test D/ContextRelationManager: ContextRelationManager() : FEATURE_ENABLED=true 
11-18 06:32:15.131 21283-21283/testing.com.test D/RelationGraph: garbageCollect() 
11-18 06:32:15.301 21283-21283/testing.com.test D/RelationGraph: garbageCollect() 
11-18 06:32:15.501 21283-21283/testing.com.test W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager> 
11-18 06:32:15.631 21283-21283/testing.com.test D/AndroidRuntime: Shutting down VM 
11-18 06:32:15.631 21283-21283/testing.com.test E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: testing.com.test, PID: 21283 
                     java.lang.NoClassDefFoundError: detector.Manager 
                      at detector.Detector.<clinit>(Detector.java:39) 
                      at testing.com.test.MainActivity.onCreate(MainActivity.java:17) 
                      at android.app.Activity.performCreate(Activity.java:6904) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3266) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415) 
                      at android.app.ActivityThread.access$1100(ActivityThread.java:229) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:7325) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

我解壓AAR和反編譯Classes.jar文件找到Manager文件確實存在:

Manager.class 
Manager$3.class 
Manager$2.class 
Manager$1.class 

這裏是圖書館的build.gradle

apply plugin: 'com.android.library' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.3" 

    defaultConfig { 
     minSdkVersion 10 
     targetSdkVersion 23 
     versionCode 1 
     versionName '1' 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile ('org.altbeacon:android-beacon-library:2.8.1') 
    compile ('com.google.android.gms:play-services-ads:9.6.1') 
    compile 'com.android.support:appcompat-v7:23.4.0' 
} 

buildscript { 
    repositories { 
     jcenter() 
     mavenCentral() 
     flatDir { 
      dirs 'libs' 
     } 
    } 
} 

此外,我能夠部署庫jCenter和我能夠鏈接到jCenter安裝時,成功運行庫等項目。這只是導致此問題的直接AAR導入。

請建議構建Android庫AAR並將其導入另一個Android項目。

====== UPDATE ======

我發現,由於從@bwt幫助,這個問題就解決了,如果我包括應用程序內的庫依賴的build.gradle是引導AAR。我怎樣才能確保依賴關係(這是谷歌播放和altbeacon)包含在AAR內?在構建AAR之前將它們設置爲傳遞依賴關係並沒有幫助。

+0

是你的代碼直接引用'detector.Manager'嗎? IOW,這可能是ProGuard在'release'版本中剝離出來的東西嗎? – CommonsWare

+0

我的代碼直接引用它,是的。我會檢查它是否被剝離。 –

+0

這些類存在於提取的classes.jar中: Manager.class Manager $ 3.class Manager $ 2.class Manager $ 1.class –

回答

1

讓說你有2個項目:

  1. AAR項目 - 這是一個在您建立並創建AAR文件。
  2. 工作項目 - 這是您運行需要(1)生成的aar文件的代碼的地方。

在您的工作項目(2)中,您將不得不爲你的aar文件(1)添加一個新模塊。其過程如下,在你現有的一個模塊上按鼠標右鍵,選擇「打開模塊設置」,然後按「+」號添加一個新模塊選擇導入jar/aar並選擇相關文件在部分產生1

你會發現,你的新模塊的新gradle這個文件是用下面的代碼生成:

configurations.maybeCreate("default") 
artifacts.add("default", file('name_of_you_aar_file.aar')) 

後的模塊創建你就會有新的模塊鏈接到您的應用程序模塊使用您已經在build.gradle中寫入的與您的模塊相關的內容:compile project(':name_of_your_module')

讓我知道它是否適合你。

+0

中有協議緩衝區時,我已經完成了這個操作並且仍然出現錯誤。這裏是gradle:configurations.maybeCreate(「默認」) artifacts.add(「default」,file('detector-debug.aar')) –

1

我不確定問題是該類沒有導入(否則,你無法編譯),但以防萬一你導入本地aar沒有額外的模塊會發生什麼?

  1. aar在模塊內部的目錄,你想用它(如應用程序模塊中aarlibs

  2. 這個目錄聲明作爲存儲庫(在應用程序的build.gradle):

    repositories{ 
        flatDir{ 
         dirs 'aarlibs' 
        } 
    } 
    
    android { 
    ... 
    
  3. 參考它作爲一個依賴(也位於應用程序的build.gradle):

    dependencies { 
        compile(name:'aar_file_name', ext:'aar') 
    ... 
    
+0

感謝您的回覆。我已經嘗試過這一點,我仍然得到同樣的錯誤。我在問題中粘貼了錯誤條件的詳細輸出以添加更多上下文。 –

+0

似乎找到了'Detector'類,但沒有找到'Manager'類。它在apk中出現嗎? (從Android Studio:Build> Analyze APK,請查看'classes.dex') – bwt

+0

我在分析APK時遇到問題。該選項在我的構建菜單中不存在,我嘗試雙擊構建>輸出> apk目錄中生成的APK,但未打開APK分析器。我正在使用一個mac –

1

aar文件沒有傳遞依賴性,也沒有描述庫使用的依賴關係的pom文件。

表示如果您要導入aar文件,則必須在項目中指定相關性。

你應該使用一個maven倉庫(你必須在私有或公共maven倉庫中發佈該倉庫)。

1
  1. 首先,抓住從文件夾的SDK所需的所有.AAR文件。
  2. 爲每個這些庫創建新模塊。使用Android Studio的GUI,可以通過文件 - >新建 - >新建模塊完成。選擇導入.JAR/.AAR包。找到其中一個.AAR並導入它。
  3. 然後通過將文件>項目結構>模塊(在左側的部分列表中)>您的應用程序的模塊名稱>依賴項(在右側的選項卡列表中) - >'+ ' - > Module Dependency

使用上述步驟將導致Android Studio生成新模塊並自動編輯您的。格式文件。或者,您可以通過編輯特定模塊的build.gradle文件直接將.AAR包含在應用程序的模塊中。

Refrence:https://developers.google.com/vr/android/get-started