美文网首页程序员
Smali聚合android4.4闪退问题原因及解决方案

Smali聚合android4.4闪退问题原因及解决方案

作者: Wood木木 | 来源:发表于2018-12-14 10:27 被阅读0次
  1. 原因分析
  2. eclipse解决方案
  3. eclipse 导入Androidstudio解决方案

原因分析:

在安卓4.4及以下的系统中,安卓限制整个app包的方法数不能超过65535(即64K),而随着现在App功能的增大,方法数远超65535。这就导致早期的安卓系统(4.4以下)出现方法找不到问题。当然,谷歌也自身有提供一套解决方案,即(multidex拆分包)。但是之前聚合虽然意识到这个问题,但是解决方案却是错误的。

eclipse工程的解决方法:

eclipse Android工程方法超过65535,一般使用MultiDex库进行分包处理。
而eclipse中使用multidex库一般分为以下步骤:

  • 下载android-support-multidex.jar
  • 在eclipse上导入android-support-multidex.jar包
  • 配置MultiDexApplication
  • 配置AndroidManifest.xml

android-support-multidex.jar下载

百度下载android-support-multidex.jar放置在主工程使用
下载链接:https://pan.baidu.com/s/1dfstShtHSFVGqqc6m8XDFA

在eclipse上导入android-support-multidex.jar包

这里就要将android-support-multidex.jar导入eclipse,跟导入其他jar包一样。

MultiDexApplication

有两种方案配置Application,目前我们聚合的Application大都没有去继承MultiDexApplication,如果父类没有继承MultiDexApplication ,就用第二种方法就可以。

  • 直接继承
public class MogeApplication extends MultiDexApplication { ... }
  • 重写attachBaseContext方法
    或者,如果替换了 Application 类,但无法更改基本类,则可以改为替换 attachBaseContext() 方法并调用 MultiDex.install(this) 来启用 Dalvik 可执行文件分包:
public class MogeApplication extends LeyouApplication{
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

配置AndroidManifest.xml

编辑清单文件,按如下方式设置 <application> 标记中的 android:name:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="android.support.multidex.MogeApplication" >
        ...
    </application>
</manifest>

注意点

不得不说,其实以上步骤只是集成了MultiDex,但是并没有做拆分包的操作,关于拆分包的操作,在打包的时候,炳元已经用python有做相应处理了,这里就可以不用处理拆分包。也就是说,以上的步骤只适用于聚合渠道打包。

eclipse项目导入到AndroidStudio解决方案

由于谷歌官方并没有支持在eclipse项目上添加MultiDex。所以上面操作eclipse集成MultiDex只是集成了这个类库,但Eclipse并没有对生成的包进行分包,所以如果真的需要完成支持MultiDex,还是要在AndroidStudio上集成MultiDex。其实谷歌把拆分包操作集成在Gradle打包工具里了,添加分包操作用Gradle很简单,只要配置:defaultConfig 下添加 multiDexEnabled true就可以。

具体步骤如下:

  • 导入eclipse工程到AndroidStudio
  • 修改build.gradle文件
  • 集成MultiDex
  • 添加MultiDex支持
  • 配置AndroidManifest.xml

导入eclipse工程到AndroidStudio

导入工程到AndroidStudio是很简单,但是导入后就会有各种问题,先看下导入步骤。

  1. file->new->Import Project...


    1.png
  2. 选择eclipse工程,注意,选择的是工程的根目录。


    2.png
  3. 选择转换成androidstudio项目后,要保存的位置。


    3.png
  4. 后面直接点下一步,完成。
  5. 要修改的地方。由于我们用的eclipse项目都很早,所以不在转换成androidstudio项目后,gradle版本不建议用最新的,建议用2.14.1版本,具体要改的地方如下:
  • dt1/build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'//版本要用2.2.3
    }
}
  • dt1\gradle\wrapper\gradle-wrapper.properties
    gradle版本要改成2.14.1
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
  • 可选操作,Build Tools版本改成常用版本,具体步骤是把所有Build Tools版本号,改成常用版本号。

集成MultiDex

  1. 在defaultConfig中添加multiDexEnabled true这个配置项。
  2. 在dependencies中添加multidex的依赖:
    implementation ‘com.android.support:multidex:1.0.2’
android { 
      defaultConfig {
        ...
        multiDexEnabled true 
        ...
      }
    dependencies {
      ...
      compile 'com.android.support:multidex:1.0.2'
      ...
    }
}

添加MultiDex支持

这一步跟elipse一样的。同样有两种方案配置Application,目前我们聚合的Application大都没有去继承MultiDexApplication,如果父类没有继承MultiDexApplication ,就用第二种方法就可以。

  • 直接继承
public class MogeApplication extends MultiDexApplication { ... }
  • 重写attachBaseContext方法
    或者,如果替换了 Application 类,但无法更改基本类,则可以改为替换 attachBaseContext() 方法并调用 MultiDex.install(this) 来启用 Dalvik 可执行文件分包:
public class MogeApplication extends LeyouApplication{
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

配置AndroidManifest.xml

编辑清单文件,按如下方式设置 <application> 标记中的 android:name:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="android.support.multidex.MogeApplication" >
        ...
    </application>
</manifest>

接下来编译运行,OK了。

问题分析与汇总

  • 如下所示,在聚合过程中,被继承的xxApplication有正确重写attachBaseContext,但是在安卓4.4下却依然无法加载分包。这是因为attachBaseContext必需要在继承于Application的xxApplication或者多继承一级,太多级继承,往往就不生效了。这些点是要多注意的。


    添加了attachBaseContext后依然没有成功安装multidex.png

相关文章

  • Smali聚合android4.4闪退问题原因及解决方案

    原因分析 eclipse解决方案 eclipse 导入Androidstudio解决方案 原因分析: 在安卓4.4...

  • PS一打开camera raw就崩溃怎么办?

    (作者海丁香) 问题出现原因:电脑显卡不行,带不动 解决方案:编辑—首选项—性能—取消使用图形处理器 结果:闪退—...

  • JNI DETECTED ERROR IN APPLICATIO

    Android上调试UVCCamera,释放相机时出现问题,闪退解决方案:...public synchroniz...

  • JShare 1.6.0 的问题

    JShare 1.6.0 在使用QQ分享的时候闪退微信,微博分享没有这问题。。。。。这。。。。 原因及解决办法 这...

  • Linux上Java闪退问题定位

    现象 java服务,运行1-2天闪退。闪退问题通常比较难查,因为日志不全,所以记录一下本次问题原因定位。 定位问题...

  • Flutter和原生混合开发IOS14系统启动app闪退问题

    IOS14系统一启动app就闪退原因:flutter适配问题,flutter为适配iOS14系统,导致真机启动闪退...

  • APP闪退的常见原因

    1、出现闪退的常见原因 1、手机本身内存不够。 2、内存泄漏,程序没有及时释放内容。 3、权限问题,也可能导致闪退...

  • 闪退问题

    造成闪退的原因有哪些呢? 1.打开的应用程序过多,iPhone内存容量用量超载导致程序闪退。 2.程序运行在较老的...

  • app闪退原因

    1、-[ViewController test]: unrecognized selector sent to i...

  • App闪退原因

    1.ios在当前页修改请求条件,新数据还未请求完毕,老页面未摧毁,这时点击老页面的内容,会出现闪退. 2.安卓动画...

网友评论

    本文标题:Smali聚合android4.4闪退问题原因及解决方案

    本文链接:https://www.haomeiwen.com/subject/srpwhqtx.html