月度归档: 2021 年 3 月

如何中转欧洲高校 Anyconnect 代理?

有一个欧洲高校 Anyconnect *(IKEv2 协议) 但没有做亚洲优化,国内访问全局代理非常慢,有没有现成方案在香港 VPS 做中转呢?或者搭配 Clash 规则做分流呢?先谢过各位 xdm 了 !

zk8802 1
zk8802 58 天前 via iPhone
在中继服务器上(比如香港的 VPS )搭 Open* 服务器。
windyland 2
windyland 58 天前 via Android
碳云有 iepl 流量转发服务,应该可以满足你的需求,但是需要通过支付宝进行实名认证
当然如果不想认证的话就直接服务器上开 goproxy 然后端口转发就行了
felixcode 3
felixcode 58 天前
haproxy 做端口转发
ericFork 4
ericFork 58 天前
为什么 AnyConnect 用 IKEv2?
czwstc 5
czwstc 58 天前
建议用前置代理

效果:
路由器挂一个 SSProxy 就好了,随便买一个机场就好了。
我公司 * 都是国外的,不中转基本没法用。

理由:
不过和一般的服务器中转不一样,国外直链节点的加速建议使用前置代理的形式。
就是路由器或者网关上跑一个代理程序接管 GEOIP 国外的请求。
此时你电脑发起的都会被中转到 SS 的 Node 去请求,就起到了避免直链的路由劣化和国际带宽太小 QOS
当然你的代理*好也是走内网的,避免公网的丢包、限速、QOS 。

HowTo:
路由器上跑 SS,Clash 采用 GEOIP 或者规则加入域名或者 IP 。
或者有 Mac 可以用 ClashXPro 或者 Surge 的网关模式。
这俩是网关和透明代理加速你的 Anyconnect 。
成本比较低,只要额外一台电脑,可以刷机的路由器或者虚拟机。加上一个 iplc/iepl 走内网的 SS 节点就好了。

Anyconnect 是 * 协议,本机运行的 Clash 是代理类的协议,协议层级不一样。只能通过外部设备去加速网络层协议。

中转的话,还要看你们学校有没有做证书认证。不一定可以。
sarkdavidson 6
sarkdavidson 57 天前
感谢诸位,使用 HAProxy 做端口转发应该不行,IKEv2 走的 UDP 。

特别感谢 @czwstc 的长文回复,简单来说就是前置代理高校连接的域名嘛?: p

>”Anyconnect 是 * 协议,本机运行的 Clash 是代理类的协议,协议层级不一样。只能通过外部设备去加速网络层协议”

局域网已经有部署 LEDE 旁路由代理了!测试成本非常低 感谢指导!
czwstc 7
czwstc 57 天前 via iPhone
@sarkdavidson 代理国外 ip 就行,你学校就是国外 ip

Python风格的对象

符合Python风格的对象

Python的私有属性和受保护的属性:

如果有人编写了Dog类,这个类内部用到了mood实例属性,但是没有将其开放。

现在,你创建了Dog类的子类:Beagle。如果你在毫不知情的情况下又创建了名为mood的实例属性,那么在继承的方法中就会把Dog类的mood属性覆盖掉。

名称改写:

为了避免这个情况,如果以__mood的形式命名实例属性,Python会把属性存入实例的__dict__属性中,而且会在前面加上一个下划线和类名。

因此,对Dog类来说,__mood会变成_Dog__mood;对Beagle来说,会变成_Beagle__mood。这个特性就是名称改写。

约定俗成:

对于不喜欢使用名称改写的人,他们约定使用一个下划线前缀编写的“受保护”的属性。(如:_MyThing_blahblah)

类似于使用全大写字母表示一个常量。

__slots__类属性节省空间:

默认情况下,Python在各个实例中名为__dict__的字典里存储实例属性,字典会消耗大量内存。

继承自父类的__slots__属性没有效果。Python只会使用各个类当前类中定义的__slots__属性。

创建一个类属性__slots__,把它的值设为一个字符串构成的可迭代对象,其中各个元素表示各个实例属性。

class Vector:

__slots__ = (‘__x’,’__y’)
在类中定义了__slots__属性之后,实例不能再有__slots__中所列名称之外的其他属性。

如果类中定义了__slots__属性,而且想把实例作为弱引用的目标,要把’__weakref__’添加到__slots__中。

实例只能拥有__slots__属性,除非把”__dict__”加入到__slots__中后,会支持动态创建属性。

覆盖类属性:

类属性可用于为实例属性提供默认值。

如果为不存在的实例属性赋值,会新建实例属性。

如果想修改类属性的值,必须直接在类上修改,不能通过实例修改。

如果想修改所有实例的XX属性的默认值,可以通过 类.XX 修改

iOS App后台保活

笔者查询了相关资料后发现,iOS App可以实现后台保活。

短时间保活的方式有beginBackgroundTaskWithName;

App长时间保活的方式有:播放无声音乐、后台持续定位、后台下载资源、BGTaskScheduler等;

唤醒App的方式有:推送、VoIP等;

导读

本文分为如下几部分:

App 运行状态、及状态变化

App 后台保活方式简介

短时间App后台保活

Background Modes AVAudio,AirPlay,and Picture in Picture

Background Modes Location updates

BGTaskScheduler (iOS13.0+)

1

App 运行状态、及状态变化

不低于iOS13.0的设备端App 运行状态

%title插图%num

不低于iOS13.0设备端App 运行状态

iOS13.0+的设备,支持多场景,共有上图中的Unattached、Foreground Inactive、Foreground Active、Forground Inactive、Background、Suspended 6种状态。

1、Unattached:多个场景的情况,如果创建的场景不是当前显示的场景,那么场景处于Unattached状态;

2、Foreground Inactive:应用启动后,显示启动图的过程中,处于Foreground Inactive状态;

3、Forground Active:应用启动后,显示出来我们设置的rootViewController之后,场景处于Forground Active;

4、Foreground Inactive:应用启动后,场景处于显示状态,数据加载完毕,且用户和App没有交互过程中,处于Forground Inactive状态;

5、Background:用户点击Home键、或者是切换App后、锁屏后,应用进入Background状态;

6、Suspended:进入Background后,应用的代码不执行后,应用进入Suspended状态;(代码是否在运行,可以在应用中写定时器,定时输出内容,从Xcode控制台,或Mac端控制台查看是否有输出内容来判断)

低于iOS13.0的设备端App 运行状态

%title插图%num

低于iOS13.0设备端App 运行状态

上图是低于iOS13.0的设备端App的运行状态,分别是Not Running、Foreground Inactive、Foreground Active、Forground Inactive、Background、Suspended 6种状态。

Not Running:指用户没有启动App,或用户Terminate App 后,App处于的状态;其他的五种状态和不低于iOS13.0的设备端App的运行状态意义相同。

App 进入后台状态变化

笔者写了个定时器,定时输出“普通定时器进行中”,可以看到,应用进入后台后,基本上立刻,就没有内容输出了。笔者认为可以认为此时App 已经进入Suspended的状态。

%title插图%num

App 进入后台

下边笔者介绍下,尝试的App后台保活方式。

2

iOS App 后台保活方式简介

短时间App后台保活

beginBackgroundTaskWithName 和 endBackgroundTask

笔者尝试过使用相关API,测试过2款手机。

对于系统版本低于iOS13(iOS 12.3)的设备(iPhone6 Plus)后台运行时间约3分钟(175秒);

对于系统版本不低于iOS13(

iOS 13.0)的设备(iPhone6 Plus)后台运行时间约31秒;

播放无声音乐

App 进入后台后,播放无声音乐,适用于音视频类App。

笔者对逆向不了解,从iOS项目技术还债之路《一》后台下载趟坑中得知,腾讯视频、爱奇艺采用了播放无声音乐保活的方式。

后台持续定位

对于定位类App,持续定位App,可以实现App后台保活。定位类App需要后台保活,像系统的地图应用,在导航的时候切换App的时候,就需要后台保活。

后台下载资源

对于需要下载资源的App,需要后台下载资源,如我们在某App下载资源的时候,我们希望在切换App时候,或者App退出后台后,资源仍然继续下载,这样当我们打开App的时候,资源已经下载好了。

BackgroundTasks

BackgroundTasks.framework 是iOS13新增的framework,笔者认为此framework中的API可以在信息流类的App中发挥作用。

3

短时间App后台保活

系统版本低于iOS13.0的设备

系统版本低于iOS13.0的设备,在应用进入后台的时候,开始后台任务([[UIApplication sharedApplication] beginBackgroundTaskWithName:)。在应用进入前台时或后台任务快过期的回调中,终止后台任务([[UIApplication sharedApplication] endBackgroundTask:)。

示例代码如下:

– (void)applicationDidEnterBackground:(UIApplication *)application {

self.backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithName:kBgTaskName expirationHandler:^{
if (self.backgroundTaskIdentifier != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
}
}];
}
– (void)applicationWillEnterForeground:(UIApplication *)application {

[[UIApplication sharedApplication] endBackgroundTask: self.backgroundTaskIdentifier];
}
添加相关代码后,笔者在iOS12.4的6 Plus上测试结果如下,应用在进入后台后,大概还运行了175秒。

2019-12-29 19:06:55.647288+0800 QiAppRunInBackground[1481:409744] -[AppDelegate applicationDidEnterBackground:]:应用进入后台DidEnterBackground
2019-12-29 19:06:56.256877+0800 QiAppRunInBackground[1481:409744] 定时器运行中
….
2019-12-29 19:09:50.812460+0800 QiAppRunInBackground[1481:409744] 定时器运行中
系统版本不低于iOS13.0的设备

– (void)sceneDidEnterBackground:(UIScene *)scene API_AVAILABLE(ios(13.0)){

self.backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithName:kBgTaskName expirationHandler:^{
if (self.backgroundTaskIdentifier != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
}
}];
}
– (void)sceneWillEnterForeground:(UIScene *)scene API_AVAILABLE(ios(13.0)){

[[UIApplication sharedApplication] endBackgroundTask: self.backgroundTaskIdentifier];
}
添加相关代码后,笔者在iOS13.0的6s上测试结果如下,应用在进入后台后,大概还运行了31秒。
%title插图%num

iOS13.0+ App 进入后台

Xs·H 提到过,如果持续后台播放无声音频或是使用后台持续定位的方式实现iOS App后台保活,会浪费电量,浪费CPU,所以一般情况下,使用这种短时间延长App 后台保活的方式,应该够开发者做需要的操作了。

4

Background Modes AVAudio,AirPlay,and Picture in Picture

对于音视频类App,如果需要后台保活App,在App 进入后台后,可以考虑先使用短时间保活App的方式,如果后台保活App方式快结束后,还没处理事情,那么可以考虑使用后台播放无声音乐。相关示例代码如下。

– (AVAudioPlayer *)player {

if (!_player) {
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@”SomethingJustLikeThis” withExtension:@”mp3″];
AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
audioPlayer.numberOfLoops = NSUIntegerMax;
_player = audioPlayer;
}
return _player;
}
[self.player prepareToPlay];
系统版本低于iOS13.0的设备

– (void)applicationDidEnterBackground:(UIApplication *)application {

NSLog(@”%s:应用进入后台DidEnterBackground”, __FUNCTION__);
self.backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithName:kBgTaskName expirationHandler:^{

if ([QiAudioPlayer sharedInstance].needRunInBackground) {
[[QiAudioPlayer sharedInstance].player play];
}
if (self.backgroundTaskIdentifier != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
}
}];
}
– (void)applicationWillEnterForeground:(UIApplication *)application {

NSLog(@”%s:应用将进入前台WillEnterForeground”, __FUNCTION__);
if ([QiAudioPlayer sharedInstance].needRunInBackground) {
[[QiAudioPlayer sharedInstance].player pause];
}
[[UIApplication sharedApplication] endBackgroundTask: self.backgroundTaskIdentifier];
}
系统版本不低于iOS13.0的设备

– (void)sceneDidEnterBackground:(UIScene *)scene API_AVAILABLE(ios(13.0)){

NSLog(@”%s:应用已进入后台DidEnterBackground”, __FUNCTION__);

self.backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithName:kBgTaskName expirationHandler:^{
if (self.backgroundTaskIdentifier != UIBackgroundTaskInvalid) {
if ([QiAudioPlayer sharedInstance].needRunInBackground) {
[[QiAudioPlayer sharedInstance].player play];
}
NSLog(@”终止后台任务”);
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
}
}];
}
– (void)sceneWillEnterForeground:(UIScene *)scene API_AVAILABLE(ios(13.0)){

if ([QiAudioPlayer sharedInstance].needRunInBackground) {
[[QiAudioPlayer sharedInstance].player pause];
}
[[UIApplication sharedApplication] endBackgroundTask: self.backgroundTaskIdentifier];
NSLog(@”%s:应用将进入前台WillEnterForeground”, __FUNCTION__);
}
5

Background Modes Location updates

开启后台定位持续更新配置,添加了位置隐私申请后,在应用使用持续定位的情况下,可以实现后台保活App。

%title插图%num

添加后台获取位置及音频使用能力

%title插图%num
添加获取位置隐私申请

对于定位类App,如果需要后台保活App,在用户使用了定位功能后,App 进入后台后,App自动具备后台保活能力,部分示例代码如下。

self.locationManager = [CLLocationManager new];
self.locationManager.delegate = self;
[self.locationManager requestAlwaysAuthorization];
@try {
self.locationManager.allowsBackgroundLocationUpdates = YES;
} @catch (NSException *exception) {
NSLog(@”异常:%@”, exception);
} @finally {

}
[self.locationManager startUpdatingLocation];
如果遇到如下异常信息:

2019-12-29 19:57:46.481218+0800 QiAppRunInBackground[1218:141397] 异常:Invalid parameter not satisfying: !stayUp || CLClientIsBackgroundable(internal->fClient) || _CFMZEnabled()
检查:

Signing&Capablities 的 backgounrd Modes 中 Location updates是否勾选;

后台下载资源

当需要实现下载资源类的App在进入后台后,持续下载资源的需求时。我们可能需要使用后台如下示例示例代码。

创建指定标识的后台NSURLSessionConfiguration,配置好

NSURL *url = [NSURL URLWithString:@”https://images.pexels.com/photos/3225517/pexels-photo-3225517.jpeg”];
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@”com.qishare.ios.wyw.backgroundDownloadTask”];
// 低于iOS13.0设备资源下载完后 可以得到通知 AppDelegate.m 文件中的 – (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)(void))completionHandler
// iOS13.0+的设备资源下载完后 直接在下载结束的代理方法中会有回调
sessionConfig.sessionSendsLaunchEvents = YES;
// 当传输大数据量数据的时候,建议将此属性设置为YES,这样系统可以安排对设备而言*佳的传输时间。例如,系统可能会延迟传输大文件,直到设备连接充电器并通过Wi-Fi连接到网络为止。此属性的默认值为NO。
sessionConfig.discretionary = YES;
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithURL:url];
[downloadTask resume];
6

BGTaskScheduler(iOS13.0+)

如果我们的App是信息流类App,那么我们可能会使用到BGTaskScheduler.framework中的API,实现后台保活App,帮助用户较早地获取到较新信息。

笔者尝试使用BGTaskScheduler 做了一个获取到App调度的时候。更新首页按钮颜色为随机色并且记录调度时间的Demo。

项目配置

为了App 支持 BGTaskScheduler,需要在项目中配置Background fetch,及Background Processing;

需要在Info.plist文件中添加 key 为Permitted background task scheduler identifiers,Value为数组的内容。

Value的数组填写,刷新的任务标识和清理的任务标识。

注册后台任务

在应用启动后,注册后台任务。

– (void)registerBgTask {

if (@available(iOS 13.0, *)) {
BOOL registerFlag = [[BGTaskScheduler sharedScheduler] registerForTaskWithIdentifier:kRefreshTaskId usingQueue:nil launchHandler:^(__kindof BGTask * _Nonnull task) {
[self handleAppRefresh:task];
}];
if (registerFlag) {
NSLog(@”注册成功”);
} else {
NSLog(@”注册失败”);
}
} else {
// Fallback on earlier versions
}

if (@available(iOS 13.0, *)) {
[[BGTaskScheduler sharedScheduler] registerForTaskWithIdentifier:kCleanTaskId usingQueue:nil launchHandler:^(__kindof BGTask * _Nonnull task) {
[self handleAppRefresh:task];
}];
} else {
// Fallback on earlier versions
}
}
调度App 刷新

应用进入后台后,调度App 刷新。

– (void)sceneDidEnterBackground:(UIScene *)scene API_AVAILABLE(ios(13.0)){

[self scheduleAppRefresh];
}

– (void)scheduleAppRefresh {

if (@available(iOS 13.0, *)) {
BGAppRefreshTaskRequest *request = [[BGAppRefreshTaskRequest alloc] initWithIdentifier:kRefreshTaskId];
// *早15分钟后启动后台任务请求
request.earliestBeginDate = [NSDate dateWithTimeIntervalSinceNow:15.0 * 60];
NSError *error = nil;
[[BGTaskScheduler sharedScheduler] submitTaskRequest:request error:&error];
if (error) {
NSLog(@”错误信息:%@”, error);
}

} else {
// Fallback on earlier versions
}
}
得到后台任务调度的时候,调用App刷新的方法,笔者在这个方法中做了发送更新首页按钮颜色的通知,并且记录了当前更新时间的记录。

– (void)handleAppRefresh:(BGAppRefreshTask *)appRefreshTask API_AVAILABLE(ios(13.0)){

[self scheduleAppRefresh];

NSLog(@”App刷新====================================================================”);
NSOperationQueue *queue = [NSOperationQueue new];
queue.maxConcurrentOperationCount = 1;

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

[[NSNotificationCenter defaultCenter] postNotificationName:AppViewControllerRefreshNotificationName object:nil];

NSLog(@”操作”);
NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:@”yyyy-MM-dd HH:mm”];
NSString *timeString = [dateFormatter stringFromDate:date];

NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@”QiLog.txt”];
if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
NSData *data = [timeString dataUsingEncoding:NSUTF8StringEncoding];
[[NSFileManager defaultManager] createFileAtPath:filePath contents:data attributes:nil];
} else {
NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
NSString *originalContent = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSString *content = [originalContent stringByAppendingString:[NSString stringWithFormat:@”\n时间:%@\n”, timeString]];
data = [content dataUsingEncoding:NSUTF8StringEncoding];
[data writeToFile:filePath atomically:YES];
}
}];

appRefreshTask.expirationHandler = ^{
[queue cancelAllOperations];
};
[queue addOperation:operation];

__weak NSBlockOperation *weakOperation = operation;
operation.completionBlock = ^{
[appRefreshTask setTaskCompletedWithSuccess:!weakOperation.isCancelled];
};
}
经过测试,发现App 在退到后台,没有手动Terminate App的情况下。苹果有调用过App调度任务的方法。现象上来看就是隔一段时间,我们再打开App 的时候可以发现,首页的按钮颜色改变了,相应的日志中追加了,调起相关方法的时间记录。

手动触发后台任务调度

Xcode运行我们的App

-> App 退到后台

-> 打开App 进入前台

-> 点击下图中蓝框中的Pause program execution,输入如下内容

后台模拟调起App

e -l objc — (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier: @”com.qishare.ios.wyw.background.refresh”]
-> 再次点击Continue program execution,就可以模拟后台启动任务,调用我们的App。

%title插图%num

Continue program execution

查看日志记录小提示

之前记得听沐灵洛提过怎么便于查看日志,正好我这里也用到了。便于我们可以直接在File App中查看写入到我们App的Documents中的文件,可以在Info.plist文件中添加key为LSSupportsOpeningDocumentsInPlace ,value为YES的键值对App 接入 iOS 11 的 Files App。

经过我们操作后,就可以打开File App -> 浏览 -> 我的iPhone -> 查看选择我们的App -> 查看我们的日志记录文件。

定义类(class)的语法

python定义类(class)的语法,

定义类(class)的语法

class Iplaypython:               #类的名字,首字母,有一个不可文的规定,*好是大写,这样需要在代码中识别区分每个类。
>>>     def fname(self, name):   #第二行开始是类的方法,大家看到了,和函数非常相似,但是与普通函数不同的是,它的内部有一个“self”,参数,它的作用是对于对象自身的引用。
>>>           self.name = name

玩蛇网是一个学习python比较好的网站

http://www.iplaypy.com/jinjie/

2)_init_函数(方法)

首先说一下,带有两个下划线开头的函数是声明该属性为私有,不能在类地外部被使用或直接访问。

类的实例(类的调用)、类的方法、构造函数、类的命名空间和作用域以及类的继承概念

哪家的 UI 和应用商店能完美支持 Android App Bundle ?

国内有哪家的 UI 和应用商店能完美支持 Android App Bundle 的?
看了下 Google Play 要求 2021.8 后的新 APP 必须使用 App Bundle 分发。然后查了下我手头的小米 9 ( MIUI12.5 开发版),基本上大部分 Play 下载的应用都是用 bundle 的。不过小米应用商店下载的还是传统的多 abi 多 dpi 的 apk 。虽然用 play 安装的支持没有问题,但自带的系统备份却只支持备份 base apk,导致用 bundle 的 app 在还原后直接打不开,得卸载重装。

像 B 站客户端就离谱,play 上的国际版有纯 arm64 版,国内版不管在商店下还是官网下,都是 armv7+x86 版,没有 arm64 版。

按理说这技术能省不少空间的,也方便差分更新,也不是 GMS 专享的技术,但感觉国内无论是手机厂商还是应用厂商都不怎么搭理这个技术,这是啥原因?
17 条回复 • 2021-03-23 22:49:08 +08:00
minami 1
minami 3 天前
t/620974
minami 2
minami 3 天前
@minami #1 爱奇艺搞了个“山寨”版的,从宣传里可以看出,App Bundle 需要依托 GMS,所以国内肯定不搭理的
janus77 3
janus77 3 天前
需要应用市场做适配,aab 其实是不能直接安装的,当你在应用市场点击下载的时候,是应用市场根据 aab 生成相应的 apk 再提供给设备安装的
janus77 4
janus77 3 天前
huawei 应用市场好像是支持 aab,不过没看到实际例子
systemcall 5
systemcall 3 天前
国内这几年都在弄应用内的增量更新和 App 热更之类的吧
loginbygoogle 6
loginbygoogle 3 天前
格局不同
FucUrFrd 7
FucUrFrd 3 天前 via Android
成龙说的,中国的 app 会爆炸
yikuo 8
yikuo 3 天前 via Android ❤️ 1
华为商店支持
jim9606 9
jim9606 3 天前
@minami
Qjigsaw 算是给开发者提供的解决方案。而且看 Google 的介绍 App Bundle 并不是只能由 GMS 支持,Split apks 是 Android framework 就有的功能,也就是说手机内置商店要实现这个功能并不需要依赖 GMS,像 Apkpure 和 SAI 都能在国产 UI 上支持这种安装。

作为证据,我用的 MIUI 安装 Split apk 虽然比较麻烦,需要关掉 MIUI 优化或者用 Shizuku,但还是能装上的。虽然我希望 AOSP 可以直接支持 App Bundle,但以 google 的态度看是没戏了。

@systemcall @janus77
我并不是说国内厂商完全不 care 模块化这事,只是国内我能搞到的 apk 模块化顶多是区分 abi 的 multiapk,而 app bundle 是可以做到区分 abi 、语言、dpi 、feature 的,例如我的小米 9 常见组合是 base+zh+arm64_v8a+xxhdpi 。

具体到我下的 b 站客户端,armv7+x86 这种肯定不是 aab 生成出来的,所以我认为小米商店是完全没支持这个的。
jim9606 10
jim9606 3 天前
另外关于原生库还有一点我不满意的就是国产 app 普遍压缩原生库,安装的时候需要解压这些库占据额外的存储空间,例如微信就因为这点导致安装后体积膨胀了一半。而 App Bundle 拆分的原生库包是不压缩的,所以就不用占额外的空间。

感觉那么多搞 APK 体积优化的压根就不关心安装后体积的问题。

minami 11
minami 3 天前
@jim9606 #8 那就是说只要商店支持就可以了。我去 OVHM 四家的开放平台文档搜了下,只有菊厂的 AppGallery 提到了“App Bundle 应用上架操作指导”,其他的都没有相关文档
hanqian 12
hanqian 3 天前 via Android
我就想吐槽国内这些 UI,OVM 三家都魔改了 package installer,不支持 split apks ( MIUI 要关闭 MIUI 优化),倒是 EMUI 没啥问题,真是吃饱了撑的
1041412569 13
1041412569 3 天前 via Android ❤️ 1
@bilibili_apk 这个 tg 频道有 arm64 版哔哩哔哩客户端分享。
winterx 14
winterx 3 天前
楼主能说一下,play 上的国产 app 有 AAB 吗?这个好像感知不出来
比如阿里系的支付宝跟淘宝
mxalbert1996 15
mxalbert1996 3 天前 via Android
@winterx 淘宝是 AAB,支付宝不是。
jim9606 16
jim9606 3 天前
@winterx 这个需要用软件查,例如 SAI 或者 Native Libs Monitor 。这功能不算什么用户感知明显的功能,主要是节省存储空间。
我用到的使用 AAB 的国产 app 有淘宝和小米运动。
jim9606 17
jim9606 1 天前
@minami @yikuo
目前看 App Bundle 的坑是必须要将 apk signkey 交给商店,Google Play 和华为 AppGallery 都要这样,估计是为了自动生成 multiapk 供低于 Android5.0 的设备用。也就是说商店有可能恶意冒充你签名发布新版包。

@hanqian AOSP 的 Package Installer 本身就不支持 split apks,魔改的是别的东西。

Android 这边还有比较好的本地视频播放器吗?

Android 这边还有比较好的本地视频播放器吗?

小米自带的, 没有 dts 解码器, 某些视频没声音.

MX player, 被国产公司收购后挺垃圾的, 而且识别不到 otg 的 nvme 硬盘

vlc player, 能识别 otg 的 nvme 硬盘上的视频, 但是无法加载 otg 上的外挂字幕
42 条回复 • 2021-03-24 14:19:00 +08:00
tetora 1
tetora 6 天前 via Android
找个能识别的文件管理器,用 mx 打开视频文件,这样可行不?
volks 2
volks 6 天前
mpv
blueboyggh 3
blueboyggh 6 天前
试试 oplayer ?
myqy 4
myqy 6 天前 via Android
nplayer
systemcall 5
systemcall 6 天前
试试 kodi,有个皮肤是为触摸屏优化过的
harwck 6
harwck 6 天前 via Android
MX Player Pro, VLC 等
Cielsky 7
Cielsky 6 天前
Reex
xiaoliu926 8
xiaoliu926 6 天前 ❤️ 1
VLC
yyyb 9
yyyb 6 天前
mxplayer 被国产了?今天刚知道
Huelse 10
Huelse 6 天前
我用的是这里的 MX Player,不知道有没有问题 http://xiaozhon.lanzoui.com/b01nr6usb

tanyongle0633 11
tanyongle0633 6 天前 via Android
MX 播放器是被印度某公司收购的
wee911 12
wee911 6 天前
安卓的场景,估计也不会看特别大的文件,其实什么都行, 没差
TokyoIncidents 13
TokyoIncidents 6 天前 via Android
kmplayer ?
a566 14
a566 5 天前
kp 应该是*好用的一个
sleepm 15
sleepm 5 天前 via Android
nplayer 可以在设置里加载 libffmpeg
vlc 挺好使的
xratzh 16
xratzh 5 天前
kmplayer pro 在用,还行
yinzhili 17
yinzhili 5 天前
@wee911 电视也是安卓系统,你没有电视机?
hscui 18
hscui 5 天前
nplayer +1 ;安卓和苹果上都用,开本地和 NAS 上视频均很棒。
TimhLiu 19
TimhLiu 5 天前 via Android
Reex
HangoX 20
HangoX 5 天前
觉得楼主思路不对,android 上只要找个可以打开 otg 文件夹的文件管理器用 mxplayer 播放即可。
在播放器上打开 otg 硬盘是 ios 的思路
Misakas 21
Misakas 5 天前
Xplayer
KarmaWu 22
KarmaWu 5 天前
MX Player
wee911 23
wee911 5 天前
@yinzhili 那就*望了, 电视机上没一个播放器好用的,不如用 n1 刷 coreelec
7emes 24
7emes 5 天前
bs player
PythonYXY 25
PythonYXY 5 天前
ios 上用的是 nplayer,不知道安卓上有没有
Vegetables 26
Vegetables 5 天前
我现在就 vlc 凑合用吧
syuraking 27
syuraking 5 天前
nplayer 好用
hkllzh 28
hkllzh 5 天前
XPlayer 万能播放器。
本地的、Nas 上的都可以。
blueboyggh 29
blueboyggh 5 天前 via Android
@syuraking nplayer 已经好久不更新了
MaverickLee 30
MaverickLee 5 天前
VLC
feitxue 31
feitxue 4 天前
qq 影音算不算?
feitxue 32
feitxue 4 天前
算了.收回 qq 影音的推荐,虽然 pc 版还不错…安卓版好久没更新了…
fox0001 33
fox0001 4 天前 via Android
能不能识别硬盘,不是播放器的锅吧?不过好像有播放器不能读取外置存储设备。

VLC 无法加载外挂字幕是什么问题?不能读取字幕文件,还是加载出错?
tubowen 34
tubowen 4 天前 via Android
VLC 挺好用的啊,还能播放局域网的 samba 上面的视频
alfawei 35
alfawei 3 天前 via iPhone
nplayer
volks 36
volks 3 天前 via Android
看到楼上推荐的 reex 去试了一下,感觉很好。基于 libmpv,操控和界面做了适配,而且性能似乎比官方 Android 版还好,进度跳转无迟滞。
Awes0me 37
Awes0me 3 天前
@fox0001 #33 不能读取字幕文件
pk000 38
pk000 3 天前 via Android
Reex 官网是什么?
augustheart 39
augustheart 3 天前 via Android
mx 应该是印度的
Awes0me 40
Awes0me 3 天前
@HangoX #20

理论上你这样说是对的, 但实际上现在字幕和视频文件都是分开的, 播放器本身不识别 otg 的话, 加载不了字幕
basaka 41
basaka 2 天前
不是啥特殊格式的话 QQ 影音还不错,PS:不像南山必胜客做的
junyee 42
junyee 23 小时 53 分钟前
请教小伙伴们现在流行的是什么播放器.

从安卓 2.X 开始用的 MXPlayer,出于习惯就一直用,

一加要换 colorOS 了?那还可以轻松地刷氧 os 吗?

一加要换 colorOS 了?那还可以轻松地刷氧 os 吗?
30 条回复 • 2021-03-24 11:56:34 +08:00
erwin985211 1
erwin985211 3 天前
有这种好事
fishercloud1024 2
fishercloud1024 3 天前
49 年入国军,买了一加 8T
Ga2en 3
Ga2en 3 天前 ❤️ 1
估计不会并行继续开发了吧。。。

昨天换了 X3PRO 发现竟然把 Android11 的分区存储给阉了。。。。
acrisliu 4
acrisliu 3 天前 via iPhone
氧 OS 还在,能不能刷还不知道,大概率可以的吧。
erwin985211 5
erwin985211 3 天前
@erwin985211 看了下论坛,确实是真滴。氧 os 还会更新,但氢 os 彻底凉凉
malagebidi 6
malagebidi 2 天前 via Android
手持 8t 氧 os,前一阵子刷氢刷不回去,现在不用回去了。
yehoshua 7
yehoshua 2 天前 via Android
据说不影响刷氧 OS 。担心的话只能等发布了确认
anUglyDog 8
anUglyDog 2 天前
老肾用户想问下,又是氢又是痒又是 color,都是一加的吗?
tankren 9
tankren 2 天前 ❤️ 1
@anUglyDog 爸爸都是 OPPO
tinkerer 10
tinkerer 2 天前
@anUglyDog 一加的东家是 oppo, oppo 搞的 coloros.

594kJ 11
594kJ 2 天前
个人觉得还是有一点希望能刷的,但是估计没有以前那么简单可以直接把 ROM 放在根目录就更新
反正我已经崩溃到看三星 S21 去了……
hanqian 12
hanqian 2 天前 via iPhone
氢 os 没了,氧 os 的公交卡支持怎么办
pkoukk 13
pkoukk 2 天前
本来觉得 1+7p 还能再战两年,结果氢这破系统 bug 越来越多还不修
kingfalse 14
kingfalse 2 天前 via Android
主要还是卖老外,氧应该不会动,氢没了倒是不太在意,一直是用氧
kingfalse 15
kingfalse 2 天前 via Android
@pkoukk 手持 7 等下一个非开孔屏的再换
594kJ 16
594kJ 2 天前
@kingfalse 同用氧 OS 。请问下如果国行不再支持刷氧,还会考虑一加吗?
JensenQian 17
JensenQian 2 天前
@hanqian #12 nfc-sim,微信乘车卡小程序
JensenQian 18
JensenQian 2 天前
@594kJ #16 又不是不能解锁,*差的结果就是和小米现在一样,只能解锁了再刷国际版,只能这样了
Hyouka 19
Hyouka 2 天前
慢慢等吧
一加 7 pro 路过….
到手就直接刷了氧 OS 用到安卓 11
JensenQian 20
JensenQian 2 天前 ❤️ 1
@hanqian #12 https://www.v2ex.com/t/763695#reply16
66beta 21
66beta 2 天前
张老板说了,氢 OS 会保留

既然都有 flyme 用了( oh 不,我是说 colorOS ),谁 tm 还要禅定 OS 啊
Hyouka 22
Hyouka 2 天前 ❤️ 1
我大清(氢)要完了
Muniesa 23
Muniesa 2 天前
氧肯定还在,互刷我觉得问题也不大,都有厂商签名,也就不用解锁了,不过一加解锁也不难
dingyx99 24
dingyx99 2 天前
一加国外论坛确认了依旧保证国际版是 OOS 不会换 ColorOS

https://www.ithome.com/0/541/499.htm
Sapp 25
Sapp 2 天前
还有这种好事? 老手机给更新吗
Logiase 26
Logiase 2 天前
不知道能不能给 1+7p 上,之前给母上换的 1+7p,什么功能都没有,用着十分难受
ychost 27
ychost 2 天前
还是觉得原版 Android 用着*省心,流畅
lisjiang 28
lisjiang 1 天前
@kingfalse +1
Infinite2K 29
Infinite2K 1 天前
@pkoukk #13 7pro 现在的系统更新只剩下安卓更新补丁了

@kingfalse #15 同等一个屏下的,手里的 7pro 永远的神,还能坚持到出屏下的时候
zzzzzzzzyp 30
zzzzzzzzyp 1 天前
赶紧换吧,氢 OS 小问题可太多了,用的头疼

云服务器下NFS文件挂载配置

什么是NFS
*近想为毕设搭个云服务器,所以想使用nginx+tomcat+nfs的方式搭建一下这个云服务器。所以有了这篇配置的文章。
NFS是网络文件系统,允许一个节点通过网络访问远程计算机的文件系统,远程文件系统可以被直接挂载到本地,文件操作和本地没有区别,如果是局域网的nfs那么io的性能也可以保证。下面就以CentOS 7.x为例,配置NFS。

服务器端配置
首先是服务端配置,服务端提供文件系统供客户端来挂载使用,配置过程如下:

首先检查是否缺少基础环境:
rpm -qa | grep nfs-utils
rpm -qa | grep rpcbind

如果这两个包存在那么可以直接使用,一般服务器安装的时候都会存在,如果没有的话执行下面命令安装:
yum -y install nfs-utils
yum -y install rpcbind

打开需要的端口:
一次正常的挂载操作中,会涉及这些端口。

nfs tcp 2049 这个很明显到处都是
sunrpc tcp 111 这个很明显到处都是
sunrpc udp 111 其中这个很难发现,仔细排查才看到
acp-proto udp 4046 其中仔细看udp的会找到
安装完成之后配置nfs访问目录,配置文件位置/etc/exports,默认是空的这里添加一行:
/nfs_test 192.168.1.8(rw,no_root_squash,no_all_squash,async)
共享的文件夹位置 允许访问的ip(该地址可执行的操作)
这个配置表示开放本地存储目录/nfs_test 只允许192.168.1.8这个主机有访问权限,rw表示允许读写;no_root_squash表示root用户具有完全的管理权限;no_all_squash表示保留共享文件的UID和GID,此项是默认不写也可以;async表示数据可以先暂时在内存中,不是直接写入磁盘,可以提高性能,另外也可以配置sync表示数据直接同步到磁盘;就配置这些就可以,保存退出。

现在配置完这些配置,启动相关服务:
systemctl start rpcbind.service
systemctl start nfs.service

启动之后可以通过status来查看状态,如果下次修改了配置,可以重启服务来使配置生效,也可以直接执行如下命令刷新配置:
exportfs -a

从机配置
现在服务端配置完毕,可以在对应的主机上来配置从机了,需要的环境和服务端一样,要保证安装nfs-utils和rpcbind。

保证环境没问题和上面一样启动rpcbind服务和nfs服务。不再赘述。

首先创建挂载点: mkdir /mnt/test1

然后挂载nfs:mount -t nfs 192.168.1.3:/nfs_test /mnt/test1
注意这里的ip是主机ip,主机挂载位置/nfs_test,从机挂载位置/mnt/test1

挂载成功之后通过 df -h 可以查看挂载的情况,nfs可用空间就是服务端/nfs_test目录所能使用的*大空间。

现在就可以往nfs写入数据了,服务端往/nfs_test读写数据和客户端往/mnt/test1读写数据是一样的,这样就实现了文件同步和共享。

卸载nfs和普通文件系统一样,使用:umount /mnt/test1

如果需要设置开机挂载,在/etc/fstab添加一行配置即可: 192.168.1.3:/nfs_test /mnt/test1 nfs rw,tcp,intr 0 1 然后服务端和客户端都要用enable设置nfs和rpcbind服务开机启动,然后才可以正常挂载。
————————————————
版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/88388975

服务器搭建个人网站(阿里云服务器)

服务器搭建个人网站
一丶购买服务器

这里我选的是阿里云服务器,进入阿里云官网https://www.aliyun.com

阿里云提供了几种服务器,云服务器ESC、轻量应用服务器,ESC更好一点儿,我选了轻量级应用服务器。购买好了之后,在阿里云网站主页→控制台→轻量应用服务器。找到运行中的实例点进去就好了。服务器器就购买好了
%title插图%num

二、配置服务器环境

首先你要知道怎么把你本机的文件放到你的服务器里去:你在本机上复制文件,远程连接服务器(ctrl+R快捷键打开“运行”,敲“mstsc”可打开远程连接窗口),在服务器中粘贴即可,就这么简单。你也可以设置本机上的各个盘为共享也是OK的。其次千万要注意:要在阿里云服务器中把你的防火墙的端口打开比如8080,3306之类的,不打开你是访问不了的
%title插图%num

(1)JDK和JRE

去官网http://www.oracle.com/technetwork/java/javase/downloads/index.html找到对应的JDK下载,或者百度“JDK”进入官网下载也是OK的,下载之后配置环境变量,此电脑→属性→高级系统设置→高级→环境变量→系统变量,新建JAVA_HOME和JRE_HOME两个变量,变量的值就是JDK和JRE的安装位置,配好之后再在path中加入JAVA_HOME和JRE_HOME,可以不用配classPath变量,新的jdk不建议配。
%title插图%num

%title插图%num

(2)Tomcat(或者jetty也是可以的)

下载Tomcat解压到你想解压的地方,配下环境变量啥的,修改配置文件,在配置文件中加入你的服务器ip让外部能访问。只要能让它运行就OK,如果能运行就找台手机或电脑输入:你的服务器ip:8080,测试下

(3)Mysql

下载mysql,复制到服务器安装,注意:你要设置一个可以远程访问的账户,不然就只能localhost访问,远程无法访问

三、把你写好的东西放到webapps录下,可以打包成war文件

四、接下来你有可以做各种尝试,可以学习下wordpress(可以快速建站的一个东西)如果对你有帮助的话记得点个赞哦

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速