Android源碼開發(fā)記錄-自定義系統(tǒng)服務(wù)和jar包生成

在系統(tǒng)開發(fā)中泳唠,尤其是自定義系統(tǒng)格粪,必然要封裝一些系統(tǒng)方法供第三方開發(fā)應(yīng)用使用舍哄。
1.自定義系統(tǒng)服務(wù)
除frameworks自定義服務(wù)(本文內(nèi)容)溪椎,也可以額外寫個(gè)service+aidl應(yīng)用
2.jar包生成供第三方應(yīng)用使用

開發(fā)環(huán)境
RK平臺(tái)5.1Android系統(tǒng)

一普舆、添加系統(tǒng)服務(wù)

1、創(chuàng)建服務(wù)接口aidl文件

創(chuàng)建文件 IMyApiService
文件路徑 frameworks/base/core/java/android/os/

package android.os;

interface IMyApiService{
   Integer getSum(Integer data1,Integer data2);
}

定義了一個(gè)計(jì)算和的方法校读。

2沼侣、aidl文件加入Android.mk編譯

在frameworks/base/Android.mk
LOCAL_SRC_FILES最后加入

core/java/android/os/IMyApiService.aidl \

3、創(chuàng)建service文件

創(chuàng)建文件 MyApiService.java
文件路徑 frameworks/base/core/java/com/android/server/

package com.android.server;

import android.os.RemoteException;
import android.os.IMyApiService;
import android.util.Log;
import android.content.Context;

public class MyApiService extends IMyApiService.Stub{
  private String TAG = "MyApiService";
  private Context mContext;

  public MyApiService(Context context){
       mContext = context;
  }
  
  @Override
  public Integer getSum(Integer data1,Integer data2)throws RemoteException{
       return data1+data2;
  }
}

實(shí)現(xiàn)aidl的接口地熄,計(jì)算參數(shù)和华临。

4、自定義service加入SystemServer啟動(dòng)項(xiàng)

(1)Context添加服務(wù)名
文件路徑 frameworks/base/core/java/android/content/Context.java
添加

public static final String MY_API_SERVICE = "my_api_service";

(2)添加啟動(dòng)服務(wù)
文件路徑 frameworks/base/services/java/com/android/server/SystemServer.java
在startOtherServices方法中添加

Slog.i(TAG, "Init MyApiService");
 try{
      ServiceManager.addService(Context.MY_API_SERVICE ,new MyApiService(context));
}catch(Throwable e){
       Slog.e(TAG, "Failure starting MyApiService", e);
}

5端考、創(chuàng)建Manager文件

創(chuàng)建 MyApiManager.java文件
文件路徑 frameworks/base/core/java/android/app/

package com.android.app;

import android.util.Log;
import android.os.IMyApiService;
import android.content.Context;

public class MyApiManager{
  private String TAG = "MyApiManager";
  private Context mContext;
  private IMyApiService mService;
  
  public MyApiManager(Context context,IMyApiService service){
     mContext = context;
     mService = service;
  }
  
    public Integer getSum(Integer data1,Integer data2){
      try{
        return mService.getSum(data1,data2);
      }catch(Exception e){
        Log.e(TAG,"error getSum "+e.toString());
        e.printStackTrace();
      }
      return null;
  }
}

6雅潭、注冊到SystemService

文件路徑 frameworks/base/core/java/android/app/ContextImpl
添加registerService

 registerService(MY_API_SERVICE, new ServiceFetcher() {
        public Object createService(ContextImpl ctx) {
        IBinder b = ServiceManager.getService(MY_API_SERVICE);
        return new MyApiManager(ctx,IMyApiService.Stub.asInterface(b));
        }
});

7、重新編譯源代碼

記住make update-api
編譯打包完成后却特,燒寫新的固件扶供。

二、生成jar包

jar主要為了在android studio編譯環(huán)境中MyApiManager報(bào)錯(cuò)導(dǎo)致編譯不通過問題裂明。
也可以導(dǎo)入frameworks jar包或使用反射椿浓。

1、新建JAR包文件夾

在源碼目錄packages/app下新建MyJar文件夾
并新建目錄com/myapi/(包名)

2闽晦、新建MyApi.java

在目錄com/myapi/新建文件MyApi.java

package com.myapi;
 
import android.app.MyApiManager;
import android.content.Context;

public class MyApi{
  private MyApiManager myApiManager;

  public MyApi(Context context){
      myApiManager= (MyApiManager) context.getSystemService(Context.MY_API_SERVICE);
  }

  public int getSum(int data1,int data2){
     return myApiManager.getSum(data1,data2);
  }

 }

3扳碍、新建Android.mk

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

LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES :=com/myapi/MyApi.java
LOCAL_MODULE :=Myapi
 
include $(BUILD_STATIC_JAVA_LIBRARY)

具體Android.mk語法這里不做解釋,可以自行查閱

3仙蛉、編譯生成jar文件

在MyApi目錄下直接運(yùn)行mm編譯命令(記得先source build/envsetup.sh)
待編譯完成后笋敞,jar生成目錄
out/target/common/obj/JAVA_LIBRARIES/Myapi_intermediates/javalib.jar
可更改為其他名稱。

3荠瘪、在應(yīng)用中使用jar包方法即可

 MyApi myApi = new MyApi (this);
 Log.d(TAG,"getSum="+myApi .getSum(2,5));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夯巷,一起剝皮案震驚了整個(gè)濱河市赛惩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趁餐,老刑警劉巖喷兼,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異后雷,居然都是意外死亡季惯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門臀突,熙熙樓的掌柜王于貴愁眉苦臉地迎上來星瘾,“玉大人,你說我怎么就攤上這事惧辈×兆矗” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵盒齿,是天一觀的道長念逞。 經(jīng)常有香客問我,道長边翁,這世上最難降的妖魔是什么翎承? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮符匾,結(jié)果婚禮上叨咖,老公的妹妹穿的比我還像新娘。我一直安慰自己啊胶,他們只是感情好甸各,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焰坪,像睡著了一般趣倾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上某饰,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天儒恋,我揣著相機(jī)與錄音,去河邊找鬼黔漂。 笑死诫尽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炬守。 我是一名探鬼主播牧嫉,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼劳较!你這毒婦竟也來了驹止?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤观蜗,失蹤者是張志新(化名)和其女友劉穎臊恋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墓捻,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抖仅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砖第。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撤卢。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖梧兼,靈堂內(nèi)的尸體忽然破棺而出放吩,到底是詐尸還是另有隱情,我是刑警寧澤羽杰,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布渡紫,位于F島的核電站,受9級(jí)特大地震影響考赛,放射性物質(zhì)發(fā)生泄漏惕澎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一颜骤、第九天 我趴在偏房一處隱蔽的房頂上張望唧喉。 院中可真熱鬧,春花似錦忍抽、人聲如沸八孝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唆阿。三九已至,卻和暖如春锈锤,著一層夾襖步出監(jiān)牢的瞬間驯鳖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工久免, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浅辙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓阎姥,卻偏偏與公主長得像记舆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子呼巴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353