相关疑难解决方法(0)

如何构建一个APK和应用程序动态加载的独立库

简短的总结是:我如何构建一个APK和单独的库(我指的是某些形式的类集合(理想情况下也是资源),例如JAR,AAR或DEX文件),但不包括那些库中的库. APK; 相反,应用程序在运行时加载它们?

详情

所以我的主要问题是如何构建这样的应用程序(例如Gradle配置).如何指定哪些类进入哪些JAR或DEX文件?我是否为每个想要最终使用的DEX文件创建了一个Android Studio模块?

一个密切相关的问题是Java代码应该如何加载外部库并在运行时访问它们的类.对于后者,我希望通过类加载器从dex文件访问app类时显示的方法可行.

我试着在说明https://developer.android.com/studio/projects/android-library.html,但是这是建立一个APK 包括依赖库.

我也尝试过Multidex(https://developer.android.com/studio/build/multidex.html),但这似乎并没有让开发人员控制哪些类进入哪个DEX文件,此外,将它们打包成一个APK.AFAICT无法在运行时控制这些DEX文件的加载.

背景

这里有" XY问题 " 的可能性,所以我最好解释一下背景.

我正在为客户构建一个应用程序.它不会通过应用程序商店分发,因此它无法访问正常的更新机制.相反,客户希望应用程序能够通过下载自身的新组件来更新自己,以替换旧组件,而无需手动加载新的APK.这里的主要动机是非技术用户的更新必须容易.如果应用程序可以控制更新过程,它可以使其流畅并引导用户.

此外,该应用程序将用于互联网访问稀缺和昂贵的领域,因此客户希望能够以较小的块(例如2MB)发布应用程序更新,而不是强迫用户重新下载整个应用程序以接收小更新.

如果重要的话,我应该提到的要求的一个方面是,在运行时加载的库应该存在于microSD卡上.这也有助于在没有互联网访问的情况下分发更新.

该应用程序的当前状态是大约50%写入:即,已发布了几个早期版本,但现在需要修改(重组)应用程序以满足上述要求以及其他要求.

android dynamic-class-loaders mobile-application android-gradle-plugin

31
推荐指数
1
解决办法
2946
查看次数

如何启动Manifest中提到的不存在的Activity?

我正在尝试开发一个"动态"Android应用程序.

动态,我在清单中列出了一个在运行时"构建"的活动.

我可以很好地构建所需的活动,但是,当我尝试启动它时,我的应用程序失败了......

    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.research.ps/com.research.Dynamic}: java.lang.ClassNotFoundException: 
Didn't find class "com.research.Dynamic" on path: DexPathList[[zip file "/data/app/com.research.ps-1/base.apk"],nativeLibraryDirectories=[/data/app/com.research.ps-1/lib/arm, 
/data/app/com.research.ps-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以在运行时成功实例化Android Activity?

有没有办法在我的应用程序路径中添加"临时"或"shell"活动?然后用我的动态实例替换"临时"活动?

UPDATE

My Manifest XML包含此条目

<activity
  android:name=".Dynamic"
  android:label="@string/title_activity_dynamic"
  android:theme="@style/AppTheme.NoActionBar" />
Run Code Online (Sandbox Code Playgroud)

但是,我的应用程序中没有包含名为"Dynamic"的Activity.

我正在使用ByteBuddy构建我的动态活动: -

  final Class<? extends android.support.v7.app.AppCompatActivity> dynamicType = new ByteBuddy(ClassFileVersion.JAVA_V8)
            .subclass(android.support.v7.app.AppCompatActivity.class, IMITATE_SUPER_CLASS)
            .name("com.research.Dynamic")
            .make()
            .load(getClass().getClassLoader(), new AndroidClassLoadingStrategy.Wrapping(this.getDir("dexgen", Context.MODE_PRIVATE)))
            .getLoaded();

final Intent intent = new Intent(this, dynamicType);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

android

8
推荐指数
2
解决办法
567
查看次数