导航:首页 > 操作系统 > android多线程调试

android多线程调试

发布时间:2022-05-28 12:07:27

1. android studio线程

Android Studio 是一个Android开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试。
在IDEA的基础上,Android Studio 提供 :
1. 基于Gradle的构建支持。
2. Android 专属的重构和快速修复。
3. 提示工具以捕获性能、可用性、版本兼容性等问题。
4. 支持ProGuard 和应用签名。
5. 基于模板的向导来生成常用的 Android 应用设计和组件。
6. 功能强大的布局编辑器,可以拖拉 UI 控件并进行效果预览。

2. android在activity启用线程,没有出错,调试过了,不执行run()方法,附上代码。

我 直接给你上代码了,你看看线程是怎么用的,希望你自己学会他!
public void OnClick(){
MyThread t1=new MyThread();
t1,start();
}

class MyThread implements Runnable {
public void run() {
你的代码

}
}

3. 如何理解android多线程里的getLooper方法

下面的代码是学习Handler.post方法的,第一种写法没有使用getLooper,结果运行的效果是一个线程,第二种写法使用了getLooper,运行的效果是多线程的:
package com.WriteCode.AndroidHandlerPost;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;

public class AndroidHandlerPost extends Activity {

private Handler mHandler = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//第一种写法beg,不使用getLooper,那么整个是一个线程(UI线程)
//mHandler = new Handler();
//第一种写法end,不使用getLooper,那么整个是一个线程(UI线程)

//第二种写法beg,不使用getLooper,那么整个是两个线程
HandlerThread handlerThread = new HandlerThread("myHandlerThread");
handlerThread.start();
mHandler = new Handler(handlerThread.getLooper());
//第二种写法end,不使用getLooper,那么整个是两个线程

mHandler.post(new MyRunnable());

Log.e("OnCreate", "The Thread is: " + Thread.currentThread().getId());

setContentView(R.layout.main);
}

private class MyRunnable implements Runnable
{

@Override
public void run() {
// TODO Auto-generated method stub
Log.e("Runnable", "The Thread is running");
Log.e("Runnable", "The Thread is: " + Thread.currentThread().getId());
try
{
Thread.sleep(6000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}

}
}

4. Android中线程与线程,进程与进程之间如何通信

使用handler发送message,消息队列排队

进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。
通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。

5. android怎么调试多线程,Log大法吗,太苦逼了吧


  1. 多线程调试有点特殊,一个线程阻塞后,其他还在运行。

  2. 如果调试不担心并发问题,可以使用debug

  3. 否则还是log打印好

  4. 其实做程序员本身就很苦

6. android客户端进行多线程编程的基本流程是怎样的

话分两头:
第一:从RecentApp界面被划掉后,系统做了什么:
系统将这个应用的UI线程杀死,并将此应用当前所分配的内存空间回收。
第二:为什么系统将UI线程杀死,将内存回收后,程序还能继续工作?比如音乐还在继续响起:
这是因为有一类应用,为了当用户将此应用的界面调到后台后,仍然是可以工作,这些应用都会在后台开一个Service,你可以理解为一个区别于UI线程的另一个线程,它可以独立于UI线程之外,当UI线程被挂起或者销毁时,它可以接替UI线程的工作,让程序员继续work。所以,为什么有时候程序被从Recent列表中删除后,程序没有停止,这里的停止,实质上是程序的某一功能没有停止,比如音乐,而此时的程序UI界面以及其它无关的内存已经被告系统回收了。
第三:如何让自己的应用不出现在Recent列表里:

7. 安卓在多线程编程中怎样保证线程安全

1.将整个类加锁 (代码为synchronized(this))
2.定义一个object,访问某些相关变量是,对该对象加锁(代码为synchronized(lockobj))。
新应用发布前如条件允许,最好做一下代码混淆,市面上各种外挂或者篡改数据什么的也比较常见,避免被破解利用。可以在一定程度上保护自己核心代码算法,提高破解/盗版/二次打包的难度,缓解代码注入/动态调试/内存注入攻击等
但也对应用的兼容性有一定影响,加壳技术不行的话,还会影响程序运行效率.
目前市面上有很多第三方加壳的平台, 如果应用需要加壳要选择的话,可以先试试免费的,例如腾讯御安全,建议先去加固个包测试下兼容性。

8. 如何调试分析Android中发生的tombstone

Android Tombstone/Crash的log分析和定位
有一句话叫做常在河边走,哪有不湿鞋。我们这些研究和开发Android的工程师正应了这句话,相必大家在调试的时候经常会遇到这么个东西吧
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'XXXXXXXXX'
pid: 1658, tid: 13086 >>> system_server <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 64696f7e
r0 00000000 r1 00000001 r2 ad12d1e8 r3 7373654d
r4 64696f72 r5 00000406 r6 00974130 r7 40d14008
r8 4b857b88 r9 4685adb4 10 00974130 fp 4b857ed8
ip 00000000 sp 4b857b50 lr afd11108 pc ad115ebc cpsr 20000030
d0 4040000040000000 d1 0000004200000003 d2 4e72cd924285e370 d3 00e81fe04b1b64d8
d4 3fbc71c7009b64d8 d5 3fe999999999999a
d6 4010000000000000 d7 4000000000000000
d8 4000000000000000 d9 0000000000000000
d10 0000000000000000 d11 0000000000000000
d12 0000000000000000 d13 0000000000000000
d14 0000000000000000 d15 0000000000000000
scr 80000012
#00 pc 000108d8 /system/lib/libc.so #01 pc 0003724c /system/lib/libxvi020.so #02 pc 0000ce02 /system/lib/libxvi020.so #03 pc 0000d672 /system/lib/libxvi020.so #04 pc 00010cce /system/lib/libxvi020.so #05 pc 00004432 /system/lib/libwimax_jni.so #06 pc 00011e74 /system/lib/libdvm.so #07 pc 0004354a /system/lib/libdvm.so #08 pc 00017088 /system/lib/libdvm.so #09 pc 0001c210 /system/lib/libdvm.so #10 pc 0001b0f8 /system/lib/libdvm.so

#11 pc 00059c24 /system/lib/libdvm.so
#12 pc 00059e3c /system/lib/libdvm.so
#13 pc 0004e19e /system/lib/libdvm.so
#14 pc 00011b94 /system/lib/libc.so
#15 pc 0001173c /system/lib/libc.so
code around pc: ad115e9c 4620eddc bf00bd70 0001736e 0001734e
ad115eac 4605b570 447c4c0a f7f44620 e006edc8 ad115ebc 42ab68e3 68a0d103 f7f42122 6864edd2 ad115ecc d1f52c00 44784803 edbef7f4 bf00bd70 ad115edc 00017332 00017312 2100b51f 46682210 code around lr: afd110e8 e2166903 1a000018 e5945000 e1a02004 afd110f8 e2055a02 e1a00005 e3851001 ebffed92 afd11108 e3500000 13856002 1a000001
ea000009 afd11118 ebfffe50 e1a01004 e1a00006 ebffed92 afd11128 e1a01005 e1550000 e1a02006 e3a03000 stack: 4b857b10 40e43be8 4b857b14 00857280 4b857b18 00000000 4b857b1c 034e8968 4b857b20 ad118ce9 /system/lib/libnativehelper.so
4b857b24 00000002 4b857b28 00000406 .....
初一看到直接崩溃,我的个妈,这么一大坨,啥玩意啊,完全搞不懂,没有头绪撒。这NND Android出了问题,冒出这么大堆的地址,搞毛呢。

其实, 我可以很负责任的告诉你,兄弟这么多其实我也看不懂,在我眼里除了红色和蓝色的地方,其他全是废话。因为除了这两个地方意外,其他的我确实看不懂,一堆线性地址,外加寄存器,跟火星文一样。 算了,废话不多少,直接分析: 1 红色的地方,是让我们确认问题到底发生在那个线程中,是主线程还是子线程,这个的判断依据是:如果PID和TID相同,恭喜你问题出在父亲这边,看样子问题还比较好办。如果PID和TID不相同,那么您悲剧了,问题出在子线程中。根据我的经验,100的tombstone中,问题出现在父线程的概率,我还从来没发现,尤其是什么system_server, zygote这些,基本都是儿子的问题。唉,谁叫父亲英雄,儿狗熊呢。。。 2 确认了问题的基本点,下面就是开始看蓝色的部分了。 这个蓝色不分是从#00-->#XX 表面上看是从上往下的增长,其实坑爹啊,它所显示的程序的执行流程,恰恰是从下往上的也就是实际的执行顺序是#XX-->#00。 所以一开始我们的目的是分析第一个出现问题的动态连接库 #15 pc 0001173c /system/lib/libc.so a 首先按图索骥,找到你的目标,libc.so这个一般会在你编译完的目标目录下,也就是out/target/proct/your_pro/system/lib这个目录下。 b 一般你如果用的是还像样的linux系统,会有个地址解析的命令addr2line,负责解析动态连接库的(如果你是悲剧,没有这个命令,那好吧, google早就预料到会有象你这样的悲剧人,他们在prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-addr2line,给您准备了个,咋就用这个吧,功能一样,没啥区别) addr2line -e -f libc.so 0001173c 红色是你的目标库,绿色是你出问题的地址,看看#15这行 结果出现:??pthread_create ??:0 恩,好了问题应该出在这个函数中,认为大功告成了?我,呸,还早呢。这个只是告诉你函数入口,至于具体执行到这个函数的哪个地方挂了,还得再看。 c 找到了是哪个部分出了问题,下面就是开启显微镜,看看谁搞的东东。

9. Android Studio和IntelliJ IDEA的不同点在什么地方

两者不同点在于支持的开发环境和开发公司不同。

1、开发的公司不同

Android Studio是谷歌开发的Android开发插件。

IntelliJ IDEA是JetBrains公司推出的java集成开发环境。

2、支持的开发环境不同

Android Studio只支持Android开发,是谷歌在IntelliJ IDEA社区版上剔除其他功能的一款专注Android开发的插件,可以说是弱化版的IntelliJ IDEA。

IntelliJ IDEA是JetBrains公司推出的Java集成开发环境,当然Android也是基于java的,IntelliJ IDEA除了支持Android开发,还支持JavaSE,Android,Groovy,Scale,HTML,CSS,PHP等语言的开发。

(9)android多线程调试扩展阅读:

IntelliJ IDEA优点:

1、最突出的功能自然是调试(Debug),可以对Java代码,JavaScript,JQuery,Ajax等技术进行调试。

2、查看Map类型的对象,如果实现类采用的是哈希映射,则会自动过滤空的Entry实例。

3、需要动态Evaluate一个表达式的值,比如我得到了一个类的实例,但是并不知晓它的API,可以通过Code Completion点出它所支持的方法。

4、最后,在多线程调试的情况下,Log on console的功能可以帮你检查多线程执行的情况。

在IDEA的基础上,Android Studio 提供:

1、基于Gradle的构建支持

2、Android 专属的重构和快速修复

3、提示工具以捕获性能、可用性、版本兼容性等问题

4、支持ProGuard 和应用签名

5、基于模板的向导来生成常用的 Android 应用设计和组件

6、功能强大的布局编辑器,可以让你拖拉 UI 控件并进行效果预览

10. android studio调试代码有没有运行

不管是什么类型的编程语言,在程序开发中我们都难免会遇到各种各样的bug,遇到bug相信大家最常用的调试手段应该就是日志和debug了吧。其实除此之外还有很多代码调试手段,本文是小编在一个android网站上面看到的,有关Android Studio开发工具中代码调试相关技能技巧,在此分享给大家,一起来看看吧。

你知道上图的三个断点有什么不同么?你有关注过Android Studio旁边断点的区别吗?不了解也没关系,下面就是一位Android大神和大家分享的Android Studio debug的相关知识,新技能get走起~~

调试基础

一般来说有两种办法调试一个debuggable的apk;其一是下好断点,然后用debug模式编译安装这个app;其二是 attach process ,在Android Studio里面就是这么一个对话框:

第二种方法比较常用,我们可以在启动apk之后,直接下断点,然后attach process到制定进程,条件触发之后就可以直接进入调试模式。

其他的一些单步执行, stepinto , step out , force step into 等就不提了;基本的跟踪手段。而下断点最简单的办法,是在代码编辑器的左侧,行号右边鼠标点击一下即可。

Evaluate Expression

这个功能非常实用,可以在断点处直接进入一个求值环境,在这里你可以执行任何你感兴趣的表达式;如下图:

比如在断点处有一个对象
object,如果你要查看它的某个属性很简单,在Debug窗口就能看到,但是如果你想要执行它的某个方法看看结果是什么呢?借助这个可以实现。当然它
的功能远不止这么多,相当于直接进入了一个 REPL 环境,非常实用。忘了说了,快捷键 Alt + F8 :P

条件断点

假设你的断点在一个列表的循环里面,可是你只对这个列表的某一个元素感兴趣,只想在遇
到这个元素的时候才断下来;你是一直人肉 F9
直到满足条件吗?条件断点就是满足这种需求的,顾名思义,在特定条件下的断点。使用起来也非常简单,在你的断点上鼠标有件会出现一个小窗口,写上条件即
可。

日志断点

很多时候我们调试更多的是打印日志定位异常代码,缩小范围之后再使用断点解决问题;所以经常做的事情就是在代码里面添加日志信息,输出函数参数,返回信息,输出我们感兴趣的变量信息等。

但是这么做一个问题就是,我们添加了日志代码需要重新编译;在没有 Instant Run 之前的黑暗时代这么做是非常痛苦的,每次编译少则几十秒,多则几分钟;这样无意义的等待简直就是折磨;其实,除了热部署工具,我们还可以使用日志断点解决这个问题。

首先,在想要输出信息的地方下一个断点;然后右键这个断点,在出现的设置框里面把这个
断点的 suspend 属性设置为 False ,这样虽然叫做“断点”,但是并不会真正断下来;然后,我们在 log message
里面填上我们想要输出的日志信息。如下图(注意标红位置):

这样,每次代码执行到这个断点的位置,并不会使我们的程序停下来,而是输出我们告诉它的日志信息,然后继续执行;非常方便。

方法断点

传统的调试方式是以行为单位的,所谓单步调试;但是很多时候我们关心的是某个函数的参
数,返回值;使用方法断点,我们可以在函数级别进行调试;如果经常跳进跳出函数或者只对某个函数的参数感兴趣,这种类型的断点非常实用。具体使用方法有两
种方式;最简单的是在你感兴趣的方法头那一行打上断点,这时候你会发现断点图标有点不一样,这就是方法断点了,如下图:

另外一种方式是通过 断点设置窗口。

异常断点

在有些情况下,我们只对某些特定的异常感兴趣,或者我们只对异常感兴趣;我们希望只要程序发生异常程序就能断下来;这好像保存现场一样,只要发生命案了(异常),第一时间保存现场,这样什么指纹之类的线索就会清晰很多,坏蛋就算想逃也是插翅难飞啊。

Android Studio给了我们这个能力!那就是 异常断点 !可以在特定异常发生的时候,直接让整个程序断下来;如果你对所有异常感兴趣,直接 Throwable 即可。

具体做法是,进入 Run ->View BreakPoints 或者使用快捷键打开断点设置窗口;如下图:

点击左上角的:heavy_plus_sign: ,会出现一个选择框;选择 Exception Breakpoint ;然后会出现一个对话框,选择你感兴趣的异常:

Field WatchPoint

在上面我们添加异常断点的时候,点击加号的时候,有四个选项;第一个就是我们前面所说的第二种方法断点的添加方式,第三个是异常断点,那么第二个 Field WatchPoint 是干什么的呢?

有没有这样一种场景:你发现某个值莫名其妙滴不知道什么时候被谁给修改了,罪魁祸首是
谁?Java虽然是值传递,但是引用也可以是值;对象全部存放在堆上面,而堆是被所有线程共享的,因此在非常复杂的场景下,你根本不知道这些共享变量被谁
修改了,这样非常危险;在多线程环境下,不变性是一个很重要的特性,我们看到高并发的语言诸如 Erlang , Scala
对于这种不变性都有着某种程度的支持。

那么我们怎么揪出这个修改我们值的捣蛋鬼呢?那就是这个 Field WatchPoint 的功能了;使用它我们可以在某个 Field 被访问或者修改的时候让程序断下来;完美解决这个问题。

下断点的方式和方法断点类似,也有两种;第一种是直接在某个字段的声明处下断点,这时候断点图标会改变,如下图:

右键这个断点我们可以进行一些设置,比如默认是被修改的时候断下来,你也可以改为每次访问这个字段就断下来。

另外一种方式是 Run ->View BreakPoint 打开设置,与异常断点类似。

结束语

上面介绍了这么多代码调试的功能,其实还有很多细节;打开断点设置窗口(Run -> View Breakpoint`):

我们可以对 感兴趣的类,感兴趣的某个特定对象下断点,也可以设置断点的次数,还能使断点在特定的线程才断下来;这些细节就不详细介绍了,大家自己去发掘!

以上就是Android Studio中一些超有用的调试技巧,大家在代码调试中,不妨可以试试上述方法,希望通过本文的分享,大家也能和我一样收获颇多。

阅读全文

与android多线程调试相关的资料

热点内容
自己购买云主服务器推荐 浏览:422
个人所得税java 浏览:761
多余的服务器滑道还有什么用 浏览:192
pdf劈开合并 浏览:28
不能修改的pdf 浏览:752
同城公众源码 浏览:489
一个服务器2个端口怎么映射 浏览:298
java字符串ascii码 浏览:79
台湾云服务器怎么租服务器 浏览:475
旅游手机网站源码 浏览:332
android关联表 浏览:946
安卓导航无声音怎么维修 浏览:333
app怎么装视频 浏览:431
安卓系统下的软件怎么移到桌面 浏览:96
windows拷贝到linux 浏览:772
mdr软件解压和别人不一样 浏览:904
单片机串行通信有什么好处 浏览:340
游戏开发程序员书籍 浏览:860
pdf中图片修改 浏览:288
汇编编译后 浏览:491