安卓源码本地查找关键_安卓的源码在哪里

hacker|
103

文章目录:

怎样在安卓设备上查看软件源代码

安卓设备是无法查看软件源代码的。每一个在手机安装的app,都是经过严格的加密和数字签名发布的应用程序,想要看到源代码必须破解加密,不过这几乎不可能。

一些简单的应用程序还是可以反编译工具,查看到源代码的。

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

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/compiler/dex/quick/dex_file_method_inliner.cc: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/tests/com/google/android/testing/mocking/AndroidMockGeneratorTest.java:249: Method method = Thread.class.getMethod("currentThread");

./external/android-mock/tests/com/google/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/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行。

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

方法二:

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

如何在Android源码里查找Java中native方法对应的C++参考:

怎么查看安卓的源代码?或者安卓应用软件的源代码?

Android代码就是java代码,如果你只需要看代码不需要运行的话,在src目录的子目录下面找到*.java文件,然后用记事本打开即可,资源文件在res目录下.如果是要运行Andorid代码的话,就需要下载Eclipse以及Android的SDK和ADT插件了.

怎么查看安卓APP的源码

如果只有apk的安装包的话,你是看不到源码的,除非使用反编译。作为新手,还是从基础一步一步来吧。

Android studio 如何为下载下来的开源源码,快速添加 log?用来查看运行流程?

在开发中,我们经常需要在Github上找一些开源项目用于自己的项目中,然而经常由于看不到其运行效果导致不断的“试错”,因此一般来说,本人在使用一个开源项目之前会将其下载并运行到手机上看效果。一方面可以准确判断出是否适合自己的项目,另一方面可以根据项目需求做一定的修改。

1、 找到项目地址,点击DownloadZIP,下载完成后,解压到本地磁盘。如图1所示

图1

2、找到该项目使用的gradle版本

    打开项目文件夹plaid-masteràgradleà wrapper,找到文件gradle-wrapper.properties,使用记事本打开该文件,可以看到该项目使用的gradle版本为gradle-4.0-all。如图2所示

图2

3、查看本地是否存在该gradle版本

    打开C盘,userà Administratorà .gradleà wrapperàdists在dists文件夹下查看是否存在gradle-4.0-all,如图3所示

图3

4、将该文件夹打开,有如图4所示。

   该图表示本地已存在gradle-4.0-all版本,此时直接将项目导入AS即可。该项目部分组件需要下载完成,下载过程很快,因此可以稍微等待一会

                                                                                                              图4

5、如果有gradle-4.0-all文件夹,那么请往下看。如果没有gradle-4.0-all文件夹,则将项目导入AS,此时由于本地没有gradle-4.0-all,因此AS会下载很久。解决方案就是,终止AS的下载后,关闭AS后查看是否已经存在了gradle-4.0-all的文件夹。如果没有,重新导一次吧。。。

6、在网上下载一个gradle-4.0-all.zip,找到第4步中的文件夹,将gradle-4.0-all/ ac27o8rbd0ic8ih41or9l32mv文件夹下除gradle-4.0-all.zip.lck文件外的其余内容删除,接着将下载的gradle-4.0-all.zip文件放在该文件夹下。(ps:由于gradle-4.0-all我的已经下载好了,因此用的gradle-3.1-bin的图顶替一下,原理是一样的。)

                                                                                                                            图5

6、将项目导入AS,下载项目其余需要的组件,编译安装,大功告成!

2条大神的评论

  • avatar
    访客 2022-07-06 下午 02:33:44

    目录的子目录下面找到*.java文件,然后用记事本打开即可,资源文件在res目录下.如果是要运行Andorid代码的话,就需要下载Eclipse以及Android的SDK和ADT插件了.怎么查看安卓APP

  • avatar
    访客 2022-07-06 上午 11:51:41

    clipse里面打开之后,在工程目录/jni下面就是 native的C++代码。Android源码中很多关键代码都是C++实现的,java通过jni来调用,经常会看到java中这样的代码: static

发表评论