AI已经这么厉害了么,都会抢人

基于Android源码的应用程序编译_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于Android源码的应用程序编译
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢输入关键字进行搜索
如题,我想在另一个项目中引用我之前项目的模块。但是我不知道如何做
有两种方法:
1. 直接选择File,New,Import Module将你那个模块导入当前项目,这种方法的缺点是会将你的那个模块复制一份放到当前项目中,这样一来你在原来的模块中有了新的变更就不会自动同步到新的项目中
2. 将你的模块打包成AAR,在新的项目中直接使用这个AAR,如果你的模块有了新的变更只需重新打包AAR,并更新即可,具体使用本地AAR的方法请参考我的文章
至于怎么打包AAR,你要是还不懂的话,可以留言我再告诉你
来个人把~
Android Studio中多项目共享Library
javascript:;
我现在有个项目要借用多个别人的demo 如何把他们都导入到我现在的项目中进行使用!百度了很多方法,都是满篇的debug~
怎么搞啊!1
要回复问题请先或
浏览: 25996
关注: 5 人安卓系统源码编译系列(六)——单独编译内置浏览器WebView教程
我的图书馆
安卓系统源码编译系列(六)——单独编译内置浏览器WebView教程
1795人阅读
本文主要对从安卓系统源码中抽取出WebView相关源码进行单独编译的流程进行说明。
编译流程说明
由于WebView包含两个部分,一部分是上层的Java代码,包括若干Java类,用于对外提供接口;另一部分是下层的C++代码,包括两个so库(libwebcore.so和libchromium_net.so),用于网页的解析和渲染。两个部分之间通过JNI进行交互。
因此,编译WebView也需要分成两部分,一部分是编译Java代码,另一部分是将C++代码编译成so库。另外,由于WebView的Java代码中会使用到很多系统的隐藏API,所以我们还需要编译安卓系统,并从中获取几个jar包。
编译Java代码
首先,我们需要下载并编译任意一个版本的安卓系统源码,具体步骤可以参见《安卓系统源码下载及编译教程》。
完成编译后,我们可以使用Eclipse(不能使用Intellij IDEA,因为之后添加library的时候无法设置为system library)新建一个Android工程,在src目录下创建一个android.webkit2的包。然后将源码目录下的frameworks/base/core/java/android/webkit目录下的所有文件拷贝到新创建的包中。
由于其中有一个类是编译之后生成的,所以我们还需要从编译完的源码目录out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/webkit中将EventLogTags.java类也拷贝到新建的包中。
接下来,我们需要在工程中加入包含系统隐藏API的jar包,将以下三个jar包重命名(名称随意)后拷贝到工程的libs目录下:
[plain] out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar&&out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes.jar&&out/target/common/obj/JAVA_LIBRARIES/bouncycastle_intermediates/classes.jar&&
在Eclipse中打开工程的Properties-&Java Build Path-&Libraries-&Add Library-&User Library,点击下一步,选择User Libraries...,选择New,随便输入一个名字,将System library选上(重要),选择OK。选中刚刚新建的User Library,选择Add JARs,在工程目录中选择新加入的三个jar包,选择OK。
添加完Library之后,切换到Order and Export选项卡,将刚刚新建的User library调整到最前面,确保隐藏API不会被系统API覆盖(由于包名相同),选择OK。另外,还要把Android Private Libraries库前的勾取消掉,否则之后运行会报错。
最后,由于我们的java文件都放到了android.webkit2包下,避免与系统的包重名,我们需要将所有java文件中的android.webkit都替换成android.webkit2。使用菜单中的Search命令批量替换即可。完成替换后,刷新一下工程,会发现所有的错误都没了。(有可能还会提示minSdkVersion版本太低,直接按要求修改AndroidManifest.xml文件即可)
此时我们的Eclipse工程已经可以编译运行了,但是启动的时候会闪退,因为我们还没有加入so库。下面我们就来编译so库。再回到虚拟机中,进入到安卓源码的external/chromium目录下,在终端执行以下命令:
[plain] $&sudo&sed&-i&"s#android/webkit#android/webkit2#g"&`grep&android/webkit&-rl&*`&&
可以将源码中的android/webkit都替换成android/webkit2,确保与我们的java代码包名相同。
再打开external/chromium目录下的Android.mk文件,将其中的libchromium_net都替换成libchromium_net2,同时增加一行LOCAL_MODULE_TAGS := optional,修改部分如下:
[plain] LOCAL_MODULE&:=&libchromium_net2&&LOCAL_MODULE_CLASS&:=&SHARED_LIBRARIES&&LOCAL_MODULE_TAGS&:=&optional&&INTERMEDIATES&:=&$(call&local-intermediates-dir)&&
再回到安卓源码根目录,运行以下命令:
[plain] $&source&build/envsetup.sh&&$&mmm&external/chromium&&
编译成功后可以在out/target/product/generic/obj/lib目录下找到libchromium_net2.so文件。
接下来进入到安卓源码的external/webkit/Source/WebKit/android目录下,在终端执行以下命令:
[plain] $&sudo&sed&-i&"s#android/webkit#android/webkit2#g"&`grep&android/webkit&-rl&*`&&
同样可以将源码中的android/webkit都替换成android/webkit2,确保与我们的java代码包名相同。
再打开external/webkit目录下的Android.mk文件,将其中的libwebcore都替换成libwebcore2(三个地方),并且增加一行LOCAL_MODULE_TAGS := optional,另外还要将LOCAL_SHARED_LIBRARIES里面的libchromium_net改成libchromium_net2。修改部分如下:
[plain] #&Define&our&module&and&find&the&intermediates&directory&&LOCAL_MODULE&:=&libwebcore2&&LOCAL_MODULE_CLASS&:=&STATIC_LIBRARIES&&LOCAL_MODULE_TAGS&:=&optional&&base_intermediates&:=&$(call&local-intermediates-dir)&&...&&LOCAL_SHARED_LIBRARIES&:=&\&&libEGL&\&&libGLESv2&\&&libandroid&\&&libandroidfw&\&&libandroid_runtime&\&&libchromium_net2&\&&libcrypto&\&&...&&LOCAL_PRELINK_MODULE&:=&false&&LOCAL_MODULE&:=&libwebcore2&&LOCAL_MODULE_TAGS&:=&optional&&LOCAL_LDLIBS&:=&$(WEBKIT_LDLIBS)&&LOCAL_SHARED_LIBRARIES&:=&$(WEBKIT_SHARED_LIBRARIES)&&LOCAL_STATIC_LIBRARIES&:=&libwebcore2&$(WEBKIT_STATIC_LIBRARIES)&&LOCAL_LDFLAGS&:=&-fvisibility=hidden&&
同样再回到安卓源码根目录,运行以下命令:
[plain] $&source&build/envsetup.sh&&$&mmm&external/webkit&&
编译成功后可以在out/target/product/generic/obj/lib目录下找到libwebcore2.so文件。
完成编译并运行测试代码
下面我们将以上编译生成的两个so文件(libchromium_net2.so和libwebcore2.so)放到我们工程的libs/armeabi目录下。再修改工程android.webkit2包下的JniUtil.java和WebViewCore.java文件,将其中的
[plain] static&{&&&&&&System.loadLibrary("webcore");&&&&&&System.loadLibrary("chromium_net");&&}&&
改为(注意,顺序也颠倒了)
[plain] static&{&&&&&&System.loadLibrary("chromium_net2");&&&&&&System.loadLibrary("webcore2");&&}&&
到此为止,与WebView相关的操作都完成了,我们可以开始加入测试代码。在测试的Activity.java的onCreate方法中加入:
[java] WebView&webView&=&(WebView)findViewById(R.id.webview);&&webView.getSettings().setJavaScriptEnabled(true);&&webView.loadUrl("");&&
对应的xml layout中加入:
[html] &android.webkit2.WebView&&&&&&&android:id="@+id/webview"&&&&&&&android:layout_width="fill_parent"&&&&&&&&&&&android:layout_height="fill_parent"&/&&&
最后在AndroidManifest.xml中加入:
[html] &uses-permission&android:name="android.permission.INTERNET"/&&&
现在我们就可以在模拟器上运行工程了,运行效果如下:&
如果出现黑屏,可以尝试将最后加入的INTERNET权限去掉后重试。只能在编译时对应版本的模拟器上运行,如果提示函数找不到,可以切换相应模拟器的版本后重试。
在模拟器上运行成功之后可以在真机上运行,效果如下:&
但是一旦用手指滑动WebView,应用就会闪退,原因是缺少一些资源,下面我们来将它们加上:
首先我们需要将安卓源码目录下的frameworks/base/core/res/res/values/styles.xml中的
[html] &style&name="ZoomControls"&&&&&&&&item&name="android:gravity"&bottom&/item&&&&&&&&item&name="android:paddingLeft"&15dip&/item&&&&&&&&item&name="android:paddingRight"&15dip&/item&&&&/style&&&
粘贴到我们工程目录下的res/values/styles.xml中。
然后再将frameworks/base/core/res/res/layout/zoom_magnify.xml文件复制到我们工程目录下的res/layout中。
接着将frameworks/base/core/res/res/drawable/btn_zoom_page.xml文件复制到我们工程目录下的res/drawable中。
最后将frameworks/base/core/res/res下的drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi目录下的btn_zoom_page_normal.png和btn_zoom_page_press.png文件复制到我们工程目录res下的相应文件夹中。
再次运行,即可任意滑动WebView了。
但是,这个版本在其他版本的安卓系统上可能会闪退,解决办法见我的下一篇博客:
如果大家觉得对自己有帮助的话,还希望能帮顶一下,谢谢:)
个人博客:
本文地址:
转载请注明出处,谢谢!
馆藏&22826
TA的最新馆藏[转]&在Android源码中编译自己的模块?
在进行Android下的jni开始时,我们编写的有些C/C++代码需要访问android中的一些C/C++的头文件,这些头文件没有在NDK中包含,不能再NDK中直接编译,只能放入到android的源码中进行编译。
编译的方法为:
1.在android的源码的development路径下创建一个文件夹,取名为screen(可以取任意的名称),然后将需要编译的C/C++文件放入这个文件夹,然后编写makefile文件Android.mk,内容大致如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -lm
-llog//这一句是可选的,如果代码中使用android中的记录日志的api,就需要加上,否则不需要加上。
LOCAL_MODULE := HelloWorld
LOCAL_SRC_FILES := HelloWorld.cpp
include $(BUILD_EXECUTABLE) 此处设置为生成可执行的目标码,如果生成so共享库,则需要修改为
include $(BUILD_SHARED_LIBRARY)
2.然后在android源码的根目录下运行make
screen就在out\target\product\generic\system\bin生产了可执行的目标码,如果mekefile中指定为生产共享库,在生产的so文件在out\target\product\generic\system\lib文件夹下。
这里我们重点说下,如何编写 Android.mk文件。
Android.mk文件语法规范
(英文原文件在/development/Ndk/Docs/android-mk.txt)
Android.mk编译文件是用来向Android NDK描述你的C,C++源代码文件的,
这篇文档描述了它的语法。在阅读下面的内容之前,假定你已经阅读了docs/OVERVIEW.TXT文件,了解了它们的脚色和用途。
一个Android.mk file用来向编译系统描述你的源代码,具体来说:该文件是GNU
Makefile的一小部分,会被编译系统解析一次或更多次的build系统。因此,您应尽量减少您声明的变量,不要认为某些变量在解析过程中不会被定义。-这个文件的语法允许把你的源代码组织成模块,一个模块属下列类型之一:静态库
只有共享库将被安装/复制到您的应用软件包。虽然静态库能被用于生成共享库。
你可以在每一个Android.mk file中定义一个或多个模块,你也可以在几个模块中使用同一个源代码文件。
-编译系统为你处理许多细节问题。例如,你不需要在你的Android.mk中列出头文件和依赖文件。NDK编译系统将会为你自动处理这些问题。这也意味着,在升级NDK后,你应该得到新的toolchain/platform支持,而且不需要改变你的Android.mk文件。
注意,这个语法同公开发布的Android平台的开源代码很接近,然而编译系统实现他们的方式却是不同的,这是故意这样设计的,可以让程序开发人员重用外部库的源代码更容易。
简单的例子:
在描述语法细节之前,咱们来看一个简单的"hello world"的例子,比如,下面的文件:
sources/helloworld/helloworld.c
sources/helloworld/Android.mk,
'helloworld.c'是一个JNI共享库,实现返回"hello world"字符串的原生方法。
相应的Android.mk文件会象下面这样:
---------- cut here ------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= helloworld
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_SHARED_LIBRARY)
---------- cut here ------------------
好,我们来解释一下这几行代码:
LOCAL_PATH := $(call my-dir)
一个Android.mk
file首先必须定义好LOCAL_PATH变量,它用于在开发树中查找源文件。在这个例子中,宏函数’my-dir’,
由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。
include $( CLEAR_VARS)
CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE,
LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH
。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。
LOCAL_MODULE := helloworld
LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'foo'的共享库模块,将会生成'libfoo.so'文件。
重要注意事项:如果你把库命名为‘libhelloworld’,编译系统将不会添加任何的lib前缀,也会生成libhelloworld.so,这是为了支持来源于Android平台的源代码的Android.mk文件,如果你确实需要这么做的话。
LOCAL_SRC_FILES := helloworld.c
LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。【注意,默认的C++源码文件的扩展名是’.cpp’.
指定一个不同的扩展名也是可能的,只要定义LOCAL_DEFAULT_CPP_EXTENSION变量,不要忘记开始的小圆点(也就是定义为‘.cxx’,而不是‘cxx’)(当然这一步我们一般不会去改它)】
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY是编译系统提供的变量,指向一个GNU
Makefile脚本(应该就是在build/core目录下的shared_library.mk),负责收集自从上次调用'include
$(CLEAR_VARS)'以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做。并根据其规则生成静态库。同理对于静态库。
在sources/samples目录下有更复杂一点的例子,写有注释的Android.mk文件,你可以看看。
这是一份你应该在Android.mk中依赖或定义的变量列表,您可以定义其他变量为自己使用,
但是NDK编译系统保留下列变量名:
-以LOCAL_开头的名字(例如 LOCAL_MODULE)
-以PRIVATE_, NDK_ or APP_开头的名字(内部使用)
-小写名字(内部使用,例如’my-dir’)
如果您为了方便在Android.mk中定义自己的变量,我们建议使用MY_前缀,一个小例子:
---------- cut here ------------------
MY_SOURCES := foo.c
ifneq ($(MY_CONFIG_BAR),)
MY_SOURCES += bar.c
LOCAL_SRC_FILES += $(MY_SOURCES)
---------- cut here ------------------
- - - - - - - - - - -
这些GNU Make 变量在你的Android.mk文件解析之前,就由编译系统定义好了。
注意在某些情况下,NDK可能分析Android.mk几次,每一次某些变量的定义会有不同。
CLEAR_VARS
指向一个编译脚本,几乎所有未定义的LOCAL_XXX变量都在"Module-description"节中列出。
你必须在开始一个新模块之前包含这个脚本,include $(CLEAR_VARS)
BUILD_SHARED_LIBRARY
指向编译脚本,收集所有的你在LOCAL_XXX变量中提供的信息,并且决定如何把你列出的源代码文件编译成一个共享库。注意,你必须至少在包含这个文件之前定义LOCAL_MODULE和LOCAL_SRC_FILES,使用例子:
$(BUILD_SHARED_LIBRARY),注意这将生成一个名为lib$(LOCAL_MODULE).so的文件。
BUILD_STATIC_LIBRARY
一个BUILD_SHARED_LIBRARY变量用于编译一个静态库。静态库不会复制到你的project/packages中,但是能够用于编译共享库,(看下面描述的LOCAL_STATIC_LIBRARIES
and LOCAL_STATIC_WHOLE_LIBRARIES)
使用例子:include $(BUILD_STATIC_LIBRARY)
注意,这将会生成一个名为lib$(LOCAL_MODULE).a的文件。
TARGET_ARCH
目标CPU平台的名字,如同在android开放源码中指定的那样。如果是’arm’,表示要生成ARM兼容的指令,与CPU架构的修订版无关。
TARGET_PLATFORM
Android.mk解析的时候,目标Android平台的名字.详情可参考/development/ndk/docs/stable-apis.txt.
android-3 -& Official Android 1.5 system images
android-4 -& Official Android 1.6 system images
android-5 -& Official Android 2.0 system images
TARGET_ARCH_ABI
暂时只支持两个value,armeabi和armeabi-v7a。在现在的版本中一般把这两个值简单的定义为arm,通过android
平台内部对它重定义来获得更好的匹配。
其他的ABI将在以后的NDK版本中介绍,它们会有不同的名字。注意所有基于ARM的ABI都会把'TARGET_ARCH'定义成‘arm’,但是会有不同的‘TARGET_ARCH_ABI’
TARGET_ABI
  目标平台和ABI的组合,它事实上被定义成$(TARGET_PLATFORM)-$(TARGET_ARCH_ABI)
在你想要在真实的设备中针对一个特别的目标系统进行测试时,会有用。在默认的情况下,它会是'android-3-arm'。
下面是GNU Make ‘功能’宏,必须通过使用'$(call )'来求值,他们返回文本化的信息。
返回当前Android.mk所在的目录路径,相对于NDK编译系统的顶层。这是有用的,在Android.mk文件的开头如此定义:
LOCAL_PATH := $(call my-dir)
all-subdir-makefiles 返回一个位于当前'my-dir'路径的子目录列表。
模块描述变量:
下面的变量用于向编译系统描述你的模块。你应该定义在'include $(CLEAR_VARS)'和'include
$(BUILD_XXXXX)'之间定义。正如前面描写的那样,$(CLEAR_VARS是一个脚本,清除所有这些变量,除非在描述中显式注明。
LOCAL_PATH
  这个变量用于给出当前文件的路径。你必须在Android.mk的开头定义,可以这样使用:
LOCAL_PATH := $(call my-dir)
这个变量不会被$(CLEAR_VARS)清除,因此每个Android.mk只需要定义一次(即使你在一个文件中定义了几个模块的情况下)。
LOCAL_MODULE
这是你模块的名字,它必须是唯一的,而且不能包含空格。你必须在包含任一的$(BUILD_XXXX)脚本之前定义它。模块的名字决定了生成文件的名字,例如,如果一个一个共享库模块的名字是,那么生成文件的名字就是lib.so。但是,在你的NDK生成文件中(或者Android.mk或者Application.mk),你应该只涉及(引用)有正常名字的其他模块。
LOCAL_SRC_FILES
这是要编译的源代码文件列表。只要列出要传递给编译器的文件,因为编译系统自动为你计算依赖。
注意源代码文件名称都是相对于LOCAL_PATH的,你可以使用路径部分,例如:
LOCAL_SRC_FILES := foo.c \
toto/bar.c
注意:在生成文件中都要使用UNIX风格的斜杠(/).windows风格的反斜杠不会被正确的处理。
LOCAL_CPP_EXTENSION
这是一个可选变量,用来指定C++代码文件的扩展名,默认是'.cpp',但是你可以改变它,比如:
LOCAL_CPP_EXTENSION := .cxx
LOCAL_C_INCLUDES ,路径的可选配置,是从根目录开始的,
all sources (C, C++ and Assembly). For example:
LOCAL_C_INCLUDES := sources/foo
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo
需要在任何包含LOCAL_CFLAGS / LOCAL_CPPFLAGS标志之前。
LOCAL_CFLAGS 可选的编译器选项,在编译C代码文件的时候使用。
这可能是有用的,指定一个附加的包含路径(相对于NDK的顶层目录),宏定义,或者编译选项。
重要信息:不要在Android.mk中改变optimization/debugging级别,只要在Application.mk中指定合适的信息,就会自动地为你处理这个问题,在调试期间,会让NDK自动生成有用的数据文件。
LOCAL_CXXFLAGS
Same as LOCAL_CFLAGS for C++ source files
LOCAL_CPPFLAGS
与LOCAL_CFLAGS相同,但是对C 和 C++ source files都适用。
LOCAL_STATIC_LIBRARIES
应该链接到这个模块的静态库列表(使用BUILD_STATIC_LIBRARY生成),这仅仅对共享库模块才有意义。
LOCAL_SHARED_LIBRARIES
这个模块在运行时要依赖的共享库模块列表,在链接时需要,在生成文件时嵌入的相应的信息。注意:这不会附加列出的模块到编译图,也就是,你仍然需要在Application.mk中把它们添加到程序要求的模块中。
LOCAL_LDLIBS
编译你的模块要使用的附加的链接器选项。这对于使用”-l”前缀传递指定库的名字是有用的。例如,下面将告诉链接器生成的模块要在加载时刻链接到/system/lib/libz.so
LOCAL_LDLIBS := -lz
看docs/STABLE-APIS.TXT获取你使用NDK发行版能链接到的开放的系统库列表。
LOCAL_ALLOW_UNDEFINED_SYMBOLS
默认情况下,在试图编译一个共享库时,任何未定义的引用将导致一个“未定义的符号”错误。这对于在你的源代码文件中捕捉错误会有很大的帮助。然而,如果你因为某些原因,需要不启动这项检查,把这个变量设为‘true’。注意相应的共享库可能在运行时加载失败。(这个一般尽量不要去设为true)
LOCAL_ARM_MODE
默认情况下,arm目标二进制会以thumb的形式生成(16位),你可以通过设置这个变量为arm如果你希望你的module是以32位指令的形式。
'arm' (32-bit instructions) mode. E.g.:
LOCAL_ARM_MODE := arm
注意你同样可以在编译的时候告诉系统编译特定的类型,比如
LOCAL_SRC_FILES := foo.c bar.c.arm
这样就告诉系统总是将bar.c以arm的模式编译,
Android.mk使用模板
在一个Android.mk中可以生成多个可执行程序、动态库和静态库。
1,编译应用程序的模板:
LOCAL_PATH := $(call my-dir)
#include $(CLEAR_VARS)
LOCAL_SRC_FILES:= main.c
LOCAL_MODULE:= test_exe
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_EXECUTABLE)
(菜鸟级别解释::=是赋值的意思,$是引用某变量的值)LOCAL_SRC_FILES中加入源文件路径,LOCAL_C_INCLUDES
中加入所需要包含的头文件路径,LOCAL_STATIC_LIBRARIES加入所需要链接的静态库(*.a)的名称,LOCAL_SHARED_LIBRARIES中加入所需要链接的动态库(*.so)的名称,LOCAL_MODULE表示模块最终的名称,BUILD_EXECUTABLE表示以一个可执行程序的方式进行编译。
2,编译静态库的模板:
#Test Static Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \helloworld.c
LOCAL_MODULE:= libtest_static
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_STATIC_LIBRARY)
一般的和上面相似,BUILD_STATIC_LIBRARY表示编译一个静态库。
3,编译动态库的模板:
#Test Shared Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \helloworld.c
LOCAL_MODULE:= libtest_shared
TARGET_PRELINK_MODULES := false
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_SHARED_LIBRARY)
一般的和上面相似,BUILD_SHARED_LIBRARY表示编译一个共享库。
以上三者的生成结果分别在如下,generic依具体target会变:
out/target/product/generic/obj/EXECUTABLE
out/target/product/generic/obj/STATIC_LIBRARY
out/target/product/generic/obj/SHARED_LIBRARY
每个模块的目标文件夹分别为:
可执行程序:XXX_intermediates
静态库: XXX_static_intermediates
动态库: XXX_shared_intermediates
另外,在Android.mk文件中,还可以指定最后的目标安装路径,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH来指定。不同的文件系统路径用以下的宏进行选择:
TARGET_ROOT_OUT:表示根文件系统。
TARGET_OUT:表示system文件系统。
TARGET_OUT_DATA:表示data文件系统。
LOCAL_MODULE_PATH:=$(TARGET_ROOT_OUT)
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Hi,欢迎来到华清远见移动互联网学院官网!国内王牌Android培训、JavaEE培训、HTML5培训、UI培训、JAVA培训、VR培训机构!
400-611-6270
您当前的位置: >
> 如何在Android源码上编译系统应用
如何在Android源码上编译系统应用
时间: 09:10 来源:移动互联网学院
& Android系统应用和普通的Android应用基本相同,都是主要用Java语言编写的APK程序。不过前者与后者有如下两点不同。
1. 签名不同。Android系统应用使用的是系统签名,或称为平台签名,而普通的Android应用使用的是一般的签名。
2. 可以访问的API不同,在AndroidSDK 中有很多API(类、接口、方法等)都声明为hide。
3. 这类API不允许在普通的Android应用中访问,而只是经过platform签名的Android系统应用才能使用这些API。
& 除了以上两点,Android系统应用和普通应用的创建过程基本相同,只是由于Android系统应用可能访问系统级的API(hide API),而ADT是不会识别这些API的,所以在ADT+Ecplise开发环境导入Android系统应用的源代码后会发现这些API的地方的都用红色波浪线标注了,不过这不要紧,反正也不在IDE中编译和运行Android系统应用。
& 在了解了Android系统应用和普通的Android应用的区别后,面临的写一个问题就是如何编译和运行Android系统应用呢?
& Android系统应用完全可以向普通的Android应用一样在Ecplise中编辑,IDE的基本特性仍然会保留,但由于使用了系统API,所以是不能直接编译的。要想编译Android系统应用必须要依靠Android源代码(最好是已经进行一遍完整编译的Android源代码)才可以。通常会将Android系统应用的源代码放到&Android 源代码根目录&/package/apps 目录或其子目录中。编译Android系统应用需要在程序的根目录建立一个Android.mk文件,该文件是Android源代码专用的编译文件,相当于GCC的Makefile文件。至于该文件的内容,通常并不需要有更深入的了解,只需要在apps中找一个Android系统应用,如PackageInstaller,将该程序中Android.mk文件复制一份,然后进行适当修改即可。
& 在Android源代码中有一个package目录,所有的android系统应用的源代码都在这个目录中,其中package/app是最核心的目录,所有的Android系统应用的源代码都在这个目录中。其中psackages/app是最核心的目录,所有内嵌的APK程序都在该目录中,如果要加入自己的Android系统应用,也需要将APK文件放到这个目录中,如果想了解Android系统有哪些窗口(Acitivity)可用,app目录中包含的源代码将告诉我们一切。
& 除了app目录外,其他一些目录,例如,providers,也非常重要,尤其是providers目录,会告诉我们整个Android系统有哪些Content Provider可共调用,并且会得知详细的使用方法。当然,我们还可以从Android系统应用的源代码中得到更多的信息。例如,开发过桌面小部件的读者都知道,桌面小部件不支持将EditText控件放到桌面上,那么Android桌面的部件是如何做的呢?
& 不过研究Android系统应用源代码还有个更重要的目的,就是定制ROM。像现在很多流行的ROM,如HTC的sense UI、小米的仿iPhone的UI,以及老罗模仿与创新并存的锤子ROM,都需要对Android系统应用的源代码相当了解实现(当然还要有很多的UI设计师才行)。
& 所以研究Android系统应用的源代码好处多多,综合起来读者至少从以下几个方面可以获益。
1. 了解Android系统中有哪些窗口、Content Provider、Service 和Broadcast可以与之交互。
2. 充分掌握很多高级应用的使用方法,例如,OTA升级是如何实现的。
3. 对实现原理比较感兴趣的读者可以通过这些源代码了解像Launcher2、短信管理等应用的内容构造。
4. 对于像编写可以完成系统级操作的应用的读者,可以学会如何将Android应用嵌入到ROM,升级为Android系统应用,进而可以做任何自己想做的事。
5. 对于那些有即可情结的读者,完全定制自己的ROM是最令人振奋的梦想,而Android系统应用将是实现这一梦想最重要的基石。
主讲人:Xena|共238人观看
主讲人:Scorpio|共5501人观看
主讲人:Wing|共121人观看}

我要回帖

更多关于 ai快捷键 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信