请问android app如何启动DexClassLoader动态加载的jar包中定义的service

发布于 2022-08-29 20:13:01 字数 2649 浏览 10 评论 0

架构需求就是这样,Service类定义在一个Jar包插件,通过网络下载或者push到SD卡中,然后要求Service在新进程中启动。

运行时出现找不到Service类的错误,然后程序错误崩溃:
Caused by: java.lang.ClassNotFoundException: Didn't find class JarService

贴个简单代码示例吧

主Activity就是load SD卡上的jar包,反射获取类名,intent启动service

public class MainActivity extends ActionBarActivity {

private final String TAG = "MainActivity";

    @Override

    protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

            Log.i(TAG, "onCreate");

            ClassLoader dexLoader = new DexClassLoader("/sdcard/jarservicetest.jar", getCacheDir().getAbsolutePath(), null, getClassLoader());



            //ClassLoader dexLoader = getClassLoader();



            try {

                    Log.i(TAG, "try");

                    Class<?> activityClass =         dexLoader.loadClass("com.example.jarservicetest.JarService");

                    Intent intent = new Intent(this, activityClass);

                    startService(intent);

            } catch (ClassNotFoundException e) {

                    Log.i(TAG, "catch");

                    // TODO Auto-generated catch block

                    e.printStackTrace();

            }

    }

}

Service就一空壳

public class JarService  extends Service{

    private final String TAG = "JARSERVICE";

    @Override

    public void onCreate() {

            // TODO Auto-generated method stub

            Log.i(TAG, "onCreate");

            super.onCreate();

    }

    @Override

    public void onDestroy() {

            // TODO Auto-generated method stub

            super.onDestroy();

    }

    @Override

    public IBinder onBind(Intent arg0) {

            // TODO Auto-generated method stub

            return null;

    }

}

Manifest文件中声明了Service
<application

    android:allowBackup="true"

    android:icon="@drawable/ic_launcher"

    android:label="@string/app_name"

    android:theme="@style/AppTheme" >

    <activity

        android:name=".MainActivity"

        android:label="@string/app_name" >

        <intent-filter>

            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />


        </intent-filter>

    </activity>

    <service android:name="com.example.jarservicetest.JarService" >

        <!-- android:process=":process1"> -->

    </service>

请教达人们,面对这种需求,有啥解决办法?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

筱果果 2022-09-05 20:13:01
  • 检查下jarservicetest.jar文件里包含的是class文件还是dex文件
  • 拿sdcard路径的时候,用Environment.getExternalStorageDirectory()
_失温 2022-09-05 20:13:01

这个其实找不到是正常的,加载的时候用户发出Intent,系统启动Service,你的Service在别的apk或者jar里边使用dexclassloader中的Service是在系统里边注册过也找不到,也就是说,需要自己手动加载,但是加载时机是不清楚的,因为并不知道Intent何时出发,目前只知道actitivy和Broadcast(静态注册,动态注册不必考虑动态加载)可以使用动态加载,service和contentprovider这两个还不知道如何加载,不过可以绕过去,在使用service得地方换成Broadcast通知主包,主包手动加载service。如果有大神知道如何动态加载service,可以与我交换经验~~哈哈哈

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文