Android APP报错--各种疑难杂症问题

以后我遇到所有的适配问题都会放置在这个简书里面

1、魅族APK安装报错:

测试手机:华为8.0两款(分刘海屏和非刘海屏),小米两款,oppo两款,魅族一款,vivo一款,锤子一款
只有魅族报错,
报错内容如下


DELETE_FAILED_INTERNAL_ERROR,
Error while Installing APKs

无法安装完全不知道什么鬼,除开魅族手机,其余测试手机都能直接通过debug安装,两个小时多个开发代码版本对比发现,是库和Gradle的锅,这里建议Gradle版本降至3.2.1,不会影响Androidx也不会影响大多数库。

小米手机目前是所有测试机器中最垃圾的,debug测试卡顿这个问题一年了都没得人修复,社区直接删除了debug卡顿的反馈,直接不修复这个,操作秀到我了666,垃圾,测试一次麻烦得要死。

2、全屏适配:Only fullscreen opaque activities can request orientation错误崩溃

描述:activity弹出activitytwo,其中
找到你设置透明的Activity,将theme

<item name="android:windowIsTranslucent">true</item>
改成
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowDisablePreview">true</item>

有时候这就搞定了
但有时候还不行,不行怎么办?继续改,在AndroidManifest中对应的activity下面添加如下代码,让他跟着父页面进行屏幕适应

android:screenOrientation="behind"

nice搞定,还不行私聊??

3、单例音乐循环播放导致主页面动画卡顿,报错为:MEDIA_PLAYBACK_COMPLETE(2)

情况:主页全是动画,目测最少12个json动画(每个动画各个渲染方式也挺多的,这里就不讲了)

MediaPlayer使用如下

private static MediaPlayer mediaPlayer = null;//声明一个MediaPlayer对象

public static void playBGSound(final Activity activity) {
        if (mediaPlayer != null) {
            mediaPlayer .release();//释放资源
        }
        mediaPlayer = MediaPlayer.create(activity, R.raw.music);
        mediaPlayer .setVolume(0.5,0.5);
        mediaPlayer .setLooping(true);//循环不再做骚操作了,直接循环了
        mediaPlayer .start();
//        //为MediaPlayer添加播放完成事件监听       //下面的写法会与主页面冲突,会导致卡顿
//        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
//            @Override
//            public void onCompletion(MediaPlayer mp) {
//                try {
//                    Thread.sleep(3000);//让线程休眠3秒
//                    playBGSound(activity);//重新播放音乐
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//            }
//        });
    }

神奇的bug

4、最近又发现了一个麻烦的问题,Android弹窗的问题,用activity弹出activity不能全屏的问题(dialog弹出会引出虚拟按键,给用户一种屏幕在动的赶脚,太LOW了,当然这里说的仅只是app全屏的情况,非全屏完全不用考虑,直接用dialog就行)

弹窗问题实现后续会贴上来,先说解决办法:

  Window window = this.getWindow();//this===当前activity
        window .setType( WindowManager.LayoutParams.TYPE_APPLICATION_PANEL);
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        window.setLayout( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

直接强制全屏,网上有很多发什么

getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);//(鸡毛用没有)

做个记录大家看一下

5、新问题:突然发现的,前后台切换,有时候会导致触发系统GC,会干掉你的部分数据

应用进入后台,系统可能因为内存紧张而杀掉activity,一般的页面还行,但是当你的页面有滚动条的时候就尴尬了啊,他有可能干掉你滚动条setProgress(int),int可能为空,哦 卖狗的,不说了,提高优先级,防止被kill。
application 里面添加android:persistent="true"
设置后app提升为系统核心级别,只要不是用户主动kill掉就不会被kill掉
还有一些方法,比如保存数据,我这里更加推荐数据保存的方式,存储在SharedPreference里面,在application 里面初始化主要的数据也行,数据保存就不多说了,网上一搜一大把,自己找找,用什么办法看自己吧!这个错误记录到这里了。

扩展:我本以为只有上面这种:系统可能因为内存紧张而杀掉activity,实际还有一种可能,后续更新,https://www.jianshu.com/p/635970ac603a里面提到的,也是可以解决的。

6、关于webview加载html(不能用腾讯的X5内核,腾讯X5内核截止到现在都不支持直接调用本地域名地址---被这个问题搞到绝望,最后才发现)

1、webview加载本地手机SD存储的html(图片也在本地)
体验比较好,加载速度快,包小
2、webview加载assert里面的html文件(不推荐,html内容比较多的情况下,包很大)
3、webview加载类似wap的网页url(图片和域名都采用http/https)(图片加载缓慢,体验不好)
4、webview加载类似wap的网页url(域名都采用http/https,图片下载在本地)
这个方法需要重写WebResourceResponse拦截url,把图片转文件流再放到html上去,缺点很明显,低端机经常加载不出来,尴尬
具体代码需要可以留言,主要是网上很多,这里也不想过多缀述不然看着累

一切为了体验和性能加油

7、继续升级Android studio3.5,报错Unable to start the daemon process

org.gradle.jvmargs=-Xmx1536m改成
org.gradle.jvmargs=-Xmx512m

8、这里说一个android studio比较奇怪的一个问题,打包失败的情况,android studio并不是每次都打包成功,极少极少的情况会出现打包失败的情况,因此在做打包的操作的时候,需要先clean project一遍然后再rebuild一遍,最后再去通过build进行打包,习惯很重要啊

9、错误报错:如下

Rejecting re-init on previously-failed class java.lang.Class<okhttp3.internal.platform.ConscryptPlatform$configureTrustManager$1>

解决办法:添加库文件如下即可解决

implementation 'org.conscrypt:conscrypt-android:2.2.1'

10、报错内容如下:

Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$2>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener;

很多人都在说降低版本就行,确实是一个解决办法,

11、升级android studio4.0版本报错

          报错情况                                        正确修改方式
response.body.string()           response.body?.string().toString()


类似下面这种写法
var url: String? = null 
Log.e("urlagent", url)             
改成
var url: String? = null 
Log.e("urlagent", url!!)  

现在定义后要做为空的检查了。。

12、Android WebView 加载失败net::ERR_CLEARTEXT_NOT_PERMITTED

方法1(有可能没用):在application里面添加如下(Android 9.0(API级别28)开始,默认情况下禁用明文支持)这里打开明文支持,不过没得有可能有用
android:usesCleartextTraffic="true"
方法2(实测有用):res 下新建 xml 目录新建文件network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

AndroidManifest.xml 的 application里再添加

 android:networkSecurityConfig="@xml/network_security_config"

13、android WebView LayoutAlgorithm.SINGLE_COLUMN失效问题

webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);只针对4.4以下有效,4.4后就无效了,目前比较常用的方式就是在html的标签里面添加

width: 100%;height: auto;

14、添加线程报错

结果Call from user 0 as user without permission INTERACT_ACROSS_USERS
目前不知道为什么,还早找原因,线程添加的object的wait和notify
不加就没事,加了就直接报错

15、xml无法编译

网上说的删除.im文件啊,什么勾选啊之类的全部无效
我用了个最最直白的方式,直接删除下载最新版
https://developer.android.google.cn/studio/#downloads

16、PictureSelector has no zero argument constructor

End of input at character 0 of

17 高德地图嵌入卡顿问题,

可能的情况有两种
1、高德版本问题
这个情况升级版本就行,有问题的版本可能是7.几的版本。具体是多少忘记了

2、外层嵌套问题,导致焦点获取不准确
外层只要嵌入NestedScrollView或者ScrollView等滚动类型的控件都会出现这样的问题
需要对页面进行重新布局就行,不行的话,你就只有监听点击事件对对应的区域进行管理就行

18 No signature of method: build_tyj1ke2ug0kj94sw357d7sh2.android() is applicable for argument types:

19

image.png

20 Only the original thread that created a view hierarchy can touch its views

原代码中

fun init(){
 var timer = Timer()
 timer.cancel()
 timer = Timer()
 var timerTask: TimerTask = object : TimerTask() {
                    override fun run(){
                        timeRefresh()
                    }
                }
 timer.schedule(timerTask, 30*1000)   //30秒
}

因为是费时的操作(如网络连接以及楼上的timer)需要另开线程
新开的线程中需要对UI进行设定,就可能违反单线程模型,
因此android采用一种的Message Queue机制保证线程间通信。

private val COMPLETED = 0
handlerTimer.sendEmptyMessage(COMPLETED);
private var thread: Thread? = null
    @SuppressLint("HandlerLeak")
    private val handlerTimer: Handler = object : Handler() {
        override fun handleMessage(msg: Message) {
            super.handleMessage(msg)
            thread = Thread(Runnable { // 子线程中解析省市区数据
                //......处理比较耗时的操作
                if(CameraTimeDialog.saveStation!=1){
                    //每隔30秒刷新一次
                    timer.cancel()
                    if(CameraTimeDialog.timeChange!=0){
                        timer = Timer()
                        var longTime=CameraTimeDialog.timeChange*60
                        // 创建计时器任务
                        var timerTask: TimerTask = object : TimerTask() {
                            override fun run(){
                                //耗时线程
                            }
                        }
                        // 添加任务,设定开始计时器时间,第2个参数为时间单位毫秒,如果是0,立即执行
                        timer.schedule(timerTask, longTime.toLong()*1000)
                    }
                }
            })
            thread!!.start()
        }
    }

20 AGPBI: {"kind":"warning","text":"Expected stack map table for method with no

gradle.properties文件中添加android.enableR8=false即可解决,不使用R8就行

改后报错:

Failed to apply plugin 'com.android.internal.application'.
   > The option 'android.enableR8' is deprecated.
     It was removed in version 7.0 of the Android Gradle plugin.
     Please remove it from `gradle.properties`.

21 更换Gradle到11导致报错如下,虽然仍然可以编译运行,但是速度奇慢无比

API 'android.registerTransform' is obsolete.
It will be removed in version 8.0 of the Android Gradle plugin.
The Transform API is removed to improve build performance. Projects that use the
Transform API force the Android Gradle plugin to use a less optimized flow for the
build that can result in large regressions in build times. It’s also difficult to
use the Transform API and combine it with other Gradle features; the replacement
APIs aim to make it easier to extend the build without introducing performance or
correctness issues.

解决办法如下:

 compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }

改成将未改的版本改成目前自己使用的版本即可

compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
    kotlinOptions {
        jvmTarget = '11'
    }

22 视频捕捉某个时间点的第一帧图片报错mediaMetadataRetriever.setDataSource报错

val mediaMetadataRetriever = MediaMetadataRetriever()
mediaMetadataRetriever.setDataSource(file_path)
var timeMs=1  //秒
//视频读取需要使用微妙,因此需要*1000*1000
 val bitmap: Bitmap? = mediaMetadataRetriever.getFrameAtTime((timeMs*1000 * 1000).toLong(),MediaMetadataRetriever.OPTION_CLOSEST)

添加try catch就好

23 2023年常用优化方向

1、使用内存友好的数据结构 SpareseArray,ArrayMap
2、避免内存泄漏,避免长生命周期对象持有短生命周期对象
3、使用池结构,复用对象避免内存抖动。
4、根据手机内存大小,设置内存缓存的大小。
5、多进程,扩大可使用内存
6、通过ComponentCallback2 监听内存吃紧,进行内存缓存的释放

24 如何避免内存oom

1、获取当前可用内存

   ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        //最大分配内存
        int memory = activityManager.getMemoryClass();
        System.out.println("memory: "+memory);
        //最大分配内存获取方法2
        float maxMemory = (float) (Runtime.getRuntime().maxMemory() * 1.0/ (1024 * 1024));

2、通过LruCache设置整个app最大缓存,针对有大规模数据使用场景进行限制

25 报错 com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: ..../BuildConfig.dex

修改multiDexEnabled true

26Failed to transform searchkit-ui-9.3.0.aar to match attributes {artifactType=android-classes-jar, or

searchkit-ui-9.3.0.aar损坏

27 Couldn't terminate the existing process for com.skyz.app. Device is offline.

重启adb.exe

28 Unsupported class file major version 61

jdk版本过高,或者不匹配,适配jdk版本就好

29 Could not set unknown property 'includeCompileClasspath' for AnnotationProcessorOptions_Decorated{classNames=[], arguments={}, compilerArgumentProviders=[]} of type com.android.build.gradle.internal.dsl.AnnotationProcessorOptions.

解决:gradle和sdk版本对应就好

30 Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository 'maven

仓库地址记得使用https的地址就好

31 Installation failed Suggested action:

Android版本当前最新版Android Studio Iguana


1713579102110.jpg

后续继续更新

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容