1:android平台编译本身编写的framework级service server实录html
http://blog.sina.com.cn/s/blog_68f928c10101a4nl.html
2:Android Framework学习——如何加入并编译自定义的模块java
http://blog.csdn.net/lylwo317/article/details/53456462 Android开发:Framework添加新模块 http://www.360doc.com/content/14/0308/22/3700464_358895265.shtml Android5.1.1源码 - 在Framework中添加自定义系统服务 http://blog.csdn.net/earbao/article/details/68955330 Android5.1.1源码 - 在Framework中添加自定义系统服务 https://jaq.alibaba.com/community/art/show?spm=a313e.7916646.24000001.64.1azB9G&articleid=342 Android6.0源码添加自定义系统服务 https://www.cnblogs.com/liam999/p/5933827.html Android FrameWork 学习之Android 系统源码调试 (**_我能看明白如何在studio中导入源代码进行调试_**) https://www.cnblogs.com/liumce/p/8027559.html
3:Android Framework系统服务详解node
http://blog.csdn.net/u012169524/article/details/51264979
操做步骤:见上面3:Android Framework系统服务详解 1):linux
joe@joe-Aspire-Z3730:/media/sdb4/aosp$ source build/envsetup.sh including device/asus/tilapia/vendorsetup.sh including device/asus/grouper/vendorsetup.sh including device/asus/deb/vendorsetup.sh including device/asus/flo/vendorsetup.sh including device/asus/fugu/vendorsetup.sh including device/lge/mako/vendorsetup.sh including device/lge/hammerhead/vendorsetup.sh including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh including device/generic/mini-emulator-x86/vendorsetup.sh including device/generic/mini-emulator-x86_64/vendorsetup.sh including device/generic/mini-emulator-arm64/vendorsetup.sh including device/generic/mini-emulator-mips/vendorsetup.sh including device/htc/flounder/vendorsetup.sh including device/moto/shamu/vendorsetup.sh including device/samsung/manta/vendorsetup.sh including sdk/bash_completion/adb.bash joe@joe-Aspire-Z3730:/media/sdb4/aosp$ popd /media/sdb4/aosp/frameworks/base
2):android
joe@joe-Aspire-Z3730:/media/sdb4/aosp$ cd /media/sdb4/aosp/frameworks/base 查看系统缓存和交换分区,以便后面高速编译模块 joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ echo $USE_CCACHE 1 joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ ccache -s cache directory /home/joe/.ccache cache hit (direct) 30 cache hit (preprocessed) 0 cache miss 29410 called for link 1241 called for preprocessing 9 preprocessor error 1159 unsupported source language 819 no input file 222 files in cache 79387 cache size 7.9 Gbytes max cache size 50.0 Gbytes joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ swapon -s Filename Type Size Used Priority /dev/sdb2 partition 488444 0 -1 joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ swapon ~/swap1 swapon: /home/joe/swap1: swapon failed: Operation not permitted joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ sudo swapon ~/swap1 [sudo] password for joe: joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ swapon -s Filename Type Size Used Priority /dev/sdb2 partition 488444 0 -1 /home/joe/swap1 file 2047996 0 -2
3):shell
joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ mm ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=5.1.1 TARGET_PRODUCT=full TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a TARGET_CPU_VARIANT=generic TARGET_2ND_ARCH= TARGET_2ND_ARCH_VARIANT= TARGET_2ND_CPU_VARIANT= HOST_ARCH=x86_64 HOST_OS=linux HOST_OS_EXTRA=Linux-3.11.0-15-generic-x86_64-with-Ubuntu-12.04-precise HOST_BUILD_TYPE=release BUILD_ID=LMY47Z OUT_DIR=out ============================================ *** Build configuration changed: "sdk-eng-{en_US,ar_EG,ar_IL,bg_BG,ca_ES,cs_CZ,da_DK,de_AT,de_CH,de_DE,de_LI,el_GR,en_AU,en_CA,en_GB,en_IE,en_IN,en_NZ,en_SG,en_US,en_ZA,es_ES,es_US,fi_FI,fr_BE,fr_CA,fr_CH,fr_FR,he_IL,hi_IN,hr_HR,hu_HU,id_ID,it_CH,it_IT,ja_JP,ko_KR,lt_LT,lv_LV,nb_NO,nl_BE,nl_NL,pl_PL,pt_BR,pt_PT,ro_RO,ru_RU,sk_SK,sl_SI,sr_RS,sv_SE,th_TH,tl_PH,tr_TR,uk_UA,vi_VN,zh_CN,zh_TW}" -> "full-eng-{en_US,en_US,cs_CZ,da_DK,de_AT,de_CH,de_DE,de_LI,el_GR,en_AU,en_CA,en_GB,en_NZ,en_SG,eo_EU,es_ES,fr_CA,fr_CH,fr_BE,fr_FR,it_CH,it_IT,ja_JP,ko_KR,nb_NO,nl_BE,nl_NL,pl_PL,pt_PT,ru_RU,sv_SE,tr_TR,zh_CN,zh_HK,zh_TW,am_ET,hi_IN,en_US,en_AU,en_IN,fr_FR,it_IT,es_ES,et_EE,de_DE,nl_NL,cs_CZ,pl_PL,ja_JP,zh_TW,zh_CN,zh_HK,ru_RU,ko_KR,nb_NO,es_US,da_DK,el_GR,tr_TR,pt_PT,pt_BR,rm_CH,sv_SE,bg_BG,ca_ES,en_GB,fi_FI,hi_IN,hr_HR,hu_HU,in_ID,iw_IL,lt_LT,lv_LV,ro_RO,sk_SK,sl_SI,sr_RS,uk_UA,vi_VN,tl_PH,ar_EG,fa_IR,th_TH,sw_TZ,ms_MY,af_ZA,zu_ZA,am_ET,hi_IN,en_XA,ar_XB,fr_CA,km_KH,lo_LA,ne_NP,si_LK,mn_MN,hy_AM,az_AZ,ka_GE,my_MM,mr_IN,ml_IN,is_IS,mk_MK,ky_KG,eu_ES,gl_ES,bn_BD,ta_IN,kn_IN,te_IN,uz_UZ,ur_PK,kk_KZ,normal}" *** Forcing "make installclean"... *** rm -rf out/target/product/generic/data/* out/target/product/generic/data-qemu/* out/target/product/generic/userdata-qemu.img out/host/linux-x86/obj/NOTICE_FILES out/host/linux-x86/sdk out/target/product/generic/*.img out/target/product/generic/*.ini out/target/product/generic/*.txt out/target/product/generic/*.xlb out/target/product/generic/*.zip out/target/product/generic/kernel out/target/product/generic/data out/target/product/generic/skin out/target/product/generic/obj/APPS out/target/product/generic/obj/NOTICE_FILES out/target/product/generic/obj/PACKAGING out/target/product/generic/recovery out/target/product/generic/root out/target/product/generic/system out/target/product/generic/vendor out/target/product/generic/oem out/target/product/generic/dex_bootjars out/target/product/generic/obj/JAVA_LIBRARIES out/target/product/generic/obj/FAKE out/target/product/generic/obj/EXECUTABLES/adbd_intermediates out/target/product/generic/obj/STATIC_LIBRARIES/libfs_mgr_intermediates out/target/product/generic/obj/EXECUTABLES/init_intermediates out/target/product/generic/obj/ETC/mac_permissions.xml_intermediates out/target/product/generic/obj/ETC/sepolicy_intermediates out/target/product/generic/obj/ETC/init.environ.rc_intermediates *** Done with the cleaning, now starting the real build. find: `phone/java': No such file or directory find: `phone/java': No such file or directory make: Entering directory `/media/46bb100d-2505-4025-8425-34ecf3129209/aosp' Aidl: framework <= frameworks/base/core/java/android/service/test/IMyTestManager.aidl target Java: framework (out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes) 。。。。。。。。。。。。 Copying: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/noproguard.classes.jar target Dex: framework Copying: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.dex target Jar: framework (out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/javalib.jar) Notice file: frameworks/base/NOTICE -- out/target/product/generic/obj/NOTICE_FILES/src//system/framework/framework.jar.txt make: *** No rule to make target `out/target/product/generic/system/framework/framework-res.apk', needed by `out/target/product/generic/system/framework/framework.jar'. Stop. make: Leaving directory `/media/46bb100d-2505-4025-8425-34ecf3129209/aosp' #### make failed to build some targets (01:18 (mm:ss)) #### 虽然出现了错误,可是在/media/sdb4/aosp/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/service/test/文件夹下出现了二个文件: IMyTestManager.java IMyTestManager.P IMyTestManager.java文件内容以下: /* * This file is auto-generated. DO NOT MODIFY. * Original file: frameworks/base/core/java/android/service/test/IMyTestManager.aidl */ package android.service.test; public interface IMyTestManager extends android.os.IInterface { /** Local-side IPC implementation stub class. */ public static abstract class Stub extends android.os.Binder implements android.service.test.IMyTestManager { private static final java.lang.String DESCRIPTOR = "android.service.test.IMyTestManager"; /** Construct the stub at attach it to the interface. */ public Stub() { this.attachInterface(this, DESCRIPTOR); } /** * Cast an IBinder object into an android.service.test.IMyTestManager interface, * generating a proxy if needed. */ public static android.service.test.IMyTestManager asInterface(android.os.IBinder obj) { if ((obj==null)) { return null; } android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); if (((iin!=null)&&(iin instanceof android.service.test.IMyTestManager))) { return ((android.service.test.IMyTestManager)iin); } return new android.service.test.IMyTestManager.Stub.Proxy(obj); } @Override public android.os.IBinder asBinder() { return this; } @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { switch (code) { case INTERFACE_TRANSACTION: { reply.writeString(DESCRIPTOR); return true; } case TRANSACTION_sayHello: { data.enforceInterface(DESCRIPTOR); java.lang.String _result = this.sayHello(); reply.writeNoException(); reply.writeString(_result); return true; } case TRANSACTION_priFunction: { data.enforceInterface(DESCRIPTOR); int _result = this.priFunction(); reply.writeNoException(); reply.writeInt(_result); return true; } } return super.onTransact(code, data, reply, flags); } private static class Proxy implements android.service.test.IMyTestManager { private android.os.IBinder mRemote; Proxy(android.os.IBinder remote) { mRemote = remote; } @Override public android.os.IBinder asBinder() { return mRemote; } public java.lang.String getInterfaceDescriptor() { return DESCRIPTOR; } @Override public java.lang.String sayHello() throws android.os.RemoteException { android.os.Parcel _data = android.os.Parcel.obtain(); android.os.Parcel _reply = android.os.Parcel.obtain(); java.lang.String _result; try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(Stub.TRANSACTION_sayHello, _data, _reply, 0); _reply.readException(); _result = _reply.readString(); } finally { _reply.recycle(); _data.recycle(); } return _result; } @Override public int priFunction() throws android.os.RemoteException { android.os.Parcel _data = android.os.Parcel.obtain(); android.os.Parcel _reply = android.os.Parcel.obtain(); int _result; try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(Stub.TRANSACTION_priFunction, _data, _reply, 0); _reply.readException(); _result = _reply.readInt(); } finally { _reply.recycle(); _data.recycle(); } return _result; } } static final int TRANSACTION_sayHello = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); static final int TRANSACTION_priFunction = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); } public java.lang.String sayHello() throws android.os.RemoteException; public int priFunction() throws android.os.RemoteException; } IMyTestManager.P文件内容以下: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/service/test/IMyTestManager.java: \ frameworks/base/core/java/android/service/test/IMyTestManager.aidl
4):建立新的系统服务类 frameworks/base/core/java/android/service/test/MyTestManagerService.javaapi
package android.service.test; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; public class MyTestManagerService extends IMyTestManager.Stub{ private static final String TAG = "MyTestManagerService"; private Context mContext; public MyTestManagerService(Context context){ mContext = context; } @Override public String sayHello() throws RemoteException{ Log.d(TAG,"sayHello()"); return "Hello AIDL"; } @Override public int priFunction() throws RemoteException{ Log.d(TAG,"priFunction()"); return 0; } }
5:建立系统服务公开接串口管理类 frameworks/base/core/java/android/service/test/MyTestManager.java缓存
package android.service.test; import android.os.RemoteException; import android.util.Log; import android.service.test.IMyTestManager; public class MyTestManager{ private static final TAG="MyTestManager"; private IMyTestManager mService; public MyTestManager(IMyTestManager service){ mService = service; } public String sayHello() throws RemoteException{ Log.d(TAG,"sayHello()"); return mService.sayHello(); } }
6:将建立的服务添加进ServiceManager 文件:frameworks/base/services/java/com/android/server/SystemServer.javabash
import android.service.test.MyTestManagerService; private void startOtherServices()函数中 AudioService audioService = null; MyTestManagerService mTestService = null; 。。。。。。 try{ Slog.i(TAG,"MyTestManager Service"); mTestService = new MyTestManagerService(context); ServiceManager.addService(Context.MYTEST_SERVICE,mTestService); }catch(Throwable e){ reportWtf("starting MyTestManager",e); }
7:代码中的Context.MYTEST_SERVICE服务常量添加 路径:frameworks/base/core/java/android/content/Context.javaapp
/** @hide */ @StringDef({ AUDIO_SERVICE, MYTEST_SERVICE, 增长这行代码在@StringDef注解中 另外还在代码中 public static final String MYTEST_SERVICE = "mytest";
8:注册服务 路径:frameworks/base/core/java/android/app/ContextImpl.java
import android.service.test.IMyTestManager; import android.service.test.MyTestManager; 在静态代码块中: registerService(AUDIO_SERVICE, new ServiceFetcher() { public Object createService(ContextImpl ctx) { return new AudioManager(ctx); }}); registerService(MYTEST_SERVICE,new ServiceFetcher(){ public Object createService(ContextImpl ctx){ IBinder iBinder = ServiceManager.getService(Context.MYTEST_SERVICE); if(iBinder == null){ return null; } IMyTestManager service = IMyTestManager.Stub.asInterface(iBinder); return new MyTestManager(service); } });
另外,还要在aosp/external/sepolicy/service_contexts文件中在中间增长一行
(audio u:object_r:system_server_service:s0的下面)
mytest u:object_r:system_server_service:s0
9:我认为的编译方式(可能个人理解不正确)
joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ mm ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=5.1.1 TARGET_PRODUCT=full TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a TARGET_CPU_VARIANT=generic TARGET_2ND_ARCH= TARGET_2ND_ARCH_VARIANT= TARGET_2ND_CPU_VARIANT= HOST_ARCH=x86_64 HOST_OS=linux HOST_OS_EXTRA=Linux-3.11.0-15-generic-x86_64-with-Ubuntu-12.04-precise HOST_BUILD_TYPE=release BUILD_ID=LMY47Z OUT_DIR=out ============================================ find: `phone/java': No such file or directory find: `phone/java': No such file or directory make: Entering directory `/media/46bb100d-2505-4025-8425-34ecf3129209/aosp' make: *** No rule to make target `out/target/product/generic/system/framework/framework-res.apk', needed by `out/target/product/generic/system/framework/framework.jar'. Stop. make: Leaving directory `/media/46bb100d-2505-4025-8425-34ecf3129209/aosp' #### make failed to build some targets (1 seconds) ####
10:
joe@joe-Aspire-Z3730:/media/sdb4/aosp$ make update-api ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=5.1.1 TARGET_PRODUCT=full TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a TARGET_CPU_VARIANT=generic TARGET_2ND_ARCH= TARGET_2ND_ARCH_VARIANT= TARGET_2ND_CPU_VARIANT= HOST_ARCH=x86_64 HOST_OS=linux HOST_OS_EXTRA=Linux-3.11.0-15-generic-x86_64-with-Ubuntu-12.04-precise HOST_BUILD_TYPE=release BUILD_ID=LMY47Z OUT_DIR=out ============================================ including ./abi/cpp/Android.mk ... including ./art/Android.mk ... including ./bionic/Android.mk ... 。。。。。 Copying: out/target/common/obj/JAVA_LIBRARIES/android-support-v7-mediarouter_intermediates/classes.jar target Java: android-support-v7-palette (out/target/common/obj/JAVA_LIBRARIES/android-support-v7-palette_intermediates/classes) Copying: out/target/common/obj/JAVA_LIBRARIES/android-support-v7-palette_intermediates/classes-jarjar.jar Copying: out/target/common/obj/JAVA_LIBRARIES/android-support-v7-palette_intermediates/emma_out/lib/classes-jarjar.jar Copying: out/target/common/obj/JAVA_LIBRARIES/android-support-v7-palette_intermediates/classes.jar Docs droiddoc: out/target/common/docs/doc-comment-check DroidDoc took 264 sec. to write docs to out/target/common/docs/doc-comment-check Copying current.txt Copying removed.txt Docs droiddoc: out/target/common/docs/system-api-stubs DroidDoc took 12 sec. to write docs to out/target/common/docs/system-api-stubs Copying system-current.txt Copying system-removed.txt #### make completed successfully (12:02 (mm:ss)) ####
11:
joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ mmm core/res/ 。。。。 warning: string 'wifi_display_notification_title' is missing 87 required localizations: af_ZA am_ET ar_EG az_AZ bg_BG bn_BD ca_ES cs_CZ da_DK de_AT de_CH de_DE de_LI el_GR en_AU en_CA en_GB en_IN en_NZ en_SG en_US eo_EU es_ES es_US et_EE eu_ES fa_IR fi_FI fr_BE fr_CA fr_CH fr_FR gl_ES hi_IN hr_HR hu_HU hy_AM in_ID is_IS it_CH it_IT iw_IL ja_JP ka_GE kk_KZ km_KH kn_IN ko_KR ky_KG lo_LA lt_LT lv_LV mk_MK ml_IN mn_MN mr_IN ms_MY my_MM nb_NO ne_NP nl_BE nl_NL pl_PL pt_BR pt_PT rm_CH ro_RO ru_RU si_LK sk_SK sl_SI sr_RS sv_SE sw_TZ ta_IN te_IN th_TH tl_PH tr_TR uk_UA ur_PK uz_UZ vi_VN zh_CN zh_HK zh_TW zu_ZA warning: no entries written for dimen/password_keyboard_height (0x010500a8) Notice file: frameworks/base/core/res/NOTICE -- out/target/product/generic/obj/NOTICE_FILES/src//system/framework/framework-res.apk.txt Install: out/target/product/generic/system/framework/framework-res.apk make: Leaving directory `/media/46bb100d-2505-4025-8425-34ecf3129209/aosp' #### make completed successfully (30 seconds) ####
12:
joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ mmm -B 由于代码写错了,从新修改源代码,回家以后再重启电脑
13:开启swap ,从新配置source build/envsetup 及lunch 以后
joe@joe-Aspire-Z3730:/media/sdb4/aosp$ make -j8 ....... Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img Running: mkuserimg.sh out/target/product/generic/system out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img ext4 system 576716800 out/target/product/generic/root/file_contexts make_ext4fs -T -1 -S out/target/product/generic/root/file_contexts -l 576716800 -a system out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img out/target/product/generic/system Creating filesystem with parameters: Size: 576716800 Block size: 4096 Blocks per group: 32768 Inodes per group: 7040 Inode size: 256 Journal blocks: 2200 Label: Blocks: 140800 Block groups: 5 Reserved block group size: 39 Created filesystem with 1467/35200 inodes and 109536/140800 blocks Install system fs image: out/target/product/generic/system.img out/target/product/generic/system.img+ maxsize=588791808 blocksize=2112 total=576716800 reserve=5947392 #### make completed successfully (13:34 (mm:ss)) ####
说明编译成功了,此时须要用模拟器来看看实验结果。先要编译SDK。
14:lunch sdk-eng而后再:
joe@joe-Aspire-Z3730:/media/sdb4/aosp$ make sdk 。。。。。 Package SDK: out/host/linux-x86/sdk/sdk/android-sdk_eng.joe_linux-x86.zip SDK: warning: including GNU target out/target/product/generic/system/lib/libexif.so SDK: warning: including GNU target out/target/product/generic/system/lib/libgccdemangle.so SDK: warning: including GNU target out/target/product/generic/system/lib/libnl.so #### make completed successfully (01:02:57 (hh:mm:ss)) #### 编译完以后会在/media/sdb4/aosp/out/host/linux-x86/sdk/sdk/ 目录下产生一个android-sdk_eng.joe_linux-x86子目录及zip压缩文件,这个压缩文件其实就是android-sdk_eng.joe_linux-x86目录压缩而成。之后开发时就能够用这个子目录或zip压缩文件(解压)以后做为SDK使用。
15:joe@joe-Aspire-Z3730:/media/sdb4/aosp$ make从新编译系统以后启动模拟器,用adb shell启动shell, 而后root@generic:/system/lib # service list
26 mytest: [android.service.test.IMyTestManager]
针对步骤9中出现的错误,网上有人说:https://bbs.csdn.net/topics/370150557
1.先在framework/base目录下执行 mmm core/res/ 生成framework-res.apk 2.接着在framework/base下继续执行 mm -B 便可生成Install: out/target/product/generic/system/framework/framework.jar
简化方法:
解决了个人问题,不过我简化了一下: mmm frameworks/base/core/res/ mmm frameworks/base/
备注: 网上有人说增长了系统服务以后,须要从新编译再启动服务,我尚未到这一步,先记录下来,以备忘记
. 测试 make make update-api 更新current.xml文件 生成system.imz文件,放到<ANDROID_SDK>/platform/android-20/images/目录下, adb shell service list
还有人说:https://www.2cto.com/kf/201709/687510.html
回到根目录下执行make update-api,不然编译不能经过。先编译framework.jar,而后编译service.jar,最后编译本身加mymodule。能够用mm命令编译,没问题后再整编。由于编译出来的out目录有boot.art和boot.oat,framework.jar和service.jar不能push调试,因此只能刷整包验证。