Android平台下驱动的开发及测试框架概述(五)

本文介绍了Android系统如何让应用通过Java接口访问硬件服务。以一个内置应用Freg为例,详细阐述了如何通过Service Manager获取服务,利用FregService代理对象进行硬件访问,实现读写虚拟硬件设备freg寄存器的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android内置Java应用测试Application Frameworks层硬件服务

          在Android系统增加硬件服务的目的是为了让应用层的APP能够通过Java接口来访问硬件服务。那么, APP如何通过Java接口来访问Application Frameworks层提供的硬件服务呢?接下来,我们将在Android系统的应用层增加一个内置的应用程序,这个内置的应用程序通过ServiceManager接口获取指定的服务,然后通过这个服务来获得硬件服务。

文件结构:

   alps/packages/experimental/Freg

                     ----AndroidManifest.xml

                     ----Android.mk

                     ----src

                           ---Freg.java

                     ----res

                        ---layout

                            --main.xml

                        ---value

                             --strings.xml

                        ---drawable

                             --icon.png

    它包含了源代码目录src、资源目录res、配置文件AndroidManifest.xml和一个编译脚本文件Android.mk.下面我们就分别介绍每一个文件的内容.

   先看Freg.java:

   

package shy.luo.freg;

import android.app.Activity;
import android.os.ServiceManager;
import android.os.Bundle;
import android.os.IFregService;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class Freg extends Activity implements OnClickListener {
	private final static String LOG_TAG = "shy.luo.freg.FregActivity";
	
	private IFregService fregService = null;

	private EditText valueText = null;
	private Button readButton = null;
	private Button writeButton = null;
	private Button clearButton = null;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

	fregService = IFregService.Stub.asInterface(
		ServiceManager.getService("freg"));
        
        valueText = (EditText)findViewById(R.id.edit_value);
        readButton = (Button)findViewById(R.id.button_read);
        writeButton = (Button)findViewById(R.id.button_write);
        clearButton = (Button)findViewById(R.id.button_clear);

	readButton.setOnClickListener(this);
	writeButton.setOnClickListener(this);
	clearButton.setOnClickListener(this);
        
        Log.i(LOG_TAG, "Freg Activity Created");
    }
    
    @Override
    public void onClick(View v) {
    	if(v.equals(readButton)) {
		try {
    			int val = fregService.getVal();
    			String text = String.valueOf(val);
    			valueText.setText(text);
		} catch (RemoteException e) {
			Log.e(LOG_TAG, "Remote Exception while reading value from freg service.");
		}		
    	}
    	else if(v.equals(writeButton)) {
		try {
    			String text = valueText.getText().toString();
    			int val = Integer.parseInt(text);
			fregService.setVal(val);
		} catch (RemoteException e) {
			Log.e(LOG_TAG, "Remote Exception while writing value to freg service.");
		}
    	}
    	else if(v.equals(clearButton)) {
    		String text = "";
    		valueText.setText(text);
    	}
    }
}
        文件定义了一个Activity组件Freg,它是应用程序Freg的主界面。在Activity组件Freg的界面上,有一个编辑框和三个按钮Read、Write和clear,其中,编辑框用来显示或者输入虚拟硬件设备freg的寄存器val的值;按钮Read和Write分别用来读写虚拟硬件设备freg的寄存器,而按钮Clear用来清空编辑框。

     在Activity组件Freg的成员函数onCreate中,第30行通过Service Manager获得一个名为"freg”的服务的binder代理对象接口。而这个服务就对应于运行在系统进程System中的硬件访问服务FregService。因此,第29行就可以安全地将这个binder代理对象接口转换为一个FregService代理对象接口,并且保存在Activity组件Freg的成员变量fragservice中。有了这个FregService代理对象接口之后,应用程序Freg就可以通过调用它的成员函数setVal和getVal来访问虚拟硬件设备freg的寄存器val的值了,如Activity组件Freg的成员函数onClick所示。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:orientation="vertical" 
    	android:gravity="center">
    	<TextView 
			android:layout_width="wrap_content"
       		android:layout_height="wrap_content" 
        	android:text="@string/value">
    	</TextView>
    	<EditText 
     		android:layout_width="fill_parent"
        	android:layout_height="wrap_content" 
        	android:id="@+id/edit_value"
        	android:hint="@string/hint">
    	</EditText>
    </LinearLayout>
     <LinearLayout
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:orientation="horizontal" 
    	android:gravity="center">
    	<Button 
    		android:id="@+id/button_read"
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:text="@string/read">
    	</Button>
    	<Button 
    		android:id="@+id/button_write"
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:text="@string/write">
    	</Button>
    	<Button 
    		android:id="@+id/button_clear"
    		android:layout_width="wrap_content"
    		android:layout_height="wrap_content"
    		android:text="@string/clear">
    	</Button>
    </LinearLayout>
</LinearLayout>
这个是应用程序Freg的主界面配置文件,在屏幕中显示一个TextView控件和三个Button控件。

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Freg</string>
    <string name="value">Value</string>
    <string name="hint">Please input a value...</string>
    <string name="read">Read</string>
    <string name="write">Write</string>
    <string name="clear">Clear</string>
</resources>
这个是应用程序Freg的字符串资源文件,定义了在应用程序中使用到的各个字符串。

icon.png

  这个是应用程序Freg的文件图标,可以根据需求放置不同的图片文件。


AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="shy.luo.freg"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Freg"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest> 
这是应用程序Freg的配置文件,由于应用程序Freg定义了一个Activity组件Freg,因此,要在这个配置文件中对它进行配置。

Android.mk

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

LOCAL_MODULE_TAGS := optional

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

LOCAL_PACKAGE_NAME := Freg

include $(BUILD_PACKAGE)
上面的android.mk指定程序的名称为“Freg”.

下面编译打包:

./mk mm packages/experimental/Freg

./mk snod

     打包后得到的Android系统镜像文件system.img就包含了应用程序Freg,然后将生成的system.img下载到手机并开机就可以看见我们的应用程序图标及测试界面。

     应用程序Freg启动起来之后,通过点击Read按钮,就可以通过硬件访问服务FregService来读取虚拟硬件设备freg的寄存器val的内容了,而通过在编辑框中输入一个整数值,并且点击Write按钮,就可以通过硬件访问服务FregService将这个整数值写入到虚拟硬件设备freg的寄存器val中了.

   至此,Android平台下驱动的开发及测试框架概述已经介绍完毕。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值