如何在android studio中调试源程序

如何在android studio中调试源程序,第1张

android studio中调试源程序步骤如下:

1设置断点,选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可。

2开启调试会话,点击红色箭头指向的小虫子,开始进入调试。

IDE下方出现Debug视图,红色的箭头指向的是现在调试程序停留的代码行,方法f2()中,程序的第11行。红色箭头悬停的区域是程序的方法调用栈区。在这个区域中显示了程序执行到断点处所调用过的所用方法,越下面的方法被调用的越早。

3单步调试

31 step over

点击红色箭头指向的按钮,程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行)

32 step into

点击红色箭头指向的按钮,程序向下执行一行。如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。在自定义方法发f1()处设置断点,执行调试

33 Force step into

该按钮在调试的时候能进入任何方法。

如何在Android源码里查找Java中native方法对应的C++实现

在framework下全局搜索这个native方法的全名。一个个查看匹配的文件,应该会找到你需要的。一般命名都有规律,大部分jni方法都在 \frameworks\base\core\jni目录

在Android源码里,有许多方法都是使用Jni机制调用底层的C++实现,比如大家都很熟悉的Binderjava里,就有 public static final native int getCallingPid(); public static final native int getCallingUid(); public static final native long clearCallingIdentity(); 等方法都是直接调用C++里的实现。 通过下面命令可以很快找到对应的实现, build/envsetup cgrep /frameworks '"getCallingPid"' 这时会查找到如下结果: 这样就可以知道对应的C++实现方法名字为android_os_Binder_getCallingPid, 在该文件中找这个方法的实现即可。

android源码只包含android app java的客户端代码。

native部分可能有可能没有,先全局搜索c或者cpp文件,有这些文件才可能有。

如果是标准的android native support 工程,那么eclipse里面打开之后,在工程目录/jni下面就是 native的C++代码。

比如有方法aaabbbCCCddd,JNI对应的名字就是Java_aaa_bbb_CCC_ddd,地图炮搜索就是了,注意不要用全字段匹配,因为JNI名可能还带参数后缀。

另外你的确定你是下的整套Android系统的源码,不是SDK附带的那个源码,那个只有Java的而且还不全。

android源码只包含android app java的客户端代码。

native部分可能有可能没有,先全局搜索c或者cpp文件,有这些文件才可能有。

如果是标准的android native support 工程,那么eclipse里面打开之后,在工程目录/jni下面就是 native的C++代码。

Android源码中很多关键代码都是C++实现的,java通过jni来调用,经常会看到java中这样的代码:

static native Thread currentThread();

如何根据方法名找到其对应的C++实现,有两个方法。

先来个java代码的示例VMThreadjava:

package javalang;

class VMThread {

Thread thread;

int vmData;

VMThread(Thread t) {

thread = t;

}

native static void create(Thread t, long stackSize);

static native Thread currentThread();

static native boolean interrupted();

static native void sleep (long msec, int nsec) throws InterruptedException;

static native void yield();

native void interrupt();

native boolean isInterrupted();

}

我们要查找currentThread方法的实现。

方法一:

由于Android源码中对每个native实现都会写一个java方法名和C++方法名映射的列表,所以我们直接搜索这个列表内容即可。

zkw@zkw $ grep -rns '"currentThread"' /

/art/piler/dex/quick/dex_file_method_inliner:108: "currentThread", kNameCacheCurrentThread

匹配到二进制文件 /dalvik/vm/native/java_lang_VMThreadcppswp

/dalvik/vm/native/java_lang_VMThreadcpp:241: { "currentThread", "()Ljava/lang/Thread;",

/external/android-mock/testsgoogle/android/testing/mocking/AndroidMockGeneratorTestjava:249: Method method = ThreadclassgetMethod("currentThread");

/external/android-mock/testsgoogle/android/testing/mocking/AndroidMockGeneratorTestjava:407: Method method = ThreadclassgetMethod("currentThread");

可以看到,在文件/dalvik/vm/native/java_lang_VMThreadcpp中找到currentThread方法相关的信息,后面()Ljava/lang/Thread代表这个方法的返回值。

进入java_lang_VMThreadcpp这个文件可以看到:

17 /

18 javalangVMThread

19 /

20 #include "Dalvikh"

21 #include "native/InternalNativePrivh"

22

23

24 /

25 static void create(Thread t, long stacksize)

26

27 This is eventually called as a result of Threadstart()

28

29 Throws an exception on failure

30 /

31 static void Dalvik_java_lang_VMThread_create(const u4 args, JValue pResult)

32 {

33 Object threadObj = (Object) args[0];

34 s8 stackSize = GET_ARG_LONG(args, 1);

35

36 / copying collector will pin threadObj for us since it was an argument /

37 dvmCreateInterpThread(threadObj, (int) stackSize);

38 RETURN_VOID();

39 }

40

41 /

42 static Thread currentThread()

43 /

44 static void Dalvik_java_lang_VMThread_currentThread(const u4 args,

45 JValue pResult)

46 {

47 UNUSED_PARAMETER(args);

48

49 RETURN_PTR(dvmThreadSelf()->threadObj);

50 }

51

237

238 const DalvikNativeMethod dvm_java_lang_VMThread[] = {

239 { "create", "(Ljava/lang/Thread;J)V",

240 Dalvik_java_lang_VMThread_create },

241 { "currentThread", "()Ljava/lang/Thread;",

242 Dalvik_java_lang_VMThread_currentThread },

243 { "getStatus", "()I",

244 Dalvik_java_lang_VMThread_getStatus },

245 { "holdsLock", "(Ljava/lang/Object;)Z",

246 Dalvik_java_lang_VMThread_holdsLock },

247 { "interrupt", "()V",

248 Dalvik_java_lang_VMThread_interrupt },

249 { "interrupted", "()Z",

250 Dalvik_java_lang_VMThread_interrupted },

251 { "isInterrupted", "()Z",

252 Dalvik_java_lang_VMThread_isInterrupted },

253 { "nameChanged", "(Ljava/lang/String;)V",

254 Dalvik_java_lang_VMThread_nameChanged },

255 { "setPriority", "(I)V",

256 Dalvik_java_lang_VMThread_setPriority },

257 { "sleep", "(JI)V",

258 Dalvik_java_lang_VMThread_sleep },

259 { "yield", "()V",

260 Dalvik_java_lang_VMThread_yield },

261 { NULL, NULL, NULL },

262 };

源码中第242行找到对应的名字,用红色标出,其实现就在第44行。

这个方法不是很准确,要靠经验来判断搜出来的代码是否是自己要找的,下一个方法可以较准确的查找。

方法二:

还是找VMThreadjava的currentThread函数,找多了会发现,C++的名字一般都是包名+类名+方法名,比如currentThread的C++名字就肯定包含“java_lang_VMThread_currentThread”,所以直接搜索即可。

如何在Android源码里查找Java中native方法对应的C++参考::edu51cto/course/course_id-4377

知道方法名就知道C++里的函数名了,native方法的函数名是 Java_包名_类名_函数名 开头的,包名要把换成_。比如xxxyyyClassAmethodB在C++那边找Java__xxx_yyy_ClassA_methodB就行了

如何在eclipse中查看android源码

假设我们想参看Activity类的源代码,按着Ctrl键,左击它,现实的结果却看不到代码的,提示的信息便是“找不到Activityclass文件”。

此时点击下面的按钮,“Change Attached Source…”,选择android源代码所在位置,便d出对话框。

第一种是选择工作目录,即已经存在的android应用程序源代码。

第二种分两种方式

(1)选择External File…按钮,添加Jar格式文件或者zip格式文件路径;

(2)选择External Floder…按钮,添加文件夹所在路径。

下面问题就来了,源代码在哪里?不能凭空产生阿。

可以通过Android SDK Manager进行源代码下载;(推荐该种方法),勾选Source for Android SDK,进行下载即可。

此外也可通过其他途径下载,网上有很多共享的资源。

这里选择第二种方式的(2)方法,选择源码所在目录(即下载源代码目录所在路径)

点击“OK”按钮,此时,Activity文件便能够查看源代码了

1打开Android studio

2点击file

3点击open 找到你说的camere2的文件夹像这样

双击

如果没有 你会在相应的目录下(是我的电脑里的目录,不是open打开的)下找到buildgradle,用Androidstudio打开。

网上下一个软碟通软通(UitraISO)工具、然后去官网上下载一个64位ubuntuiso系统文件、然后软碟通工具自己制作一个USB启动盘(非常简单)不会用软碟通的百度一下一大把!、系统最好是1040以上的版本

使用的是ubuntu官网下载的ubuntu1004 LTS 64位版本(ubuntu-10042-desktop-amd64iso)

配置软件源:

系统安装完毕以后应该首先换一个速度快的软件源

一般用的是ubunt

不然下载各种更新和软件包的时候非常的慢

安装JDK:

我要编译的是23姜饼的源代码 所以需要使用jdk6 (还需要是64位的系统)

如果是32为系统藐视jdk要安装jdk50的吧!藐视说有个doc什么的不行!所以系统一般装64的、如果是32的小伙们赶快把jdk看看

安装方法:

打开终端

输入

sudo add-apt-repository "deb "

sudo add-apt-repository "deb-src "

sudo apt-get update

sudo apt-get install sun-java6-jdk

就安装好了 (ubuntu1004 LTS版会自带那两个源)

并且不需要配置环境变量

这一步可以参考

安装各种软件包:

终端中输入

sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos texinfo libsdl-dev libwxgtk26-dev

最后三个是我补充的 其他都是官方文档提供的

这一步可以参考

下载源代码:

打开终端并输入

mkdir ~/bin

PATH=~/bin:$PATH

这两句是在你的个人文件夹下创建了一个名字叫bin的文件夹 并且把其加入到了环境变量中

再输入

curl ; ~/bin/repo

chmod a+x ~/bin/repo

这两句首先在bin目录下面下载了一个repo文件 repo简单来说就说用来版本控制的 我们就是用的它来同步代码

然后建立一个用来存放源代码的文件夹 我的这个文件夹的名字是android23

输入

mkdir android23

cd android23

进入android23目录

输入

repo init -u git://androi/platform/manifestgit -b gingerbread

在此说明一下:

安卓总称:“机器人”

15系统:“纸杯蛋糕”

Android 16 Donut甜甜圈

Android 20 Eclair松饼

Android 21 Eclair松饼

Android 22 Froyo冻酸奶

Android 23 Gingerbread姜饼(以上系统都是用于手机的)官方消息说24准备出来了!至于30目前只用于平板电脑

Android 40 Ice Cream Sandwich(简称ICS,冰淇淋三明治),

表示你需要的代码是姜饼的 所以最后是gingerbread 如果是22代码 就把gingerbread改成froyo

然后你需要输入你的名字跟邮箱地址

如果提示找不到repo命令的话 需要重新设置环境变量 就是之前的PATH=~/bin:$PATH

输入

repo sync

开始同步代码 这个过程会根据你的网速来决定快慢

这一步需要下载的数据有3g那么大

可以续传 一次没下完也没关系

如果之前就已经下过一次的话 只需要把源代码目录(我的是android23)下有一个叫repo的隐藏文件夹里的projects文件夹备份出来就可以了

以后还需要同步的时候再把projects文件夹拷贝回去

ctrl+h查看隐藏文件

这一步可以参考

编译整个源代码:

cd android23

进入你的代码目录

输入

build/envsetupsh

注意和build中间有个空格

输入

lunch full-eng

make -j2

输入make就是开始编译代码了 加一个-j2参数就是开两个线程去编译 速度会快些 我花了两个小时的时间

编译完毕以后马上输入

emulator

就可以运行模拟器了 系统能跑起来就说明编译成功了

如果提示找不到emulator命令的话

需要添加环境变量

在android23目录下的out/target/product/generic文件夹下会看到systemimg

能看到的话应该算是成功了

这一步可以参考

编译SDK:

这一步在官方网站上没有说明

但是在源代码文件夹里面有文档提到了

就是在android23/sdk/docs目录下有一个叫howto_build_SDKtxt的文件介绍了如何编译SDK

原文

Then once you have all the source, simply build the SDK using: $ cd ~/my-android-git $ build/envsetupsh $ lunch sdk-eng $ make sdk

看来不需要先编译整个系统再编译SDK 可以直接上来就编译SDK

按提示输入

make到时候也可以加上-j参数 比如 make -j2 sdk

但是不推荐 因为容易编译失败 而且编译SDK只需要二十多分钟到时间 不算很长

当出现

Package SDK: out/host/darwin-x86/sdk/android-sdk_eng<build-id>_mac-x86zip

的时候 就表示编译成功了 其中<build-id>默认是系统的用户名

howto_build_SDKtxt中还提到了编译ADT插件

我发现自己编译到ADT插件竟然认不到platform 自己编译出来到SDK也一样

原因不明

只要使用官方的SDK和ADT就没有问题了

具体就是把自己编译出来platform拷贝到官方SDK里到platforms文件夹下 搞过Android开发都懂的

最后:

非常简单的一步

就是直接修改源代码然后编译SDK就可以得到自己的SDK了

我就示范一个简单的例子 抛砖引玉

首先我找到TextView的代码

在frameworks/base/core/java/android/widget 如图

我在updateTextColors方法的开头添加了一句Systemoutprintln

打印了一句话"Source Code Changed"

updateTextColors方法会在TextView的setTextColor方法中被调用

好 保存

编译

然后使用这个platform

新建一个项目

调用一下TextView的setTextColor方法看看有什么效果

一个很简单的例子

看看

Source Code Changed被打出来了

SDK修改成功

你想看什么源代码,视频编码格式还是视频网页上视频的源网址

源网址的话:

页面停留在视频的页面上,然后按F12;

将鼠标放入下面的div模块上面,就会出现页面所代表的结构块;

最后在里面的div块中找出属于视频的那一个div;

然后直接复制里面的video(或embed)的代码就可以了。

以上就是关于如何在android studio中调试源程序全部的内容,包括:如何在android studio中调试源程序、如何在Android源码里查找Java中native方法对应的C++实现、android studio导入android源代码中的原生app等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10175936.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存