睡觉睡觉,我可懒得老是管 XML 和几个接口/抽象类定义的事情...
CachedServiceFetcher、registerService、permission-group、checkSelfOrCallingPermission 什么的,你们自己看吧,给张图就跑~
CachedServiceFetcher、registerService、permission-group、checkSelfOrCallingPermission 什么的,你们自己看吧,给张图就跑~
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
😲 Sticker
该死... 又多写了(
https://github.com/duangsuse/RandomPicture/commit/440b8a1c7d2251b0074c1571c0d07c613628fc54
支持了个刷新功能,可以使用 Ctrl-|
https://github.com/duangsuse/RandomPicture/blob/master/src/main/kotlin/org/duangsuse/fushion/RandomPicture.kt#L76
https://github.com/duangsuse/RandomPicture/commit/440b8a1c7d2251b0074c1571c0d07c613628fc54
支持了个刷新功能,可以使用 Ctrl-|
SIGQUIT 退出程序https://github.com/duangsuse/RandomPicture/blob/master/src/main/kotlin/org/duangsuse/fushion/RandomPicture.kt#L76
GitHub
Feat(Main): Add Signal: Ctrl-C SIGINT refresh · duangsuse/RandomPicture@440b8a1
- And see file list!
因为 Telegram 一直连不上,白白浪费了很多时间!
This media is not supported in your browser
VIEW IN TELEGRAM
效率.... 🤐
那既然已经花了很多时间就再多花一点(皮)
演示一下这个功能:
[DuangSUSE@duangsuse]
~/WallpapperSlide% cd ~/Projects/RandomPicture
~/Projects/RandomPicture% ./gradlew build
BUILD SUCCESSFUL in 1s
12 actionable tasks: 9 executed, 3 up-to-date
~/Projects/RandomPicture% cp build/libs/server-1.0-SNAPSHOT.jar ~/bin; cd -
四月 01, 2019 11:29:18 上午 org.duangsuse.fushion.RandomPicture
信息: Checking with regex /^.*\.(png|jpg|jpeg|gif|webp|raw|bmp|img|svg)$/
Server started at http://localhost:8080
信息: Registering refresh list signal handler...
信息: Finished registration
严重: Failed in deploying verticle
io.vertx.core.impl.NoStackTraceThrowable: Input path /app/favourite (RANDOM_PICTURE) should be exists and is folder
(其实我应该用 then 而不是 all 的,不过机不可失,逃跑)
信息: Begin indexing images
四月 01, 2019 11:29:31 上午 org.duangsuse.fushion.RandomPicture
信息: Begin >
四月 01, 2019 11:29:31 上午 org.duangsuse.fushion.RandomPicture
信息: Finished > (.) costs 1 ms
信息: Finished > (png) costs 0 ms
四月 01, 2019 11:29:31 上午 org.duangsuse.fushion.RandomPicture
警告: Ignoring non-picture file ./png
警告: 8 files ignored, 75 files added
信息: Finished indexing images size 75 costs 19 ms
Server started at http://localhost:8080
信息: Registering refresh list signal handler...
信息: Finished registration
<Ctrl-C(INT)
信息: Refreshing pictures list...
== All files
0: /home/DuangSUSE/WallpapperSlide/昨日青空/./后来谁又在这里装作不经意的看过谁.jpg
...
74: /home/DuangSUSE/WallpapperSlide/昨日青空/./l-2.jpg
信息: Begin Cleaning old list
信息: Finished Cleaning old list costs 1 ms
信息: Begin Indexing new images...
警告: 8 files ignored, 75 files added
信息: Finished Indexing new images... 0 files added costs 14 ms
<Ctrl+Z(HUP)
mv origin.jpg.bak origin.jpg
fg %RANDOM_PICTURE=.
警告: 7 files ignored, 76 files added
信息: Finished Indexing new images... 1 files added costs 7 ms
== New files
/home/DuangSUSE/WallpapperSlide/昨日青空/./origin.jpg
<Ctrl+Z
kill -TERM %RANDOM_PICTURE=.
🤔 SIGQUIT 都被 HotSpot 占用了... 欸
如果是生产环境的话,可以用 USR1、USR2 代替这种操作,毕竟也不常用(可以用于不停服刷新静态数据)。
当然,Java 也提供了文件夹更新监听器,所以这种操作完全不用手工弄,也不用完全重新扫描整个文件树,直接用 fs watcher 监听就好 #backend #Kotlin #Java
其他操作,比如输出更新 log 什么的,可以试试 UNIX Signal
那既然已经花了很多时间就再多花一点(皮)
演示一下这个功能:
[DuangSUSE@duangsuse]
~/WallpapperSlide% cd ~/Projects/RandomPicture
~/Projects/RandomPicture% ./gradlew build
BUILD SUCCESSFUL in 1s
12 actionable tasks: 9 executed, 3 up-to-date
~/Projects/RandomPicture% cp build/libs/server-1.0-SNAPSHOT.jar ~/bin; cd -
##~/WallpapperSlide% java -jar ~/bin/server-1.0-SNAPSHOT.jar
四月 01, 2019 11:29:18 上午 org.duangsuse.fushion.RandomPicture
信息: Checking with regex /^.*\.(png|jpg|jpeg|gif|webp|raw|bmp|img|svg)$/
Server started at http://localhost:8080
信息: Registering refresh list signal handler...
信息: Finished registration
严重: Failed in deploying verticle
io.vertx.core.impl.NoStackTraceThrowable: Input path /app/favourite (RANDOM_PICTURE) should be exists and is folder
(其实我应该用 then 而不是 all 的,不过机不可失,逃跑)
##
RANDOM_PICTURE=. java -jar ~/bin/server-1.0-SNAPSHOT.jar信息: Begin indexing images
四月 01, 2019 11:29:31 上午 org.duangsuse.fushion.RandomPicture
信息: Begin >
四月 01, 2019 11:29:31 上午 org.duangsuse.fushion.RandomPicture
信息: Finished > (.) costs 1 ms
信息: Finished > (png) costs 0 ms
四月 01, 2019 11:29:31 上午 org.duangsuse.fushion.RandomPicture
警告: Ignoring non-picture file ./png
警告: 8 files ignored, 75 files added
信息: Finished indexing images size 75 costs 19 ms
Server started at http://localhost:8080
信息: Registering refresh list signal handler...
信息: Finished registration
<Ctrl-C(INT)
信息: Refreshing pictures list...
== All files
0: /home/DuangSUSE/WallpapperSlide/昨日青空/./后来谁又在这里装作不经意的看过谁.jpg
...
74: /home/DuangSUSE/WallpapperSlide/昨日青空/./l-2.jpg
信息: Begin Cleaning old list
信息: Finished Cleaning old list costs 1 ms
信息: Begin Indexing new images...
警告: 8 files ignored, 75 files added
信息: Finished Indexing new images... 0 files added costs 14 ms
<Ctrl+Z(HUP)
mv origin.jpg.bak origin.jpg
fg %RANDOM_PICTURE=.
警告: 7 files ignored, 76 files added
信息: Finished Indexing new images... 1 files added costs 7 ms
== New files
/home/DuangSUSE/WallpapperSlide/昨日青空/./origin.jpg
<Ctrl+Z
kill -TERM %RANDOM_PICTURE=.
🤔 SIGQUIT 都被 HotSpot 占用了... 欸
如果是生产环境的话,可以用 USR1、USR2 代替这种操作,毕竟也不常用(可以用于不停服刷新静态数据)。
当然,Java 也提供了文件夹更新监听器,所以这种操作完全不用手工弄,也不用完全重新扫描整个文件树,直接用 fs watcher 监听就好 #backend #Kotlin #Java
其他操作,比如输出更新 log 什么的,可以试试 UNIX Signal
duangsuse::Echo
最后完整注释的版本 #Android
最后,快速了解一下 #Android 系统服务吧,看来这个星期又是啥都没干成... 🤐
== 简而言之
就是简单的『强类型』 C/S 架构喽
(下面的 Class#method% 方法表示我不想提及 method 的方法列表,但它是方法不是实例字段)
Service,就是 Android IPC 的 OOService
Service Server 使用 ServiceManager#addService% 和 ServiceManager#getService% 注册和获取 IBinder
一般要进行权限认证,Context#checkCallingOrSelfPermission
没有 Context,使用 ActivityThread 拿到 system main thread,再拿 system Context。
检查相等性 PackageManager.PERMISSION_GRANTED
XML 符号:
tag permission-group { android:name android:icon android:label }
tag permission { android:name android:icon android:label android:permission-group android:protectionLevel }
Client,就是 OO,它找 ServiceManager 拿到一个 IBinder 对象,然后进行 IOOService.Stub.asService 转换,保证接口是清真无混乱的(IBinder 好比果的 HTTP 协议、AIDL 则是我们自己对协议的约束)
API,就是 IOOService,可以使用 AIDL 语言定义,用来利用 Android IPC 系统传递我们自己的消息
Manager,就是你自己提供一些辅助函数,比如
—> 应用程序
class Vibrator
class android.os.SystemVibrator extends Vibrator
AIDL interface IVibratorService
abstact class IVibratorService.Stub
public class VibratorService extends IVibratorService.Stub implements InputManager.InputDeviceListener
public void VibratorService#vibrate(int uid, String opPkg, long milliseconds, int usageHint, IBinder token)
Context#getSystemService(@ServiceName String! serviceId)
Context.VIBRATOR_SERVICE
—> SystemServer
class com.android.server.SystemServer
traceBeginAndSlog(String)
ServiceManager.addService(String, IBinder)
traceEnd()
SystemServer#startOtherServices()
SystemServer#main()
SystemServer#run()
SystemServiceManager#startService()
ServiceManager#addService(String, IBinder)
ServiceManager#getService(String)
—> Services API
class android.app.SystemServiceRegistry
abstract class CachedServiceFetcher<T> { T createService(ContextImpl ctx); }
registerService(name, ServiceFetcher)
abstract class ServiceConnection
onServiceConnected(ComponentName name, IBinder service)
IXXXService.Stub.asInterface(service);
—> Android API
class android.os.Looper
Looper#prepareMainLooper();
Looper#loop%
activityThread.getSystemContext%
ActivityThread#systemMain
android.permission.SHUTDOWN
IPowerManager
IPowerManager#shutdown
Context.POWER_SERVICE
PowerManager.SHUTDOWN_USER_REQUESTED
Context#checkCallingOrSelfPermission
http://androidxref.com/8.0.0_r4/xref/frameworks/base/services/java/com/android/server/SystemServer.java#475
== 简而言之
就是简单的『强类型』 C/S 架构喽
(下面的 Class#method% 方法表示我不想提及 method 的方法列表,但它是方法不是实例字段)
Service,就是 Android IPC 的 OOService
Service Server 使用 ServiceManager#addService% 和 ServiceManager#getService% 注册和获取 IBinder
abstract class ServiceConnection但是注册 Service 对象的程序应该持续运行,一般使用 Looper 的 mainLooper
onServiceConnected(ComponentName name, IBinder service)
一般要进行权限认证,Context#checkCallingOrSelfPermission
没有 Context,使用 ActivityThread 拿到 system main thread,再拿 system Context。
检查相等性 PackageManager.PERMISSION_GRANTED
XML 符号:
tag permission-group { android:name android:icon android:label }
tag permission { android:name android:icon android:label android:permission-group android:protectionLevel }
Client,就是 OO,它找 ServiceManager 拿到一个 IBinder 对象,然后进行 IOOService.Stub.asService 转换,保证接口是清真无混乱的(IBinder 好比果的 HTTP 协议、AIDL 则是我们自己对协议的约束)
API,就是 IOOService,可以使用 AIDL 语言定义,用来利用 Android IPC 系统传递我们自己的消息
Manager,就是你自己提供一些辅助函数,比如
getOOService()
== 根据符号们:—> 应用程序
class Vibrator
class android.os.SystemVibrator extends Vibrator
AIDL interface IVibratorService
abstact class IVibratorService.Stub
public class VibratorService extends IVibratorService.Stub implements InputManager.InputDeviceListener
public void VibratorService#vibrate(int uid, String opPkg, long milliseconds, int usageHint, IBinder token)
Context#getSystemService(@ServiceName String! serviceId)
Context.VIBRATOR_SERVICE
—> SystemServer
class com.android.server.SystemServer
traceBeginAndSlog(String)
ServiceManager.addService(String, IBinder)
traceEnd()
SystemServer#startOtherServices()
SystemServer#main()
SystemServer#run()
SystemServiceManager#startService()
ServiceManager#addService(String, IBinder)
ServiceManager#getService(String)
—> Services API
class android.app.SystemServiceRegistry
abstract class CachedServiceFetcher<T> { T createService(ContextImpl ctx); }
registerService(name, ServiceFetcher)
abstract class ServiceConnection
onServiceConnected(ComponentName name, IBinder service)
IXXXService.Stub.asInterface(service);
—> Android API
class android.os.Looper
Looper#prepareMainLooper();
Looper#loop%
activityThread.getSystemContext%
ActivityThread#systemMain
android.permission.SHUTDOWN
IPowerManager
IPowerManager#shutdown
Context.POWER_SERVICE
PowerManager.SHUTDOWN_USER_REQUESTED
Context#checkCallingOrSelfPermission
http://androidxref.com/8.0.0_r4/xref/frameworks/base/services/java/com/android/server/SystemServer.java#475
blog.yuuta.moe
从 Vibrator 到系统服务
这是一篇从前博客迁移来的文章。
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from Doge
欢迎回来,亲爱的Doge AxuUnW !
获得了本月 3466 MB 流量,下月 1603.5 MB 流量
获得了本月 3466 MB 流量,下月 1603.5 MB 流量
啊看来这种公益项目还是救命啊,可惜我网上经济不自由不能使用付费服务