最近360市场强制加固后才能上传,加固后安装在手机上,点击图标异常


java.lang.RuntimeException: Unable to get provider com.xx.xxx.xxxx: java.lang.ClassNotFoundException:
Didn't find class "com.xx.xxx.xxxx" on path: DexPathList[[zip file "/data/app/com.xx.xxx-1/base.apk"],nativeLibraryDirectories=[/data/app/com.xx.xxx-1/lib/arm, /vendor/lib, /system/lib]]

     网上百度了,比较广泛的解决方案是:

1。Manifest文件中注册的Activity的名称,有没有写错,包名有没有搞错,有些网友,可能只写一个类名,前面用点号代替,但是这个类不在默认的包内,所以报这个错,那么只要写上类的全名,即可。

2。有些android,需要一些第三方的包,直接将其引入,在以前是可以的,但是在最新的adt中不行,必须在程序中新建一个libs文件夹,将第三方的jar文件copy到libs文件夹中,才行,很多人因为这样才报错,特别是以前的项目,默认并没有这个libs文件夹,但是新版本的adt,默认就建了libs这个文件夹。

3。有一点也很重要,在Java Build Path面板下的Order and Export中,一定要把你引入的jar文件,勾上,否则,跟没引用一样,切记。

     这可能针对的是原包出现java.lang.ClassNotFoundException的解决方案,我尝试之后都无效

继续百度,有如下解决方案:

   manifest文件中,各组件的name用包名+组件名的形式,而不要用组件名前加点的省略形式。

     然而试过之后还是不行,最后抱着试一下的心态,对project进行了clean,然后编译,签名,加固,重签名,发现居然可以了,简直是奇迹。

     总结:

       如果原包没问题,加固之后出现class not found的情况,建议进行以下尝试:

       1.对project进行clean,然后重新编译,签名,加固,重签名,如果还是不行,尝试2;

       2.将manifest文件中,各组件的name用包名+组件名的形式,然后clean,重新编译,签名,加固,重签名。

    然而,360加固后,应用的运行明显感觉没加固前流畅了,也并不清楚加固过程中究竟会干些什么,所以虽然加固是降低反编译的风险,然而加固也是一种风险。