精华内容
下载资源
问答
  • 有时候使用某些api需要使用系统权限,如调用PackageInstaller的相关接口,需要android.permission.INSTALL_PACKAGES权限,该权限系统只会授权给系统应用,此时可以考虑将我们的应用升级系统应用,升级系统应用有...

    有时候使用某些api需要使用系统权限,如调用PackageInstaller的相关接口,需要android.permission.INSTALL_PACKAGES权限,该权限系统只会授权给系统应用,此时可以考虑将我们的应用升级为系统应用,升级为系统应用有两种方法:

    1. 将apk放到/system/app目录下,重启手机即可,此方法比较粗暴,而且需要修改/system目录的读写权限,因此需要root,而且随着Android系统版本对权限管理越来越严,root和修改读写权限更繁琐和复杂
    2. 添加sharedUserId="android.uid.system"配置,同时使用系统签名对apk进行重签名,安装后即有系统权限,此方法需要获取到系统签名,但通常厂商开发的rom都不会公开签名,因此如果针对某些自己集成系统的需求,可以使用此方案。

    下面针对第2种方案进行讲解。

    1. 首先需要在menifest文件中添加sharedUserId="android.uid.system"配置,如下
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                  package="com.google.example"
                  android:sharedUserId="android.uid.system">

       

    2. 添加需要的使用的系统权限,如

      <uses-permission android:name="android.permission.INSTALL_PACKAGES" />

       

    3. 使用系统签名对apk进行签名,首先需要打未签名的包,Android Studio环境下点击右侧Gradle按钮,弹出目录,打开Tasks->build->assemble...,其中assemble开头的几项即是打包任务,双击相应项即可获取相应的包

    接着要获取系统签名,找到系统签名文件“platform.pk8”和“platform.x509.pem”,在系统源码路径下

    签名文件路径:android/build/target/product/security/

    准备好签名工具:“signapk.jar”

    位置:android/prebuilts/sdk/tools/lib

    将未签名的apk、签名文件和签名工具放在同一路径下,开启终端,cd到该目录,运行如下命令即可得到带系统签名的apk

    java -jar signapk.jar platform.x509.pem platform.pk8 Demo.apk signedDemo.apk

    以上的方法相对还是比较繁琐,而且不便于调试,可以将系统签名打入keystore,使用该keystore即可在Android Studio环境下生成带系统签名的apk

    1. 首先需要生成keystore文件,生成过程在此省略,可自行百度
    2. 下载keytool-importkeypair,https://github.com/getfatday/keytool-importkeypair/
    3. 该操作需要linux系统,并安装jdk,win10环境下可以开启“基于Lunix的Windows子系统”,不需要去折腾安装虚拟机或者系统。当如,如果兄dei你已经有Linux系统或者是mac,那么恭喜你,省了很多需要折腾的步骤
    4. 将keystore、platform.pk8、platform.x509.pem、keytool-importkeypair放在同一目录下,开启终端,cd到此目录,运行如下命令即可将系统签名打入keystore
      ./keytool-importkeypair -k ./demo.keystore -p password -pk8 platform.pk8 -cert platform.x509.pem -alias demoAlias
      
      解释:-P后接keystore密码,-alias后接key alias

       

    5. 运行结束即会在当前目录下生成带有系统签名的keystore,使用此keystore安装Android Studio打包流程打包即可得到带系统权限的apk

    展开全文
  • 前一篇说了在app中弹出应用权限设置界面。本篇就说一下怎么获得应用需要的所有权限并查看是否授权。 PackageManager pm = context.getPackageManager(); PackageInfo pi; try { // 参数2必须是PackageManager.GET_...
    前一篇说了在app中弹出应用权限设置界面。本篇就说一下怎么获得应用需要的所有权限并查看是否授权。
    PackageManager pm = context.getPackageManager();
    PackageInfo pi;
    try {
        // 参数2必须是PackageManager.GET_PERMISSIONS
    pi = pm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);
        String[] permissions = pi.requestedPermissions;
        if(permissions != null){
            for(String str : permissions){
                boolean permission = (PackageManager.PERMISSION_GRANTED ==
                        pm.checkPermission(str, getPackageName()));
    
                Log.i(TAG, str + permission);
            }
        }
    }catch (NameNotFoundException e) {
        e.printStackTrace();
    }

    展开全文
  • Android系统级应用程序在运行时需要申请权限吗, 是不是在AndroidManifest.xml文件中进行设置后, 应用程序直接就获取了相关权限, 例如: android:name="android.permission.ACCESS_FINE_LOCATION" /> 在代码中就...
  • 3.第三方应用不可卸载并且不用动态申请危险权限应用 通常厂商内置应用会放到vendor目录下再创建自己的目录名,把需要预置的apk放入对应目录,并编写对应的mk文件。 应用是否可用卸载会根据类型最后拷贝到不同的...

    一、内置应用分为以下几种:

    1.第三方合作可卸载应用

    2.第三方应用不可卸载应用

    3.第三方应用不可卸载并且不用动态申请危险权限应用

     

    通常厂商内置应用会放到vendor目录下再创建自己的目录名,把需要预置的apk放入对应目录,并编写对应的mk文件。

    应用是否可用卸载会根据类型最后拷贝到不同的目录下,例如system/app(不可卸载),system/ third-app(可卸载),system/priv-app(

    不可卸载并启不用动态申请危险权限)。

     

    二、如何将应用不可卸载并且不用动态申请危险权限

    通常情况下我们的应用都会有自己的签名,如果这个签名和系统签名不同则不会被作为第三类应用的,所以需要和系统签名一样,

    当然我们一般会编写一个mk脚本再编译的时候重新给apk签名保证和系统签名一致。

    以下几步实现不可卸载并且不用动态申请危险权限应用:

    • 在AndroidManifest.xml文件中配置android:sharedUserId="android.uid.system"和系统共享userid
    • 将apk放到对应目录下
    • 编写改apk的mk文件
    • LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      # Module name should match apk name to be installed
      LOCAL_MODULE := XXXX
      LOCAL_MODULE_TAGS := optional
      
      LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
      LOCAL_MODULE_CLASS := APPS
      LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
      
      LOCAL_PREBUILT_JNI_LIBS := \
      @lib/armeabi/libxypatch.so
      
      #保留原来应用自身签名
      # LOCAL_CERTIFICATE := PRESIGNED
      #使用系统平台签名
      LOCAL_CERTIFICATE := platform
      include $(BUILD_PREBUILT)

       

    • 将目录mk文件添到系统编译mk文件中按照格式加就行

         # 需要预置的定制应用及三方应用

         PRODUCT_PACKAGES += \
             SogouInput \
              ****

    三、小结

    注意:

    1. 如果在AndroidManifest.xml文件中配置android:sharedUserId="android.uid.system"表示该应用一定要和系统平台签名一致要不然应用无法被解析安装。
    2. 动态申请的危险权限还是要写动态申请方法,如果不写动态申请权限方法系统也不会将这些权限默认赋予改应用,同时也是为了保证应用在被用户手动关闭权限后被再次弹窗提示框让用户手动赋予权限。
    3. 默认赋予应用动态权限只会在第一次启动赋予一次,如果后续手动关闭应用权限则需要弹框提示用户手动赋予权限。
    展开全文
  • 为什么 Android 截屏需要 root 权限

    万次阅读 2015-01-16 11:54:35
    这篇文章主要从代码的角度分析,问什么需要权限需要什么样的权限?对截屏方法也有一些分析,欢迎大家讨论。 Android 截屏 -- 传统方法 一般最开始的 Android 截屏程序,都是来源于 Linux 的截屏方法,android 使用...

    Android 截屏问题

    看到很多朋友都有一个需求:那就是截取 Android 的整个屏幕,而且大家都遇到一个相同的问题,没有权限。这篇文章主要从代码的角度分析,问什么需要权限,需要什么样的权限?对截屏方法也有一些分析,欢迎大家讨论。


    Android 截屏 -- 传统方法

    一般最开始的 Android 截屏程序,都是来源于 Linux 的截屏方法,android 使用的 Linux 内核,那么 Linux 下的截屏方法也就最先被 android 采用。Linux  使用了 framebuffer 管理显示输出,传统的办法就是读取 framebuffer 的数据,然后得到整个屏幕的数据。此方法在 Android3.0 版本之前是也唯一可行的方法。 然而 linux 采用了严格的权限控制 设备文件,framebuffer 也是其控制之一,在 Android 中只有 root , 和 graphic 组用户才有权限读取:

    ls -l /dev/graphics/fb0                                       
    crw-rw---- root     graphics  29,   0 2015-01-16 03:26 fb0

    所以要采用读取 framebuffer 的方式实现截屏,应用必须获得 root 权限。

    随着 Android 显示系统的变迁,自 Android 4.2 开始, Android 自己增加截屏接口,而且更多的设备采用了多个 framebuffer 使用 overlay 的方式,更有采用硬件 composer 的设备,使得单独读取 framebuffer 并不能截取到,一个完整的屏幕。于是这个方法也渐渐被开发者抛弃。



    Android 截屏 -- SurfaceFlinger

    在 Android 4.0 里,显示系统采用了新的构架,加入“黄油计划”,同时也添加截屏接口:

    status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
            sp<IMemoryHeap>* heap,
            uint32_t* width, uint32_t* height, PixelFormat* format,
            uint32_t sw, uint32_t sh,
            uint32_t minLayerZ, uint32_t maxLayerZ)
    {
        if (CC_UNLIKELY(display == 0))
            return BAD_VALUE;
    
        if (!GLExtensions::getInstance().haveFramebufferObject())
            return INVALID_OPERATION;
    
        class MessageCaptureScreen : public MessageBase {
            SurfaceFlinger* flinger;
            sp<IBinder> display;
            sp<IMemoryHeap>* heap;
            uint32_t* w;
            uint32_t* h;
            PixelFormat* f;
            uint32_t sw;
            uint32_t sh;
            uint32_t minLayerZ;
            uint32_t maxLayerZ;
            status_t result;
        public:
            MessageCaptureScreen(SurfaceFlinger* flinger, const sp<IBinder>& display,
                    sp<IMemoryHeap>* heap, uint32_t* w, uint32_t* h, PixelFormat* f,
                    uint32_t sw, uint32_t sh,
                    uint32_t minLayerZ, uint32_t maxLayerZ)
                : flinger(flinger), display(display),
                  heap(heap), w(w), h(h), f(f), sw(sw), sh(sh),
                  minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
                  result(PERMISSION_DENIED)
            {
            }
            status_t getResult() const {
                return result;
            }
            virtual bool handler() {
                Mutex::Autolock _l(flinger->mStateLock);
                result = flinger->captureScreenImplLocked(display,
                        heap, w, h, f, sw, sh, minLayerZ, maxLayerZ);
                return true;
            }
        };
    
        sp<MessageBase> msg = new MessageCaptureScreen(this,
                display, heap, width, height, format, sw, sh, minLayerZ, maxLayerZ);
        status_t res = postMessageSync(msg);
        if (res == NO_ERROR) {
            res = static_cast<MessageCaptureScreen*>( msg.get() )->getResult();
        }
        return res;
    }

    现在应用可以调用系统接口来截屏,最好的例子就是 screencap : frameworks/base/cmds/screencap/screencap.cpp

    然而,系统依然出于安全的考虑,对权限的控制依然严格:使用系统截屏接口需要 READ_FRAMEBUFFER 权限:

            case CAPTURE_SCREEN:
            {
                // codes that require permission check
                IPCThreadState* ipc = IPCThreadState::self();
                const int pid = ipc->getCallingPid();
                const int uid = ipc->getCallingUid();
                if ((uid != AID_GRAPHICS) &&
                        !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
                    ALOGE("Permission Denial: "
                            "can't read framebuffer pid=%d, uid=%d", pid, uid);
                    return PERMISSION_DENIED;
                }
                break;
            }

    而且 READ_FRAMEBUFFER 属于 system 级别的权限,非系统应用无法获得,所以在应用程序中声明了使用这个权限,应用程序如果不是 system 程序,依然没有权限。第三方程序要能截屏成功还是需要 root 。



    Android 截屏 -- ddms

    有的开发者就会发现,就算系统没有 root,依然可以通过 ddms 截屏成功。 为什么 ddms 可以在没有 root 的设备上截屏成功?

    ddms 也是调用系统的截屏接口,而且他直接调用的是 screencap:

    首先 ddms 通过 adb 发送信号给设备上的 adbd 守护进程,adbd 里面的 framebuffer service (system/core/adb/framebuffer_service.c ) 负责整个截屏过程:

    void framebuffer_service(int fd, void *cookie)
    {
        struct fbinfo fbinfo;
        unsigned int i;
        char buf[640];
        int fd_screencap;
        int w, h, f;
        int fds[2];
    
        if (pipe(fds) < 0) goto done;
    
        pid_t pid = fork();
        if (pid < 0) goto done;
    
        if (pid == 0) {
            dup2(fds[1], STDOUT_FILENO);
            close(fds[0]);
            close(fds[1]);
            const char* command = "screencap";
            const char *args[2] = {command, NULL};
            execvp(command, (char**)args);
            exit(1);
        }
    
        fd_screencap = fds[0];
    
        /* read w, h & format */
        if(readx(fd_screencap, &w, 4)) goto done;
        if(readx(fd_screencap, &h, 4)) goto done;
        if(readx(fd_screencap, &f, 4)) goto done;
    

    所以,实际上是 adbd 守护进程启动了 screencap;以没有root 的 mx3 为例:

    shell@mx3:/ $ ps adbd
    ps adbd
    USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
    shell     3008  1     4648   272   ffffffff 00000000 S /sbin/adbd
    shell@mx3:/ $ id shell
    id shell
    uid=2000(shell) gid=2000(shell) groups=1003(graphics),1004(input),1007(log),1009(mount),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats)

    adbd 是以 shell 用户执行的, 而系统为 shell 用户分配 graphics 组,所以 shell 用户是有权限调用 surfaceflinger 的接口的。



    总结

    以上几种办法,除了 adb 不需要 root ,另外两种都需要 root 才能截屏。当然还有 android 的版本差异,造成接口函数也不一样,具体细节可以查看源代码。要实现自己的截屏功能,提升权限是必须的,但是我们也看到有些程序可以在没有 root 的设备上执行。那么我们可以推测,可以不要 root ,但是提升到 graphics 或者将应用提升到 system 级别都是可行的。希望这篇文章可以帮助还在寻找截屏方法的朋友。


    展开全文
  • 危险权限,获取应用权限列表

    千次阅读 2018-08-08 15:34:54
    获取应用所需权限(只能获取在AndroidManifest.xml文件中声明的权限,像手机设置-》权限管理-》应用-》权限列表这个里面的权限并不是都能获取,比如读取应用列表的权限就获取不到) PackageInfo pkgInfo = ...
  • 权限漏洞:水平权限漏洞、垂直权限漏洞

    万次阅读 多人点赞 2019-07-31 19:21:31
    水平权限漏洞是指Web应用程序接收到用户请求时,没有判断数据的所属人,或者在判断数据所属人时是从用户提交的参数中获取了userid,导致攻击者可以自行修改userid修改不属于自己的数据。 漏洞示例: XXX/...
  • 未知来源应用权限   Android8.0的诸多新特性中有一个非常重要的特性:未知来源应用权限 以前安装未知来源应用的时候一般会弹出一个弹窗让用户去设置允许还是拒绝,并且设置允许之后,所有的未知来源的应用都...
  • 先上图,看看最终我们可以得到什么...应用权限信息分为两个部分,我们先来看应用权限使用情况。 PackageManager pm = context.getPackageManager(); PackageInfo packageInfo = pm.getPackageInfo(packageN...
  • Android中应用调用系统权限

    千次阅读 2017-03-02 11:24:05
    现在设备的安全性越来越受到重视,随之而来的便是开发中的各种不便,比如有普通权限,运行时权限,系统权限之分。...chapter one 系统应用添加系统权限 对于可以编译到源码里的apk添加系统权限很简单,
  • 部分手机读取应用列表权限

    万次阅读 2018-08-08 15:20:39
    部分手机比如小米,华为在权限管理那里有个读取应用列表的权限,这个读取应用列表的权限需要申请,部分手机系统默认就有的,并且默认打开。某型号小米手机关闭读取应用列表权限后仍然可以手机安装的第三方应用,...
  • 现在基本上每个安卓应用都有在线更新功能,应该很多人都知道7.0添加了文件夹限制访问的权限,主要就是拍照还有文件安装问题需要开发者去设置FileProvider 共享文件这里就不讲了 ,今天主要讲的就是8.0的一些...
  • Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri1 = Uri.fromParts("package", AuthentActivity.this.getPackageName(), null); intent.setData(uri1);...
  • MIUI应用权限设置

    千次阅读 2015-07-25 17:11:23
    随着miui越来越封闭,小米对非自由渠道的应用限制越来越苛刻,我们公司的...因此花了几个小时在网上搜索相关资料,我们不能帮助用户打开应用的权限至少我们能够引导用户去打开应用权限,并且将引导尽可能做的很简单。
  • 安装我们的app时提示这个权限,给用户感觉不好,可以不显示出来吗?或者说是这个权限什么?有知道的吗? 谢谢
  • ubuntu更改应用程序执行的权限

    千次阅读 2018-01-02 15:06:49
    如果是有图标的应用程序,直接/usr/share/applications,在下面查看是否有自己的应用程序xxxx,下面是一些权限设定,根据自己的需要而设定sudo chmod 600 ××× (只有所有者有读和写的权限) sudo chmod 644 ××...
  • 在android 项目中 怎么用代码获取用户是否开启或者拒绝了某一个应用权限,比如。拍照权限、定位权限
  • 应用程序升级拥有系统管理员权限。 写一个广播接收者,给该广播接收者去申请系统管理员的权限,让操作系统给广播接收者授权。(激活系统的授权组件)。 在此,本人主要通过申请应用系统管理员权限,锁屏,设置密码...
  • 根据上面的内容可知,主要是需要应用第一次安装的时候,提醒用户隐私权限相关的声明,并且用户可以进入隐私权限界面查看相关隐私内容。 逻辑实现 通过上面的说明,结合市面上常用的实现方式,该功能的流程图如下所...
  • 如何获取iOS应用网络权限

    万次阅读 2017-03-21 21:38:21
    在iOS 10下 ,首次进入应用时,会有询问是否允许网络连接权限的的弹窗,更好进行用户交互,需要在打开应用时获取应用禁用网络权限状态(状态分为:未知、限制网络、未限制网络),客户端根据不同的权限状态定制...
  • android判断应用是否有某个权限

    万次阅读 热门讨论 2014-12-16 15:13:54
    android在开发中有时候要判断应用中是否有某项权限,或者想获取到某个应用权限清单,可以使用以下方法 1) 判断应用是否具有某个权限 PackageManager pm = getPackageManager(); boolean permission = ...
  • Android应用程序获得root权限

    千次阅读 2013-09-17 22:30:54
    但是android application能够得到的最大权限为system,所以从网上搜索了一下,发现以下方式从理论上可行,准备进行验证!  android 应用程序获得root权限有两种思路: 1、实现一个init实现一个Service,来...
  • Android 应用适配 Android 7.0 权限要求

    千次阅读 2017-02-13 14:08:50
    但是对于 Android 6.0 以及以上,对于应用权限的获取具有更高的要求。应用只有获取到了相关权限才可以正常运行,相反如果用户没有赋予相关权限则应用直接退出甚至崩溃,无法进行正常的运行。 具体可以参考下列获取...
  • 周末时间参加了东莞和深圳的两场GDG,因为都是线上参与,所以时间上并不赶,我只需要坐在家里等活动开始就行...为什么?我认为Google在设计运行时权限这块功能时,充分考虑了用户的使用体验,但是却没能充分考虑开发者
  • Android应用申请运行时权限示例
  • Android应用默认权限开启

    万次阅读 2018-03-22 21:35:07
    Android系统应用默认权限设置frameworks/base/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java 类是对... 下面举个例子,修改系统中应用存储空间权限: private void grantDefaultSy...
  • APP检查应用授予的权限

    千次阅读 2016-07-18 14:16:59
    APP检查应用授予的权限 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(t
  • 今天给app添加权限,当用户禁止后会弹出alert提示用户,咱们这个app需要这个权限 没这个权限app的一些功能就不能使了,但用户已经关了 也不知道在哪打开 所以加个去设置的按钮 点击然后跳到系统应用管理 设置权限 ...
  • 安装包进行安装时会报:该应用定义的权限与系统中已有应用权限冲突。首先要解决这个问题,重点要关注“该应用定义的权限”,从这一点你就会清楚知道,失败的根本原因了。 首先检查下自己定义的uses-permission...
  • 在android手机系统开发中,可能会遇到将第三方应用的修改系统设置及在其他应用上层显示的权限默认打开的问题。我习惯的做法: 在framework层中,DatabaseHelper.java 中添加 private void loadSettings...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 934,819
精华内容 373,927
关键字:

为什么应用需要那么多权限