Android 问题汇总

Android 问题汇总

  • 开发中遇到的问题
    • 自定义注解反射
    • Android多module下重复jar包问题
    • 白屏体验时android体验的克星
    • SO文件size = 0
    • gradle 更新失败问题
    • javax.crypto.BadPaddingException: Decryption error

开发中遇到的问题

记录在实际开发中遇到的问题及心得

自定义注解反射

当使用自定义注解同时使用反射获取属性值时,Field. isAnnotationPresent 判断此属性是否存在注解,如果isAnnotationPresent 方法一直返回false 可以查看下自定义注解中是否添加:
@Retention(RetentionPolicy.RUNTIME) 【表示运行时存在】

##ADB 调度使用
Android 问题汇总_第1张图片
遇到这种情况,直接在活动监视器中杀掉ADB重新启动就可,亲测可行:
Android 问题汇总_第2张图片

Android多module下重复jar包问题

对于module 添加如下操作
// implementation fileTree(include: [’*.jar’], dir: ‘libs’)
provided files(‘libs/utiltool.jar’)
第一行是去掉gradle自动扫描libs目录下的jar,第二行是以provided的方式参与编译

白屏体验时android体验的克星

1.在首启动的引导页或者广告页的activity的style加入以下代码

true
true

SO文件size = 0

java.lang.UnsatisfiedLinkError: dlopen failed: file offset for the library “/data/app/com.beiya.littletraveler-1/lib/arm/***.so” file size =0>

解决办法:查看**.so的大小是否为空

gradle 更新失败问题

修改build.gradle 中的repositories 与allprojects部分修改如下:

buildscript {
dependencies {
classpath ‘com.android.tools.build:gradle:3.5.1’
}

repositories {


    maven { url'https://maven.aliyun.com/repository/public/' }
    maven { url'https://maven.aliyun.com/repository/google/' }
    maven { url'https://maven.aliyun.com/repository/jcenter/' }
    maven { url'https://maven.aliyun.com/repository/central/' }

    //mavenCentral()

// maven { url “http://maven.aliyun.com/nexus/content/repositories/central” }
}
}

allprojects {
repositories {

    maven { url'https://maven.aliyun.com/repository/public/' }
    maven { url'https://maven.aliyun.com/repository/google/' }
    maven { url'https://maven.aliyun.com/repository/jcenter/' }
    maven { url'https://maven.aliyun.com/repository/central/' }

   // mavenCentral()

}
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

}

javax.crypto.BadPaddingException: Decryption error

1.异常描述:最近做项目为了增强数据传输的安全性用到了RSA加密。即android客户端将要传送的信息,用私钥通过RSA非对称加密算法加密后,传到服务器端(PC端)。服务器端用对应(密钥)的公钥来解密时解密失败,抛出“javax.crypto.BadPaddingException: Blocktype”异常。

2.异常原因:Android系统使用的虚拟机(dalvik)跟SUN标准JDK是有所区别的,其中他们默认的RSA实现就不同。即Android端用Cipher.getInstance(“RSA”)方法进行加密时,使用的provider是Bouncycastle Security provider,Bouncycastle Security provider默认实现的是“RSA/None/NoPadding”算法,而服务器(PC)端用Cipher.getInstance(“RSA”)进行解密时,使用的是Sun的security provider,实现的是“RSA/None/PKCS1Padding”算法,所以,解密时会失败。

3.解决办法:我这里提供三种解决办法:
第一种:将服务器(pc)端的Cipher.getInstance(“RSA”)方法改为Cipher.getInstance(“RSA/ECB/NoPadding”)。但这种改法有一个缺点就是解密后的明文比加密之前多了很多空格。(空格的长度个数+原来的明文字符数=产生密钥时采用的bit数/8)

第二种:将Android端的Cipher.getInstance(“RSA”)方法改为Cipher.getInstance(“RSA/None/PKCS1Padding”)。这种方法解密后的明文和加密前的明文是对应的,不会出现第一种方法中的现象,推荐这种方法。

第三种:在服务器(pc)端的jdk中加入Bouncycastle Security provider,关于Bouncycastle JCE的安装配置及验证请参看 http://blog.csdn.net/caoshichao520326/article/details/8732670, 配置好Bouncycastle Security provider后,将服务器(pc)端的Cipher.getInstance(“RSA”)方法改为Cipher.getInstance(“RSA”,“BC”)。
————————————————
版权声明:本文为CSDN博主「sichard」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cshichao/article/details/8731680

你可能感兴趣的:(Android)