Coder Social home page Coder Social logo

virtualappdoc's Introduction

VirtualAppDoc

说明:本工程是VirtualApp项目的非官方文档。

理解VirtualApp代码的过程中,对我帮助很大两组系列文章:

PS.还有很多文章无法一一列举, 谨表谢忱。

Server Process 启动流程

getService VirtualCoreGetSerivce

Binder Provider调用过程 VABinderProvider

VirtualActivityManagerService启动流程 VAMS

startActivity 流程

VAStartActivity

VStubContentProvider

install流程

VAInstall

Broadcast流程

注意:VA对client的xml中定义的receiver(静态广播接收器)做了处理,详细参考VAInstall流程图。

标准Broadcast发送/接收

标准Broadcast发送/接收

VA中Broadcast发送/接收

VA中Broadcast发送/接收

VA中动态Broadcast注册

动态注册Broadcast,最终都会调用ActivityManagerNatvie#registerReceiver方法,因此VA中hook了这个方法然后改造IntentFilter的ACTION字段,具体改造方法与静态广播接收器的方式相同。然后创建一个新的IIntentReceiver$Stub对象,传递给AMS。也就是所谓静态代理方式。

代码:RegisterReceiver.java

请参考下面类结构图。

类结构图

PS

添加SVG图片的方法

virtualappdoc's People

Contributors

howie-hxu avatar prife avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

virtualappdoc's Issues

无法使用google账号登陆google play

prife,
我发现使用google play无法正常添加google 账号。能帮忙看下这个问题吗?
也就是说目前VirtualApp添加账号这块还有严重的问题。
异常如下:
09-02 10:39:30.501 13963-14143/io.virtualapp:p6 E/ActivityThread: Failed to find provider info for com.google.android.wearable.settings
09-02 10:39:55.541 13963-13976/io.virtualapp:p6 E/JavaBinder: *** Uncaught remote exception! (Exceptions are not yet supported across processes.)
java.lang.RuntimeException: android.os.RemoteException: This AccountDataManager cannot write
at android.os.Parcel.writeException(Parcel.java)
at android.os.Binder.execTransact(Binder.java)
Caused by: android.os.RemoteException: This AccountDataManager cannot write
at djd.a(:com.google.android.gms:679)
at djd.a(:com.google.android.gms:362)
at djd.a(:com.google.android.gms:352)
at elx.onTransact(:com.google.android.gms:231)
at android.os.Binder.execTransact(Binder.java) 

VirtualApp无法打开多个应用

VA的 版本还可以同时打开多个应用. f8f8e93
master上最新代码 cfc3228  已经不能打开同时打开多个应用,即使注释掉:

//HomePresenterImpl.java

    public void launchApp(AppModel model) {
        try {
            // VActivityManager.getInstance().killAllApps();   注释掉这一行也不能同时打开多个
            LoadingActivity.launch(mActivity, model);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

VirtualApp无法运行开启InstantRun编译的应用

使用VS,打开InstantRun特性,生成一个helloworld应用,在VA中打开,即抛出异常,如下所示。

01-10 04:44:20.254 12168-12168/io.virtualapp:p9 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.droi.helloinstantrun, PID: 12168
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.droi.helloinstantrun/com.droi.helloinstantrun.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.droi.helloinstantrun.MainActivity" on path: DexPathList[[zip file "/data/app/com.droi.helloinstantrun-1/base.apk", zip file "/data/app/com.droi.helloinstantrun-1/base.apk"],nativeLibraryDirectories=[/data/user/0/io.virtualapp/app_VApps/com.droi.helloinstantrun/lib, /vendor/lib, /system/lib]]
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
    at android.app.ActivityThread.-wrap11(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
  Caused by: java.lang.ClassNotFoundException: Didn't find class "com.droi.helloinstantrun.MainActivity" on path: DexPathList[[zip file "/data/app/com.droi.helloinstantrun-1/base.apk", zip file "/data/app/com.droi.helloinstantrun-1/base.apk"],nativeLibraryDirectories=[/data/user/0/io.virtualapp/app_VApps/com.droi.helloinstantrun/lib, /vendor/lib, /system/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
    at android.app.Instrumentation.newActivity(Instrumentation.java:1067)
    at com.lody.virtual.client.hook.delegate.InstrumentationDelegate.newActivity(InstrumentationDelegate.java:253)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
      Suppressed: java.lang.ClassNotFoundException: com.droi.helloinstantrun.MainActivity
    at java.lang.Class.classForName(Native Method)
    at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
    at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
          ... 13 more
  Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

VA对Broadcast的处理讨论及分析

问题描述:假设两个应用A和B,A中发送某广播,B中接收。A、B都安装到了系统中,即只讨论双开模式。那下面有如下问题,

  1. 如果A安装到了VA中,B没有,那么运行A发送广播,B是否应该收到?
  2. 如果A、B都安装到了VA中。运行A,那么应该是系统B收到还是VA里的B收到,还是都收到?

目前VA Master分支最新代码,这两种下B(无论是否安装到VA中)都不能收到A发送的广播。

对比平行空间:

  1. 系统中B能收到广播
  2. 平行空间中的B收到平行空间中A发送的广播。

因为VA还支持插件模式,这个问题就变的比较复杂。

VA的IOhook类放置位置不合理

包名 package com.lody.virtual;不合理,该包就IOHook一个类。
放在package com.lody.virtual.client.hook.base下可能更合理些。

VA中最近应用列表中删除VA应用后,VA无法再次启动该应用

bug描述:
VA中打开一个应用,然后在最近列表中移除它,再在va中重复打开它,就启动不了了。

目前分析的结果是这样:
最近应用列表移除会调用到AMS的removeTask,并且在里面执行kill进程。但是VA里面启动的进程被移除时,不会被AMS kill掉,这个在removeTask里走了特殊的path,Task相关数据结构被删除了。对比平行空间,通用启动的应用也没有被kill掉。因此 VAMS里的linkToDeath不会生效,ActivityStack.processDied不会被调用。
这个过程VA主进程没有得到通知,VA里再去通过 ActivityManager.moveTaskToFront启动应用是起不来的。AMS里相关数据结构没了。

VA当前缺失了对这种情况处理的代码。

一个思路:利用这个API ActivityManager.getRecentTasks ,VA里 每次luanch intent时,对去比较一下当前系统中存在的Task和VA内部维护的Task列表,如果找到,继续用VA ActivityStack里每次moveTaskFromFront逻辑。找不到说明出现了Task被干掉的情况,但是这时候如何启动client我就没啥思路了。

平行空间里也是利用了这个 getRecentTasks API。

测试代码: prife/VirtualApp@6d568ac

VA在Android N上无法启动

徐晖(3447724537) 13:59:27
hi 我用nexus6跑了一下android n,发现va起不来。起不来的原因是因为remote :x没办法做完system ready,进一步debug发现是在做VAccountManagerService初始化的时候,call
RegisteredServiceCache::generateServicesMap,这边会通过pm.queryIntentServices,而在做query的时候,会进入到mPM的Hook_QueryIntentServices,这里的onHook都可以走完,但是走完以后就卡住了,群里有谁遇到过类似的问题吗
群主[email protected] 13:59:50
嗯,我知道,目前没有计划支持N
徐晖(3447724537) 14:00:24
哈~这样呀,群主大概知道原因吗,我想调试一下
徐晖(3447724537) 14:00:43
我很奇怪为什么这边会卡住,不明所以
今天调了一个上午
群主[email protected] 14:00:46
N上面queryIntentXXXXX的返回值变了
徐晖(3447724537) 14:01:06
我去查看api,发现还是List resolveInfos
徐晖(3447724537) 14:01:16
https://developer.android.com/reference/android/content/pm/PackageManager.html#queryIntentServices(android.content.Intent, int)
群主[email protected] 14:01:24
你看看异常就知道了
徐晖(3447724537) 14:02:49
难道是我抓log的方式不对么..那我再看看
你说的log是va的log,还是systrem的log?
徐晖(3447724537) 14:03:44
噢,我知道了,编译的时候要用24去编译吧

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.