eclipse adt中因升级ADT出现的问题解决方法,method IDnotin[0,0xffff]:65536,分包处理这个问题

问题背景:因为公司Android 框架项目比较老,但是客户那边还在用,而google对android系统权限的审核问题做出调整,导致之前的项目在android系统升级之后,项目不能用了,比如调用拍摄的功能,所以我必须着手升级api。下面开始一步步记录升级过程。

一、准备阶段

1,下载eclipse adt,我这里是下载的配置好的adt,省去了配置的时间(jdk环境最好是1.8以上,现在大多用的这个)

2,下载新版的sdk(6.0),最低要这个,原因下面会描述,所有的依赖包库都要升级成6.0以上,v7 ,v4的包,不然sdk不一致会起冲突

3.将原项目工程导入新的环境下

二,排错过程

1.先保证你的项目能在新的环境下运行起来,然而不会那么容易跑起来的,我导入新的后,问题不少

  a.问题1,因为我项目有v7,v4包,所以替换的时候,我采取的是将依赖库下的libs用新的替换,替换后有些styles会报错,你如果知道这个样式是哪里用到的,清楚这个,可以处理,不清楚先注释,目的是让项目先跑起来。

  b.问题2,排完所有报错的地方后,不报错了,那就开始运行,,然后给你报个错,method IDnotin[0,0xffff]:65536  方法数超过了虚拟机加载的最大数,项目小一般不会出现这个问题,然后之前都是在project.properties加个dex.force.jumbo=true就完事了,但是这次不行,然后以前eclipse有时候clear一下就好了,这次确不行,于是就找方法,查这查那的,最后看到一个方法,

  https://www.jianshu.com/p/09c7204109b0   开始在eclipse中手动分包然后避免35536的问题, 然后就开始尝试 

三,分包

看上面链接的方法,大体思路是将部分jar合并成一个一个jar包,然后再将jar转成.dex文件,大多比较大、功能比较多的apk,可以解压之后看到有classes.dex ,classes2.dex classes3.dex文件,所以我我们也是将部分(在Application中没有用到的jar,看着上面的文档说的,如果将在Application中用到的jar包也合并的话,会爆ClassNotFound找不到类的那个错误,没有验证)

1.jar到dex转换

如果你你项目中jar比较多,像我的项目中引入了16个的jar包,所以我们需要将部分jar合并,我用到了一个eclipse插件fatjar工具,百度搜索然后下载最新的就好。具体可参考 https://blog.csdn.net/nmzkchina/article/details/79701142

然后将合并好的jar包生成为dex,然后重命名classes2.dex ,你也可以在生成的时候就命名成这个,具体参考https://www.jianshu.com/p/562eaf211ff5,然后放在src根目录下,我们的目的是为了分包 ,那么libs下的包是不是可以删减了呢,但是这时我们不能直接删除下面的包,因为我们直接删除项目会报错,因为我们编译的时候要用到这些jar,我们要将这些jar放在其他地方,上文链接中的大哥是在src下建了个folder(图1)其实在其他地方存放也行,然后把jar包放在这里然后再在以外部lib的方式加入项目(图2),保证编译通过

               图1

                                             图2

然后呢,再到此项目本地项目目录下找到.classpath文件,就可以看到文件路径在这里已经能看到了

                             图3

 

2.导入 mutildex 分包所需要的jar包

然后在 Application的oncreate声明载入dex文件的代码MultiDex.install(this)就行了,然后项目运行,发现已经不会爆35536的问题了。

四、将在6.0以上的动态添加系统权限的功能加上,也是我们升级api的目的

    private void boolOpenCarmer() {
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA) // 打开相机权限
        != PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this,
                        Manifest.permission.READ_EXTERNAL_STORAGE) // 可读
                != PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE) // 可写
                != PackageManager.PERMISSION_GRANTED) {
            // 申请WRITE_EXTERNAL_STORAGE权限
            ActivityCompat.requestPermissions(this,
                    new String[] { Manifest.permission.CAMERA,
                            Manifest.permission.READ_EXTERNAL_STORAGE,
                            Manifest.permission.WRITE_EXTERNAL_STORAGE }, 1);
        }
    }

在你的BaseActivity中加上这个方法,然后再onCreate方法中调用一下就可以了。然后错也排完了,功能也加上了,那我们运行一下,然后达到预期的效果

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章