您的位置:首页 > 移动开发 > Android开发

android4.4 framework添加第三方调用接口

2015-03-11 15:12 351 查看
近日,将第三方可执行文件封装成接口,移植到了系统中。现将曲折的成功之路做一个总结,与大家共享。

软件平台:android

硬件平台:marvell

第三方可执行文件:AA, BB;

工作需求:两个文件必须按顺序依次执行,完成功能,在framework层要提供相应的api接口,供应用程序调用。

由于此接口与wifi相关,因此framework层面将接口添加到了WifiApManager.java中,

--- a/wifi/java/android/net/wifi/WifiApManager.java

+++ b/wifi/java/android/net/wifi/WifiApManager.java

@@ -1213,6 +1213,20 @@ public class WifiApManager {

return false;

}

}

public boolean startXX() {

try {

mService.startXX();

return true;

} catch (RemoteException e) {

return false;

}

}



public boolean stopXX() {

try {

mService.stopXX();

return true;

} catch (RemoteException e) {

return false;

}

}

注意修改相应的aidl文件,否则无法调用接口。

--- a/wifi/java/android/net/wifi/IWifiApManager.aidl

+++ b/wifi/java/android/net/wifi/IWifiApManager.aidl

@@ -103,6 +103,10 @@ interface IWifiApManager

void startWifi();



void stopWifi();

+

+ void startXX();

+

+ void stopXX();

接着是主角部分的改动:

--- a/services/java/com/android/server/wifi/WifiApService.java

+++ b/services/java/com/android/server/wifi/WifiApService.java

@@ -1010,6 +1010,21 @@ public final class WifiApService extends IWifiApManager.Stub {

return info;

}



+ public void startXX() {

+ SystemProperties properties = new SystemProperties();

+

+ properties.set("ctl.stop", "XX_killer");

+ properties.set("ctl.start", "XX_start");

+

+ }

+

+ public void stopXX() {

+ SystemProperties properties = new SystemProperties();

+

+ properties.set("ctl.stop", "XX_start");

+ properties.set("ctl.start", "XX_killer");

+ }

我们看到相应的方法会开启或杀死相应的service,两个service(XX_start, XX_stop) 是在init.rc中声明定义的。

--- a/copyfiles/root/init.pxa1l88.rc

+++ b/copyfiles/root/init.pxa1l88.rc

@@ -313,6 +313,20 @@ service hostapd2 /system/bin/hostapd -dd -e/data/misc/wifi/entropy.bin /data/mis

disabled

oneshot



+# XX killer

+service XX_killer /system/bin/wifiapp_helper.sh -k

+ user root

+ group log system

+ class main

+ disabled

+

+# XX start

+service XX_start /system/bin/wifiapp_helper.sh -s

+ user root

+ group log system

+ class main

+ disabled

+

service的执行是通过wifiapp_helper.sh脚本执行完毕的,脚本内容如下:

#!/system/bin/sh

WIFIDIR=/data/weixin

SRC=/system/etc/weixin

DNSFILE=$WIFIDIR/blackWhiteDns.conf

APP_LOG0=$WIFIDIR/wifiapp.log

APP_LOG1=$WIFIDIR/wifiapp1.log

LIST_LOG0=$WIFIDIR/list.log

LIST_LOG1=$WIFIDIR/list1.log

MKDIR=mkdir

CHMOD="chmod 777"

CP=cp

CD=cd

MV=mv

RM=rm

function dirExsit() {

if [ ! -d "$WIFIDIR" ]; then

$MKDIR "$WIFIDIR"

$CP $SRC/blackwhitelist $WIFIDIR

$CP $SRC/blackwhitelist_weixin.conf $WIFIDIR

$CP $SRC/wifiapp $WIFIDIR

$CP $SRC/wifiapp.conf $WIFIDIR

$CHMOD $WIFIDIR/*

fi

}

function execWifiapp() {

$CD $WIFIDIR

echo $PWD

if [ -f $APP_LOG0 ]; then

$MV $APP_LOG0 $APP_LOG1

./AA -c wifiapp.conf &> $APP_LOG0

else

./AA -c wifiapp.conf &> $APP_LOG0

fi

}

function execBlack() {

$CD $WIFIDIR

echo $PWD

if [ -f $LIST_LOG0 ]; then

$MV $LIST_LOG0 $LIST_LOG1

./BB > $LIST_LOG0

else

./BB > $LIST_LOG0

fi

}

case $1 in

"-s" )

dirExsit

execWifiapp

execBlack

exit 0;;

"-k" )

PID=`ps | busybox grep blackwhite | awk '{print $2}'`

kill -9 $PID

PID=`ps | busybox grep wifiapp | awk '{print $2}'`

kill -9 $PID

$RM $DNSFILE

exit 0;;

esac

至此,移植添加完毕。当中遇到了必须切换到可执行文件放置的目录才能正确执行,否则报错,因此脚本需先切换目录,然后执行~~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: