标签: 权限

Android 10 ,未授予任何权限,一些 App 会在某些二级目录创建文件

例如 Download 和 Music

那么

浏览器下载文件就可以不需要存储权限

App 能否读取其创建的文件,还是可以读取或修改所有数据,甚至创建次级目录

Android 目录有什么例外吗
第 1 条附言 · 5 天前
即使删除了 Music 目录,依然会在每次打开 App 时,建立 1 个由大小写字母、数字、字符组成,名称固定,大小不变但不足 2 kB 的 mp3 文件

shijianit 1
shijianit 5 天前
Android10 及以上,默认有外部存储公共目录写权限,如系统相册目录,读取相册列表需要外部存储读权限
ronman 2
ronman 5 天前
别说安卓 10 了,11 强制分区存储了不一样在公共目录拉屎吗。
BeautifulSoap 3
BeautifulSoap 5 天前 via Android
谷歌对 Android 的 app 随地拉屎问题毫不作为都这么多年了,即便是 Android11,只要你不 root 依旧没法管住 app 拉屎。想真正管住就 root 装存储重定向吧
dingwen07 4
dingwen07 5 天前 via iPhone ❤️ 1
创建的文件和目录别的 app 没存储权限就读不了,该 app 自己被重装之后也读不了
好像是这样的
liuidetmks 5
liuidetmks 5 天前
安卓为什么不学习 iOS,一个 app 一个目录
codehz 6
codehz 5 天前 via Android
@BeautifulSoap sr 管不住,rikka 还在研究新魔法呢
sky96111 7
sky96111 5 天前
@liuidetmks 一开始没考虑到,现在收拾包袱太大了。再加上大多数非国产程序没有这个问题,Google 也不太想管
JensenQian 8
JensenQian 5 天前
https://play.google.com/store/apps/details?id=moe.shizuku.redirectstorage
这个试下
JensenQian 9
JensenQian 5 天前
@JensenQian #8 20 刀有点贵
relieve56 10
relieve56 4 天前 via iPhone
@codehz sr 用了几年,每次下载新 app 或者有什么别的需求都要调半天,*后受不了换了果。。sr 重度用户真应该直接换 iOS,换了一身轻松

xmumiffy 11
xmumiffy 4 天前 via Android
换 iOS x
卸载文档管理器 ✓
beginor 12
beginor 2 天前
在根目录下建一个“我的文档”目录, 然后文档管理期默认就打开这个目录 ?
hu8245 13
hu8245 2 天前
@beginor 当真可行?创建的文件夹名称叫做 “我的文档”?
merpyzf 14
merpyzf 2 天前
如果在 Android10 的设备上应用不申请权限就可以随意在用户存储目录下读写文件的话那么这个 app 的 targetAp i 一定是低于 23 以下的。
Ga2en 15
Ga2en 2 天前
music 文件夹里面的东西基本都是 TX 游戏创建的,还有一些奇怪的 APP 船舰一系列从 a~z 的文件夹(特别是某家,自己编译了媒体存储,造成奇怪的文件夹层出不穷 mixiao ),已经换阵营了。
beginor 16
beginor 1 天前 via Android
@hu8245 应该 SD 卡根目录下创建,然后自己只看这个目录,其它可以无视
sw926 17
sw926 1 天前 ❤️ 1
Download 和 Music 是专有文件夹,Android 10 分区存储情况下 App 可以不申请权限在这些文件夹下创建文件,但是 App 只能访问自己创建的文件。对于一些图片、视频编辑软件来说,导入素材可以通过文件浏览器手动授权,编辑完可以直接导出到相册,对开发者来说不用动态申请权限了,对用户来说不用担心 App 会读取到全部的相册内容。道高一尺,魔高一丈,遇到流氓软件就直接把专有文件夹当额外存款空间了,不知道他们怎么想的,这些文件在 App 卸载了也不会删除,但是重装后就没有权限去读这些文件了。

android 7.0文件读写权限配置

在gradle中指定applicationId,这里也会跟着变了AdroidManifest.xml

android:authorities=”${applicationId}.fileProvider”
<provider
android:name=”android.support.v4.content.FileProvider”
android:authorities=”${applicationId}.FileProvider”
android:exported=”false”
android:grantUriPermissions=”true”>
<meta-data
android:name=”android.support.FILE_PROVIDER_PATHS”
android:resource=”@xml/rc_file_path” />
res/xml/rc_file_path.xml 文件的名字没有要求,只要放在xml文件夹下面就可以了
<?xml version=”1.0″ encoding=”utf-8″?>
<paths>

<external-path path=”.” name=”name” />

</paths>
paths这个元素内可以包含以下一个或多个

<files-path name=”name” path=”path” />对应内部内存卡根目录:Context.getFileDir() + /path/

<cache-path name=”name” path=”path” />对应应用默认缓存根目录,物理路径相当于Context.getCacheDir() + /path/

<external-path name=”name” path=”path” />对应外部内存卡根目录,物理路径相当于Environment.getExternalStorageDirectory() + /path/

<external-files-path name=”name” path=”path” />对应外部内存卡根目录下的APP公共目录,物理路径相当于Context.getExternalFilesDir(String) + /path/

<external-cache-path name=”name” path=”path” />对应外部内存卡根目录下的APP缓存目录,物理路径相当于Context.getExternalCacheDir() + /path/

拍照:

//创建图片存放file
File imgFile = new File(“照片存放目录”);
Uri uri;
//根据当前系统版本决定使用哪个api,N是Android7.0的代号
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//*个参数是上下文,第二个参数来自清单文件,必须完全一样,第三个参数为上面创建的照片file
uri = FileProvider.getUriForFile(this, “${applicationId}.FileProvider”, imgFile);
} else {
//Android7.0还用原先的api
uri = Uri.fromFile(imgFile);
}
//设置拍照后保存目录
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
应用安装
//创建安装包file
File apkFile = new File(path);
Uri uri;
//根据当前系统版本决定使用哪个api,N是Android7.0的代号
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
uri = FileProvider.getUriForFile(context, “{applicationId}.FileProvider”, apkFile);
} else {
//Android7.0还用原先的api
uri = Uri.fromFile(apkFile);
}
//当前代码在Activity里则下面这句可省略
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//授权Intent读取URI和写URI的权限
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.setDataAndType(uri,”application/vnd.android.package-archive”);
context.startActivity(intent);
 

Android声明和使用权限

Android定义了一种权限方案来保护设备上的资源和功能。例如,在默认情况下,应用程序无法访问联系人列表、拨打电话等。下面就以拨打电话为例介绍一下系统对权限的要求。一般在我们的应用中,如果要用到拨打电话的功能,我们会这样编码:

Uri uri = Uri.parse(“tel:12345678″);
Intent intent = new Intent(Intent.ACTION_CALL, uri);
startActivity(intent);
默认情况下,我们无权访问拨打电话的Activity,控制台将会报以下异常信息:
ERROR/AndroidRuntime: java.lang.SecurityException: Permission Denial:
starting Intent { act=android.intent.action.CALL dat=tel:12345678 cmp=com.android.phone/.OutgoingCallBroadcaster }
……
requires android.permission.CALL_PHONE
看来,我们是缺少了CALL_PHONE这个权限,这个权限是Android系统自带的phone应用里定义的权限:
……
<uses-permission android:name=”android.permission.CALL_PHONE” />
……
<activity android:name=”OutgoingCallBroadcaster”
android:permission=”android.permission.CALL_PHONE”
android:theme=”@android:style/Theme.NoDisplay”
android:configChanges=”orientation|keyboardHidden”>
<!– CALL action intent filters, for the various ways
of initiating an outgoing call. –>
<intent-filter>
<action android:name=”android.intent.action.CALL” />
<category android:name=”android.intent.category.DEFAULT” />
<data android:scheme=”tel” />
</intent-filter>
<intent-filter>
<action android:name=”android.intent.action.CALL” />
<category android:name=”android.intent.category.DEFAULT” />
<data android:scheme=”voicemail” />
</intent-filter>
<intent-filter>
<action android:name=”android.intent.action.CALL” />
<category android:name=”android.intent.category.DEFAULT” />
<data android:mimeType=”vnd.android.cursor.item/phone” />
<data android:mimeType=”vnd.android.cursor.item/phone_v2″ />
<data android:mimeType=”vnd.android.cursor.item/person” />
</intent-filter>
</activity>
……
想要使用此功能,必须在我们的AndroidManifest.xml文件中声明使用此权限:
<application …>

</application>
<uses-permission android:name=”android.permission.CALL_PHONE”/>
这告诉系统,我们的应用使用了此权限,我们有权访问拨打电话的Activity。
我们不仅要问,为什么系统会这样设计呢?答案是为了保护用户资源的安全。要想使用此功能,必须在应用中声明权限信息,这样一来,在用户安装此应用时系统会从应用中提取出权限信息,告诉用户该应用使用到了哪些功能,由用户判断该应用是否损害自己的安全。

接下来由我来演示一下权限的定义和使用,我们建立一个phone项目,项目结构如下:

%title插图%num

我们设计的流程是在MainActivity中点击按钮,然后跳转到PhoneActivity中,我们会为PhoneActiivty定义相应的权限。

我们先看一下MainActivity和PhoneActivity的代码:

MainActivity.java如下:

package com.scott.phone;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, PhoneActivity.class));
}
});
}
}
PhoneActivity.java如下:
package com.scott.phone;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class PhoneActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText(“Yes! It works.”);
setContentView(tv);
}
}
*重要的是AndroidManifest.xml文件,我们所有的权限声明配置都在此文件中完成:
<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”com.scott.phone”
android:versionCode=”1″
android:versionName=”1.0″>

<!– 声明一个权限 –>
<permission android:protectionLevel=”normal”
android:name=”scott.permission.MY_CALL_PHONE”/>

<application android:icon=”@drawable/icon” android:label=”@string/app_name”>
<activity android:name=”.MainActivity”
android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
<!– 为Activity应用已定义的权限 –>
<activity android:name=”.PhoneActivity”
android:permission=”scott.permission.MY_CALL_PHONE”>
<intent-filter>
<!– 注意这个action 在其他应用中可使用此action访问此Activity –>
<action android:name=”scott.intent.action.MY_CALL”/>
<category android:name=”android.intent.category.DEFAULT” />
</intent-filter>
</activity>
</application>
<!– 在同一应用中访问PhoneActivity也需要加上权限 –>
<uses-permission android:name=”scott.permission.MY_CALL_PHONE”/>
<uses-sdk android:minSdkVersion=”8″ />
</manifest>
需要注意的是,在声明权限时需要一个 android:protectionLevel的属性,它代表“风险级别”。必须是以下值之一:
normal、dangerous、signature、signatureOrSystem。

normal表示权限是低风险的,不会对系统、用户或其他应用程序造成危害。

dangerous表示权限是高风险的,系统将可能要求用户输入相关信息,才会授予此权限。

signature告诉Android,只有当应用程序所用数字签名与声明此权限的应用程序所有数字签名相同时,才能将权限授给它。

signatureOrSystem告诉Android,将权限授给具有相同数字签名的应用程序或Android包类,这一级别适用于非常特殊的情况,比如多个供应商需要通过系统影像共享功能时。

另外一个是android:permissionGroup属性,表示一个权限组。可以将权限放在一个组中,但对于自定义权限,应该避免设置此属性。如果确实希望设置此属性,可以使用以下属性代替:android.permission-group.SYSTEM_TOOLS。

下面是两个活动的截图:

%title插图%num

以上过程都是在一个内部完成的,现在假如我们的这个phone应用作为系统内置的应用,做为开发者,我们新建一个app,然后访问phone应用里的PhoneActivity。app的结构图如下:

%title插图%num

我们在MainActivity里放置一个按钮,点击之后跳转到phone应用的PhoneActivity中。MainActivity.java代码如下:

package com.scott.app;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(“scott.intent.action.MY_CALL”);
startActivity(intent);
}
});
}
}
然后我们需要在AndroidManifest.xml文件中配置相应的权限:
<application …>

</application>
<uses-permission android:name=”scott.permission.MY_CALL_PHONE”/>
点击按钮,就可以顺利地跳转到PhoneActivity了。截图如下:

%title插图%num

Android中的权限机制

Android的权限管理遵循的是“*小特权原则”,即所有的Android应用程序都被赋予了*小权限。一个Android应用程序如果没有声明任何权限,就没有任何特权。

权限的历史

2013年,苹果公司发布IOS7系统。其中一项令开发者头疼的修改点:隐私中增加相册、录音等权限,App如需使用相应权限,需要申请并由用户同意(IOS7以前,可以直接访问相册),针对此点,很多App在首次启动时一通弹窗,申请各式各样的权限。

后来苹果为改善用户体验,在App Store审核时要求App必须在使用前一刻才能申请权限,有效改善了此类问题。比如一款直播App,当你启动App时并不需要相机、录音权限,等到你开播时才需要申请这两个权限。这一场景,其实就类似今天要提到的Android动态授权。

早期:无遮拦

Android6.0系统以前,在安装App前,会罗列出App申请的所有权限。如果继续安装,视为用户同意赋予App所需权限。这种机制是无遮拦的,在尝试安装App时,弹窗罗列了App申请的全部权限。只能对所需权限进行查看,无法拒*授权,可选择取消安装或继续安装。

这种方式,对于开发者*为友好,仅需在Manifest中配置App所需权限即可,代码就可以直接调用了。但是对于用户来说,这种方法存在*大的安全隐患。

%title插图%num

发展:第三方安全App

为解决部分敏感权限被不合理使用,国内部分公司的安全类App,开始监控应用获取手机敏感权限并做出提示。如360手机卫士、腾讯手机管家等产品,当监测到有App尝试使用短信权限、定位等敏感权限,会告知用户,并可以拒*赋予权限。刚开始,还比较顺利。但随着手机厂商逐渐开始修改ROM,第三方安全App的兼容、性能问题逐步爆发。

升级:厂商行动

再稍后一些,手机厂商开始行动,纷纷将第三方软件的权限提示功能直接做入ROM。并把安全作为产品的卖点进行打造。

%title插图%num

 

目前:谷歌升级权限管理

2015年推出的Android 6.0,加入了危险权限管理。因手机厂商对ROM的修改,部分6.0以上机器并不支持此项特性。到了此阶段,App需要在对权限代码进行修改后,才能正常使用对应权限。简单理解为3步:

  • 1、判断是否授权;
  • 2、如果未授权需申请权限,根据授权结果继续执行;
  • 3、已授权可以继续操作。

权限的使用和适配

零、权限的基础知识

Android系统基于Linux内核,系统中的权限分为3类:

  • Android手机所有者权限:这个和厂商相关,可以理解为系统权限。
  • Android ROOT权限:类似于Linux,这是Android系统中的*高权限。如果拥有该权限,就可以对Android系统中的任何文件、数据、资源进行任意操作。所谓“越狱”,就是令用户获得*高的ROOT权限。
  • Android应用程序权限:该权限在AndroidManifest文件中由程序开发者声明,在需要时由用户授权。

一、不适用动态权限

动态权限特性,仅从Android 6.0开始拥有,所以,可以简单粗暴的通过不提升targetSDK(targetSDK<23)的方式,便可不触发此特性。

如果不改变任何代码,直接将targetSDK提升到26,然后运行App,做同样操作时会发生异常甚至崩溃,产生这个崩溃的原因,是在Android 6.0及以上,未获取权限的情况下直接执行了需要权限的操作。

二、动态权限适配

1、在使用前权限前,检测权限

首先,我们需要判断自己是否拥有权限。判断时间点为执行需要权限的对应操作前。如我们在获取IMEI前,需要判断是否拥有PHONE_STATE权限。

我们可以调用ContextCompat.checkSelfPermission()方法检测授权状态,返回的结果为PackageManager中的两个常量:PERMISSION_GRANTED(已授权)和PERMISSION_DENIED(未授权)。

2、已授权的情况下,执行相应的操作

当已授权时,就可以执行原有的操作了。代码如下:

  1. // 检测PHONE_STATE 如果已授权
  2. if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
  3. //做你想做的
  4. }

3、未授权时,申请权限

如果App未获得授权,我们就需要向用户申请授权。可以调用requestPermissions()方法来请求授权。代码如下:

  1. // 检测PHONE_STATE 如果未授权
  2. if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
  3. //申请权限
  4. ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_PHONE_STATE), PERMISSIONS_REQUEST_PHONE_STATE)
  5. }

requestPermissions()中的第三个参数是一个int型请求码,方便回调处理。

调用申请授权方法后,ROM会调起一个系统级弹窗,这个dialog开发者无法定制。当用户点击同意后,系统会记录,下次再判断权限时就会返回已授权状态;当App卸载时,记录会被清除。

4、重写函数,处理授权弹窗的结果

直接在Activity或Fragment中重写onRequestPermissionsResult()函数,来处理权限申请结果。requestPermissions()的第三个参数,将在这里被用到。代码如下:

  1. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  2. if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) {
  3. if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  4. //todo
  5. } else {
  6. //todo
  7. }
  8. }
  9. }

理性分析,拼多多是怎么远程删除用户图片的?技术上是否可行?

19 条回复    2021-01-14 10:22:41 +08:00
HongJay
    1

HongJay   87 天前

安卓可以。但没必要。怀疑 bug
ArJun
    2

ArJun   87 天前

获取了权限应该是可以删除的,安卓的权限很霸道
codehz
    3

codehz   87 天前 via Android

(这就是为啥谷歌要在 android 11 限制读取 /sdcard,阻止访问 Android/data
(以及推了好几个版本也没推上的 scoped storage
xiaoliu926
    4

xiaoliu926   87 天前

android 获取相册读取存储权限,你手机上几乎啥都能远程删除
yukiww233
    5

yukiww233   87 天前

可以
不过感觉大概率是发送截图时本地压缩了一份,发完之后缓存就删了
tomari
    6

tomari   87 天前

给了权限就可以,但是个人认为没有这种奇怪的需求和吃力不讨好的必要。。我觉得跟用录音推荐商品一样吃力不讨好
testxss
    7

testxss   87 天前

这么高风险低价值的事情,做了有什么用呢?
ajaxfunction
    8

ajaxfunction   87 天前

就和 app 可以做到视频摄像头监控一个人吗?
肯定可以,比如微信 app,程序员把微信视频聊天功能里 代码搞成自动接听就完了,
但是这样子似乎毫无意义
ku9527
    9

ku9527   87 天前

@HongJay 你这意思是:我胖虎冤枉你大雄了 ^_^
westoy
    10

westoy   87 天前

@tomari

未必
就技术和实现上来说
录音推荐一是识别成本高&&耗电, 二是准确度低, 说白了就是费力而且不划算啊
但是某个 app 用户投诉客服被套路, 客服给用户标识一个 flag, app 端远程接收一个动态指令和模型, 扫一两天内的小图片, 然后根据模式识别是不是针对性的截图, 是就删掉, 技术上并不是不可行的, 而且开销也不大, 好处也是实打实的

Nillouise
    11

Nillouise   87 天前

@westoy 录音识别应该有专门的低耗电芯片做出来,faceID 用的好像就是专门的芯片识别人脸,没理由录音做不出来。
xiyuesaves
    12

xiyuesaves   87 天前

理论上只要你给了存储权限,app 就能访问整个存储空间了,miui 到是在升到安卓 11 之后单独吧相册权限拎出来需要单独授权了
telami
    13

telami   87 天前

帮别人砍了一刀,就下载了拼多多,然后有一天突然发现,我相册里面的照片,被像发朋友圈一样,展示在了拼多多里面,真是太恶心了
westoy
    14

westoy   87 天前

@Nillouise

那个是少量的触发唤醒词, 实时分析语义不可能放本地的

longxk
    15

longxk   87 天前   ❤️ 1

按拼多多的说法,只是删除了缓存图片,我觉得没有问题。
只是缓存图片没有做隐藏处理,被图库索引到了。
然后华为和 VIVO 的系统会拦截 APP 对图库文件的删除操作,导致了所谓的远程删除提示。
那个视频只是提到了拼多多有被拦截的删除操作,连时机都没有说明,删除的是否是他的截图也没法证明。
julyclyde
    16

julyclyde   87 天前

说他偷照片都比删照片可信
我觉得他们的解释(图片处理过程中的临时文件)说得过去
pwn
    17

pwn   87 天前

首先技术上完全可行,安卓的权限就这么乱来,没有区分,有点期待 MIUI 12.5 给出的解决方案。
其次,拼多多的解释是说删除的是缓存文件,而实际上被删除的是截图文件,截图文件的保存位置跟缓存文件的保存位置完全不一样好吧。用户调用拼多多里面的拍照功能得到的图片,放在缓存合理,删掉也可以,是一个程序能做的,但是跑去删系统目录(一般是 DCIM )下面的文件,就说不过去了。
但神奇的是,几乎所有人都忽视了这个区别,以为拼多多的解释合理。。
wsseo
    18

wsseo   86 天前

@pwn 拼多多的说法不是截屏,是通过 pdd 调用消息拍摄的图片。
cw2k13as
    19

cw2k13as   86 天前

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