MCPcopy Index your code
hub / github.com/singwhatiwanna/dynamic-load-apk

github.com/singwhatiwanna/dynamic-load-apk @main sqlite

repository ↗ · DeepWiki ↗
381 symbols 899 edges 37 files 25 documented · 7%
README

DL : dynamic load framework for android

dl

support load apk which is not installed.

host : host apk, a container contains many plugin apks

plugin : plugin apk, which is invoked by host, also, it can be running when installed.

about DL

  1. plugin can be invoked by host without being installed
  2. plugin can visit resources by R identifer
  3. support Activity and FragmentActivity
  4. nearly no reflection
  5. plugin can be running when installed
  6. provide threes development mode: (1) plugin not refer host (2) plugin partly refer host (3) plugin fully refer host
  7. easy getting start, just need dl-lib.jar
  8. support android 2.x

resource managment

protected void loadResources() {
    try {
        AssetManager assetManager = AssetManager.class.newInstance();
        Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);
        addAssetPath.invoke(assetManager, mDexPath);
        mAssetManager = assetManager;
    } catch (Exception e) {
        e.printStackTrace();
    }
    Resources superRes = super.getResources();
    mResources = new Resources(mAssetManager, superRes.getDisplayMetrics(),
            superRes.getConfiguration());
    mTheme = mResources.newTheme();
    mTheme.setTo(super.getTheme());
}

then, in plugin project, resources can be visited by R identifer.

activity lifecircle managment

public interface DLPlugin {

    public void onStart();
    public void onRestart();
    public void onActivityResult(int requestCode, int resultCode, Intent data);
    public void onResume();
    public void onPause();
    public void onStop();
    public void onDestroy();
    public void onCreate(Bundle savedInstanceState);
    public void setProxy(Activity proxyActivity, String dexPath);
    public void onSaveInstanceState(Bundle outState);
    public void onNewIntent(Intent intent);
    public void onRestoreInstanceState(Bundle savedInstanceState);
    public boolean onTouchEvent(MotionEvent event);
    public boolean onKeyUp(int keyCode, KeyEvent event);
    public void onWindowAttributesChanged(LayoutParams params);
    public void onWindowFocusChanged(boolean hasFocus);
    public void onBackPressed();
    ...
}

implement DLPlugin in DLProxyActivity

...
    @Override
    protected void onStart() {
        mRemoteActivity.onStart();
        super.onStart();
    }

    @Override
    protected void onRestart() {
        mRemoteActivity.onRestart();
        super.onRestart();
    }

    @Override
    protected void onResume() {
        mRemoteActivity.onResume();
        super.onResume();
    }

    @Override
    protected void onPause() {
        mRemoteActivity.onPause();
        super.onPause();
    }

    @Override
    protected void onStop() {
        mRemoteActivity.onStop();
        super.onStop();
    }
...

How to develop a DL plugin

  1. import dl-lib.jar
  2. the key word this is dangerous
  3. use that to instead this when visit Activity's methods
  4. use startActivityByProxy and startActivityForResultByProxy to start activity, another, launchmode is not supported
  5. not support service,broadcast can only be used by register it in code.

Current job

  1. DLIntent
  2. UI Bus
  3. some little android feature

Demo

dl

firstly, host will load all plugin apks located in /mnt/sdcard/DynamicLoadHost, then, plugin can be invoked by clicking list's item. Details can be found in source code.

Thanks nealgao to design the logo for DL.

License

Copyright (C) 2014 singwhatiwanna(任玉刚) <singwhatiwanna@gmail.com>

collaborator:田啸,宋思宇

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Extension points exported contracts — how you extend this code

DLAttachable (Interface)
@author mrsimple [8 implementers]
DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLAttachable.java
HostInterface (Interface)
(no doc) [2 implementers]
DynamicLoadApk/sample/depend_on_interface/doi-common/src/com/ryg/dynamicload/sample/docommon/HostInterface.java
DLServiceAttachable (Interface)
@author mrsimple [7 implementers]
DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLServiceAttachable.java
ResourceConstants (Interface)
(no doc)
DynamicLoadApk/sample/main/main-plugin-a/src/com/ryg/dynamicload/sample/mainplugin/ResourceConstants.java
DLPlugin (Interface)
(no doc) [6 implementers]
DynamicLoadApk/lib/src/com/ryg/dynamicload/DLPlugin.java
ITestServiceInterface (Interface)
业务接口,为了不增加新的工程,所以先定义在插件LIB里面, 客户可以根据业务需求定义Service的接口 @author zhangjie [2 implementers]
DynamicLoadApk/lib/src/com/ryg/dynamicload/service/ITestServiceInterface.java
DLServicePlugin (Interface)
(no doc) [1 implementers]
DynamicLoadApk/lib/src/com/ryg/dynamicload/DLServicePlugin.java

Core symbols most depended-on inside this repo

d
called by 41
DynamicLoadApk/lib/src/com/ryg/utils/LOG.java
findViewById
called by 18
DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginActivity.java
onCreate
called by 17
DynamicLoadApk/lib/src/com/ryg/dynamicload/DLPlugin.java
getPluginPackage
called by 13
DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLIntent.java
setPluginPackage
called by 10
DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLIntent.java
onActivityResult
called by 9
DynamicLoadApk/lib/src/com/ryg/dynamicload/DLPlugin.java
onDestroy
called by 9
DynamicLoadApk/lib/src/com/ryg/dynamicload/DLPlugin.java
getInstance
called by 9
DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLPluginManager.java

Shape

Method 333
Class 39
Interface 9

Languages

Java100%

Modules by API surface

DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginFragmentActivity.java43 symbols
DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginActivity.java41 symbols
DynamicLoadApk/lib/src/com/ryg/dynamicload/internal/DLPluginManager.java25 symbols
DynamicLoadApk/lib/src/com/ryg/dynamicload/DLProxyActivity.java25 symbols
DynamicLoadApk/lib/src/com/ryg/dynamicload/DLProxyFragmentActivity.java24 symbols
DynamicLoadApk/lib/src/com/ryg/dynamicload/DLPlugin.java20 symbols
DynamicLoadApk/sample/main/main-host/src/com/ryg/dynamicload/sample/mainhost/MainActivity.java17 symbols
DynamicLoadApk/sample/main/main-plugin-a/src/com/ryg/dynamicload/sample/mainplugin/MainActivity.java16 symbols
DynamicLoadApk/sample/depend_on_interface/doi-host/src/com/ryg/dynamicload/sample/doihost/MainActivity.java16 symbols
DynamicLoadApk/lib/src/com/ryg/utils/SoLibManager.java13 symbols
DynamicLoadApk/lib/src/com/ryg/dynamicload/DLServicePlugin.java13 symbols
DynamicLoadApk/lib/src/com/ryg/dynamicload/DLBasePluginService.java13 symbols

For agents

$ claude mcp add dynamic-load-apk \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact