导航:首页 > APP软件 > androidapp编译过程

androidapp编译过程

发布时间:2023-11-05 02:02:34

Ⅰ 怎么样将自己开发的Android应用程序编译到系统Image中

1. 搭建编译环境
编译环境: Ubuntu 10.10
Android版本:Android 2.2

编译过程中可能需要在Ubuntu上安装必要的一些软件,我安装过的包含如下软件,不同的系统可能会有差别:
jdk6(Android官方建议装jdk5,但是我在编译时会遇到java override问题,改用6没有任何问题), bison, lib64z1-dev, libasound2-dev, flex, gperf, libncurses5-dev

2. 应用程序存放目录
SimpleJNI是采用Android NDK和Java编写的程序,包含apk和so库文件,它的源代码在source tree的development/samples/目录下。
实际上package在编译时所放的目录并没有明确限定,编译后apk和so存放的位置是根据目录下Android.mk所指定的编译类型所决定的,例如:
SimpleJNI根目录下的Android.mk中有一行include $(BUILD_PACKAGE),表示将该目录下的模块编译成package,即apk文件,默认存放的位置为/system/app。
SimpleJNI/jni目录下的Android.mk中有一行为include $(BUILD_SHARED_LIBRARY),表示将该目录下的native.cpp编译为共享库文件,即so文件,默认存放的位置为/system/lib

因此,如果我们想要将自己编写的程序编译至image中,只需要将Eclipse下完成的整个工程到source tree下的某个目录即可,我一般习惯放到packages/apps下。

3. 添加Android.mk
完成了上一步,可以知道,Android.mk在编译中起着至关重要的作用,这其实就是Android编译环境中的make file。为了完成我们的工作,需要在源代码中添加Android.mk。添加自己的Android.mk可以仿照SimpleJNI中的Android.mk,稍微修改即可。我们首先看看SimpleJNI目录下的两个Android.mk的内容:
根目录下的Android.mk

TOP_LOCAL_PATH:= $(call my-dir)

# Build activity

LOCAL_PATH:= $(TOP_LOCAL_PATH)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := samples

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := SimpleJNI

LOCAL_JNI_SHARED_LIBRARIES := libsimplejni

LOCAL_PROGUARD_ENABLED := disabled

include $(BUILD_PACKAGE)

# ============================================================

# Also build all of the sub-targets under this one: the shared library.
include $(call all-makefiles-under,$(LOCAL_PATH))

根目录下的Android.mk决定了整个工程编译的配置,其中,

LOCAL_PATH 定义了当前的目录

LOCAL_MUDULE_TAGS 定义了当前模块的类型,编译器在编译时会根据类型的不同有些差别,有些tags的mole甚至不会被编译至系统中。LOCAL_MUDULE_TAGS主要有如下几种:user debug eng tests optional samples shell_ash shell_mksh。optional表示在所有版本的编译条件下都被编译至image中,剩下的表示在该版本中才会被编译只image中,如user表示在user版本下才会被编译至image中。
对于包含LOCAL_PACKAGE_NAME的mk文件,该项默认为optinal,具体可以参看build/core/package.mk。SimpleJNI中定义为samples的具体作用我也不太清楚,为了保险起见,我自己的apk一般定义为optional。

LOCAL_SRC_FILES 定义了编译apk所需要的java代码的目录

LOCAL_PACKAGE_NAME 这里需要改成自己的package的名字

LOCAL_JNI_SHARED_LIBRARIES 定义了要包含的so库文件的名字,如果你的程序没有采用JNI,这行不需要。

LOCAL_PROGUARD_ENABLED 定义了Java开发中的ProGuard压缩方法,主要用来分析压缩程序的,在我自己的应用中我没有加这行。

include $(BUILD_PACKAGE) 这行是build的关键,表示当前java代码build成apk

include $(call all-makefiles-under,$(LOCAL_PATH)) 表示需要build该目录下的子目录的文件,这样编译系统就会在当前目录下的子目录寻找Android.mk来编译so等其它程序。

根据上述所写,创建我自己的Android.mk如下:

TOP_LOCAL_PATH:= $(call my-dir)

# Build activity

LOCAL_PATH:= $(TOP_LOCAL_PATH)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := TestJniApp

LOCAL_JNI_SHARED_LIBRARIES := libtestjniapp

include $(BUILD_PACKAGE)

# ============================================================

# Also build all of the sub-targets under this one: the shared library.
include $(call all-makefiles-under,$(LOCAL_PATH))
看起来很简单吧,基本不需要改动即可。

Jni目录下的Android.mk

由于我们的TestJniApp是用JNI完成的,包含C源代码,因此也需要一个jni目录下的Android.mk。同样首先看看SimpleJNI中jni目录下的Android.mk的内容:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := samples

# This is the target being built.
LOCAL_MODULE:= libsimplejni

# All of the source files that we will compile.
LOCAL_SRC_FILES:= /
native.cpp

# All of the shared libraries we link against.
LOCAL_SHARED_LIBRARIES := /
libutils

# No static libraries.
LOCAL_STATIC_LIBRARIES :=

# Also need the JNI headers.
LOCAL_C_INCLUDES += /
$(JNI_H_INCLUDE)

# No special compiler flags.
LOCAL_CFLAGS +=

# Don't prelink this library. For more efficient code, you may want
# to add this library to the prelink map and set this to true. However,
# it's difficult to do this for applications that are not supplied as
# part of a system image.

LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE 当前模块的名字,即编译后的so文件的名字

LOCAL_SRC_FILES 所要编译的文件

LOCAL_SHARED_LIBRARIES, LOCAL_STATIC_LIBRARIES 该模块要链接的动态库和静态库。

LOCAL_C_INCLUDES 要包含的头文件

LOCAL_CFLAGS C语言编译选项

LOCAL_PRELINK_MODULE 定义是否使用prelink工具,它用事先链接代替运行时链接的方法来加速共享库的加载,不仅可以加快起动速度,还可以减少部分内存开销。

经过修改后,我自己的TestJniApp中jni目录下的Android.mk如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := libtestjniapp
LOCAL_SRC_FILES := com_test_app_Jni.c
LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)

LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)

这里有一点需要注意,如果要将so文件编译入image,必须要修改LOCAL_MODULE_TAGS,将原有的值samples修改为user,或者可以直接删掉 。删掉是因为对于包含LOCAL_MODULE的mk文件,如果没有指定LOCAL_MODULE_TAGS,该项默认为user,而只有定义为user的情况下,才会将so文件编译入image,具体定义可以参看build/core/base_rule.mk。

4. 修改/bulid/target/proct/generic.mk 把工程编译到系统中
至此,还有最后一部工作。为了将工程编译进入image,还需要在/bulid/target/proct/generic.mk文件中将package name添加进去

PRODUCT_PACKAGES := /
AccountAndSyncSettings /
CarHome /
DeskClock /
……
SyncProvider /
TestJniApp

完成上面这些步骤后,在source tree根目录下编译image就可以了。

Ⅱ 写一个完整的android应用有哪些步骤

分为五个步骤来完成Android开发环境的搭建。


第一步:安装JDK。

要下载Oracle公司的JDK可以网络“JDK”进入Oracle公司的JDK下载页面,选择自己电脑系统的对应版本即可。


第二步:配置Windows上JDK的变量环境 。

JAVA_HOME

先设置这个系统变量名称,变量值为JDK在电脑上的安装路径:C:Program FilesJavajdk1.8.0_20。创建好后则可以利用%JAVA_HOME%作为JDK安装目录的统一引用路径。

Path

PATH属性已存在,可直接编辑,在原来变量后追加:;%JAVA_HOME%in;%JAVA_HOME%jrein 。

CLASSPATH

设置系统变量名为:CLASSPATH 变量值为:.;%JAVA_HOME%libdt.jar;%JAVA_HOME%lib ools.jar 。

注意变量值字符串前面有一个"."表示当前目录,设置CLASSPATH的目的,在于告诉Java执行环境,在哪些目录下可以找到您所要执行的Java程序所需要的类或者包。



第三步: 下载安装Eclipse(已上传附件,电脑打开可下载)。

Eclipse为Java应用程序及Android开发的IDE(集成开发环境)。Eclipse不需要安装,下载后把解压包解压后,剪切eclipse文件夹到你想安装的地方,打开时设置你的工作目录即可。



第四步:下载安装Android SDK 。

配置了JDK变量环境,安装好了Eclipse,这个时候如果只是开发普通的JAVA应用程序,那么Java的开发环境已经准备好了。我们要通过Eclipse来开发Android应用程序,那么我们需要下载Android SDK(Software Development Kit)和在Eclipse安装ADT插件,这个插件能让Eclipse和Android SDK关联起来。


第五步:为Eclipse安装ADT插件。

前面已经配置好了java的开发环境,安装了开发Android的IDE,下载安装了Android SDK,但是Eclipse还没有和Android SDK进行关联,也就是它们现在是互相独立的,就好比枪和子弹分开了。为了使得Android应用的创建,运行和调试更加方便快捷,Android的开发团队专门针对Eclipse IDE定制了一个插件:Android Development Tools(ADT)。


安卓APP的主要开发原理以及其主要过程是什么

开发原理:

Android应用程序是用Java语言编写的。编译过后的字节码,以及应用程序要求的其他数据和资源文件,通过aapt工具被绑定在一起,称为 Android包,这是一个带.apk后缀的档案文件。这个文件也是用户下载到他们设备上的文件。所有的代码在一个单一的.apk文件中,组成一个“应用程序”。

主要过程:

1、需求分析:

大部分创业型项目在这个阶段只是一些比较抽象的想法。有一份相对完善的需求文档,不仅有助于创业者自身对项目的理解和周全性分析,如果项目是交由设计公司去完成的话,也更有利于对方准确把握项目的定位和商业模式,以便给出专业的建议和解决方案。

2、原型设计

接下来会根据上面提到的具体需求文档,项目经理进行会进行原型图的设计。

3、UI设计

原型图经过反复推敲修正后,UI 设计师会进行UI界面相关的配色设计、功能具象化处理、交互设计、以及各种机型、系统的适配。UI 设计师经过多次与项目经理沟通修改后,最终的到定稿的高保真设计图。

4、开发

经过以上几个过程之后,会正式进入到开发阶段。

5、测试调试

APP 功能开发完成之后,测试人员会对整项目进行系统性测试。这个环节会调动起项目组内所有人相关人员。而测试这个环节的重要性不亚于前期功能的规划,如果团队没有经过专业系统性训练的测试人员,很可能会导致项目出现与设计初衷存在落差,以及遗漏下一些逻辑上的坑。

6、发布app

经过至少两轮的内部测试以及小范围外测(或者完成满足测试要求的周期)后,会进行最终版本的上架。

(3)androidapp编译过程扩展阅读

APP开发工具

1、MOTODEV Studio for Android

MOTODEV Studio for Android,这是基于Android的开发环境,为开发者们提供新的MOTODEV App Accelerator Program使他们可以开发出更适合摩托罗拉Android手机的应用程序。

2、J2ME开发插件 Mobile Tools for Java

Mobile Tools for Java (MTJ) 是Nokia公司开发的一款 Eclipse插件,用于支持 Java 手机应用程序开发。其前身就是大名鼎鼎的 EclipseME。

3、apk文件修改工具 Root Tools

RootTools是一个新的工具软件,Android开发者可以在这一工具软件的支持下,对.apk格式的文件进行再次修改,让程序表现更加出色,满足用户的需求。Root Tools里面自带有很多工具,比如BusyBox,它里面集成压缩了很多Linux的工具和命令,这样软件开发者在对....

4、IDEA的Android开发插件 idea-android

idea-android 是在 IDEA 集成开发环境中开发 Android 应用程序的插件。

参考资料

网络-app开发

Ⅳ 如何用c++写安卓手机软件

用c++写安卓手机软件的方法:

安装ndk,使用纯c++开发安卓程序,下边是详细的步骤与说明:

1、编写入口函数

android_main为入口函数,和C++中的main函数是一样的。这里创建CELLAndroidApp的对象,直接调用main函数。

voidandroid_main(structandroid_app*state)

{

CELLAndroidAppapp(state);

app.main(0,0);

}

2.绘制类的实现说明

protected:

EGLConfig_config;

EGLSurface_surface;

EGLContext_context;

EGLDisplay_display;

android_app*_app;

int_width;

int_height;

部分参数说明:

_surface:用于绘制图形,相当于windows绘图中的位图

_context:可以看做是opengl对象

_display:用于绘图的设备上下文,类似于windows绘图中的dc

3.构造函数说明

CELLAndroidApp(android_app*app):_app(app) { _surface=0; _context=0; _display=0; _width=64; _height=48; app->userData=this;//用户数据 app->onAppCmd=handle_cmd;//窗口的创建销毁等 app->onInputEvent=handle_input;//回调函数 }

值得注意的是,这里的app中的userData,传入用户数据,这里直接传入this,onAppCmd传入的handle_cmd回调函数,onInputEvent传入的事handle_input回调函数

4.类中函数main()说明

virtualvoidmain(intargc,char**argv)

{

intident;

intevents;

android_poll_source*source;

while(true)

{

while((ident=ALooper_pollAll(0,NULL,&events,(void**)&source))>=0)

{

if(source!=NULL)

source->process(_app,source);//有触摸事件,调用input函数,相当于dispatchmessage

if(_app->destroyRequested!=0)

return;

}

render();

}

}

5.调用render()函数,绘制图形。

6.初始化设备函数initDevice()

virtualvoidinitDevice()

{

constEGLintattribs[]=

{

EGL_SURFACE_TYPE,EGL_WINDOW_BIT,

EGL_BLUE_SIZE,8,

EGL_GREEN_SIZE,8,

EGL_RED_SIZE,8,

EGL_NONE

};

EGLintformat;

EGLintnumConfigs;

_display=eglGetDisplay(EGL_DEFAULT_DISPLAY);

eglInitialize(_display,0,0);

eglChooseConfig(_display,attribs,&_config,1,&numConfigs);

eglGetConfigAttrib(_display,_config,EGL_NATIVE_VISUAL_ID,&format);

ANativeWindow_setBuffersGeometry(_app->window,0,0,format);

_surface=eglCreateWindowSurface(_display,_config,_app->window,NULL);

#if0

EGLintcontextAtt[]={EGL_CONTEXT_CLIENT_VERSION,2,EGL_NONE,EGL_NONE};

_context=eglCreateContext(_display,_config,0,contextAtt);

#else

_context=eglCreateContext(_display,_config,0,0);

#endif

if(eglMakeCurrent(_display,_surface,_surface,_context)==EGL_FALSE)

{

LOGW("UnabletoeglMakeCurrent");

return;

}

eglQuerySurface(_display,_surface,EGL_WIDTH,&_width);

eglQuerySurface(_display,_surface,EGL_HEIGHT,&_height);

onCreate();

//InitializeGLstate.

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_FASTEST);

glEnable(GL_CULL_FACE);

glShadeModel(GL_SMOOTH);

glDisable(GL_DEPTH_TEST);

glViewport(0,0,_width,_height);

glOrthof(0,_width,_height,0,-100,100);

7.绘制函数render()

virtualvoidrender()

{

if(_display==0)

{

return;

}

glClearColor(0,0,0,1);

glClear(GL_COLOR_BUFFER_BIT);

glEnableClientState(GL_VERTEX_ARRAY);

if(g_arVertex.size()>=2)

{

glColor4f(1,1,1,1);

glVertexPointer(3,GL_FLOAT,0,&g_arVertex[0]);

glDrawArrays(GL_LINE_STRIP,0,g_arVertex.size());

}

eglSwapBuffers(_display,_surface);//双缓存的交换缓冲区

}

8.编译程序,将程序导入到模拟器中,最终运行的效果图如下:

阅读全文

与androidapp编译过程相关的资料

热点内容
word删除尾注分隔符 浏览:773
公告质疑需要哪些文件 浏览:608
数据库模型是干什么的 浏览:404
win10的驱动怎么安装驱动 浏览:320
word文件水印怎么取消 浏览:443
rhel6的镜像文件在哪里下载 浏览:571
成功正能量微信头像 浏览:848
wps表格如何恢复数据 浏览:264
linuxc静态库创建 浏览:838
u盘有微信文件但微信恢复不了 浏览:585
苹果的网站数据是什么 浏览:22
ps滚字教程 浏览:237
win7网络邻居如何保存ftp 浏览:186
安卓客户端代理服务器 浏览:572
编程用苹果 浏览:659
51虚拟机的文件管理在哪里 浏览:13
win10系统有没有便签 浏览:722
java引用传递和值传递 浏览:109
oracle下载安装教程 浏览:854
php筛选数据库 浏览:830

友情链接