duangsuse::Echo
716 subscribers
4.25K photos
130 videos
583 files
6.47K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
正确的打开方式:
Vibrator.svg
24 KB
Vibrator.png
255.5 KB
对应的位图 #Share #Android #svg
Vibrator.svg
27.8 KB
最后完整注释的版本 #Android
duangsuse::Echo
最后完整注释的版本 #Android
This media is not supported in your browser
VIEW IN TELEGRAM
睡觉睡觉,我可懒得老是管 XML 和几个接口/抽象类定义的事情...

CachedServiceFetcher、registerService、permission-group、checkSelfOrCallingPermission 什么的,你们自己看吧,给张图就跑~
This media is not supported in your browser
VIEW IN TELEGRAM
因为 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 -

##
~/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

abstract class ServiceConnection
onServiceConnected(ComponentName name, IBinder service)

但是注册 Service 对象的程序应该持续运行,一般使用 Looper 的 mainLooper
一般要进行权限认证,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
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from Doge
欢迎回来,亲爱的Doge AxuUnW !
获得了本月 3466 MB 流量,下月 1603.5 MB 流量
啊看来这种公益项目还是救命啊,可惜我网上经济不自由不能使用付费服务
最近客户端问题非常大,,,,