Android 问题汇总
开发中遇到的问题
记录在实际开发中遇到的问题及心得
自定义注解反射
当使用自定义注解同时使用反射获取属性值时,Field. isAnnotationPresent 判断此属性是否存在注解,如果isAnnotationPresent 方法一直返回false 可以查看下自定义注解中是否添加:
@Retention(RetentionPolicy.RUNTIME) 【表示运行时存在】
##ADB 调度使用
遇到这种情况,直接在活动监视器中杀掉ADB重新启动就可,亲测可行:
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
Exception in MessageQueue callback: handleReceiveCallback
当迁移到Android X 之后混淆时,出现异常:
2021-01-21 20:41:23.928 30986-30986/cn.ft.appstore E/InputEventReceiver: Exception dispatching input event.
2021-01-21 20:41:23.929 30986-30986/cn.ft.appstore E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
2021-01-21 20:41:23.931 30986-30986/cn.ft.appstore E/MessageQueue-JNI: java.lang.AbstractMethodError: abstract method "boolean android.view.Window
C
a
l
l
b
a
c
k
.
d
i
s
p
a
t
c
h
G
e
n
e
r
i
c
M
o
t
i
o
n
E
v
e
n
t
(
a
n
d
r
o
i
d
.
v
i
e
w
.
M
o
t
i
o
n
E
v
e
n
t
)
"
a
t
c
o
m
.
a
n
d
r
o
i
d
.
i
n
t
e
r
n
a
l
.
p
o
l
i
c
y
.
D
e
c
o
r
V
i
e
w
.
d
i
s
p
a
t
c
h
G
e
n
e
r
i
c
M
o
t
i
o
n
E
v
e
n
t
(
D
e
c
o
r
V
i
e
w
.
j
a
v
a
:
411
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
.
d
i
s
p
a
t
c
h
P
o
i
n
t
e
r
E
v
e
n
t
(
V
i
e
w
.
j
a
v
a
:
10295
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
R
o
o
t
I
m
p
l
Callback.dispatchGenericMotionEvent(android.view.MotionEvent)" at com.android.internal.policy.DecorView.dispatchGenericMotionEvent(DecorView.java:411) at android.view.View.dispatchPointerEvent(View.java:10295) at android.view.ViewRootImpl
Callback.dispatchGenericMotionEvent(android.view.MotionEvent)"atcom.android.internal.policy.DecorView.dispatchGenericMotionEvent(DecorView.java:411)atandroid.view.View.dispatchPointerEvent(View.java:10295)atandroid.view.ViewRootImplViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4928)
at android.view.ViewRootImpl
V
i
e
w
P
o
s
t
I
m
e
I
n
p
u
t
S
t
a
g
e
.
o
n
P
r
o
c
e
s
s
(
V
i
e
w
R
o
o
t
I
m
p
l
.
j
a
v
a
:
4787
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
R
o
o
t
I
m
p
l
ViewPostImeInputStage.onProcess(ViewRootImpl.java:4787) at android.view.ViewRootImpl
ViewPostImeInputStage.onProcess(ViewRootImpl.java:4787)atandroid.view.ViewRootImplInputStage.deliver(ViewRootImpl.java:4293)
at android.view.ViewRootImpl
I
n
p
u
t
S
t
a
g
e
.
o
n
D
e
l
i
v
e
r
T
o
N
e
x
t
(
V
i
e
w
R
o
o
t
I
m
p
l
.
j
a
v
a
:
4346
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
R
o
o
t
I
m
p
l
InputStage.onDeliverToNext(ViewRootImpl.java:4346) at android.view.ViewRootImpl
InputStage.onDeliverToNext(ViewRootImpl.java:4346)atandroid.view.ViewRootImplInputStage.forward(ViewRootImpl.java:4312)
at android.view.ViewRootImpl
A
s
y
n
c
I
n
p
u
t
S
t
a
g
e
.
f
o
r
w
a
r
d
(
V
i
e
w
R
o
o
t
I
m
p
l
.
j
a
v
a
:
4459
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
R
o
o
t
I
m
p
l
AsyncInputStage.forward(ViewRootImpl.java:4459) at android.view.ViewRootImpl
AsyncInputStage.forward(ViewRootImpl.java:4459)atandroid.view.ViewRootImplInputStage.apply(ViewRootImpl.java:4320)
at android.view.ViewRootImpl
A
s
y
n
c
I
n
p
u
t
S
t
a
g
e
.
a
p
p
l
y
(
V
i
e
w
R
o
o
t
I
m
p
l
.
j
a
v
a
:
4516
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
R
o
o
t
I
m
p
l
AsyncInputStage.apply(ViewRootImpl.java:4516) at android.view.ViewRootImpl
AsyncInputStage.apply(ViewRootImpl.java:4516)atandroid.view.ViewRootImplInputStage.deliver(ViewRootImpl.java:4293)
at android.view.ViewRootImpl
I
n
p
u
t
S
t
a
g
e
.
o
n
D
e
l
i
v
e
r
T
o
N
e
x
t
(
V
i
e
w
R
o
o
t
I
m
p
l
.
j
a
v
a
:
4346
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
R
o
o
t
I
m
p
l
InputStage.onDeliverToNext(ViewRootImpl.java:4346) at android.view.ViewRootImpl
InputStage.onDeliverToNext(ViewRootImpl.java:4346)atandroid.view.ViewRootImplInputStage.forward(ViewRootImpl.java:4312)
at android.view.ViewRootImpl
I
n
p
u
t
S
t
a
g
e
.
a
p
p
l
y
(
V
i
e
w
R
o
o
t
I
m
p
l
.
j
a
v
a
:
4320
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
V
i
e
w
R
o
o
t
I
m
p
l
InputStage.apply(ViewRootImpl.java:4320) at android.view.ViewRootImpl
InputStage.apply(ViewRootImpl.java:4320)atandroid.view.ViewRootImplInputStage.deliver(ViewRootImpl.java:4293)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6817)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6791)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6734)
at android.view.ViewRootImpl
W
i
n
d
o
w
I
n
p
u
t
E
v
e
n
t
R
e
c
e
i
v
e
r
.
o
n
I
n
p
u
t
E
v
e
n
t
(
V
i
e
w
R
o
o
t
I
m
p
l
.
j
a
v
a
:
6989
)
a
t
a
n
d
r
o
i
d
.
v
i
e
w
.
I
n
p
u
t
E
v
e
n
t
R
e
c
e
i
v
e
r
.
d
i
s
p
a
t
c
h
I
n
p
u
t
E
v
e
n
t
(
I
n
p
u
t
E
v
e
n
t
R
e
c
e
i
v
e
r
.
j
a
v
a
:
185
)
a
t
a
n
d
r
o
i
d
.
o
s
.
M
e
s
s
a
g
e
Q
u
e
u
e
.
n
a
t
i
v
e
P
o
l
l
O
n
c
e
(
N
a
t
i
v
e
M
e
t
h
o
d
)
a
t
a
n
d
r
o
i
d
.
o
s
.
M
e
s
s
a
g
e
Q
u
e
u
e
.
n
e
x
t
(
M
e
s
s
a
g
e
Q
u
e
u
e
.
j
a
v
a
:
328
)
a
t
a
n
d
r
o
i
d
.
o
s
.
L
o
o
p
e
r
.
l
o
o
p
(
L
o
o
p
e
r
.
j
a
v
a
:
148
)
a
t
a
n
d
r
o
i
d
.
a
p
p
.
A
c
t
i
v
i
t
y
T
h
r
e
a
d
.
m
a
i
n
(
A
c
t
i
v
i
t
y
T
h
r
e
a
d
.
j
a
v
a
:
6251
)
a
t
j
a
v
a
.
l
a
n
g
.
r
e
f
l
e
c
t
.
M
e
t
h
o
d
.
i
n
v
o
k
e
(
N
a
t
i
v
e
M
e
t
h
o
d
)
a
t
c
o
m
.
a
n
d
r
o
i
d
.
i
n
t
e
r
n
a
l
.
o
s
.
Z
y
g
o
t
e
I
n
i
t
WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6989) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:328) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:6251) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit
WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6989)atandroid.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)atandroid.os.MessageQueue.nativePollOnce(NativeMethod)atandroid.os.MessageQueue.next(MessageQueue.java:328)atandroid.os.Looper.loop(Looper.java:148)atandroid.app.ActivityThread.main(ActivityThread.java:6251)atjava.lang.reflect.Method.invoke(NativeMethod)atcom.android.internal.os.ZygoteInitMethodAndArgsCaller.run(ZygoteInit.java:1063)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
解决办法,添加以下混淆文件
-keep class com.google.android.material.** {;}
-keep class androidx.** {;}
-keep public class * extends androidx.**
-keep interface androidx.** {*;}
-dontwarn com.google.android.material.**
-dontnote com.google.android.material.**
-dontwarn androidx.**
Andorid 9 添加WebView
1,修改frameworks/base/core/res/res/xml/config_webview_packages.xml
添加内容:
2,在package/app添加WebViewGoogle APK
修改device相对应的MK,添加应用
WebViewGoogle.apk的下载地址
添加WebViewGoogle.apk 的mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := WebViewGooglearm64(APK 的名字)
LOCAL_MODULE_TAGS := optional
LOCAL_DEX_PREOPT := false
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app
LOCAL_SDK_VERSION := current
include $(BUILD_PREBUILT)
RecyclerView 单行更新闪烁问题
是由于RecyclerView 更新时默认动画的问题,所以直接设置:((SimpleItemAnimator)lvResult.getItemAnimator()).setSupportsChangeAnimations(false);停止动画就可以了
OkHttp +Reftrofit 下载返回400错误
下载声明
public interface IDownFile {
@GET
@Streaming
Observable downfile(@Url String url, @Header(“Range”) String range);
}
使用URL 通过下面方式处理不会返回400错误
String path = “”;
try {
// LogUtils.error(“path” + mPoint.getUrl());
path = new String(mPoint.getUrl().getBytes(), “utf-8”);
path = URLEncoder.encode(path, “UTF-8”);
logger.info("path = "+path);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
android 9 SystemUI 下拉显示白色
主要流程涉及的类:base/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
问题解决:
QSFragment 主要显示处理QSSettings,QSPanel显示下拉内容:
QSFragment.setQsExpansion 操作下拉菜下滑动作;
在方法中添加如下方法:
if(expansion==1.0)
{
Log.d(TAG,“updateQsState begin true”);
mQsDisabled = false;
mQsExpanded = true;
updateQsState();
}else
{
Log.d(TAG,"updateQsState begin false ");
mQsDisabled = false;
mQsExpanded = false;
updateQsState();
}