Apk静默安装之调用系统隐藏API

Android各版本 应用安装之静默安装/卸载SDK实现 (三) 前两章分析了Android应用安装与卸载的各种方式:Android14 应用安装之方法汇总 (一)Android14 应用安装之静默安装 (二)下面我们就兼容Android各版本实现静默安装与卸载的SDK。根据前两篇文章的描述,应用要实现静默安装与卸载,那么该应用必须为系统应用才有权限来执行。也即下面我们实现的SDK只能供系统应用来对接。怎么将应用变成系统应用,这里不再赘述! 阅读详情

0x00 问题

何为隐藏的API?

简单来说就是在源码中被用 @hide 标记的代码块,比如常量,方法等。以常用的 ActivityManager.java 为例,里面就有大量的隐藏API:

@SystemService(Context.ACTIVITY_SERVICE)
public class ActivityManager {
...
     /**
     * System property to enable task snapshots.
     * @hide
     */
    public final static boolean ENABLE_TASK_SNAPSHOTS;
...
    /**
     * Return the default limit on the number of recents that an app can make.
     * @hide
     */
    static public int getDefaultAppRecentsLimitStatic() {
        return getMaxRecentTasksStatic() / 6;
    }
...
}

以上代码来自 AOSP 源码,我们下载的 Android SDK 源码中是找不到这些代码的。

而用 Android Studio 进行系统App的开发的我们,有时候难免会调用到系统隐藏的API,那我们怎么办呢?

0x01 调用系统隐藏API

如果你之前做过功课,你会发现网上有很多通过反射来调用系统API的例子,既然反射能调到,说明这些方法在我们的运行环境中是存在的。那这些方法从哪里加载的呢?这就要提到设备中的一个jar:/system/framework/framework.jar,他和我们 SDK 中加载的 android.jar 的区别就是他里面包含了这些隐藏的API。到这里我们就得出两种调用系统隐藏API的方法:

  • 反射

    这个最常见了,如:

    public static boolean silentInstall(PackageManager packageManager, String apkPath) {
        Class<?> pmClz = packageManager.getClass();
        try {
            Method method = pmClz.getDeclaredMethod("installPackage", Uri.class, Class.forName("android.content.pm.IPackageInstallObserver"), int.class, String.class);
            method.setAccessible(true);
            method.invoke(packageManager, Uri.fromFile(new File(apkPath)), null, 2, null);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    
  • 替换 SDK 中的 android.jar

    这个就厉害了,反射一次只可以反射一个方法,这种方式所有系统的隐藏API都可以直接调用到。Github上有个一个项目 android-hidden-api ,在这里我们可以下载别人收集的带隐藏API的 android.jar。

个人不是很喜欢反射,就研究了下第二种方法,但是很遗憾,我没成功(可能是因为我的build工具版本比较高)。那么还有其他方法吗?

由于我们有系统的源码,因此我们可否从源码入手?简单总结了一个思路:创建一个项目,在这个项目中对要调用的系统隐藏API做一些封装,然后在AOSP中编译生成jar包,最后将这个jar包拷贝到 Android Studio 中使用。下面以App的静默安装为例,说明此思路的具体实现。

0x02 SystemHideAPI

这里有一个前提,系统隐藏API可以通过各种方法调到,但是能不能调成功却是另外一回事,因为有些隐藏API不是普通权限的App可以调用的。若要升级你的App为系统App,可以按照下面几步操作:

  • AndroidManifest.xml 中添加

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.your.pkg"
    android:sharedUserId="android.uid.system">
    ...
    </manifest>
    
  • 系统签名
    使用系统密钥给App签名。一般位于: build/target/product/security/ 中。 需要signapk.jar,命令如下:
    java -jar signapk.jar platform.x509.pem platform.pk8 in.apk out.apk

  • 安装
    直接推到 /system/app/ 或者 /system/priv-app/下面,重启即可。

下面回到我们App静默安装的例子。

bash-3.2$ tree
vendor
|-- ...
|-- SystemHideAPI
|   |-- Android.mk
|   `-- com
|       `-- your
|           `-- pkg
|               `-- utils
|                   `-- SystemHideAPI.java

SystemHideAPI.java

public class SystemHideAPI {
    /**
     * Silent install
     * @param pm
     * @param apkPath
     * @return
     */
    public static boolean silentInstall(PackageManager pm, String apkPath, OnInstallResultListener listener) {
        if(null == pm || TextUtils.isEmpty(apkPath)){
            return false;
        }
        pm.installPackage(Uri.fromFile(new File(apkPath)), new PackageInstallObserver() {
            @Override
            public void onPackageInstalled(String basePackageName, int returnCode, String msg, Bundle extras) {
                if (null != listener) {
                    listener.onResult(basePackageName, returnCode, msg);
                }
            }
        }, PackageManager.INSTALL_REPLACE_EXISTING, "");
        return true;
    }

    /**
     * App install callback
     */
    public interface OnInstallResultListener {
        /**
         * App install callback
         *
         * @param pkg
         * @param returnCode
         * @param msg
         */
        void onResult(String pkg, int returnCode, String msg);
    }
}

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := SystemHideAPI
LOCAL_MODULE_TAGS := optional
LOCAL_JACK_ENABLED := disabled

include $(BUILD_STATIC_JAVA_LIBRARY)

Build

mma

classes.jar

生成的jar文件位于下面目录:

out/target/common/obj/JAVA_LIBRARIES/SystemAPI_intermediates/

➜  SystemHideAPI_intermediates tree -L 1
.
├── anno
├── classes
├── classes-full-debug.jar
├── classes.jar
└── link_type

2 directories, 3 files
➜  SystemHideAPI_intermediates

最后,将生成的 classes.jar 拷贝到Android Studio项目,使用 SystemHideAPI 中的方法,即可正常编译,运行了。

0x03 总结

相比反射,这种方式的灵活性更大,如上面静默安装的例子,如果我想监听安装的回调,还需要去反射 PackageInstallObserver 这个类(这个类也是hide)。如果还需要其他隐藏的API,只需要增加响应的方法即可。给我们在AndroidStuido 中调用系统隐藏API带来很大方便

0xFF 参考

  1. https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces?hl=zh-cn
  2. https://github.com/skylot/jadx/releases
  3. https://github.com/anggrayudi/android-hidden-api
  4. https://blog.youkuaiyun.com/pshiping2014/article/details/79549680
  5. https://stackoverflow.com/questions/17035271/what-does-hide-mean-in-the-android-source-code
Android 8.1 静默安装 1、<=Api 23 时 相信大家都是通过installPackage这个类反射来静默安装apk的。但是呢api24及其之后就没有这个方法了,你再PackageManagerService或IPackageManager都是没有这个方法了。所以我们只能通过installPacakageAsUser来实现静默安装了。代码如下: /** * void installPac... 阅读详情

相关推荐

Android APK后台静默安装技术详解与实战指南

htmltable {th, td {th {pre {简介:Android APK后台静默安装是指在无需用户交互的情况下,通过命令行或编程方式自动完成应用安装的技术,主要应用于批量部署、系统更新和自动化测试场景。本文详细介绍了静默安装的实现原理、适用Android版本范围(如4.2–4.4可行,6.0及以上受限),并通过adb shell与pm命令演示了具体操作流程,包括获取权限、设置安装路径、执行安装命令及处理权限限制。

weixin_35266799的博客 1431

Android各版本 应用安装之静默安装/卸载平台接口实现 (四)

将平台接口文件都放置于下面的路径下:java文件:CloudComputerAgent.java这个文件是APP调用的总入口= null) {Java文件:PackageManager.java这个文件提供了静默安装及卸载的调用/*** 包管理模块*/= null) {//推荐厂商在实现是通过调用有权限的服务端进行安装,因此这里会跨进程调用到系统应用中进行具体的静默安装与卸载/*** APP通过此接口静默安装应用。

Red风信子的博客 622

Android 10系统级静默安装APK实战详解

简单来说,platform key 就是设备制造商用来签署整个系统镜像的那一套密钥。它通常包含两个文件::私钥(PKCS#8格式):公钥证书(X.509格式)这些密钥用于签署所有核心系统组件,比如Settings、SystemUI、Phone等。当你自己开发一个系统级应用时,也必须用同一套密钥签名,才能被视为“一家人”。否则,即使你放进了priv-app,系统也会说:“你不认识我,我不认识你。归根结底,静默安装不是一个技术问题,而是一个信任问题。

weixin_35899324的博客 879

我的安卓AOSP开发使用到的教程汇总【安卓12】

静默安装需要使用到系统权限,需要系统签名,文章底下有我的评论,最后汇总都是发现都是一份代码出来的【直接泪目】scrcpy 【设置为系统变量后 可以投屏的情况下使用adb 并且查看log】【为什么当时标注了精华?

weixin_43387612的博客 1100

实现Android应用的静默安装方法

在Android系统中,权限是控制应用程序行为和保护用户数据安全的关键机制。权限分为两大类:普通权限和危险权限。普通权限通常不会对用户隐私造成风险,例如访问互联网、使用Wi-Fi等,这些权限一般不需要用户特别授权,应用程序声明即可自动获得。而危险权限则涉及用户隐私,如联系人、位置、相机、麦克风等,这些权限需要用户在运行时明确授权。权限的另一种分类是应用权限和系统权限。

weixin_42527589的博客 1154

android添加系统api和系统apk的过程

实现在androud2.3.4源码中添加一个系统api并在源码中加入一个apk,编译后运行还验证api的过程

华为应用市场静默安装

最近有个需求,领导要求华为应用市场实现静默安装。反编译华为应用市场后发现只要加个权限就可以实现。直接上代码,位置在aosp的PermissionManagerService中。

doublelixin的博客 1186

Android 无需root实现APK静默安装

使用Android5.0的环境编译的,不同版本之间,aidl文件可能会有差异,具体还需参照Android系统源码。详细参考我的博客文章《Android 无需root实现APK静默安装》:http://blog.youkuaiyun.com/yyh352091626/article/details/50533137

利用反射机制来调用android隐藏api,实现应用静默安装.

在本人浏览器中需要下载安装插件,但是安装过程又不想打扰用户,google下android静默安装apk,发现大部分都是要用到在linux上用mmm来编译... 本人懒得弄源码等东西.所以利用了java的反射机制来实现了调用隐藏api.至于远离,请查看java的反射原理...网络上大把介绍... 废话不多说,先看看我的代码实现吧.

创业的程序员 451

Android反编译工具

包括dex和jadx两个工具,一个是反编译apk的java代码的,一个可以反编译资源文件

C语言 在合并编译 ( 多.c文件 ) 情况下 实现 linked list ( 链表 ) 教程 . 更新ing

写在前面  依旧是参考借鉴了 浙江大学 温老师 的视频教程,很不错,在中国大学MOOC上,强力推荐!  虽说有借鉴,但是能保证的是每一行代码都是我自己经过理解后手敲出来的,所以才来做了这部分的教程。  最后,带 * 字符是我个人觉得可以添加的功能,按理来讲是可以不看的,而且大概率是可以有更好的改进的。  PS: 文章还在更新,如果文字蓝了(有超链接),说明写完了,如果没蓝,说明我在开军舰.jpg 源代码:  这里→源代码. 第一步:前置工作  先说一下每一篇都会出现 main 函数的,stage1 只是给没

weixin_47287635的博客 527

android批量安装APK

在android机上安装APK时一般都是借助PC端的91手机助手或者豌豆荚之类的工具;或者直接将APK下载到android机子上手动点击安装,手动安装时系统会弹出“是否要安装该应用程序?”的对话框让你选择是否安装,如果一次只安装一两个APK还可以在每次弹出对话框时选择“安装“,如果一次需要安装数十个时这是相当费力而且容易漏掉APK没有安装的。     能不能自己写个应用来实现一次批量安装所有

yearafteryear的专栏 8347

XDMA 驱动安装与性能测试全流程解析

本文详细解析了XDMA驱动的完整安装与性能测试流程。从环境准备、源码获取、编译安装到驱动加载与设备验证,逐步指导用户打通FPGA加速卡与主机间的高速数据通道。重点介绍了如何通过官方测试脚本进行功能验证与带宽性能测试,帮助用户评估XDMA驱动的实际传输效能,为AI推理、高频交易等低延迟高带宽应用奠定基础。

weixin_29216049的博客 526

Android静默安装

静默安装的两种方式 1、需要root权限 2、拥有系统签名 首先第一种方式: 需要root权限 1 import java.io.File; 2 import java.io.IOException; 3 import java.io.InputStream; 4 import java.io.OutputStream; 5 import android.conte...

weixin_33896069的博客 98

告别单调!3种方法给VS2019换上VSCode同款NightOwl主题(附字体优化技巧)

本文详细介绍了三种将VSCode热门NightOwl主题移植到VS2019的方法,包括扩展市场直装、官方主题库导入与增强以及手动调色实现像素级复刻。同时提供了字体优化与视觉增强技巧,帮助开发者打造更舒适的编码环境。

weixin_28836989的博客 215

Synopsys工具链实战:如何用VCS、DC、ICC和Calibre跑通你的第一个数字IC设计项目?

本文详细介绍了如何使用Synopsys工具链(VCS、Design Compiler、ICC和Calibre)完成数字IC设计项目,从RTL代码到GDSII版图的全流程。涵盖环境配置、RTL设计验证、逻辑综合、物理实现及签核验证等关键步骤,帮助工程师掌握高效的数字IC设计流程。

weixin_42525005的博客 199

android 实现静默安装、卸载(图)

android中应用的安装卸载,大家(用android设备的)肯定不陌生。这里就来浅谈android应用的安装、卸载的实现方式。 1.系统安装程序 android自带了一个安装程序---/system/app/PackageInstaller.apk.大多数情况下,我们手机上安装应用都是通过这个apk来安装的。代码使用也非常简单: ? 1

阳光灿烂的日子的博客 2510

大模型训练流程(四):PPO强化学习实战与调优指南

本文详细解析了大模型训练中PPO强化学习的实战应用与调优技巧,涵盖RLHF核心原理、PPO算法实现及显存优化策略。通过具体案例和代码示例,指导开发者有效提升模型回答质量与安全性,避免常见训练陷阱。

weixin_29051811的博客 438

【安卓静默安装手段分析】

———优快云插入图片实在是蛋疼,现在都喜欢用erevnote了,但是有好的文章还是想分享出来我们平时安装应用的手段1.应用市场安装。 这种是没有安装界面的,一般有也只是有个进度条。如:小米应用市场,googleplay等。 2.adb 命令进行安装 这种也是没有安装界面 3.网络下载的应用。 这种一般都有安装界面。apk的安装处理流程 i. apk会copy到/data/app; ii

Tesi1a的充电桩 2338

Unreal5从入门到精通之一文搞懂Unreal的C++代码编译之谜

我们在开发Unreal项目时,如果时蓝图模板的项目,一般问题不大,因为当你修改完蓝图,点击编译Compile+保存Save,就可以继续开发了。这对于开发者来说也非常友好。但是,如果你使用的C++模板开发项目,代码编译一切都变得魔幻起来,IDE(VS/Rider)里面有编译,编辑器里面也有编译,有什么区别呢?我们来列举几个新手常碰到的问题。1.代码我明明新建了,编辑器里怎么看不到?2.昨天我新家的功能运行的好好的,今天怎么感觉还是老逻辑。或者昨天加的新代码,新蓝图不见了。

TxNet 1607

linux那些事之numa balance

numa balance numa balance是页迁移技术最重要也是最开始使用应用的技术,主要是为解决由于调度器进程在两个node迁移造成访问内存性能问题。 numba balance通过页迁移技术,将不在运行节点的内存迁移到所运行的节点上。对应numa balance要注意几点: 防止进程在两个节点之前来回切换造成频繁进行页迁移(ping pang现场)从而影响性能。numa balance本身就是为了提高性能,不能因为造成频繁页迁移而对性能进行一个反向优化。 多个线程分布在不同线程 访.

weixin_42730667的博客 3911

Android中实现静态的默认安装和卸载应用

Android中实现静态的默认安装和卸载应用

qq_44906504的博客 301

高通 vs MTK vs 海思:三大平台 ISP 架构横向对比与实战差异分析

随着移动影像能力成为智能终端差异化竞争的核心维度,ISP(Image Signal Processor)架构日益重要。高通、MTK、海思三大 SoC 厂商在 ISP 设计上各具特色,不仅在图像处理链路、模块集成度、算法加速路径等方面存在显著差异,同时也决定了终端厂商在成像质量、调试复杂度与扩展能力上的实际表现。本文将基于真实平台项目经验,横向对比三大主流平台的 ISP 架构关键指标,系统分析其在实际开发过程中的能力边界、工程成本与调优空间,帮助工程师更精准地进行平台选型与优化策略制定。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3938

CrossProfileTestApp下载 (Crossprofiletestapp是什么)

摘要:CrossProfileTestApp是谷歌开发的系统工具,专为OPPO系手机用户提供极简应用安装体验。它能一键调用安卓原生安装器,跳过繁琐的安全检查、广告推荐等步骤,实现"点击即安装"。该应用无需Root或ADB操作,安装包小巧,运行高效,特别适合追求纯净体验的玩机用户。通过隐藏系统接口,它解决了ColorOS/OxygenOS/realmeUI系统的安装痛点,让用户重获原生安卓的流畅安装体验。

免费分享,免费下载 1200

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

静默安装

软件实现的功能:当需要静默安装(即不弹出安装确认对话框,后台自动安装)时,启动安装服务,将待安装的软件包的路径放置到intent中,然后启动安装服务即可,在软件成功安装以后,会发送广播,你只需要接受对应的广播,即可获知软件是否安装成功!   软件的关键代码:   Java代码 class PackageInstallObserver extends IPackageIns...

iteye_16410的博客 158

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: NMS Toast
下一篇: 【Android】ServiceNotFoundException: No service published for: search
ttdevs
博客等级 码龄15年 388粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值