1. 程式人生 > >Android Studio填坑之路

Android Studio填坑之路

Android Studio是個強大Android開發工具,每個新版本的釋出都有帶來新的驚喜和爽快,但是同時也帶來驚嚇和糟糕,這邊文章就是收集開發中遇到的細節問題以及解決方法。

解析打包出的Apk沒有versionCode和versionName

開發環境背景:Andorid studio 3.0.1+ buildToolsVersion ‘26.0.2’
問題:在apktool下反編譯出的AndroidManifest.xml中沒有versionCode和versionName配置,也通過不是一些apk檢查工具,但是實際上是存在的,執行時候能解析出,有些工具也能解析出來。

這個問題就很奇怪,實際是有,但是有的工具就是解析不出來,但是又能解析出別人的apk,這就讓我糾結了好久到底問題出在哪裡。通過測試了好久了,就本環境下打包的apk確認在某平臺下檢查不出。所以只能把目光轉移到本開發環境,想想之前好像沒有這個問題,這個問題肯定是在打包環境下產生的,AndroidManifest是由aapt進行編譯的,所以看下編譯工具配置 buildToolsVersion ‘26.0.2’。難道是版本的問題,故修改了幾次到低版本發現均不行,無奈之下突然發現了可以升級到27.0.3。抱著僥倖心裡升級測試了下,特麼還真可以。經過仔細測試,發現25和26都不行,貌似27解決了這個問題。

JavaLib新增第3方庫編譯通過執行找不到類:java.lang.NoClassDefFoundError

開發環境背景:Andorid studio 3.0.1+ buildToolsVersion ‘27.0.3’
問題:發生java.lang.NoClassDefFoundError異常,不能找到引用的第3方jar

根據問題型別,最先去排查是否對第3方庫配置引用是否有問題,在javalib module中的build.gradle檔案配置中發現已經compile了libs下的第3方庫,並且src下java程式碼能正常引用第3方庫的api,說明編譯引用和配置都沒有問題。那為何還是執行時候找不到Class呢。個人就隨便找是否有其他配置生效的地方有問題,發現module下還有個xxxx.iml檔案格式檔案,開啟一看這個是對module的專案配置,其中有個component配置如下,看起來有點蹊蹺:

 <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6">
    <output url="file://$MODULE_DIR$/build/classes/java/main" />
    <output-test url="file://$MODULE_DIR$/build/classes/java/test" />
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR
$/src/main/java"
isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" /> <excludeFolder url="file://$MODULE_DIR$/.gradle" /> <excludeFolder url="file://$MODULE_DIR$/build" /> </content> <orderEntry type="inheritedJdk" /> <orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="library" exported="" scope="PROVIDED" name="okhttp-3.2.0" level="project" /> <orderEntry type="library" exported="" scope="PROVIDED" name="okio-1.7.0" level="project" /> <orderEntry type="library" exported="" scope="PROVIDED" name="rxandroid-2.0.1" level="project" /> <orderEntry type="library" exported="" scope="PROVIDED" name="rxjava-2.1.3" level="project" /> <orderEntry type="library" exported="" scope="PROVIDED" name="reactive-streams-1.0.1" level="project" /> <orderEntry type="library" exported="" scope="PROVIDED" name="AXMLPrinter-1.0" level="project" /> </component>

可以發現所有的第3方庫 配置scope=”PROVIDED” ,雖然當時不理解scope意思,但是provided是提供編譯但是不匯入包的意思,會在執行的時候產生找不到類。這個檔案又是自動生成的,抱著嘗試修改的態度,認為應該是COMPILE才是我們要的。故修改為scope=”COMPILE”,奇蹟還真發生了,解決了問題。