Android P阻止调用非sdk api后,Atlas该何去何从

2023-05-16

0、背景

    自从Android 9.0后,Android就已经开始着手阻止app开发调用非sdk的api,也就是被标记为@hide的变量、函数、类不可以通过反射调用,否则会提示NoSuchMethod异常

1、对atlas影响

   atlas有许多调用都是通过反射系统api来完成的,其中不乏被标记为@hide的类,比如用来处理插件资源的android.content.res.AssetManager#addAssetPath,还有用来处理动态部署的启动新activity的android.app.ActivityThread

    /**
     * Add an additional set of assets to the asset manager.  This can be
     * either a directory or ZIP file.  Not for use by applications.  Returns
     * the cookie of the added asset, or 0 on failure.
     * {@hide}  WARM,该方法被标记为隐藏
     */
    public final int addAssetPath(String path) {
        synchronized (this) {
            int res = addAssetPathNative(path);
            makeStringBlocks(mStringBlocks);
            return res;
        }
    }
/**
 * This manages the execution of the main thread in an
 * application process, scheduling and executing activities,
 * broadcasts, and other operations on it as the activity
 * manager requests.
 *
 * {@hide}   高能,整个类都标记为隐藏
 */
public final class ActivityThread {
如果android.content.res.AssetManager#addAssetPath不能用,资源在插件中就无法使用,如果android.app.ActivityThread整个类不让反射,那动态部署中无法添加新的activity、service

2、android p 处理非sdk调用

   但情况并没有想象的糟糕,android p 阻止调用非sdk并不是绝对的,并不是标记了hide就一定会抛异常。还有个X因素——light-greylist,如果被hide的api在里面列出,就允许被反射调用。该列表如下:

https://github.com/aosp-mirror/platform_frameworks_base/blob/master/config/hiddenapi-p-light-greylist.txt

https://github.com/aosp-mirror/platform_frameworks_base/blob/master/config/hiddenapi-light-greylist.txt

乍一看addAssetPath和ActivityThread都在里面,看来atlas还是有希望的,不过atlas用的反射有许多,让我们在Android p模拟器上运行下atlas试一试

3、死而后生,atlas的适配

  现在官网默认的master分支上的demo还没法运行,那是因为demo里反射调用了hide api且light-greylist没生命的api——android.app.ActivityThread#performRestartActivity,所以现在要运行demo请clone分支android_p

git clone https://github.com/alibaba/atlas.git -b android_p

运行后发现没有了之前的异常,但会有如下提示

05-27 04:37:31.077 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/ApplicationPackageManager;->mPM:Landroid/content/pm/IPackageManager; (light greylist, reflection)
05-27 04:37:31.077 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden method Landroid/content/pm/ParceledListSlice;-><init>(Ljava/util/List;)V (light greylist, linking)
05-27 04:37:31.115 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden method Landroid/content/pm/PackageParser;-><init>()V (light greylist, reflection)
05-27 04:37:31.115 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden method Landroid/content/res/StringBlock;-><init>(JZ)V (light greylist, reflection)
05-27 04:37:31.115 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/ActivityThread;->mInstrumentation:Landroid/app/Instrumentation; (light greylist, reflection)
05-27 04:37:31.115 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/ActivityThread;->mAllApplications:Ljava/util/ArrayList; (light greylist, reflection)
05-27 04:37:31.115 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/ActivityThread;->mInitialApplication:Landroid/app/Application; (light greylist, reflection)
05-27 04:37:31.115 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/ActivityThread;->mPackages:Landroid/util/ArrayMap; (light greylist, reflection)
05-27 04:37:31.115 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/ActivityThread;->sPackageManager:Landroid/content/pm/IPackageManager; (light greylist, reflection)
05-27 04:37:31.116 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/LoadedApk;->mApplication:Landroid/app/Application; (light greylist, reflection)
05-27 04:37:31.116 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/LoadedApk;->mResources:Landroid/content/res/Resources; (light greylist, reflection)
05-27 04:37:31.116 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/LoadedApk;->mResDir:Ljava/lang/String; (light greylist, reflection)
05-27 04:37:31.116 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/LoadedApk;->mClassLoader:Ljava/lang/ClassLoader; (light greylist, reflection)
05-27 04:37:31.116 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/LoadedApk;->mBaseClassLoader:Ljava/lang/ClassLoader; (light greylist, reflection)
05-27 04:37:31.116 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/LoadedApk;->mAppDir:Ljava/lang/String; (light greylist, reflection)
05-27 04:37:31.116 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/ContextImpl;->mResources:Landroid/content/res/Resources; (light greylist, reflection)
05-27 04:37:31.117 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/ContextImpl;->mTheme:Landroid/content/res/Resources$Theme; (light greylist, reflection)
05-27 04:37:31.118 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/view/ContextThemeWrapper;->mTheme:Landroid/content/res/Resources$Theme; (light greylist, reflection)
05-27 04:37:31.118 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/view/ContextThemeWrapper;->mResources:Landroid/content/res/Resources; (light greylist, reflection)
05-27 04:37:31.118 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/content/ContextWrapper;->mBase:Landroid/content/Context; (light greylist, reflection)
05-27 04:37:31.118 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/content/pm/PackageParser$Component;->intents:Ljava/util/ArrayList; (light greylist, reflection)
05-27 04:37:31.118 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/content/pm/PackageParser$Package;->activities:Ljava/util/ArrayList; (light greylist, reflection)
05-27 04:37:31.118 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/content/pm/PackageParser$Package;->services:Ljava/util/ArrayList; (light greylist, reflection)
05-27 04:37:31.118 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/content/pm/PackageParser$Package;->receivers:Ljava/util/ArrayList; (light greylist, reflection)
05-27 04:37:31.118 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/content/pm/PackageParser$Package;->providers:Ljava/util/ArrayList; (light greylist, reflection)
05-27 04:37:31.118 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/content/pm/PackageParser$Package;->applicationInfo:Landroid/content/pm/ApplicationInfo; (light greylist, reflection)
05-27 04:37:31.118 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/content/pm/PackageParser$Package;->packageName:Ljava/lang/String; (light greylist, reflection)
05-27 04:37:31.119 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/content/pm/PackageParser$ActivityIntentInfo;->activity:Landroid/content/pm/PackageParser$Activity; (light greylist, reflection)
05-27 04:37:31.119 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/content/pm/PackageParser$ServiceIntentInfo;->service:Landroid/content/pm/PackageParser$Service; (light greylist, reflection)
05-27 04:37:31.119 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/content/pm/PackageParser$ProviderIntentInfo;->provider:Landroid/content/pm/PackageParser$Provider; (light greylist, reflection)
05-27 04:37:31.119 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/content/pm/PackageParser$Provider;->info:Landroid/content/pm/ProviderInfo; (light greylist, reflection)
05-27 04:37:31.119 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/ActivityManager;->IActivityManagerSingleton:Landroid/util/Singleton; (light greylist, reflection)
05-27 04:37:31.119 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/util/Singleton;->mInstance:Ljava/lang/Object; (light greylist, reflection)
05-27 04:37:31.120 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/ActivityThread$AppBindData;->providers:Ljava/util/List; (light greylist, reflection)
05-27 04:37:31.120 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/ActivityThread;->mBoundApplication:Landroid/app/ActivityThread$AppBindData; (light greylist, reflection)
05-27 04:37:31.120 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden field Landroid/app/ContextImpl;->mPackageInfo:Landroid/app/LoadedApk; (light greylist, reflection)
05-27 04:37:31.121 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden method Landroid/app/ActivityThread;->currentActivityThread()Landroid/app/ActivityThread; (light greylist, reflection)
05-27 04:37:31.121 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden method Landroid/content/res/AssetManager;->addAssetPath(Ljava/lang/String;)I (light greylist, reflection)
05-27 04:37:31.121 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden method Landroid/content/res/AssetManager;->addAssetPathAsSharedLibrary(Ljava/lang/String;)I (light greylist, reflection)
05-27 04:37:31.121 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden method Landroid/app/Application;->attach(Landroid/content/Context;)V (light greylist, reflection)
05-27 04:37:31.121 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden method Landroid/content/pm/PackageParser$Component;->getComponentName()Landroid/content/ComponentName; (light greylist, reflection)
05-27 04:37:31.121 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden method Landroid/app/ContextImpl;->setOuterContext(Landroid/content/Context;)V (light greylist, reflection)
05-27 04:37:31.122 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden method Landroid/content/res/AssetManager;->getResourceIdentifier(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I (light greylist, reflection)
05-27 04:37:31.122 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden method Landroid/app/ActivityThread;->installContentProviders(Landroid/content/Context;Ljava/util/List;)V (light greylist, reflection)
05-27 04:37:31.122 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden method Landroid/app/ActivityThread;->installProvider(Landroid/content/Context;Landroid/app/ContentProviderHolder;Landroid/content/pm/ProviderInfo;ZZZ)Landroid/app/ContentProviderHolder; (light greylist, reflection)
05-27 04:37:31.122 2972-2972/com.taobao.demo W/com.taobao.dem: Accessing hidden method Landroid/app/Service;->attach(Landroid/content/Context;Landroid/app/ActivityThread;Ljava/lang/String;Landroid/os/IBinder;Landroid/app/Application;Ljava/lang/Object;)V (light greylist, reflection)

hide api在light greylist中,调用时都会有警告,但还好大部分都可以被反射调用了

当然也有失败的情况:

0 = {Hack$HackDeclaration$HackAssertionException@5211} "android.taobao.atlas.hack.Hack$HackDeclaration$HackAssertionException: java.lang.NoSuchFieldException: No field mStringBlocks in class Landroid/content/res/AssetManager; (declaration of 'android.content.res.AssetManager' appears in /system/framework/framework.jar)"
1 = {Hack$HackDeclaration$HackAssertionException@5212} "android.taobao.atlas.hack.Hack$HackDeclaration$HackAssertionException: java.lang.NoSuchMethodException: ensureStringBlocks []"
2 = {Hack$HackDeclaration$HackAssertionException@5213} "android.taobao.atlas.hack.Hack$HackDeclaration$HackAssertionException: java.lang.NoSuchMethodException: addAssetPathNative [class java.lang.String]"
3 = {Hack$HackDeclaration$HackAssertionException@5214} "android.taobao.atlas.hack.Hack$HackDeclaration$HackAssertionException: java.lang.NoSuchMethodException: addAssetPathNative [class java.lang.String, boolean]"
4 = {Hack$HackDeclaration$HackAssertionException@5215} "android.taobao.atlas.hack.Hack$HackDeclaration$HackAssertionException: java.lang.NoSuchMethodException: addAssetPathNative [class java.lang.String, int]"
5 = {Hack$HackDeclaration$HackAssertionException@5216} "android.taobao.atlas.hack.Hack$HackDeclaration$HackAssertionException: java.lang.NoSuchMethodException: getStringBlockCount []"
6 = {Hack$HackDeclaration$HackAssertionException@5217} "android.taobao.atlas.hack.Hack$HackDeclaration$HackAssertionException: java.lang.NoSuchMethodException: getNativeStringBlock [int]"

不过这些都是一些兼容性处理的反射调用,不会影响到整个atlas的框架。

所以从目前来看atlas在Android不会因为hide  api限制而作废

4、hide api 自相矛盾的现状

   为什么Android会开放出light greylist来运行反射调用hide api呢?为什么没法立即执行这个限制呢?

   原因很可能还是Android studio中需要使用,Instant Run是主要使用者,而Instant Run这种机制还主要是用的插件化的思想来完成的(不清楚的自行百度instant run原理),atlas中调用的大部分还是Instant Run需要用的,如果Android一刀切,可能自己的工具也会遭殃,所以这个是Android hide api中矛盾的现状。

5、未来,未知...

   如果Android未来删除了light greylist、如果Android p正式版的限制更加严格、甚至Android更改了activity的启动源码,这都不好说,有许多未知问题,不过这不是因为Android自身问题,而是这些api本身就是隐藏的。但是,插件话加载的核心还是DexClassLoader的使用。

6、未来,猜测

   就算Android屏蔽了所有的hide api,只要DexClassLoader可以使用,我们还是可以实现插件化开发,以后减少对Android系统组件依赖,使用weex、rn解耦可能是趋势,而阿里巴巴现在本身一直都在推广weex,集团下app大都也是插件化和weex并用,所以我们就等待安心等待Android p的到来、未来的到来。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android P阻止调用非sdk api后,Atlas该何去何从 的相关文章

随机推荐

  • ORACLE多表查询优化

    转自某地 对作者很愧疚 不晓得地址了 ORACLE 多表查询优化 这里提供的是执行性能的优化 而不是后台数据库优化器资料 参考数据库开发性能方面的各种问题 收集了一些优化方案统计如下 当然 象索引等优化方案太过简单就不列入了 嘿嘿 执行路径
  • Word to PDF Converter v3.0 算法分析及注册机

    Word to PDF Converter v3 0算法分析及注册机 详细过程 1 xff0c 主程序在C Program Files doc2pdf DOC2PDF dll xff0c PEID查壳为ASProtect 1 23 RC1
  • 安全策略调整步骤

    1 修改防火墙 xff0c 保留22 SSHD 8081 APACHE 80 关闭端口443 HTTPS 3306 MYSQL 8080 8088 53 123 2 针对PHP的BUG和安全漏洞 xff0c 只有升级版本一途 xff0c 经
  • 获取微信openid(或昵称头像)的授权登录及其代理

    lt php 本页用于微信授权登录及其代理 64 version V2 0 64 author ty1921 lt ty1921 64 gmail com gt 64 param backurl 传get参数backurl xff0c 则授
  • 常用的PHP文件头和HTML5文件头(含移动端)

    lt php PHP Header Created by ty1921 64 gmail com Ver V1 Date 2017 8 18 1 session session start 2 display errors ini set
  • VB+PHP实现在线修改Windows服务器的配置文件

    本文仅供记录 存档备案用 用途 xff1a 某电话转接系统 xff0c 需要每天修改配置文件 并重启服务端程序 原理 xff1a WEB用于展示修改界面 xff0c 提交 保存配置文件的相关数据 VB端用于定时轮训WEB上保存的数据 xff
  • OLLVM分析

    一 LLVM是什么 LLVM最初是Low Level Virtual Machine的缩写 xff0c 定位是一个 xff0c 但是是比较底层的虚拟机 然而LLVM本身并不是一个完整的编译器 xff0c LLVM是一个编译器基础架构 xff
  • A General Optimization-based Framework for Local Odometry Estimation with Multiple Sensors论文翻译整理

    综述部分 x1f4cc 多传感器融合有两个趋势 xff1a 基于滤波的融合 xff08 MSCKF EKF UKF xff09 基于优化的滤波 xff08 BA xff09 基于滤波器的方法对时间同步很敏感 任何迟来的测量都会引起麻烦 xf
  • 按键精灵的5级开发认证,笔试题参考

    4题是抄的 xff0c 只是为了过级 最后得93分 xff0c 可能代码还是不够最优 xff0c 有看出的大大希望能不吝指点 1 写一个脚本 xff0c 要求启动时 xff0c 记录 xff08 录制 xff09 当前鼠标的移动轨迹 xff
  • 常见端口号和对应服务的概念和作用

    端口号的主要作用是表示一台计算机中的特定进程所提供的服务 网络中的计算机是通过IP地址来代表其身份的 xff0c 它只能表示某台特定的计算机 xff0c 但是一台计算机上可以同时提供很多个服务 xff0c 如数据库服务 FTP服务 Web服
  • 51单片机学习历程---单片机入门

    主要用来做控制的 xff0c 如果要驱动外部设备的话 xff0c 需要使用驱动电路 proteus 模拟 51 8位 最小系统 晶振电路 提供时钟 12M xff08 方便计算机器周期 xff09 11 0592M xff08 非常适合串行
  • 手把手教你使用--常用模块--HC05蓝牙模块,无线蓝牙串口透传模块,(实例:手机蓝牙控制STM32单片机点亮LED灯)

    最近在学STM32 xff0c 基本的学完了 xff0c 想学几个模块来巩固一下知识 xff0c 就想到了蓝牙模块 玩啥好难过有很多博客教怎么连的 xff0c 但自己看起来还是有点糊涂 模块的原理和知识点我就不讲解了 xff0c 这里我主要
  • FreeRTOS实时操作系统----机制

    四 机制 目录 四 机制 4 1任务优先级 4 1 1高优先级抢占低优先级 4 1 2时间片 4 2任务调度器 4 3临界段的保护 4 4空闲任务与阻塞延时 4 5任务延时列表 4 6消息队列 4 6 1消息队列的基本概念 4 6 2消息队
  • 三极管导通条件

    NPN三极管 xff0c 箭头朝外 xff1a 高电平导通 PNP三极管 xff0c 箭头朝里 xff1a 低电平导通
  • 74HC1G66模拟开关,多路复用

    SEL为低电平的时候 xff0c SD导通 SEL为高电平的时候 xff0c SD不导通 直接看数据手册
  • 一张图了解MOS管导通条件

    不管他长什么样 xff0c 直接就看箭头指向 箭头向栅极 xff0c 就是nmos管 xff0c 高电平导通 箭头向外 xff0c 就是pmos管 xff0c 低电平导通 一边连了两根线的就是s极
  • Android SDK的安装配置

    SDK xff1a xff08 software development kit xff09 软件开发工具包 被软件开发工程师用于为特定的软件包 软件框架 硬件平台 操作系统等建立应用软件的开发工具的集合 因此 xff0c Android
  • 1.C++简介

    学习目标 xff1a 初识C 43 43 xff0c 介绍C 43 43 一些简单的语法 xff1a 初识C 43 43 数据类型 运算符 程序流程结构 学习内容 xff1a 1 初识C 43 43 一个简单的C 43 43 框架 xff0
  • 死锁形成的原因和四个必要条件

    死锁的概念 死锁是指两个或两个以上的进程 xff08 线程 xff09 在运行过程中因争夺资源而造成的一种僵局 xff0c 若无外力作用 xff0c 这些进程 xff08 线程 xff09 都将无法向前推进 xff0c 这时就形成了死锁 处
  • Android P阻止调用非sdk api后,Atlas该何去何从

    0 背景 自从Android 9 0后 xff0c Android就已经开始着手阻止app开发调用非sdk的api xff0c 也就是被标记为 64 hide的变量 函数 类不可以通过反射调用 xff0c 否则会提示NoSuchMethod