Android11 —— 自定义添加一个System Services
1.Android 11 -- 强制清理app后台,关于权限引发的问题2.Android 11 (MTK)状态栏图标反色-->跟随当前应用变化代码流程3.Android 11 --关于Toast的异常4.Android 11 -- 关于dialog和悬浮窗导致SystemUI状态栏下拉频繁闪烁(窗口焦点问题)5.Android 11 下拉菜单长按WiFi图标SystemUI ANR6.Android 11 sim卡来电不弹出悬浮通知,默认来电默认全屏7.Android Bluetooth 蓝牙开发/蓝牙协议 小结
8.Android11 —— 自定义添加一个System Services
9.Android系统——AOSP相关-->随记10.Android11 , Launcher3 切换阿拉伯语,最近应用(后台)不能滑动11.Android 底层问题日志记录12.Android 11 -- app 服务保活13.Android11 - 添加自定义服务注意事项14.Android 11 导航栏添加一个虚拟按钮--问题合集15.Android 11--设置第三方Launcher并默认 与 如何预置apk16.Android11 系统修改 AOSP输入法的默认输入键盘布局17.Settings里面切换不同Launcher的代码流程18.关于Android`系统默认屏保`19.关于Android 11 Settings添加新的选项界面的细节20.Android 11 自由窗口模式 || 全屏模式启动app21.强制app横屏显示或者竖屏显示(动态)22.Android 11 禁止从SD卡上安装第三方应用23.实体物理音量键替换为home键24.AMS- kill Launcher进程的代码流程25.Android 11 recovery恢复出厂设置保留某些文件26.Android 11 禁用 adb root (userdebug版本)27.Android11 应用默认获取通知使用权限(可以获取系统所有通知信息)28.Android 11 UsbDebug 关于adb RSA 认证29.Android 11 NavigationBar && Status Bar 如果改变背景颜色30.Anroid 11 关于NotificationManager && NotificationManagerService -- 衍生到权限管理31.Android13 控制设置界面 双栏显示或单栏显示32.Android 13 大屏显示时关于SystemUI和Launcher3问题33.Android 系统适配无源码app34.Android 11 关于app的权限重置35.Android 11.0 关于app进程保活36.Android 11 关于按键拦截/按键事件处理分享37.Android R Settings关于屏保/PowerManagerService欺骗系统不让其进入休眠状态38.Android13 关于SystemUI更新/Nav Bar add volume button&&other button39.Android 13 移植EthernetSettings/Ethernet更新40.Anrdoir 13 关于设置静态IP后,突然断电,在上电开机卡动画41.Android T(13) The app is granted permissions by default42.Android T 关于屏幕旋转 (一)43.Android T about screen rotation(二)44.Android 13 about launcher3 (1)45.Android T don't abort background activity starts46.Android T adout replace bootanimation47.Launcher start App WINDOWING_MODE_FREEFORM48.Android 11 About SleepToken / (Settings)Screen timeout49.Settings.System数据监听/prop&SystemProperties数据监听怎么添加一个System Services 系统服务 ,步骤如下:
1.添加ITwwManager.aidl
//frameworks\base\core\java\android\hardware\tww\ITwwManager.aidl
package android.hardware.tww;
/** @hide */
interface ITwwManager {
String getName();
}
2.添加Context变量
//frameworks\base\core\java\android\content\Context.java
/** add text tww**/
public static final String TWW_SERVICE = "tww";
3.编写系统服务
//frameworks/base/services/core/java/com/android/server/tww/TwwManagerService.java
package com.android.server.tww;
import android.content.Context;
import android.hardware.tww.ITwwManager;
public class TwwManagerService extends ITwwManager.Stub {
private final Context mContext;
public TwwManagerService(Context context) {
super();
mContext = context;
}
@Override
public String getName() {
String name = "Tww hello..";
return name;
}
}
4.在SystemServer中添加系统服务
/**
* Starts a miscellaneous grab bag of stuff that has yet to be refactored and organized.
*/
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
t.traceBegin("startOtherServices");
final Context context = mSystemContext;
......
// add test tww
t.traceBegin("SystemServer TwwManagerService");
ServiceManager.addService(Context.TWW_SERVICE, new TwwManagerService(context));
t.traceEnd();
{
5.编写 Manager 类,暴露接口
//frameworks/base/core/java/android/hardware/tww/TwwManager.java
package android.hardware.tww;
import android.os.IBinder;
import android.os.ServiceManager;
import android.hardware.tww.ITwwManager;
import android.content.Context;
import android.os.RemoteException;
import android.compat.annotation.UnsupportedAppUsage;
import android.annotation.Nullable;
import android.os.ServiceManager.ServiceNotFoundException;
import android.annotation.SystemService;
@SystemService(Context.TWW_SERVICE)
public class TwwManager {
private static TwwManager sInstance;
private final ITwwManager mService;
private Context mContext;
/**
* @hide
*/
public TwwManager(ITwwManager iTwwManager) {
mService = iTwwManager;
}
/**
* Gets an instance of the tww manager.
*
* @return The tww manager instance.
* @hide
*/
@UnsupportedAppUsage
public static TwwManager getInstance() {
// android.util.Log.d("wxl", "tww getInstance");
synchronized (TwwManager.class) {
if (sInstance == null) {
try {
IBinder b = ServiceManager.getServiceOrThrow(Context.TWW_SERVICE);
sInstance = new TwwManager(ITwwManager.Stub
.asInterface(ServiceManager.getServiceOrThrow(Context.TWW_SERVICE)));
} catch (ServiceNotFoundException e) {
throw new IllegalStateException(e);
}
}
return sInstance;
}
}
@Nullable
public String getName() {
android.util.Log.d("tww", "TwwManager getName");
try {
return mService.getName();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
6.注册 Manager 类 ,不要忘记导入相应的包,前面的也是
//frameworks/base/core/java/android/app/SystemServiceRegistry.java
import android.hardware.tww.TWwManager;
// Not instantiable.
private SystemServiceRegistry() { }
static {
//add test tww
registerService(Context.TWW_SERVICE, TwwManager.class,
new CachedServiceFetcher<TwwManager>() {
@Override
public TwwManager createService(ContextImpl ctx) {
android.util.Log.d("tww","SystemServiceRegistry registerService");
return TwwManager.getInstance();
}});
........
{
最后,调用
mContext = getApplicationContext();
TwwManager mTwwManager = (TwwManager)mContext.getSystemService(Context.TWW_SERVICE);
android.util.Log.d("tww","Name="+ mTwwManager.getName());
问题
记得执行make update-api 更新framework中的接口,执行后,如何查看是否更新:
\frameworks\base\api\current.txt
package android.hardware.tww {
public class TwwManager {
method @Nullable public String getName();
}
}
package android.hardware.usb {
public class UsbAccessory implements android.os.Parcelable {
method public int describeContents();
method @Nullable public String getDescription();
编译中可能会遇到很多的问题,一定要仔细查看报错日志,不要只知道伸手党!!!
大部分原因可能是因为你添加代码时没有导入相应的包,导致编译找不到类。
可能会遇到的问题,原作
参考
系统服务里面添加一个自定义函数
./frameworks/base/services/core/java/com/android/server/audio/AudioService.java
private String getAudioFocusPkg = "";
//请求音频焦点
public int requestAudioFocus(AudioAttributes aa, int durationHint, IBinder cb,
IAudioFocusDispatcher fd, String clientId, String callingPackageName, int flags,
IAudioPolicyCallback pcb, int sdk) {
......
int ret = mMediaFocusControl.requestAudioFocus(aa, durationHint, cb, fd,
clientId, callingPackageName, flags, sdk,
forceFocusDuckingForAccessibility(aa, durationHint, uid));
android.util.Log.d("TAG",callingPackageName + " requestAudioFocus ret = "+ret);//add
if(ret == AudioManager.AUDIOFOCUS_REQUEST_GRANTED)getAudioFocusPkg = callingPackageName;//add
return ret;
}
//放弃音频焦点
public int abandonAudioFocus(IAudioFocusDispatcher fd, String clientId, AudioAttributes aa,
String callingPackageName) {
......
if (aa != null && !isValidAudioAttributesUsage(aa)) {
Log.w(TAG, "Request using unsupported usage.");
mmi.set(MediaMetrics.Property.EARLY_RETURN, "unsupported usage").record();
return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
}
mmi.record();
int ret = mMediaFocusControl.abandonAudioFocus(fd, clientId, aa, callingPackageName);
//add
android.util.Log.d("TAG",callingPackageName + " abandonAudioFocus ret = "+ret);
if(ret == AudioManager.AUDIOFOCUS_REQUEST_GRANTED && getAudioFocusPkg.equals(callingPackageName)){
getAudioFocusPkg = callingPackageName;
}
//end
return ret;
}
//add a textFunction about audiofocus start
public String setTextFunction(){
android.util.Log.d("TAG","to setTextFunction");
return getAudioFocusPkg;
}
//add a textFunction about audiofocus end
./frameworks/base/media/java/android/media/IAudioService.aidl
interface IAudioService {
......
String setTextFunction();//add
......
}
./frameworks/base/media/java/android/media/AudioManager.java
public class AudioManager {
......
public String setTextFunction(){
final IAudioService service = getService();
try {
return service.setTextFunction();
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
}
修改framework/base下面的api要注意更新api/current.txt文件,如何更新?
1:如果修改了Android原有API的 ,需要执行 update frameworks/base/api/current.txt,系统会自动更新这个文件!
切记:不能手动更改api/current.txt文件去更新 !!!
2:如果我们对framework/base/下新增aidl,需要执行 make update-api
分类:
Android
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库