Android OpenAtlas之二 基本结构

还是老样子 项目主页在这儿Github国内镜像在oschina上

有童鞋说项目太复杂,大体说一下这边怎么入手(主要分三部分)。现在做插件的很多,当然一个demo大家都能做,稳定性和健壮性就未必了,当然代码可能存在许多改进的地方,欢迎push request。

有些事情我还是要声明下 :

出去招摇撞骗没这个与我无关,我不参与,也阻止不了,你赚了钱我也不感兴趣,当然我也不参与,我现在能养活自己,不稀罕那点money。

开发使用Android Studio和Eclipse均可。

OpenAtlasCore

这部分是引擎的核心实现了Android的Hook和OGSI,每个插件apk对应到OSGI为一个Bundle,注意这边这个Bundle是OSGI的概念,不是Android里面的那个。OSGI也有自己的声明周期,包括安装、启动、停止、升级、卸载。

OpenAtlasCore的基本结构。分为三部分,画框的为分界点,org开头的几个包是OSGI的东西,添加了一个update file。

话红框的部分为Runtime核心部分,runtime

红线上方的这部分是核心的基本封装,包括初始化之类的各种东西。

目前让插件有关的东西尽量放在OpenAtlasCore中。

OpenAtlasLauncher OpenAtlasCore实现sample

这个工程是OpenAtlasCore的实现。如下图,基本这个结构。依赖于OpenAtlasCore,实际上就是一个jar (+两个so,在4.3或者一下的系统用到,dexopt的封装)没资源

核心标注出来了。

libs下这一堆so就是插件模块,你所看到的listview也是插件就在homelauncher里面。至于为啥放在libs,原因只有一个,可能加快启动速度,虽然现在机器性能不错,但是运行时解压那么一堆东西 速度肯定会慢,放在这个位置系统安装的时候就解压出来了,用户能容忍你安装慢一点,启动慢就不太友好了。

关于TBLocationContentProviderProxy

package com.openAtlas.launcher.mirrorProvider;import android.content.ContentProvider;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import com.openAtlas.boot.ProviderProxy;public class TBLocationContentProviderProxy extends ProviderProxy {/** * @param mTargetProvider */public TBLocationContentProviderProxy() {// 这个类必须在这儿实现,这个可以认为是一个mirror类,它所对应的真正的Provider为 // com.taobao.android.gamecenter.AppProvider,换句话说你在插件中使用了Provider, // 如果插件中单独实现的,那么宿主程序必须存在这个Provider的mirror,原因很简单, // 你的Provider需要在宿主程序声明,那么问题来了,你的插件肯定没法在Application onCreate的时候就启动完 // ,当然你的如果是个demo的话可以忽略点这块, // 而在onCreate之前要做的实情有一个,那就是初始化Provider,在manifest声明的Provider要初始化, // 找不到类就歇菜了。所以做个mirror类,告诉系统这个类没问题,而且正确初始化完毕。实现很简单具体参考ProviderProxysuper("com.taobao.android.gamecenter.AppProvider");}ContentProvider mContentProvider;@Overridepublic boolean onCreate() {return true;}}

现在还有一处就是WelcomeFragment,这个看着代码很多,其实没什么,就是一点:等通知 当OpenAtlasCore安装完基本组件会发送广播,告诉UI框架启动完成,可以进行下一步操作(进入主页)。

init注册广播接收器,收到INSTALLED广播时进行页面跳转

private void init() {if ("flase".equals(System.getProperty("BUNDLES_INSTALLED", "flase"))) {this.atlasBroadCast = new BundlesInstallBroadcastReceiver();getActivity().registerReceiver(this.atlasBroadCast, new IntentFilter(PlatformConfigure.ACTION_BROADCAST_BUNDLES_INSTALLED));this.bundlestart = System.currentTimeMillis();this.mHandler.sendEmptyMessageDelayed(MSG_CONSUME_TIMEOUT, 4000);} else {this.mHandler.sendEmptyMessageDelayed(MSG_CONSUME_FINISH, 600);}}

当收到广播跳转到这儿,启动HomePage 跟正常启动Activity一样,四大组件都这样,基本上无缝对接

public void gotoMainActivity(boolean z) {System.out.println("WelcomeFragment.gotoMainActivity()");// boolean z2 = false;.//com.openatlas.homelauncher.MainActivityif (getActivity().getClass() == Welcome.class) {Intent mIntent=new Intent();mIntent.setClassName(getActivity(), "com.openatlas.homelauncher.MainActivity");startActivity(mIntent);Welcome.doLaunchoverUT();getActivity().finish();}}

插件的开发

拿ImageLoader插件化,这个使用Android Studio开发的,当然用eclipse也行,跟正常项目一样,,你也可以独立调试,主要是打包问题了,这个使用的aapt 已经patch,不想自己编译的可以用我编译好的,patch也在Github上。

Studio打开已有的项目找到ImageLoader就行,在app build.gradle有VersionName的id 0x6a(从0x2到0x7都可用,要是你的插件多达上百个的话就要考虑下公司业务是不是需要调整了),aapt解析到0x的时候会解析最后两位,转换成package id(这部分明天讲),aapt用build-tool 版本22 从binary下载对应版本(备份下旧的替换这个,21那个版本不不计划维护了),三个平台的都编译好了,osx和Linux测试了,没有windows机器,没测试windows,应该没问题。

而做人的能力则会给你一百种机会。

Android OpenAtlas之二 基本结构

相关文章:

你感兴趣的文章:

标签云: