怎样查看 Android APP 源代码

怎样查看 Android APP 源代码,第1张

需要把反编译的apk存放到apktools同级文件夹目录下,然后运行要查看的安装包,具体 *** 作如下:

1、首先把反编译的apk存放到apktools同级文件夹目录下,如下图所示。

2、按住shift+鼠标右键打开命令窗口,运行代码 apktool d yd.apk(安装包的名字)。

3、apk后缀名改成zip,解压双击打开xml格式文件如下图所示。

4、打开cmd命令窗口,如下图所示依次输入命令。

5、将classes.dex打包成jar包 需要用到dex2ja。

6、然后就可以查看需要的源代码,如下图所示。

当我们在eclipse中开发android程序的时候,往往需要看源代码(可能是出于好奇,可能是读源码习惯),那么如何查看Android源代码呢?

比如下面这种情况

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

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

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

第二种分两种方式

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

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

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

可以通过Android SDK Manager进行源代码下载;(推荐该种方法),如图四

勾选Source for Android SDK,进行下载即可。

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

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

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

这样就大功告成了!!!

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

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

在Android源码里,有许多方法都是使用Jni机制调用底层的C++实现,比如大家都很熟悉的Binder.java里,就有 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++代码。

比如有方法aaa.bbb.CCC.ddd,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代码的示例VMThread.java:

package java.lang

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_VMThread.cpp.swp

./dalvik/vm/native/java_lang_VMThread.cpp:241: { "currentThread", "()Ljava/lang/Thread",

./external/android-mock/testsgoogle/android/testing/mocking/AndroidMockGeneratorTest.java:249: Method method = Thread.class.getMethod("currentThread")

./external/android-mock/testsgoogle/android/testing/mocking/AndroidMockGeneratorTest.java:407: Method method = Thread.class.getMethod("currentThread")

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

进入java_lang_VMThread.cpp这个文件可以看到:

17 /*

18 * java.lang.VMThread

19 */

20 #include "Dalvik.h"

21 #include "native/InternalNativePriv.h"

22

23

24 /*

25 * static void create(Thread t, long stacksize)

26 *

27 * This is eventually called as a result of Thread.start().

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/ThreadJ)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行。

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

方法二:

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

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

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

如何在eclipse中查看android源码

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

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

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

第二种分两种方式

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

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

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

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

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

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

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


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

原文地址: http://outofmemory.cn/yw/11087242.html

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

发表评论

登录后才能评论

评论列表(0条)

保存