如何使用ApkPlug进行Android平台下模块化开发

\u5982\u4f55\u4f7f\u7528ApkPlug\u8fdb\u884cAndroid\u5e73\u53f0\u4e0b\u6a21\u5757\u5316\u5f00\u53d1

\u6253\u5f00Apkplug\u5b98\u7f51\u540e\uff0c\u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u201c\u6ce8\u518c\u201d\uff0c\u5728\u8df3\u8f6c\u9875\u9762\u586b\u5165\u76f8\u5173\u4fe1\u606f\uff0c\u6ce8\u518c\u754c\u9762\u5982\u4e0b\uff1a

\u786e\u8ba4\u540e\u6ce8\u518c\u6210\u529f\uff0c\u4f7f\u7528\u4f60\u7684\u8d26\u53f7\u767b\u5f55\u7f51\u7ad9\u3002\u4f60\u5c31\u53ef\u4ee5\u7528Apkplug\u5f00\u53d1\u5e94\u7528\u4e86
END
\u6b65\u9aa42\uff1a\u5f00\u53d1\u63d2\u4ef6
Apkplug\u4e2d\u7684\u63d2\u4ef6\u4e5f\u662f\u4e00\u4e2a\u5b8c\u6574\u7684apk,\u5b83\u4e0e\u666e\u901a\u5e94\u7528\u7684\u533a\u522b\u6709\u4ee5\u4e0b3\u70b9\uff1a
1\uff0c \u63d2\u4ef6assets\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2aplugin.xml\u6587\u6863,\u901a\u8fc7\u5b83\u53ef\u5224\u65ad\u4e00\u4e2a\u5de5\u7a0b\u662f\u4e3b\u5e94\u7528\u8fd8\u662f\u63d2\u4ef6\u3002
2\uff0c \u63d2\u4ef6\u6709\u4e00\u4e2a\u5165\u53e3\u7c7bBundleActivator
3\uff0c \u63d2\u4ef6\u4f1a\u5916\u90e8\u5f15\u7528\u4e00\u4e2aosgi.jar\u6587\u4ef6
\u5f00\u53d1\u63d2\u4ef6\u7684\u6b65\u9aa4\u6709\u5982\u4e0b4\u6b65\uff1a
1\uff0c\u5f15\u5165osgi.jar\u5e93\u6587\u4ef6
Apkplug\u4e2d\u63d2\u4ef6\u9700\u8981\u5bfc\u5165\u7684\u5e93\u6587\u4ef6\u53ea\u6709\u4e00\u4e2aosgi.jar\u3002
\u5bfc\u5165osgi.jar\u5e93\u6587\u4ef6\u9700\u8981\u6ce8\u610f\u4e00\u4e0b
osgi.jar\u6587\u4ef6\u53ea\u80fd\u5f15\u7528\u4e0d\u80fd\u7f16\u8bd1\u5230apk\u6587\u4ef6\u4e2d,\u5426\u5219\u4f1a\u51fa\u73b0\u7c7b\u51b2\u7a81\u7684\u60c5\u51b5
\u5f02\u5e38\u4ee3\u7801\uff1ahad used a different Lorg/osgi/framework/BundleActivator; during pre-verification\u3002
osgi.jar\u5305\u5bfc\u5165\u65b9\u6cd5\uff1a

\u8fd9\u6587\u4ef6\u5728Apkplug SDK\u4e2d\u53ef\u4ee5\u627e\u5230\u3002

2\uff0c\u7f16\u5199\u63d2\u4ef6\u5165\u53e3\u7c7bBundleActivator
\u63d2\u4ef6\u542f\u52a8\u65f6\u9996\u5148\u8c03\u7528BundleActivator,\u5176\u529f\u80fd\u7c7b\u4f3candroid\u4e2d\u7684application\u7c7b\u3002

public class SimpleBundle implements BundleActivator
{
private BundleContext mcontext = null;
public void start(BundleContext context) throws Exception
{
System.err.println("\u4f60\u597d\u6211\u662f\u63d2\u4ef6,\u6211\u5c06\u4e3a\u4f60\u5c55\u793a\u542f\u52a8acitivty\u6211\u5df2\u7ecf\u542f\u52a8\u4e86 \u6211\u7684BundleId\u4e3a\uff1a"+context.getBundle().getBundleId());
}
public void stop(BundleContext context)
{
System.err.println("\u4f60\u597d\u6211\u662f\u63d2\u4ef6,\u6211\u88ab\u505c\u6b62\u4e86 \u6211\u7684BundleId\u4e3a\uff1a"+context.getBundle().getBundleId());

}

}
3\uff0c\u7f16\u5199plugin.xml\u914d\u7f6e\u6587\u4ef6
plugin.xml \u662f\u4e00\u4e2a\u914d\u7f6e\u8868,\u5b83\u8ddfAndroidManifest.xml\u4f5c\u7528\u7c7b\u4f3c\u3002 plugin.xml\u6587\u6863\u653e\u7f6e\u5728assets\u4e2d\u5373\u53ef \u91cd\u8981\u5c5e\u6027\u8bf4\u660e\uff1a Bundle-Name \u63d2\u4ef6\u540d\u79f0 Bundle-SymbolicName \u63d2\u4ef6\u5305\u540d -\u4e0e\u5e94\u7528packagename\u53ef\u4e00\u4e00\u5bf9\u5e94 Bundle-Version \u63d2\u4ef6\u7248\u672c -1.0.0 Bundle-Activator \u63d2\u4ef6\u5165\u53e3 -\u4e0eAppliction \u7c7b\u4f3c Bundle-Activity \u63d2\u4ef6\u754c\u9762 -\u591a\u4e2aActivity\u53ef\u7528 , \u5206\u5272 Bundle-Service \u63d2\u4ef6Service -\u591a\u4e2aService\u53ef\u7528 , \u5206\u5272 (v2.0.0\u65b0\u589e) Bundle-Receiver \u63d2\u4ef6\u5e7f\u64ad -\u591a\u4e2a\u5e7f\u64ad\u7c7b\u53ef\u7528 , \u5206\u5272 (v2.0.0\u65b0\u589e)

4\uff0c \u7f16\u8bd1\u751f\u6210\u63d2\u4ef6apk\u6587\u4ef6
\u63d2\u4ef6\u5de5\u7a0b\u4e2d\u6dfb\u52a0\u7684\u6587\u4ef6\u76ee\u5f55\u7ed3\u6784\u5982\u4e0b\uff1a

\u6700\u540e\u7f16\u8bd1\u8fd0\u884c\u63d2\u4ef6\u5de5\u7a0b,\u751f\u6210\u7684apk\u6587\u4ef6\u5373\u4e3a\u63d2\u4ef6\u6587\u4ef6
END
\u6b65\u9aa43\uff1a\u5f00\u53d1\u4e3b\u5e94\u7528
Apkplug \u4e3b\u5e94\u7528\u5f00\u53d1\u5206\u4e24\u6b65\u96c6\u6210\uff1a
1. \u83b7\u53d6\u4e3b\u5e94\u7528\u6388\u6743AppAuth\u3002
\u767b\u5f55\u8d26\u53f7\u8fdb\u5165Apkplug\u540e\u53f0\u540e\uff0c\u5207\u6362\u5230\u201c\u5e94\u7528\u6388\u6743\u9875\u9762\u201d\uff0c\u6309\u8981\u6c42\u586b\u5199\u597d\u5e94\u7528\u4fe1\u606f\uff0c\u7136\u540e\u786e\u5b9a\uff0c\u4f60\u5c31\u62e5\u6709\u4e86\u4e00\u4e2a\u7b49\u5f85\u5f00\u53d1\u7684\u5e94\u7528\u6388\u6743AppAuth\u3002\u5e94\u7528\u6388\u6743\u754c\u9762\u5982\u4e0b\uff1a

\u8fdb\u5165\u201c\u6388\u6743\u5217\u8868\u201d\u9875\u9762,\u70b9\u51fb\u201c\u67e5\u770b\u8be6\u60c5\u201d\u94fe\u63a5,\u8fdb\u5165\u201c\u5e94\u7528\u8be6\u60c5\u754c\u9762\u201d\uff0c\u5c31\u53ef\u4ee5\u770b\u5230\u5df2\u7533\u8bf7\u7684AppAuth\uff0c\u70b9\u51fb\u5176\u540e\u9762\u7684\u201c\u590d\u5236\u201d\uff0c\u5373\u53ef\u76f4\u63a5\u590d\u5236AppAuth\uff0c\u5982\u4e0b\u56fe\u6240\u793a

2. \u5bf9\u63a5Apkplug SDK \u5bfc\u5165\u76f8\u5173\u5e93\u6587\u4ef6\u3002
\u2460\u914d\u7f6e\u5e94\u7528\u6743\u9650
\u4e3b\u5e94\u7528\u9700\u8981\u51e0\u4e2a\u57fa\u7840\u7684\u6743\u9650\u914d\u7f6e\uff0c\u8bf7\u5c06\u4ee5\u4e0b\u7684\u51e0\u4e2a\u6743\u9650\u52a0\u5165\u5230\u4e3b\u5e94\u7528\u7684AndroidManifest.xml\u4e2d\u3002







\u53e6\u5916\u5c06\u4e00\u4e0b\u52a0\u5165\u5230\u8282\u70b9\u4e2d

<activity
android:name="org.apkplug.app.apkplugActivity"
android:theme="@style/android:Theme.Light"
android:configChanges="orientation|keyboardHidden"
/>
\u6700\u540e\u5c06\u6211\u4eec\u4eceApkplug\u7ba1\u7406\u540e\u53f0\u7533\u8bf7\u5230\u7684AppAuth\u52a0\u5165\u5230\u914d\u7f6e\u6587\u4ef6\u4e2d\u3002


\u6ce8\uff1a\u7531\u4e8e3.2.2\u8282\u4e2d\u6211\u4eec\u76f4\u63a5\u590d\u5236\u4e86AppAuth\uff0c\u6b64\u5904\u76f4\u63a5\u7c98\u8d34\u5230AndroidManifest\u6587\u6863\u4e2d\u3002
\u5982\u4e0b\u56fe\uff1a

\u2461\u5bfc\u5165SDK\u5e93\u6587\u4ef6
\u4e3b\u5e94\u7528\u9700\u8981\u5bfc\u5165\u4e24\u4e2a\u6587\u4ef6,\u5c06\u5176\u653e\u5165libs\u76ee\u5f55\u4e2d\u5373\u53ef\u3002
1\uff0c libndkfoo.so
2\uff0c Bundle2.0.0.jar
\u5982\u4e0b\u56fe\uff1a

\u8fd9\u4e24\u4e2a\u5e93\u6587\u4ef6\u5728Apkplug SDK\u4e2d\u53ef\u4ee5\u627e\u5230\u3002
\u7136\u540e\uff1a
\u4e3b\u5e94\u7528\u542f\u52a8Apkplug\u6700\u7b80\u53ea\u9700\u8981\u4e00\u6bb5\u4ee3\u7801\u5373\u53ef,\u5efa\u8bae\u5728Application\u4e2d\u542f\u52a8\u6846\u67b6\u3002

FrameworkInstance frame=FrameworkFactory.getInstance().start(List,Context);
\u5c06\u4e0a\u4e00\u6b65\u9aa4\u5f00\u53d1\u597d\u7684\u63d2\u4ef6apk\uff0c\u653e\u7f6e\u5728\u4e3b\u5e94\u7528\u5de5\u7a0b\u91cc\u7684assets\u8def\u5f84\u4e0b\u3002
\u5982\u4e0b\u56fe\uff1a

END
\u6b65\u9aa44\uff1a\u542f\u52a8\u4e3b\u5e94\u7528
\u6700\u540e\u542f\u52a8\u4e3b\u5e94\u7528\u5373\u53ef\u3002\u7b80\u5355\u7684\u63d2\u4ef6\u5316apk\u7684\u65b9\u6cd5\u5c31\u8bb2\u5b8c\u4e86\uff0c\u6709\u5174\u8da3\u7684\u5173\u6ce8\u6211\uff0c\u4e0b\u6b21\u8bb2\u4e91\u7aef\u6258\u7ba1\u63d2\u4ef6\u5b9e\u73b0\u5e94\u7528\u5185\u66f4\u65b0\u3002

\u6253\u5f00Apkplug\u5b98\u7f51\u540e\uff0c\u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u201c\u6ce8\u518c\u201d\uff0c\u5728\u8df3\u8f6c\u9875\u9762\u586b\u5165\u76f8\u5173\u4fe1\u606f\uff0c\u6ce8\u518c\u754c\u9762\u5982\u4e0b\uff1a

\u786e\u8ba4\u540e\u6ce8\u518c\u6210\u529f\uff0c\u4f7f\u7528\u4f60\u7684\u8d26\u53f7\u767b\u5f55\u7f51\u7ad9\u3002\u4f60\u5c31\u53ef\u4ee5\u7528Apkplug\u5f00\u53d1\u5e94\u7528\u4e86
END
\u6b65\u9aa42\uff1a\u5f00\u53d1\u63d2\u4ef6
Apkplug\u4e2d\u7684\u63d2\u4ef6\u4e5f\u662f\u4e00\u4e2a\u5b8c\u6574\u7684apk,\u5b83\u4e0e\u666e\u901a\u5e94\u7528\u7684\u533a\u522b\u6709\u4ee5\u4e0b3\u70b9\uff1a
1\uff0c \u63d2\u4ef6assets\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2aplugin.xml\u6587\u6863,\u901a\u8fc7\u5b83\u53ef\u5224\u65ad\u4e00\u4e2a\u5de5\u7a0b\u662f\u4e3b\u5e94\u7528\u8fd8\u662f\u63d2\u4ef6\u3002
2\uff0c \u63d2\u4ef6\u6709\u4e00\u4e2a\u5165\u53e3\u7c7bBundleActivator
3\uff0c \u63d2\u4ef6\u4f1a\u5916\u90e8\u5f15\u7528\u4e00\u4e2aosgi.jar\u6587\u4ef6
\u5f00\u53d1\u63d2\u4ef6\u7684\u6b65\u9aa4\u6709\u5982\u4e0b4\u6b65\uff1a
1\uff0c\u5f15\u5165osgi.jar\u5e93\u6587\u4ef6
Apkplug\u4e2d\u63d2\u4ef6\u9700\u8981\u5bfc\u5165\u7684\u5e93\u6587\u4ef6\u53ea\u6709\u4e00\u4e2aosgi.jar\u3002
\u5bfc\u5165osgi.jar\u5e93\u6587\u4ef6\u9700\u8981\u6ce8\u610f\u4e00\u4e0b
osgi.jar\u6587\u4ef6\u53ea\u80fd\u5f15\u7528\u4e0d\u80fd\u7f16\u8bd1\u5230apk\u6587\u4ef6\u4e2d,\u5426\u5219\u4f1a\u51fa\u73b0\u7c7b\u51b2\u7a81\u7684\u60c5\u51b5
\u5f02\u5e38\u4ee3\u7801\uff1ahad used a different Lorg/osgi/framework/BundleActivator; during pre-verification\u3002
osgi.jar\u5305\u5bfc\u5165\u65b9\u6cd5\uff1a

\u8fd9\u6587\u4ef6\u5728Apkplug SDK\u4e2d\u53ef\u4ee5\u627e\u5230\u3002

2\uff0c\u7f16\u5199\u63d2\u4ef6\u5165\u53e3\u7c7bBundleActivator
\u63d2\u4ef6\u542f\u52a8\u65f6\u9996\u5148\u8c03\u7528BundleActivator,\u5176\u529f\u80fd\u7c7b\u4f3candroid\u4e2d\u7684application\u7c7b\u3002

public class SimpleBundle implements BundleActivator
{
private BundleContext mcontext = null;
public void start(BundleContext context) throws Exception
{
System.err.println("\u4f60\u597d\u6211\u662f\u63d2\u4ef6,\u6211\u5c06\u4e3a\u4f60\u5c55\u793a\u542f\u52a8acitivty\u6211\u5df2\u7ecf\u542f\u52a8\u4e86 \u6211\u7684BundleId\u4e3a\uff1a"+context.getBundle().getBundleId());
}
public void stop(BundleContext context)
{
System.err.println("\u4f60\u597d\u6211\u662f\u63d2\u4ef6,\u6211\u88ab\u505c\u6b62\u4e86 \u6211\u7684BundleId\u4e3a\uff1a"+context.getBundle().getBundleId());

}

}
3\uff0c\u7f16\u5199plugin.xml\u914d\u7f6e\u6587\u4ef6
plugin.xml \u662f\u4e00\u4e2a\u914d\u7f6e\u8868,\u5b83\u8ddfAndroidManifest.xml\u4f5c\u7528\u7c7b\u4f3c\u3002 plugin.xml\u6587\u6863\u653e\u7f6e\u5728assets\u4e2d\u5373\u53ef \u91cd\u8981\u5c5e\u6027\u8bf4\u660e\uff1a Bundle-Name \u63d2\u4ef6\u540d\u79f0 Bundle-SymbolicName \u63d2\u4ef6\u5305\u540d -\u4e0e\u5e94\u7528packagename\u53ef\u4e00\u4e00\u5bf9\u5e94 Bundle-Version \u63d2\u4ef6\u7248\u672c -1.0.0 Bundle-Activator \u63d2\u4ef6\u5165\u53e3 -\u4e0eAppliction \u7c7b\u4f3c Bundle-Activity \u63d2\u4ef6\u754c\u9762 -\u591a\u4e2aActivity\u53ef\u7528 , \u5206\u5272 Bundle-Service \u63d2\u4ef6Service -\u591a\u4e2aService\u53ef\u7528 , \u5206\u5272 (v2.0.0\u65b0\u589e) Bundle-Receiver \u63d2\u4ef6\u5e7f\u64ad -\u591a\u4e2a\u5e7f\u64ad\u7c7b\u53ef\u7528 , \u5206\u5272 (v2.0.0\u65b0\u589e)

4\uff0c \u7f16\u8bd1\u751f\u6210\u63d2\u4ef6apk\u6587\u4ef6
\u63d2\u4ef6\u5de5\u7a0b\u4e2d\u6dfb\u52a0\u7684\u6587\u4ef6\u76ee\u5f55\u7ed3\u6784\u5982\u4e0b\uff1a

\u6700\u540e\u7f16\u8bd1\u8fd0\u884c\u63d2\u4ef6\u5de5\u7a0b,\u751f\u6210\u7684apk\u6587\u4ef6\u5373\u4e3a\u63d2\u4ef6\u6587\u4ef6
END
\u6b65\u9aa43\uff1a\u5f00\u53d1\u4e3b\u5e94\u7528
Apkplug \u4e3b\u5e94\u7528\u5f00\u53d1\u5206\u4e24\u6b65\u96c6\u6210\uff1a
1. \u83b7\u53d6\u4e3b\u5e94\u7528\u6388\u6743AppAuth\u3002
\u767b\u5f55\u8d26\u53f7\u8fdb\u5165Apkplug\u540e\u53f0\u540e\uff0c\u5207\u6362\u5230\u201c\u5e94\u7528\u6388\u6743\u9875\u9762\u201d\uff0c\u6309\u8981\u6c42\u586b\u5199\u597d\u5e94\u7528\u4fe1\u606f\uff0c\u7136\u540e\u786e\u5b9a\uff0c\u4f60\u5c31\u62e5\u6709\u4e86\u4e00\u4e2a\u7b49\u5f85\u5f00\u53d1\u7684\u5e94\u7528\u6388\u6743AppAuth\u3002\u5e94\u7528\u6388\u6743\u754c\u9762\u5982\u4e0b\uff1a

\u8fdb\u5165\u201c\u6388\u6743\u5217\u8868\u201d\u9875\u9762,\u70b9\u51fb\u201c\u67e5\u770b\u8be6\u60c5\u201d\u94fe\u63a5,\u8fdb\u5165\u201c\u5e94\u7528\u8be6\u60c5\u754c\u9762\u201d\uff0c\u5c31\u53ef\u4ee5\u770b\u5230\u5df2\u7533\u8bf7\u7684AppAuth\uff0c\u70b9\u51fb\u5176\u540e\u9762\u7684\u201c\u590d\u5236\u201d\uff0c\u5373\u53ef\u76f4\u63a5\u590d\u5236AppAuth\uff0c\u5982\u4e0b\u56fe\u6240\u793a

2. \u5bf9\u63a5Apkplug SDK \u5bfc\u5165\u76f8\u5173\u5e93\u6587\u4ef6\u3002
\u2460\u914d\u7f6e\u5e94\u7528\u6743\u9650
\u4e3b\u5e94\u7528\u9700\u8981\u51e0\u4e2a\u57fa\u7840\u7684\u6743\u9650\u914d\u7f6e\uff0c\u8bf7\u5c06\u4ee5\u4e0b\u7684\u51e0\u4e2a\u6743\u9650\u52a0\u5165\u5230\u4e3b\u5e94\u7528\u7684AndroidManifest.xml\u4e2d\u3002







\u53e6\u5916\u5c06\u4e00\u4e0b\u52a0\u5165\u5230\u8282\u70b9\u4e2d

<activity
android:name="org.apkplug.app.apkplugActivity"
android:theme="@style/android:Theme.Light"
android:configChanges="orientation|keyboardHidden"
/>
\u6700\u540e\u5c06\u6211\u4eec\u4eceApkplug\u7ba1\u7406\u540e\u53f0\u7533\u8bf7\u5230\u7684AppAuth\u52a0\u5165\u5230\u914d\u7f6e\u6587\u4ef6\u4e2d\u3002


\u6ce8\uff1a\u7531\u4e8e3.2.2\u8282\u4e2d\u6211\u4eec\u76f4\u63a5\u590d\u5236\u4e86AppAuth\uff0c\u6b64\u5904\u76f4\u63a5\u7c98\u8d34\u5230AndroidManifest\u6587\u6863\u4e2d\u3002
\u5982\u4e0b\u56fe\uff1a

\u2461\u5bfc\u5165SDK\u5e93\u6587\u4ef6
\u4e3b\u5e94\u7528\u9700\u8981\u5bfc\u5165\u4e24\u4e2a\u6587\u4ef6,\u5c06\u5176\u653e\u5165libs\u76ee\u5f55\u4e2d\u5373\u53ef\u3002
1\uff0c libndkfoo.so
2\uff0c Bundle2.0.0.jar
\u5982\u4e0b\u56fe\uff1a

\u8fd9\u4e24\u4e2a\u5e93\u6587\u4ef6\u5728Apkplug SDK\u4e2d\u53ef\u4ee5\u627e\u5230\u3002
\u7136\u540e\uff1a
\u4e3b\u5e94\u7528\u542f\u52a8Apkplug\u6700\u7b80\u53ea\u9700\u8981\u4e00\u6bb5\u4ee3\u7801\u5373\u53ef,\u5efa\u8bae\u5728Application\u4e2d\u542f\u52a8\u6846\u67b6\u3002

FrameworkInstance frame=FrameworkFactory.getInstance().start(List,Context);
\u5c06\u4e0a\u4e00\u6b65\u9aa4\u5f00\u53d1\u597d\u7684\u63d2\u4ef6apk\uff0c\u653e\u7f6e\u5728\u4e3b\u5e94\u7528\u5de5\u7a0b\u91cc\u7684assets\u8def\u5f84\u4e0b\u3002
\u5982\u4e0b\u56fe\uff1a

END
\u6b65\u9aa44\uff1a\u542f\u52a8\u4e3b\u5e94\u7528

打开Apkplug官网后,点击右上角的“注册”,在跳转页面填入相关信息,注册界面如下: 确认后注册成功,使用你的账号登录网站。你就可以用Apkplug开发应用了 END 步骤2:开发插件 Apkplug中的插件也是一个完整的apk,它与普通应用的区别有以下3点:

1, 插件assets目录下有一个plugin.xml文档,通过它可判断一个工程是主应用还是插件。

2, 插件有一个入口类BundleActivator

3, 插件会外部引用一个osgi.jar文件

开发插件的步骤有如下4步:

1,引入osgi.jar库文件

Apkplug中插件需要导入的库文件只有一个osgi.jar。

导入osgi.jar库文件需要注意一下

osgi.jar文件只能引用不能编译到apk文件中,否则会出现类冲突的情况

异常代码:had used a different Lorg/osgi/framework/BundleActivator; during pre-verification。

osgi.jar包导入方法:

文件在Apkplug SDK中可以找到。


2,编写插件入口类BundleActivator

插件启动时首先调用BundleActivator,其功能类似android中的application类。

 

public class SimpleBundle implements BundleActivator

{

    private BundleContext mcontext = null;

    public void start(BundleContext context) throws Exception

    {

        System.err.println("你好我是插件,我将为你展示启动acitivty我已经启动了 我的BundleId为:"+context.getBundle().getBundleId());

    }

    public void stop(BundleContext context)

    {

             System.err.println("你好我是插件,我被停止了 我的BundleId为:"+context.getBundle().getBundleId());

     

    }

        

}

3,编写plugin.xml配置文件

plugin.xml 是一个配置表,它跟AndroidManifest.xml作用类似。 plugin.xml文档放置在assets中即可  重要属性说明: Bundle-Name                        插件名称 Bundle-SymbolicName       插件包名  -与应用packagename可一一对应 Bundle-Version                     插件版本  -1.0.0 Bundle-Activator                    插件入口  -与Appliction 类似 Bundle-Activity                       插件界面  -多个Activity可用 ,  分割 Bundle-Service                     插件Service  -多个Service可用 , 分割    (v2.0.0新增) Bundle-Receiver                  插件广播    -多个广播类可用 , 分割         (v2.0.0新增)


4, 编译生成插件apk文件

插件工程中添加的文件目录结构如下:


最后编译运行插件工程,生成的apk文件即为插件文件


Apkplug 主应用开发分两步集成:

1. 获取主应用授权AppAuth。

登录账号进入Apkplug后台后,切换到“应用授权页面”,按要求填写好应用信息,然后确定,你就拥有了一个等待开发的应用授权AppAuth。

进入“授权列表”页面,点击“查看详情”链接,进入“应用详情界面”,就可以看到已申请的AppAuth,点击其后面的“复制”,即可直接复制AppAuth。

2. 对接Apkplug SDK 导入相关库文件。

①配置应用权限

主应用需要几个基础的权限配置,请将以下的几个权限加入到主应用的AndroidManifest.xml中。

<!-- 插件平台需要的权限! -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.READ_PHONE_STATE">

</uses-permission>

 

另外将一下加入到<application></application>节点中 

<!-- 插件平台需要的配置! -->

   <activity

            android:name="org.apkplug.app.apkplugActivity" 

            android:theme="@style/android:Theme.Light"

            android:configChanges="orientation|keyboardHidden"

       />

最后将我们从Apkplug管理后台申请到的AppAuth加入到配置文件中。

 

<meta-data  android:name="apkplug-auth" android:value="xxxxxxxx" ></meta-data>

注:由于3.2.2节中我们直接复制了AppAuth,此处直接粘贴到AndroidManifest文档中。

②导入SDK库文件

主应用需要导入两个文件,将其放入libs目录中即可。

1,  libndkfoo.so

2,  Bundle2.0.0.jar

这两个库文件在Apkplug SDK中可以找到。

然后:

主应用启动Apkplug最简只需要一段代码即可,建议在Application中启动框架。

 

FrameworkInstance frame=FrameworkFactory.getInstance().start(List<BundleActivator>,Context); 

将上一步骤开发好的插件apk,放置在主应用工程里的assets路径下。



扩展阅读:直接下载app安装 ... apk如何在苹果手机安装 ... apk苹果手机怎么打开 ... 安卓app转化为苹果app ... apk下载安装包 ... 怎么把手机app转换成apk ... 打开app下载 ... 安卓手机如何打开.apk ... 安卓手机直接安装apk文件 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网