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”,奇迹还真发生了,解决了问题。

猜你喜欢

转载自blog.csdn.net/u010019468/article/details/78924547