当前位置:首页 » 安卓系统 » spaceandroid

spaceandroid

发布时间: 2023-03-09 01:56:04

1. app:和android:namespace的区别

在 Android Studio 上为第三方和自定义控件写命名空间就比较容易了,直接统一写为 xmlns:app=”http://schemas.android.com/apk/res-auto” 即可,无需带上麻烦的包名,当然,如果你在 Android Studio并且使用 Gradle 构建的时候,不这样写也无法通过编译

2. android是什么文件夹可以删除

分析如下:

可以删除,但是会重新生成的。这个是系统的缓存文件,删了之后可能你存在手机上 的一些东西就不见了。建议不要删除,里面一个是data文件及是存放数据的一个obb文件夹。

(2)spaceandroid扩展阅读

1、Android是一种基于linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。

2、Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。Android的Logo是由Ascender公司设计的,诞生于2010年,其设计灵感源于男女厕所门上的图形符号, 于是布洛克绘制了一个简单的机器人,它的躯干就像锡罐的形状,头上还有两根天线,Android小机器人便诞生了。其中的文字使用了Ascender公司专门制作的称之为“Droid ” 的字体。Android是一个全身绿色的机器人,绿色也是Android的标志。

3、Android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。

4、Android 是运行于Linux kernel之上,但并不是GNU/Linux。因为在一般GNU/Linux 里支持的功能,Android 大都没有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以Bionic 取代Glibc、以Skia 取代Cairo、再以opencore取代FFmpeg等等。Android 为了达到商业应用,必须移除被GNU GPL授权证所约束的部份,例如Android将驱动程序移到 Userspace,使得Linux driver 与 Linux kernel彻底分开。Bionic/Libc/Kernel/ 并非标准的Kernel header files。Android 的 Kernel header 是利用工具由 Linux Kernel header 所产生的,这样做是为了保留常数、数据结构与宏。

5、Android开发四大组件分别是:活动(Activity): 用于表现功能。服务(Service): 后台运行服务,不提供界面呈现。广播接收器(BroadcastReceiver):用于接收广播。内容提供商(Content Provider): 支持在多个应用中存储和读取数据,相当于数据库

参考资料:(网络:Android)

3. android (安卓)是完全开源的吗

android (安卓)是完全开源的。

Android是一种基于Linux的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由Google(谷歌)公司和开放手机联盟领导及开发。

尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。

2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。

(3)spaceandroid扩展阅读:

一、发展历程

2003年10月,Andy Rubin等人创建Android公司,并组建Android团队。

2005年8月17日,Google低调收购了成立仅22个月的高科技企业Android及其团队。安迪鲁宾成为Google公司工程部副总裁,继续负责Android项目。

2007年11月5日,谷歌公司正式向外界展示了这款名为Android的操作系统,并且在这天谷歌宣布建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成。

并与84家硬件制造商、软件开发商及电信营运商组成开放手持设备联盟(Open Handset Alliance)来共同研发改良Android系统,这一联盟将支持谷歌发布的手机操作系统以及应用软件,Google以Apache免费开源许可证的授权方式,发布了Android的源代码。

2008年,在GoogleI/O大会上,谷歌提出了AndroidHAL架构图,在同年8月18号,Android获得了美国联邦通信委员会(FCC)的批准,在2008年9月,谷歌正式发布了Android 1.0系统,这也是Android系统最早的版本。

二、系统内核

Android 是运行于Linux kernel之上,但并不是GNU/Linux。因为在一般GNU/Linux 里支持的功能,Android 大都没有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。

Android又以Bionic 取代Glibc、以Skia 取代Cairo、再以opencore取代FFmpeg等等。Android 为了达到商业应用,必须移除被GNU GPL授权证所约束的部份,例如Android将驱动程序移到 Userspace,使得Linux driver 与 Linux kernel彻底分开。

Bionic/Libc/Kernel/ 并非标准的Kernel header files。Android 的 Kernel header 是利用工具由 Linux Kernel header 所产生的,这样做是为了保留常数、数据结构与宏。

Android 的 Linux kernel控制包括安全(Security),存储器管理(Memory Management),程序管理(Process Management),网络堆栈(Network Stack),驱动程序模型(Driver Model)等。下载Android源码之前,先要安装其构建工具 Repo来初始化源码。Repo 是 Android 用来辅助Git工作的一个工具。

4. 如何在android的jni线程中实现回调

JNI回调是指在c/c++代码中调用java函数,当在c/c++的线程中执行回调函数时,会导致回调失败。

其中一种在Android系统的解决方案是:

把c/c++中所有线程的创建,由pthread_create函数替换为由Java层的创建线程的函数AndroidRuntime::createJavaThread。

假设有c++函数:

[cpp] view plain
void *thread_entry(void *args)
{
while(1)
{
printf("thread running...\n");
sleep(1);
}

}

void init()
{
pthread_t thread;
pthread_create(&thread,NULL,thread_entry,(void *)NULL);
}

init()函数创建一个线程,需要在该线程中调用java类Test的回调函数Receive:

[cpp] view plain
public void Receive(char buffer[],int length){
String msg = new String(buffer);
msg = "received from jni callback:" + msg;
Log.d("Test", msg);
}

首先在c++中定义回调函数指针:

[cpp] view plain
//test.h
#include <pthread.h>
//function type for receiving data from native
typedef void (*ReceiveCallback)(unsigned char *buf, int len);

/** Callback for creating a thread that can call into the Java framework code.
* This must be used to create any threads that report events up to the framework.
*/
typedef pthread_t (* CreateThreadCallback)(const char* name, void (*start)(void *), void* arg);

typedef struct{
ReceiveCallback recv_cb;
CreateThreadCallback create_thread_cb;
}Callback;

再修改c++中的init和thread_entry函数:

[cpp] view plain
//test.c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/wait.h>
#include <unistd.h>
#include "test.h"

void *thread_entry(void *args)
{
char *str = "i'm happy now";
Callback cb = NULL;
int len;
if(args != NULL){
cb = (Callback *)args;
}

len = strlen(str);
while(1)
{
printf("thread running...\n");
//invoke callback method to java
if(cb != NULL && cb->recv_cb != NULL){
cb->recv_cb((unsigned char*)str, len);
}
sleep(1);
}

}

void init(Callback *cb)
{
pthread_t thread;
//pthread_create(&thread,NULL,thread_entry,(void *)NULL);
if(cb != NULL && cb->create_thread_cb != NULL)
{
cb->create_thread_cb("thread",thread_entry,(void *)cb);
}
}

然后在jni中实现回调函数,以及其他实现:

[cpp] view plain
//jni_test.c
#include <stdlib.h>
#include <malloc.h>
#include <jni.h>
#include <JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"

#include "test.h"
#define RADIO_PROVIDER_CLASS_NAME "com/tonny/Test"

using namespace android;

static jobject mCallbacksObj = NULL;
static jmethodID method_receive;

static void (JNIEnv* env, const char* methodName) {
if (env->ExceptionCheck()) {
LOGE("An exception was thrown by callback '%s'.", methodName);
LOGE_EX(env);
env->ExceptionClear();
}
}

static void receive_callback(unsigned char *buf, int len)
{
int i;
JNIEnv* env = AndroidRuntime::getJNIEnv();
jcharArray array = env->NewCharArray(len);
jchar *pArray ;

if(array == NULL){
LOGE("receive_callback: NewCharArray error.");
return;
}

pArray = (jchar*)calloc(len, sizeof(jchar));
if(pArray == NULL){
LOGE("receive_callback: calloc error.");
return;
}

// buffer to jchar array
for(i = 0; i < len; i++)
{
*(pArray + i) = *(buf + i);
}
// buffer to jcharArray
env->SetCharArrayRegion(array,0,len,pArray);
//invoke java callback method
env->CallVoidMethod(mCallbacksObj, method_receive,array,len);
//release resource
env->DeleteLocalRef(array);
free(pArray);
pArray = NULL;

(env, __FUNCTION__);
}

static pthread_t create_thread_callback(const char* name, void (*start)(void *), void* arg)
{
return (pthread_t)AndroidRuntime::createJavaThread(name, start, arg);
}

static Callback mCallbacks = {
receive_callback,
create_thread_callback
};

static void jni_class_init_native
(JNIEnv* env, jclass clazz)
{
method_receive = env->GetMethodID(clazz, "Receive", "([CI)V");
}

static int jni_init
(JNIEnv *env, jobject obj)
{

if (!mCallbacksObj)
mCallbacksObj = env->NewGlobalRef(obj);

return init(&mCallbacks);
}

static const JNINativeMethod gMethods[] = {
{ "class_init_native", "()V", (void *)jni_class_init_native },
{ "native_init", "()I", (void *)jni_init },
};

static int registerMethods(JNIEnv* env) {

const char* const kClassName = RADIO_PROVIDER_CLASS_NAME;
jclass clazz;
/* look up the class */
clazz = env->FindClass(kClassName);
if (clazz == NULL) {
LOGE("Can't find class %s/n", kClassName);
return -1;
}
/* register all the methods */
if (env->RegisterNatives(clazz,gMethods,sizeof(gMethods)/sizeof(gMethods[0])) != JNI_OK)
{
LOGE("Failed registering methods for %s/n", kClassName);
return -1;
}
/* fill out the rest of the ID cache */
return 0;
}

jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env = NULL;
jint result = -1;
LOGI("Radio JNI_OnLoad");
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
LOGE("ERROR: GetEnv failed/n");
goto fail;
}

if(env == NULL){
goto fail;
}
if (registerMethods(env) != 0) {
LOGE("ERROR: PlatformLibrary native registration failed/n");
goto fail;
}
/* success -- return valid version number */
result = JNI_VERSION_1_4;
fail:
return result;
}

jni的Android.mk文件中共享库设置为:

[cpp] view plain
LOCAL_SHARED_LIBRARIES := liblog libcutils libandroid_runtime libnativehelper

最后再实现Java中的Test类:

[java] view plain
//com.tonny.Test.java

public class Test {

static{
try {
System.loadLibrary("test");
class_init_native();

} catch(UnsatisfiedLinkError ule){
System.err.println("WARNING: Could not load library libtest.so!");
}

}

public int initialize() {
return native_radio_init();
}

public void Receive(char buffer[],int length){
String msg = new String(buffer);
msg = "received from jni callback" + msg;
Log.d("Test", msg);
}

protected static native void class_init_native();

protected native int native_init();

}

5. 如何在Android下使用Binder

1概述
Binder是基于OpenBinder,在Android系统上使用的进程间通信机制。
Binder基于Client-Server通信模式,本质上可以理解为它实现了Client对Server对象的远程调用。比如,有某个binder对象A位于Server中,该对象提供了一套函数用以实现对服务的请求,而在一个或多个Client中包含对象A的引用,Client通过该引用可以调用远端Server中对象A的接口函数,这种远端调用对Client而言,与调用本地对象并无区别。

2 通信模型
Binder机制定义了四个组件,分别是Client,Server,ServiceManager和binder驱动,其中Client,Server,ServiceManager运行于用户空间,binder驱动运行于内核空间。

binder驱动
binder驱动是内核中的一个字符设备驱动/dev/binder,它是整个Binder通信机制的核心。Client,Server,ServiceManager通过open()和ioctl()文件操作函数与binder驱动进行通信,从而实现了Client向Server发送请求,Server处理请求并返回结果到Client。具体来说,它负责进程之间Binder通信的建立,Binder在进程之间的传递,Binder引用计数管理,数据包在进程之间的传递和交互等一系列底层支持。

ServiceManager
ServiceManager是一个守护进程,负责管理服务,即所有的Server需要向ServiceManager注册服务。同时,ServiceManager向Client提供查询和获取Server的接口。

3 binder通信实例

实现一个binder通信实例,需要经过以下步骤:
(1)获得ServiceManager的对象引用
(2)向ServiceManager注册新的Service
(3)在Client中通过ServiceManager获得Service对象引用
(3)在Client中发送请求,由Service返回结果。

下面看具体的代码如何实现。

3.1 libmyservice代码实现

(1)新建目录frameworks/base/myservice/libservice,进入该目录

view plain
$ cd frameworks/base
$ mkdir myservice
$ cd myservice
$ mkdir libmyservice
$ cd libmyservice

(2)编写libmyservice/myservic.h文件

view plain
#include <utils/threads.h>

#include <utils/RefBase.h>

#include <binder/IInterface.h>

#include <binder/BpBinder.h>

#include <binder/Parcel.h>

namespace android {

class MyService : public BBinder

{

mutable Mutex mLock;

int32_t mNextConnId;

public:

static int instantiate();

MyService();

virtual ~MyService();

virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);

};

}; //namespace

(2)编写libservice/myservice.cpp文件

view plain
#include "myservice.h"

#include <binder/IServiceManager.h>

#include <binder/IPCThreadState.h>

namespace android {

static struct sigaction oldact;

static pthread_key_t sigbuskey;

int MyService::instantiate()

{

LOGE("MyService instantiate");

// defaultServiceManager ()获得ServiceManager的对象引用,addService()可向ServiceManager注册新的服务

int r = defaultServiceManager()->addService(String16("android.myservice"), new MyService());

LOGE("MyService r = %d/n", r);

return r;

}

MyService::MyService()

{

LOGV("MyService created");

mNextConnId = 1;

pthread_key_create(&sigbuskey, NULL);

}

MyService::~MyService()

{

pthread_key_delete(sigbuskey);

LOGV("MyService destroyed");

}

// 每个系统服务都继承自BBinder类,都应重写BBinder的onTransact虚函数。当用户发送请求到达Service时,系统框架会调用Service的onTransact函数,该函数分析接收到的数据包,调用相应的接口函数处理请求

status_t MyService::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)

{

switch(code)

{

case 0: {

pid_t pid = data.readInt32();

int num = data.readInt32();

num = num + 100;

reply->writeInt32(num);

return NO_ERROR;

}

break;

default:

return BBinder::onTransact(code, data, reply, flags);

}

}

}; //namespace

(3)编写libservice/Android.mk文件

view plain
# File: Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := myservice.cpp
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES := libutils libbinder
LOCAL_MODULE_TAGS := optional
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE := libmyservice

include $(BUILD_SHARED_LIBRARY)

(4)编译libmyservice.so动态库

在android源码主目录下
view plain
$ source build/envsetup.sh

including device/htc/passion/vendorsetup.sh

including device/samsung/crespo4g/vendorsetup.sh

including device/samsung/crespo/vendorsetup.sh

$ mmm frameworks/base/myservice/libmyservice/

编译成功后生成文件:out/target/proct/generic/system/lib/libmyservice.so

3.2 myserver代码实现

(1)新建目录myservice/myserver,并进入该目录

(2)编写myserver/myserver.cpp文件

view plain
#include <sys/types.h>

#include <unistd.h>

#include <grp.h>

#include <binder/IPCThreadState.h>

#include <binder/ProcessState.h>

#include <binder/IServiceManager.h>

#include <utils/Log.h>

#include <private/android_filesystem_config.h>

#include "../libmyservice/myservice.h"

using namespace android;

int main(int argc, char** argv)

{

sp<ProcessState> proc(ProcessState::self());

sp<IServiceManager> sm = defaultServiceManager();//获得ServiceManager接口

LOGI("ServiceManager: %p", sm.get());

MyService::instantiate();
//执行addService()函数,注册服务
ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();
//进入循环,等待客户端的请求
return 0;

}

(3)编写myserver/Android.mk文件

view plain
# File: Android.mk

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \

myserver.cpp

LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)

LOCAL_SHARED_LIBRARIES := \

libutils libbinder libmyservice

LOCAL_MODULE_TAGS := optional

LOCAL_PRELINK_MODULE := false

LOCAL_MODULE := myserver

include $(BUILD_EXECUTABLE)

(4)编译myserver可执行程序
在android源码主目录下执行:
view plain
$mmm frameworks/base/myservice/myserver/

编译成功后生成文件:out/target/proct/generic/symbols/system/bin/myserver

3.3 MyClient客户端代码实现
(1)新建目录myservice/myclient,进入该目录

(2)编写myclient/myclient.h文件

view plain
namespace android

{

class MyClient {

public:

void add100(int n);

private:

static const void getMyService();
//通过ServiceManager获取服务接口
};

}; //namespace

(3)编写myclient/myclient.cpp文件

view plain
#include <binder/IServiceManager.h>

#include <binder/IPCThreadState.h>

#include "myclient.h"

namespace android

{

sp<IBinder> binder;

void MyClient::add100(int n)

{

getMyService();

Parcel data, reply;

int answer;

data.writeInt32(getpid());

data.writeInt32(n);

LOGE("BpMyService::create remote()->transact()/n");

binder->transact(0, data, &reply);

answer = reply.readInt32();

printf("answner=%d/n", answer);

return;

}

const void MyClient::getMyService()

{

sp<IServiceManager> sm = defaultServiceManager();

binder = sm->getService(String16("android.myservice"));

LOGE("MyClient::getMyService %p/n",sm.get());

if (binder == 0) {

LOGW("MyService not published, waiting...");

return;

}

}

}; //namespace

using namespace android;

int main(int argc, char** argv)

{

MyClient* p = new MyClient();

p->add100(1);

return 0;

}

(4)编写myclient/Android.mk文件

view plain
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \

myclient.cpp

LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)

LOCAL_SHARED_LIBRARIES := \

libutils libbinder libmyservice

LOCAL_MODULE_TAGS := optional

LOCAL_PRELINK_MODULE := false

LOCAL_MODULE := myclient

include $(BUILD_EXECUTABLE)

(5)编译myclient可执行程序

在android源码主目录下,执行:
view plain
$ mmm frameworks/base/myservice/myclient/

编译成功后生成可执行文件:out/target/proct/generic/symbols/system/bin/myclient

3.4在模拟器上运行
(1)启动模拟器

view plain
$ cd ~/software/android/android-sdk-linux/tools
$ ./emulator -avd gbread -partition-size 512

(2)拷贝libmyservice.so到模拟器的/system/lib目录

view plain
$cd out/target/proct/generic/obj/lib
$adb remount
$ adb push libmyservice.so /system/lib

159 KB/s (10084 bytes in 0.061s)

(3)拷贝myserver到模拟器的/system/bin目录

view plain
$cd out/target/proct/generic/symbols/system/bin
$ adb push myserver /system/bin

668 KB/s (27508 bytes in 0.040s)

(4)拷贝myclient到/system/bin目录

view plain
$ adb push myclient /system/bin

1549 KB/s (46840 bytes in 0.029s)

(5)在模拟器上启动服务,并执行客户端程序。

view plain
# adb shell
# cd system/bin
# ls my*

myclient

myserver

# ./myserver
# ./myclient
answner=101/n#

由客户端程序的执行结果可知,由服务端返回的执行结果是正确的。

热点内容
为什么微信会出现账号密码错误 发布:2025-05-14 03:03:30 浏览:692
幻影脚本官网 发布:2025-05-14 03:01:13 浏览:826
servlet的webxml怎么配置 发布:2025-05-14 02:51:46 浏览:772
怎么取消手势密码 发布:2025-05-14 02:51:11 浏览:639
openvpn搭建vpn服务器搭建 发布:2025-05-14 02:47:52 浏览:998
密码忘了从哪里找 发布:2025-05-14 02:39:09 浏览:548
我的世界什么服务器有前途 发布:2025-05-14 02:30:31 浏览:528
java程序反编译 发布:2025-05-14 02:18:46 浏览:458
蛤蟆编程 发布:2025-05-14 02:17:12 浏览:643
解压缩文件后缀 发布:2025-05-14 02:14:07 浏览:304