Android.mk介绍(一)

Android.mk介绍(一),第1张

在Linux下,可以通过Makefile来对源码工程进行管理,Androidmk文件是Makefile的一小部分,它用来对Android程序进行编译。Androidmk文件中描述了哪些C文件将被编译且指明了如何编译。Androidmk文件用来告知NDK Build 系统关于Source的信息。

1、编译可执行程序

2、编译动态库或静态库

3、预编译文件(APK或Java库)

以上三种是Androidmk的主要用法,我们写mk文件时也就是以上三种目的。

首先看一个最简单的Androidmk的例子:

讲解:

每个Androidmk文件必须以定义 LOCAL_PATH 为开始。它用于在开发tree中查找源文件。

my-dir 由Build System提供。返回包含Androidmk的目录路径。

CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx

例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理 LOCAL_PATH

这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。

LOCAL_MODULE 模块必须定义,以表示Androidmk中的每一个模块。名字必须唯一且不包含空格。

Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfooso

但请注意:如果模块名被定为:libfoo则生成libfooso 不再加前缀。

LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码。

不必列出头文件,build System 会自动帮我们找出依赖文件。

缺省的C++源码的扩展名为cpp 也可以修改,通过LOCAL_CPP_EXTENSION。

BUILD_SHARED_LIBRARY:是Build System提供的一个变量,指向一个GNU Makefile Script。

它负责收集自从上次调用include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。并决定编译为什么。

BUILD_STATIC_LIBRARY:编译为静态库。

BUILD_SHARED_LIBRARY :编译为动态库

BUILD_EXECUTABLE:编译为Native C可执行程序

BUILD_PACKAGE(既可以编apk,也可以编资源包文件,但是需要指定LOCAL_EXPORT_PACKAGE_RESOURCES:=true)

BUILD_JAVA_LIBRARY(Java共享库)

BUILD_STATIC_JAVA_LIBRARY(java静态库)

Android源码中有大量的mk文件,Android系统的编译就是靠着这些mk文件的,所以学好是非常有必要的哦!

如何在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的文件系统结构是怎样的,我们安装的程序放在那里?

编译Android源码之后,在out/target/product/generic一些文件:

ramdiskimg、systemimg、userdataimg、 system、 data、root

其中, systemimg是由 system打包压缩得到的, userdataimg是由 data打包压缩得到的。

ramdiskimg是模拟器的文件系统,把ramdiskimg解压出来可知道,ramdiskimg里的文件跟root文件夹的文件基本一样。模拟器装载ramdiskimg并解压到内存,接着分别把systemimg和userdataimg挂载到 ramdisk下的system和data目录。我们编译出来的应用程序就是放在system/app下的。用户安装的程序则是放在data/app下。

2、Android SDK和android源码能为我们提供什么工具?

AndroidSDK提供有很多工具,如adb,ddms,emulator,aapt等,并提供kernel-qemu、ramdiskimg、systemimg、userdataimg。因此,只要有android SDK,我们就可以在模拟器上把android跑起来。

Android源码可以编译出android SDK、adb等工具、android文件系统,以及ADT插件,也就是说,我们可以从android源码编译出所有android相关的东西。

3、 把Android源 码”make”之后会生成许多工具和android文件系统(systemimg等),我们又可以使用“makesdk”来生成android SDK,android

SDK也包括有工具和android文件系统(systemimg等),而原来安装的时候我们也安装了androidSDK,那么我们在开发时应该使用那些工具和android文件系统呢?

android应用开发框架是ApplicationFramework其系统架构由5部分组成,分别是:LinuxKernel、AndroidRuntime、Libraries、ApplicationFramework、。第二部分将详细介绍这5个部分。下面自底向上分析各层。

Android架构

1、LinuxKernel

Android基于Linux26提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。LinuxKernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。如果你学过计算机网络知道OSI/RM,就会知道分层的好处就是使用下层提供的服务而为上层提供统一的服务,屏蔽本层及以下层的差异,当本层及以下层发生了变化不会影响到上层。也就是说各层各尽其职,各层提供固定的SAP(ServiceAessPoint),专业点可以说是高内聚、低耦合。如果你只是做应用开发,就不需要深入了解LinuxKernel层。

2、AndroidRuntime

Android包含一个核心库的集合,提供大部分在Java编程语言核心类库中可用的功能。每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是dex,dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。两种架构各有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机器指令更大。dx是一套工具,可以将Javaclass转换成dex格式。一个dex文件通常会有多个class。由于dex有时必须进行最佳化,会使文件大小增加1-4倍,以ODEX结尾。Dalvik虚拟机依赖于Linux内核提供基本功能,如线程和底层内存管理。

3、Libraries

Android包含一个C/C库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(applicationframework)暴露给开发者。下面列出一些核心库:系统C库--标准C系统库(libc)的BSD衍生,调整为基于嵌入式Linux设备媒体库--基于PacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态图像文件,包括MPEG4、H264、MP3、AAC、AMR、JPG、PNG界面管理--管理访问显示子系统和无缝组合多个应用程序的二维和三维图形层LibWebCore--新式的Web浏览器引擎,驱动Android浏览器和内嵌的web视图SGL--基本的2D图形引擎3D库--基于OpenGLES10APIs的实现。库使用硬件3D加速或包含高度优化的3D软件光栅FreeType--位图和矢量字体渲染SQLite--所有应用程序都可以使用的强大而轻量级的关系数据库引擎

4、ApplicationFramework

通过提供开放的开发平台,Android使开发者能够编制极其丰富和新颖的应用程序。开发者可以自由地利用设备硬件优势、访问位置信息、运行后台服务、设置闹钟、向状态栏添加通知等等,很多很多。开发者可以完全使用核心应用程序所使用的框架APIs。应用程序的体系结构旨在简化组件的重用,任何应用程序都能发布他的功能且任何其他应用程序可以使用这些功能(需要服从框架执行的安全限制)。这一机制允许用户替换组件。所有的应用程序其实是一组服务和系统,包括:视图(View)--丰富的、可扩展的视图集合,可用于构建一个应用程序。包括包括列表、网格、文本框、按钮,甚至是内嵌的网页浏览器内容提供者(ContentProviders)--使应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据资源管理器(ResourceManager)--提供访问非代码资源,如本地化字符串、图形和布局文件通知管理器(Manager)--使所有的应用程序能够在状态栏显示自定义警告活动管理器(ActivityManager)--管理应用程序生命周期,提供通用的导航回退功能

5、

Android装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置。所有应用程序都是用Java编程语言写的。更加丰富的应用程序有待我们去开发!从上面我们知道Android的架构是分层的,非常清晰,分工很明确。Android本身是一套软件堆迭(SoftwareStack),或称为「软件迭层架构」,迭层主要分成三层: *** 作系统、中间件、应用程序。从上面我们也看到了开源的力量,一个个熟悉的开源软件在这里贡献了自己的一份力量。

最新的反编译不用此方法, 有最新的一键自动反编译工具:

这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程。

在此郑重声明,贴出来的目的不是为了去破解人家的软件,完全是一种学习的态度,不过好像通过这种方式也可以去汉化一些外国软件。

注:本Android反编译教程,在Windows7-Ultimate-64bit *** 作系统上,测试通过!

下述所需的反编译工具包 下载

一、反编译Apk得到Java源代码

首先要下载两个工具:dex2jar和JD-GUI

前者dex2jar是将apk中的classesdex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源代码。以下是下载地址:

dex2jar:>

大概有10G的源代码,一Byte一个字符,也就是说有超过100亿个字符,每行按标准80字符来算的话,超过1亿行。开放的WinXP系统有2亿行,从数量级上来看的话,应该差不多。Android 44,是由Google公司制作和研发的代号为KitKat的手机 *** 作系统,于北京时间2013年9月4日凌晨对外公布了该Android新版本的名称,为Android 44(代号 KitKat 奇巧)。据悉,该代号来自雀巢的KitKat巧克力。"Kit Kat"原本是雀巢公司的一款巧克力名称。谷歌表示,他们非常感谢雀巢授权使用该名称,但使用的时候会将中间的空格去掉。Android 44 KitKat针对RAM占用进行了优化,甚至可以在一些仅有512MB RAM的老款手机上流畅运行。它也进一步优化了系统在低配硬件上的运行效果, 支持内核同页合并 KSM,zRAM 交换,似乎是为了更好地在众多智能穿戴设备上运行。

是指sdk的源码,还是android *** 作系统的源码,不过都有10G左右,另外sdk的源码是用git管理的,一次下载后,用git check就可以切换到各个版本。Android SDK是用于开发Android上JAVA应用程序的,另外发布Android NDK,可以添加一些C语言写的链接库,至于Linux代码,可以在Android源代码中找到(SDK程序中只有编译好的测试映像)。应用程序开发用不到Linux代码(搞嵌入式开发才会用到,而SDK不负责底层开发)。

当然可以 只要建库的时候给路径就好了 SQLiteOpenHelper类中构造方法会建立数据库 private static final String DBNAME = "/mnt/sdcard/databases/studentdb";给定SD卡路径。下面是构造方法public DBHelper(Context context, int version) { super(context, DBNAME, null, version); }就可以了~~~望采纳

以上就是关于Android.mk介绍(一)全部的内容,包括:Android.mk介绍(一)、如何在Android源码里查找Java中native方法对应的C++实现、安卓怎么使用修改过的源码编译程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/zz/10208881.html

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

发表评论

登录后才能评论

评论列表(0条)

保存