安卓编译内核生成的是o文件吗,然后再打包进boot.img

安卓编译内核生成的是o文件吗,然后再打包进boot.img,第1张

o是中间文件,ko是内核模块
kernel是一个可执行的bzImage,简单来讲就是由o链接生成的目标文件,不是像你说的那样n多o
ko可以编译进内核,也可以不编译进内核,作为插件的形式存在
安装内核的意思就是把内核copy到启动分区,然后安装内核模块,以及一些其他的东西。。
每次开机直接把内核装载到内存里面去不就行了吗,这也得先安装才行不是。

具体步骤如下:

第一步:

先将项目打包成war文件,也就是将在项目上单击鼠标右键,选择Export:

选择WAR file,点击下一步:

会出现如下所示,选择你要保存的位置,点击完成:

在你所选择的地方会有个如下所示的war文件:

以上步骤只是完成了将项目打包成war文件的步骤,现在来说将war包部署到服务器的步骤:

第二步:

先将war包用类似于ftp的工具(我自己用的是ftp,这种工具很多的)上传到固定位置

第三步:

一般是先停止tomcat,Linux命令:shutdowsh,将war放到tomcat的webapps目录下,我自己用到的命令(我用ftp将war包放到了data下的version目录下):

mv /data/version/tecDocwar /var/tomcat/tomcat6/webapps/tecDocwar

第四步:

然后启动tomcat,Linux命令:/startupsh,第六步也可以不用 *** 作了,我一般都是所有的配置都改好才打包

第五步:

再次停止tomcat,删除war文件(注:如果tomcat不停止 ,删除war包时,文件夹也会被tomcat一起自动删除,之所以删除war,是怕tomcat再次自动解压,覆盖掉修改的配置,不确定会不会再次解压,以防万一)

第六步:

修改自动解压的文件夹里配置(如果打包前没有修改配置文件,比如jdbcproperties文件(一般开发时用的是本地数据库,上生成时要改成生产数据库),就要用linux命令修改一下,如果打包前修改好了,就不用修改了)

第七步:

然后再启动tomcat

直接给出PHP代码实现。

对于这个文件,大家需要修改的便是命名空间。

至于为什么,大家需要了解下PHP的基础知识,和thinkPHP框架的开发流程就可以了,很快的。

一认识android的架构
Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。
android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
二搭建环境
搭建开发环境
对国内的开发者来说最痛苦的是无法去访问android开发网站。为了更好的认识世界,对程序员来说,会也是的一门技术,带你去领略墙外的世界,好了,不废话了, 国内开发者访问(androiddevtools) 上面已经有了所有你要的资源,同时可以下载到我们的主角framework
但是这样的搭建只能去阅读源代码,我们无法去更进一步去实现自己的rom,我们看到锤子的系统在早期的开放rom是自己从新实现了framework的代码,现在看起来他成功了,所以我们还要去搭建android系统的源码编译环境。
搭建源码编译环境
三开始主题
在一开始写c程序的时候都有一个运行的入口,比如
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
//这里的main就是应用的入口
int main(int argc, const char argv[]){
return 0;
}
在计算机网络原理中我们用socket实现一个服务器端,不断的接听客户端的访问,而且他的代码是这样实现的:
#include <winsock2h>
#pragma comment(lib, "WS2_32lib")
#include <stdioh>
void main()
{
WORD wVersionRequested;//版本号
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);//22版本的套接
//加载套接字库,如果失败返回
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return;
}
//判断高低字节是不是2,如果不是22的版本则退出
if (LOBYTE(wsaDatawVersion) != 2 ||
HIBYTE(wsaDatawVersion) != 2)
{
return;
}
//创建流式套接字,基于TCP(SOCK_STREAM)
SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);
//Socket地址结构体的创建
SOCKADDR_IN addrSrv;
addrSrvsin_addrS_unS_addr = htonl(INADDR_ANY);//转换Unsigned long型为网络字节序格
addrSrvsin_family = AF_INET;//指定地址簇
addrSrvsin_port = htons(6000);
//指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换
//将套接字绑定到一个端口号和本地地址上
bind(socSrv, (SOCKADDR)&addrSrv, sizeof(SOCKADDR));//必须用sizeof,strlen不行
listen(socSrv, 5);
SOCKADDR_IN addrClient;//字义用来接收客户端Socket的结构体
int len = sizeof(SOCKADDR);//初始化参数,这个参数必须进行初始化,sizeof
//循环等待接受客户端发送请求
while (1)
{
//等待客户请求到来;当请求到来后,接受连接请求,
//返回一个新的对应于此次连接的套接字(accept)。
//此时程序在此发生阻塞
SOCKET sockConn = accept(socSrv, (SOCKADDR)&addrClient, &len);
char sendBuf[100];
sprintf(sendBuf, "Welcome %s to JoyChou",
inet_ntoa(addrClientsin_addr));//格式化输出
//用返回的套接字和客户端进行通信
send(sockConn, sendBuf, strlen(sendBuf)+1, 0);//多发送一个字节
//接收数据
char recvBuf[100];
recv(sockConn, recvBuf, 100, 0);
printf("%s\\n", recvBuf);
closesocket(sockConn);
}
}
他采用了一个while死循环去监听客户端的请求。
先上源代码
public final class ActivityThread {
public static void main(String[] args) {
SamplingProfilerIntegrationstart();
CloseGuardsetEnabled(false);
EnvironmentinitForCurrentUser();
EventLoggersetReporter(new EventLoggingReporter());
SecurityaddProvider(new AndroidKeyStoreProvider());
final File configDir = EnvironmentgetUserConfigDirectory(UserHandlemyUserId());
TrustedCertificateStoresetDefaultUserDirectory(configDir);
ProcesssetArgV0("<pre-initialized>");
LooperprepareMainLooper();
//从中可以看到为app开辟了一个线程进入了looper之中
ActivityThread thread = new ActivityThread();
threadattach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = threadgetHandler();
}
AsyncTaskinit();
if (false) {
LoopermyLooper()setMessageLogging(new
LogPrinter(LogDEBUG, "ActivityThread"));
}
Looperloop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
}
看到源码失望了,没有一个while循环啊,其实用了他方法实现
//用一个looper的机制循环监听响应
LooperprepareMainLooper();
Looperloop();
进一步深入代码
public static void loop() {
final Looper me = myLooper();
if (me == null) {
throw new RuntimeException("No Looper; Looperprepare() wasn't called on this thread");
}
final MessageQueue queue = memQueue;
BinderclearCallingIdentity();
final long ident = BinderclearCallingIdentity();
// 在这里看到了一个循环监听消息
for (;;) {
Message msg = queuenext(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting
return;
}
Printer logging = memLogging;
if (logging != null) {
loggingprintln(">>>>> Dispatching to " + msgtarget + " " +
msgcallback + ": " + msgwhat);
}
msgtargetdispatchMessage(msg);
if (logging != null) {
loggingprintln("<<<<< Finished to " + msgtarget + " " + msgcallback);
}
// Make sure that during the course of dispatching the
// identity of the thread wasn't corrupted
final long newIdent = BinderclearCallingIdentity();
if (ident != newIdent) {
Logwtf(TAG, "Thread identity changed from 0x"
+ LongtoHexString(ident) + " to 0x"
+ LongtoHexString(newIdent) + " while dispatching to "
+ msgtargetgetClass()getName() + " "
+ msgcallback + " what=" + msgwhat);
}
msgrecycleUnchecked();
}
}

使用别的开发工具或者源码模式底下,直接在manifestjson文件中找到mp-weixin的配置项,在permission底下加上scopeuserLocation位置接口权限,如下:
"mp-weixin" : {
"appid" : "",
"setting" : {
"urlCheck" : false,
"es6" : false,
"postcss" : false,
"minified" : true
},
"usingComponents" : true,
"permission" : { // 在这里加权限
"scopeuserLocation" : {
"desc" : "XXX" // 必填
}
}
},
在编译成微信小程序以后,可以看到小程序项目底下的appjson文件中的permission底下有了位置接口权限:
"permission": {
"scopeuserLocation": {
"desc": "XXX"
}
},
然后安卓真机便可以使用chooseLocation方法获取位置信息了。

首先.还是跟其它文章讲的一样.先下载ANDORID的源码.在下源码之前.请看下面第一步
----------
增加代码,下真机配置
1
vim repo/local_manifestxml
<xml version="10" encoding="UTF-8">
<manifest>
<project path="kernel" name="kernel/msm" revision="refs/heads/android-msm-2629"/>
<project path="hardware/htc/dream" name="platform/hardware/htc/dream" revision="master"/>
</manifest>
增加上面这段代码,为一个配置.告诉服务器.我们下的代码.是要装进真机的.
(就为了多下载一个KERNEL下来。。还有下载DREAM的真机配置参数)
小哈在这里折腾了很久.很久..非常久..回忆起来内牛满面
-----
下相关的代码
2
repo sync
-----
3
vim env_rc
加入:
export EMU=/home/coconut/cupcake/out/host/linux-x86/bin
export ARCH=arm
export CROSS_COMPILE=arm-eabi-
export PATH=$PATH:/home/coconut/cupcake/prebuilt/linux-x86/toolchain/arm-eabi-421/bin:${EMU}
source env_rc
4
编译内核及无线网络驱动
$ cd $ANDROID/kernel
$ make ARCH=arm CROSS_COMPILE=/prebuilt/linux-x86/toolchain/arm-eabi-440/bin/arm-eabi- msm_defconfig # 设定默认的msm配置
#编译内核
make ARCH=arm CROSS_COMPILE=/prebuilt/linux-x86/toolchain/arm-eabi-440/bin/arm-eabi-
#编译无线网络驱动
cd $ANDROID/system/wlan/ti/sta_dk_4_0_4_32
make ARCH=arm CROSS_COMPILE=$ANDROID/prebuilt/linux-86/toolchain/arm-eabi-440/bin/arm-eabi- KERNEL_DIR=$ANDROID/kernel
//内核拷到目录下
$ cp $ANDROID/kernel/arch/arm/boot/zImage $ANDROID/vendor/htc/dream-open/kernel
$ cp $ANDROID/system/wlan/ti/sta_dk_4_0_4_32/wlanko $ANDROID/vendor/htc/dream-open/wlanko
5
在HTC网站(developerhtccom/adphtml)
下载名为signed-dream_devphone_userdebug-ota-14721zip的包,并把它放在$ANDROID目录下
$ cd $ANDROID
$ source build/envsetupsh
$ lunch aosp_dream_us-eng # 指明机型
这样编译出来就会在OUT下出来一个DREAM_OPEN的目录里面就有相关的镜像文件了
$ cd vendor/htc/dream-open
$ /unzip-filessh # 解压htc相关驱动
$ cd $ANDROID
$ vi buildspecmk # 新建配置文件
----
Vim htc_dreammk
vim /oracle/android/src/vendor/htc/dream-open/htc_dreammk
在头部增加
PRODUCT_PACKAGES := \
Calculator \
Email \
ImProvider \
SdkSetup \
VoiceDialer
完成。
回到根目录
cd /oracle/android/src
vim buildspecmk
加入( 201077 不需要加入):
#TARGET_PRODUCT:=htc_dream
#TARGET_PREBUILT_KERNEL:=kernel/arch/arm/boot/zImage
增加:
CUSTOM_LOCALES:=zh_CN
然后:
其中增加环境:
ubuntu 810 , sudo apt-get libelf-dev
make clean
// 保证PC有 1280 内存, 加上 1000 SWAP空间虚拟机也是如此
然后开始编译 BOOTIMG SYSTEMIMG USERDATAIMG:
make -j2
接下来
mmm -B $ANDROID/packages/apps/Luancher/ snod
cd out/target/product/dream-open/
//先测试:
emulator -system -kernel ~/cupcake/prebuilt/android-arm/kernel/kernel-qemu -data userdataimg
因为出来了BOOTIMG这个是真机的所以不能用BOOT做为内核要用模拟器来做内核
//然后开始烧机
fastboot flash boot bootimg
fastboot flash system systemimg
fastboot flash userdata userdataimg
fastboot reboot


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

原文地址: http://outofmemory.cn/zz/13266945.html

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

发表评论

登录后才能评论

评论列表(0条)

保存