Full Code of umeng/apf for AI

master 3a43f732f4ed cached
34 files
43.3 KB
11.4k tokens
16 symbols
1 requests
Download .txt
Repository: umeng/apf
Branch: master
Commit: 3a43f732f4ed
Files: 34
Total size: 43.3 KB

Directory structure:
gitextract_wi3u2aqj/

├── .gitignore
├── README.md
├── apf-framework.jar
├── apf-plugin-build/
│   ├── ant.properties.example
│   ├── apf-create-plugin.sh
│   ├── build.xml.plugin.example
│   ├── build.xml.plugin.ifs.example
│   └── debug.keystore
├── com.example.host/
│   ├── .settings/
│   │   └── org.eclipse.core.resources.prefs
│   ├── AndroidManifest.xml
│   ├── libs/
│   │   └── apf-framework.jar
│   ├── proguard.cfg
│   ├── project.properties
│   ├── res/
│   │   ├── layout/
│   │   │   ├── main.xml
│   │   │   └── second.xml
│   │   └── values/
│   │       └── strings.xml
│   └── src/
│       └── com/
│           └── example/
│               └── host/
│                   └── MainActivity.java
├── com.example.plugin1/
│   ├── AndroidManifest.xml
│   ├── ant.properties
│   ├── build.xml
│   ├── proguard-project.txt
│   ├── project.properties
│   ├── res/
│   │   ├── layout/
│   │   │   └── main.xml
│   │   └── values/
│   │       └── strings.xml
│   └── src/
│       └── com/
│           └── example/
│               └── plugin1/
│                   ├── ExampleApfServiceImpl.java
│                   └── PluginActivity.java
└── com.example.plugin1.ifs/
    ├── AndroidManifest.xml
    ├── ant.properties
    ├── build.xml
    ├── proguard-project.txt
    ├── project.properties
    ├── res/
    │   ├── layout/
    │   │   └── main.xml
    │   └── values/
    │       └── strings.xml
    └── src/
        └── com/
            └── example/
                └── plugin1/
                    └── ifs/
                        └── ExampleApfService.java

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# built application files
*.apk
*.ap_

# files for the dex VM
*.dex

# Java class files
*.class

# generated files
bin/
gen/

# Local configuration file (sdk path, etc)
local.properties

# Eclipse project files
.classpath
.project


================================================
FILE: README.md
================================================
# Android Plugin Framework
> This project is pre-mature and may be changed very frequently.

## Introduction

Android Plugin Framework (APF) aims to providing a flexible, extensible framework, for Android applications, like OSGi for Java applications. App developers can design their Android applications in a totally new way: declar the interface of a application component, put the actual implementations of the component on the remote server, use APF library to load the actual implementations at runtime. In this way, app developers can dynamically update application components, or add features to an already installed application, without requiring the application being updated throught Android System Framework. A typical usage scenario can be skin: designers design various skins for an application according to pre-defined format and then put those skin files online. App users can then find and use skins through `skin store`, without having to installing a new version of the app.   
Another using scenario is for game design: design the `hard` level of a game in a different package that can be dynamically load into the game. When an user passes the `low` level of the game, the app can load the `hard` level of game code using APF dynamically. The user gets a seemlessly upgrade experience.
 
The project consists 3 major components: 

### APF core
The core library to find, verify and load plugin code from remote servers. Now, the architecture and the remote server is still pre-mature and is subject to change, so it is not open sourced yet. But it will be soon. 

### Plugin Build Scripts
The instructions to create your own plugins. Check [Creating Your APF Plugin] for details.

### Example
Example contains: 

1. Host application, Android Application Project. 
2. Plugin Interface, as an Android Library Project
3. Plugin Implementation, as an Android Application Project
  
There is already an example plugin implementation signed by [Umeng](http://www.umeng.com) and hosted on [Umeng](http://www.umeng.com)'s server side. If you want to try it out and have a different implementation, please contact xuxianming @ umeng.com


## Creating Your APF Plugin
To create a effective APD plugin, you will need to design plugin interface first in an Android Library Project. Next, implement the declared interface in an Android Application Project. 

### Plugin Interface
* Create an Android Library Project. 

```bash
android create lib-project -n com_example_plugin1_ifs -t android-17 -k com.example.plugin1.ifs -p com.example.plugin1.ifs
```

* Update ant.properties according to the template file `apf-plugin-build/ant.properties.example`
```bash
/apf-opensource/com.example.plugin1$ cat ../apf-plugin-build/ant.properties.example >> ant.properties 
```
The `ant.properties` looks like:

```bash
# This file is used to override default values used by the Ant build system.
#
# This file must be checked into Version Control Systems, as it is
# integral to the build system of your project.

# This file is only used by the Ant script.

# You can use this to override default values such as
#  'source.dir' for the location of your java source folder and
#  'out.dir' for the location of your output folder.

# You can also use it define how the release builds are signed by declaring
# the following properties:
#  'key.store' for the location of your keystore and
#  'key.alias' for the name of the key to use.
# The password will be asked during the build when you use the 'release' target.
key.store=../apf-plugin-build/debug.keystore
key.store.password=android
key.alias=androiddebugkey
key.alias.password=android
```


* Update `build.xml` according to the template file `build.xml.plugin.ifs.example`
```bash
apf-opensource/com.example.plugin1.ifs$ cp ../apf-plugin-build/build.xml.plugin.ifs.example build.xml 
```

* Design the interface to be used by the host application. Check: `src/com/example/plugin1/ifs/`

### Plugin Implementation
* Create an Android Application Project. 

```bash
android create project -n com_example_plugin1 -t android-17 -k com.example.plugin1 -p com.example.plugin1 -a PluginActivity
cd com.example.plugin1
android update project -p ./ --library ../com.example.plugin1.ifs

```

* Update ant.properties according to the template file `ant.properties.example`

* Update `build.xml` according to the template file `build.xml.plugin.ifs.example`
```bash
apf-opensource/com.example.plugin1$ cp ../apf-plugin-build/build.xml.plugin.example build.xml 
```

* Design the interface to be used by the host application.
  `src/com/example/plugin1/ifs/`




> `Plugin Implementation` project will be will packaged/exported as `${package-name}.apk` and `Plugin Interface` project will be packaged to `${package-name}.ifs.jar`.

For example, `com.umeng.analytics.apk` for plugin, and `com.umeng.analytics.ifs.jar` for interfaces declarations.
 
### Build
```bash
> ant deploy
```

The output will be at `${project.dir}/bin/com.example.plugina.apk` and `${project.dir}/bin/com.example.plugina.ifs.jar`.
                                                             
> Note: if the plugin implementation projec ifself is a android library project, for example, like com.umeng.common, you need a little "hack" to the ant build system. First change ant.properties, change `android.library=true` to `android.library=false`. After successfully `ant deploy`, change it back to `android.library=true`, as is required by the upper stream application project. 

### Example
See [com.example.host] and [com.example.plugin1]. 

To Run the example: 
```bash
ant 
```






## Signing plugin
All plugins must be signed with private key. APF adopts similar mechanisms as Android app signing. See [Signing Your Applications](http://developer.android.com/tools/publishing/app-signing.html) for help.

### Sign the plugin apk

1. Make sure that you can build your plugin interface and implementation with `ant` successfully before preceeding.
2. Configure `ant.properties`. Add the content of `ant.properties.example` to your plugin implementation project's `ant.properties`.
3. Use `ant deploy` to build the release apk package.
This will build a *release* mode plugin apk called *[project-name]-release.apk* under bin/ directory. 


### Warning
> When to release your plugin, remember to update the key and keystore. Do not use the example key store used here. 
> Caution: Since APF is in very pre-mature state, it's architecture and server side design is subject to change very frequently. For now, APF provided by [Umeng](http://www.umeng.com) does not allow any plugin signed by third party. If you want to try this out and want to deploy your plugin on [Umeng](http://www.umeng.com)'s platform, please develop your plugin first and contact us. After we check out that your plugin is secure, we can sign the plugin for you and host your plugin on  [Umeng](http://www.umeng.com)'s server. Please email to xuxianming at umeng.com. 
We will open source implementation of APF when it's architecture design is freezed. 






================================================
FILE: apf-plugin-build/ant.properties.example
================================================
key.store=../apf-plugin-build/debug.keystore
key.store.password=android
key.alias=androiddebugkey
key.alias.password=android


================================================
FILE: apf-plugin-build/apf-create-plugin.sh
================================================
#!bin/sh
# input: name of interface: com.example.plugin.ifs 
# create android lib project. 
android create lib-project $

# create android application project implementing the interface
android create project 

android update project 


# update build.xml for plugin and its implementation


# create host example. 

================================================
FILE: apf-plugin-build/build.xml.plugin.example
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project name="com.umeng.analytics" default="help">

	<!-- START: Customized build target ant: deploy. Added by Lucas Xu at 2013/03/18 -->

	<tstamp>

		<format pattern="yyyy-MM-dd HH:mm z" property="TODAY" />
	</tstamp>

	<tstamp>

		<format pattern="yyyyMMddHHmm" property="TIME" />
	</tstamp>

	<property name="version" value="${TIME}" />

	<property name="user.name" value="Umeng" />

	<!-- END: Customized build target ant: deploy. Added by Lucas Xu at 2013/03/18 -->


	<!-- The local.properties file is created and updated by the 'android' tool. 
		It contains the path to the SDK. It should *NOT* be checked into Version 
		Control Systems. -->

	<property file="local.properties" />

	<!-- The ant.properties file can be created by you. It is only edited by 
		the 'android' tool to add properties to it. This is the place to change some 
		Ant specific build properties. Here are some properties you may want to change/update: 
		source.dir The name of the source directory. Default is 'src'. out.dir The 
		name of the output directory. Default is 'bin'. For other overridable properties, 
		look at the beginning of the rules files in the SDK, at tools/ant/build.xml 
		Properties related to the SDK location or the project target should be updated 
		using the 'android' tool with the 'update' action. This file is an integral 
		part of the build system for your application and should be checked into 
		Version Control Systems. -->

	<property file="ant.properties" />

	<!-- if sdk.dir was not set from one of the property file, then get it from 
		the ANDROID_HOME env var. This must be done before we load project.properties 
		since the proguard config can use sdk.dir -->

	<property environment="env" />

	<condition property="sdk.dir" value="${env.ANDROID_HOME}">

		<isset property="env.ANDROID_HOME" />
	</condition>

	<!-- The project.properties file is created and updated by the 'android' 
		tool, as well as ADT. This contains project specific properties such as project 
		target, and library dependencies. Lower level build properties are stored 
		in ant.properties (or in .classpath for Eclipse projects). This file is an 
		integral part of the build system for your application and should be checked 
		into Version Control Systems. -->

	<loadproperties srcFile="project.properties" />

	<!-- quick check on sdk.dir -->

	<fail message="sdk.dir is missing. Make sure to generate local.properties using &apos;android update project&apos; or to inject it through the ANDROID_HOME environment variable." unless="sdk.dir" />

	<!-- START: Customized build target ant: deploy. Added by Lucas Xu at 2013/03/18 -->

	<!-- Converts this project's .class files into .dex files -->
	<target name="-pre-deploy" depends="release">
		<delete>
			<fileset dir="${out.absolute.dir}" includes="*.dex" />
			<fileset dir="${out.absolute.dir}" includes="*.dex.d" />
			<fileset dir="${out.absolute.dir}" includes="*.apk" />
			<fileset dir="${out.absolute.dir}/dexedLibs" includes="*" />
		</delete>
		<echo> executable="${dx}" output="${intermediate.dex.file}" nolocals="@{nolocals}" forceJumbo="${dex.force.jumbo}" disableDexMerger="true" verbose="true"</echo>
		<dex executable="${dx}" output="${intermediate.dex.file}" nolocals="@{nolocals}" forceJumbo="${dex.force.jumbo}" disableDexMerger="true" verbose="true">
			<path path="${out.absolute.dir}/classes" />
		</dex>
		<package-helper />
		 <antcall target="-release-sign"/>
	</target>
	<target name="deploy" depends="-pre-deploy" />





	<!-- END: Customized build target ant: deploy. Added by Lucas Xu at 2013/03/18 -->


	<!-- Import per project custom build rules if present at the root of the 
		project. This is the place to put custom intermediary targets such as: -pre-build 
		-pre-compile -post-compile (This is typically used for code obfuscation. 
		Compiled code location: ${out.classes.absolute.dir} If this is not done in 
		place, override ${out.dex.input.absolute.dir}) -post-package -post-build 
		-pre-clean -->

	<import file="custom_rules.xml" optional="true" />

	<!-- Import the actual build file. To customize existing targets, there 
		are two options: - Customize only one target: - copy/paste the target into 
		this file, *before* the <import> task. - customize it to your needs. - Customize 
		the whole content of build.xml - copy/paste the content of the rules files 
		(minus the top node) into this file, replacing the <import> task. - customize 
		to your needs. *********************** ****** IMPORTANT ****** *********************** 
		In all cases you must update the value of version-tag below to read 'custom' 
		instead of an integer, in order to avoid having your file be overridden by 
		tools such as "android update project" -->
	<!-- version-tag: custom -->

	<import file="${sdk.dir}/tools/ant/build.xml" />

</project>


================================================
FILE: apf-plugin-build/build.xml.plugin.ifs.example
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project name="com.umeng.analytics.ifs" default="help">

	<!--
         The local.properties file is created and updated by the 'android' tool.
         It contains the path to the SDK. It should *NOT* be checked into
         Version Control Systems.
    -->

	<property file="local.properties" />

	<!--
         The ant.properties file can be created by you. It is only edited by the
         'android' tool to add properties to it.
         This is the place to change some Ant specific build properties.
         Here are some properties you may want to change/update:

         source.dir
             The name of the source directory. Default is 'src'.
         out.dir
             The name of the output directory. Default is 'bin'.

         For other overridable properties, look at the beginning of the rules
         files in the SDK, at tools/ant/build.xml

         Properties related to the SDK location or the project target should
         be updated using the 'android' tool with the 'update' action.

         This file is an integral part of the build system for your
         application and should be checked into Version Control Systems.
    -->

	<property file="ant.properties" />

	<!--
         if sdk.dir was not set from one of the property file, then
         get it from the ANDROID_HOME env var.
         This must be done before we load project.properties since
         the proguard config can use sdk.dir
    -->

	<property environment="env" />

	<condition property="sdk.dir" value="${env.ANDROID_HOME}">

		<isset property="env.ANDROID_HOME" />
	</condition>

	<!--
         The project.properties file is created and updated by the 'android'
         tool, as well as ADT.

         This contains project specific properties such as project target, and library
         dependencies. Lower level build properties are stored in ant.properties
         (or in .classpath for Eclipse projects).

         This file is an integral part of the build system for your
         application and should be checked into Version Control Systems.
    -->

	<loadproperties srcFile="project.properties" />

	<!-- quick check on sdk.dir -->

	<fail message="sdk.dir is missing. Make sure to generate local.properties using &apos;android update project&apos; or to inject it through the ANDROID_HOME environment variable." unless="sdk.dir" />

	<!-- START: Customized build target ant: deploy. Added by Lucas Xu at 2013/03/18 -->

	<target name="help">

		<!-- displays starts at col 13 |13 80| -->

		<echo>
 Android Ant Build. Available targets:
        </echo>

		<echo>
 deploy: Build library jar file. The generated output is at "${out.absolute.dir}/com.umeng.apf.jar"
        </echo>

		<echo>
 clean: Removes output files created by other targets.
        </echo>
	</target>

	<target name="deploy" depends="-compile" description="package the library as a normal java jar file which will used by Android host application.">
		<copy file="${out.library.jar.file}" tofile="${out.dir}/${ant.project.name}.jar" />
		<echo message="library jar file created at ${out.absolute.dir}/${ant.project.name}.jar ." />
	</target>

	<!-- END: Customized build target ant: deploy. Added by Lucas Xu at 2013/03/18 -->


	<!--
        Import per project custom build rules if present at the root of the project.
        This is the place to put custom intermediary targets such as:
            -pre-build
            -pre-compile
            -post-compile (This is typically used for code obfuscation.
                           Compiled code location: ${out.classes.absolute.dir}
                           If this is not done in place, override ${out.dex.input.absolute.dir})
            -post-package
            -post-build
            -pre-clean
    -->

	<import file="custom_rules.xml" optional="true" />

	<!--
         Import the actual build file.

         To customize existing targets, there are two options:
         - Customize only one target:
             - copy/paste the target into this file, *before* the
               <import> task.
             - customize it to your needs.
         - Customize the whole content of build.xml
             - copy/paste the content of the rules files (minus the top node)
               into this file, replacing the <import> task.
             - customize to your needs.

         ***********************
         ****** IMPORTANT ******
         ***********************
         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
         in order to avoid having your file be overridden by tools such as "android update project"
    -->
	<!-- version-tag: custom -->

	<import file="${sdk.dir}/tools/ant/build.xml" />

</project>


================================================
FILE: com.example.host/.settings/org.eclipse.core.resources.prefs
================================================
#Fri Jul 20 17:17:22 CST 2012
eclipse.preferences.version=1
encoding/<project>=UTF-8


================================================
FILE: com.example.host/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.host"
    android:versionCode="2"
    android:versionName="1.5" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.INTERNET" >
    </uses-permission>
    <uses-permission android:name="android.permission.WAKE_LOCK" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_LOGS" >
    </uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <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>
  
        <meta-data
            android:name="UMENG_APPKEY"
            android:value="5009274e5270154d14000001" >
        </meta-data>
        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="Channel ID" />

        <service
            android:name="com.umeng.common.net.DownloadingService"
            android:exported="false">
        </service>
    </application>

</manifest>

================================================
FILE: com.example.host/proguard.cfg
================================================
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}


================================================
FILE: com.example.host/project.properties
================================================
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "ant.properties", and override values to adapt the script to your
# project structure.

# Project target.
target=android-16
android.library.reference.1=../com.example.plugin1.ifs


================================================
FILE: com.example.host/res/layout/main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/edit_a"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:hint="a"
        android:inputType="numberSigned"/>"

    <EditText
        android:id="@+id/edit_b"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:hint="b"
        android:inputType="numberSigned"/>

    <Button
        android:id="@+id/button_add"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="+" />

    <Button
        android:id="@+id/button_minus"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="-" />

    <Button
        android:id="@+id/button_multiply"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="*" />

    <Button
        android:id="@+id/button_divide"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="/" />

    <TextView
        android:id="@+id/text_result"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:hint="result"/>
</LinearLayout>

================================================
FILE: com.example.host/res/layout/second.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
	<TextView 
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="I'm just for test!"/>
</LinearLayout>

================================================
FILE: com.example.host/res/values/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="hello">Hello World, TestUmengSdkActivity!</string>
    <string name="app_name">APF Example Host</string>
    <string name="check">Check</string>
    <string name="go">Go</string>

</resources>

================================================
FILE: com.example.host/src/com/example/host/MainActivity.java
================================================
package com.example.host;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.TextView;

import com.example.plugin1.ifs.ExampleApfService;
import com.umeng.apf.ApfException;
import com.umeng.apf.PluginManager;

public class MainActivity extends Activity {
	private static final String TAG = MainActivity.class.getName();
	private ExampleApfService service;

	EditText edit_a;
	EditText edit_b;

	TextView result;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Log.d(TAG, "onCreate");
		//
		new Thread() {
			@Override
			public void run() {
				try {
					PluginManager.registerPlugin("com.example.plugin1");
					PluginManager.loadPlugins(getApplicationContext());
					service = (ExampleApfService) PluginManager
							.newInstance("com.example.plugin1.ExampleApfServiceImpl");
					if (service == null)
						throw new ApfException("unable to initialize plugin");
				} catch (ApfException e) {
					e.printStackTrace();
				}

			}
		}.start();

		edit_a = (EditText) findViewById(R.id.edit_a);
		edit_b = (EditText) findViewById(R.id.edit_b);
		result = (TextView) findViewById(R.id.text_result);
		this.findViewById(R.id.button_add).setOnClickListener(
				new OnClickListener() {

					@Override
					public void onClick(View v) {
						int a = Integer.parseInt(edit_a.getText().toString());
						int b = Integer.parseInt(edit_b.getText().toString());

						if (service != null) {
							result.setText(service.add(a, b));
						}
					}

				});

		this.findViewById(R.id.button_minus).setOnClickListener(
				new OnClickListener() {

					@Override
					public void onClick(View v) {
						int a = Integer.parseInt(edit_a.getText().toString());
						int b = Integer.parseInt(edit_b.getText().toString());

						if (service != null) {
							result.setText(service.minus(a, b));
						}
					}

				});
		this.findViewById(R.id.button_multiply).setOnClickListener(
				new OnClickListener() {

					@Override
					public void onClick(View v) {
						int a = Integer.parseInt(edit_a.getText().toString());
						int b = Integer.parseInt(edit_b.getText().toString());

						if (service != null) {
							result.setText(service.multiply(a, b));
						}
					}

				});
		this.findViewById(R.id.button_divide).setOnClickListener(
				new OnClickListener() {

					@Override
					public void onClick(View v) {
						int a = Integer.parseInt(edit_a.getText().toString());
						int b = Integer.parseInt(edit_b.getText().toString());

						if (service != null) {
							result.setText(service.divide(a, b));
						}
					}

				});
	}

	@Override
	protected void onPause() {
		super.onPause();
		Log.d(TAG, "onPause");
	}

	@Override
	protected void onResume() {
		super.onResume();
		Log.d(TAG, "onResume");
	}
}

================================================
FILE: com.example.plugin1/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.plugin1"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
        <activity android:name="PluginActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>


================================================
FILE: com.example.plugin1/ant.properties
================================================
# This file is used to override default values used by the Ant build system.
#
# This file must be checked into Version Control Systems, as it is
# integral to the build system of your project.

# This file is only used by the Ant script.

# You can use this to override default values such as
#  'source.dir' for the location of your java source folder and
#  'out.dir' for the location of your output folder.

# You can also use it define how the release builds are signed by declaring
# the following properties:
#  'key.store' for the location of your keystore and
#  'key.alias' for the name of the key to use.
# The password will be asked during the build when you use the 'release' target.

key.store=../apf-plugin-build/debug.keystore
key.store.password=android
key.alias=androiddebugkey
key.alias.password=android


================================================
FILE: com.example.plugin1/build.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project name="com.example.plugin1" default="help">

	<!-- START: Customized build target ant: deploy. Added by Lucas Xu at 2013/03/18 -->

	<tstamp>

		<format pattern="yyyy-MM-dd HH:mm z" property="TODAY" />
	</tstamp>

	<tstamp>

		<format pattern="yyyyMMddHHmm" property="TIME" />
	</tstamp>

	<property name="version" value="${TIME}" />

	<property name="user.name" value="Umeng" />

	<!-- END: Customized build target ant: deploy. Added by Lucas Xu at 2013/03/18 -->


	<!-- The local.properties file is created and updated by the 'android' tool. 
		It contains the path to the SDK. It should *NOT* be checked into Version 
		Control Systems. -->

	<property file="local.properties" />

	<!-- The ant.properties file can be created by you. It is only edited by 
		the 'android' tool to add properties to it. This is the place to change some 
		Ant specific build properties. Here are some properties you may want to change/update: 
		source.dir The name of the source directory. Default is 'src'. out.dir The 
		name of the output directory. Default is 'bin'. For other overridable properties, 
		look at the beginning of the rules files in the SDK, at tools/ant/build.xml 
		Properties related to the SDK location or the project target should be updated 
		using the 'android' tool with the 'update' action. This file is an integral 
		part of the build system for your application and should be checked into 
		Version Control Systems. -->

	<property file="ant.properties" />

	<!-- if sdk.dir was not set from one of the property file, then get it from 
		the ANDROID_HOME env var. This must be done before we load project.properties 
		since the proguard config can use sdk.dir -->

	<property environment="env" />

	<condition property="sdk.dir" value="${env.ANDROID_HOME}">

		<isset property="env.ANDROID_HOME" />
	</condition>

	<!-- The project.properties file is created and updated by the 'android' 
		tool, as well as ADT. This contains project specific properties such as project 
		target, and library dependencies. Lower level build properties are stored 
		in ant.properties (or in .classpath for Eclipse projects). This file is an 
		integral part of the build system for your application and should be checked 
		into Version Control Systems. -->

	<loadproperties srcFile="project.properties" />

	<!-- quick check on sdk.dir -->

	<fail message="sdk.dir is missing. Make sure to generate local.properties using &apos;android update project&apos; or to inject it through the ANDROID_HOME environment variable." unless="sdk.dir" />

	<!-- START: Customized build target ant: deploy. Added by Lucas Xu at 2013/03/18 -->

	<!-- Converts this project's .class files into .dex files -->
	<target name="-pre-deploy" depends="release">
		<delete>
			<fileset dir="${out.absolute.dir}" includes="*.dex" />
			<fileset dir="${out.absolute.dir}" includes="*.dex.d" />
			<fileset dir="${out.absolute.dir}" includes="*.apk" />
			<fileset dir="${out.absolute.dir}/dexedLibs" includes="*" />
		</delete>
		<echo> executable="${dx}" output="${intermediate.dex.file}" nolocals="@{nolocals}" forceJumbo="${dex.force.jumbo}" disableDexMerger="true" verbose="true"</echo>
		<dex executable="${dx}" output="${intermediate.dex.file}" nolocals="@{nolocals}" forceJumbo="${dex.force.jumbo}" disableDexMerger="true" verbose="true">
			<path path="${out.absolute.dir}/classes" />
		</dex>
		<package-helper />
		 <antcall target="-release-sign"/>
	</target>
	<target name="deploy" depends="-pre-deploy" />





	<!-- END: Customized build target ant: deploy. Added by Lucas Xu at 2013/03/18 -->


	<!-- Import per project custom build rules if present at the root of the 
		project. This is the place to put custom intermediary targets such as: -pre-build 
		-pre-compile -post-compile (This is typically used for code obfuscation. 
		Compiled code location: ${out.classes.absolute.dir} If this is not done in 
		place, override ${out.dex.input.absolute.dir}) -post-package -post-build 
		-pre-clean -->

	<import file="custom_rules.xml" optional="true" />

	<!-- Import the actual build file. To customize existing targets, there 
		are two options: - Customize only one target: - copy/paste the target into 
		this file, *before* the <import> task. - customize it to your needs. - Customize 
		the whole content of build.xml - copy/paste the content of the rules files 
		(minus the top node) into this file, replacing the <import> task. - customize 
		to your needs. *********************** ****** IMPORTANT ****** *********************** 
		In all cases you must update the value of version-tag below to read 'custom' 
		instead of an integer, in order to avoid having your file be overridden by 
		tools such as "android update project" -->
	<!-- version-tag: custom -->

	<import file="${sdk.dir}/tools/ant/build.xml" />

</project>


================================================
FILE: com.example.plugin1/proguard-project.txt
================================================
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}


================================================
FILE: com.example.plugin1/project.properties
================================================
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

# Project target.
target=android-17
android.library.reference.1=../com.example.plugin1.ifs


================================================
FILE: com.example.plugin1/res/layout/main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Hello World, PluginActivity"
    />
</LinearLayout>



================================================
FILE: com.example.plugin1/res/values/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">PluginActivity</string>
</resources>


================================================
FILE: com.example.plugin1/src/com/example/plugin1/ExampleApfServiceImpl.java
================================================
package com.example.plugin1;

import android.util.Log;

/**
 * Implementation of plugin interface
 * {@link com.example.plugin1.ifs.ExampleApfService}
 * 
 * @author lucas
 * 
 */
public class ExampleApfServiceImpl implements
		com.example.plugin1.ifs.ExampleApfService {
	private static final String TAG = ExampleApfServiceImpl.class.getName();

	/**
	 * Flawed implementation, mind overflow.
	 */
	@Override
	public int add(int a, int b) {
		Log.d(TAG, "calling implementation add.");
		return a + b;
	}

	@Override
	public int minus(int a, int b) {
		Log.d(TAG, "calling implementation minus.");
		return a - b;
	}

	/**
	 * Flawed implementation of {@link #multiply(int, int)}. Mind overflow.
	 */
	@Override
	public int multiply(int a, int b) {
		Log.d(TAG, "calling implementation multiply.");
		return a * b;
	}

	/**
	 * Flawed implementation, mind divided by zero.
	 */
	@Override
	public int divide(int a, int b) {
		Log.d(TAG, "calling implementation divide.");
		return a / b;
	}
}


================================================
FILE: com.example.plugin1/src/com/example/plugin1/PluginActivity.java
================================================
package com.example.plugin1;

import android.app.Activity;
import android.os.Bundle;

public class PluginActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}


================================================
FILE: com.example.plugin1.ifs/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.plugin1.ifs"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
        <activity android:name="ACTIVITY_ENTRY_NAME"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>


================================================
FILE: com.example.plugin1.ifs/ant.properties
================================================
# This file is used to override default values used by the Ant build system.
#
# This file must be checked into Version Control Systems, as it is
# integral to the build system of your project.

# This file is only used by the Ant script.

# You can use this to override default values such as
#  'source.dir' for the location of your java source folder and
#  'out.dir' for the location of your output folder.

# You can also use it define how the release builds are signed by declaring
# the following properties:
#  'key.store' for the location of your keystore and
#  'key.alias' for the name of the key to use.
# The password will be asked during the build when you use the 'release' target.

key.store=../apf-plugin-build/debug.keystore
key.store.password=android
key.alias=androiddebugkey
key.alias.password=android


================================================
FILE: com.example.plugin1.ifs/build.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project name="com.example.plugin1.ifs" default="help">

	<!--
         The local.properties file is created and updated by the 'android' tool.
         It contains the path to the SDK. It should *NOT* be checked into
         Version Control Systems.
    -->

	<property file="local.properties" />

	<!--
         The ant.properties file can be created by you. It is only edited by the
         'android' tool to add properties to it.
         This is the place to change some Ant specific build properties.
         Here are some properties you may want to change/update:

         source.dir
             The name of the source directory. Default is 'src'.
         out.dir
             The name of the output directory. Default is 'bin'.

         For other overridable properties, look at the beginning of the rules
         files in the SDK, at tools/ant/build.xml

         Properties related to the SDK location or the project target should
         be updated using the 'android' tool with the 'update' action.

         This file is an integral part of the build system for your
         application and should be checked into Version Control Systems.
    -->

	<property file="ant.properties" />

	<!--
         if sdk.dir was not set from one of the property file, then
         get it from the ANDROID_HOME env var.
         This must be done before we load project.properties since
         the proguard config can use sdk.dir
    -->

	<property environment="env" />

	<condition property="sdk.dir" value="${env.ANDROID_HOME}">

		<isset property="env.ANDROID_HOME" />
	</condition>

	<!--
         The project.properties file is created and updated by the 'android'
         tool, as well as ADT.

         This contains project specific properties such as project target, and library
         dependencies. Lower level build properties are stored in ant.properties
         (or in .classpath for Eclipse projects).

         This file is an integral part of the build system for your
         application and should be checked into Version Control Systems.
    -->

	<loadproperties srcFile="project.properties" />

	<!-- quick check on sdk.dir -->

	<fail message="sdk.dir is missing. Make sure to generate local.properties using &apos;android update project&apos; or to inject it through the ANDROID_HOME environment variable." unless="sdk.dir" />

	<!-- START: Customized build target ant: deploy. Added by Lucas Xu at 2013/03/18 -->

	<target name="help">

		<!-- displays starts at col 13 |13 80| -->

		<echo>
 Android Ant Build. Available targets:
        </echo>

		<echo>
 deploy: Build library jar file. The generated output is at "${out.absolute.dir}/com.umeng.apf.jar"
        </echo>

		<echo>
 clean: Removes output files created by other targets.
        </echo>
	</target>

	<target name="deploy" depends="-compile" description="package the library as a normal java jar file which will used by Android host application.">
		<copy file="${out.library.jar.file}" tofile="${out.dir}/${ant.project.name}.jar" />
		<echo message="library jar file created at ${out.absolute.dir}/${ant.project.name}.jar ." />
	</target>

	<!-- END: Customized build target ant: deploy. Added by Lucas Xu at 2013/03/18 -->


	<!--
        Import per project custom build rules if present at the root of the project.
        This is the place to put custom intermediary targets such as:
            -pre-build
            -pre-compile
            -post-compile (This is typically used for code obfuscation.
                           Compiled code location: ${out.classes.absolute.dir}
                           If this is not done in place, override ${out.dex.input.absolute.dir})
            -post-package
            -post-build
            -pre-clean
    -->

	<import file="custom_rules.xml" optional="true" />

	<!--
         Import the actual build file.

         To customize existing targets, there are two options:
         - Customize only one target:
             - copy/paste the target into this file, *before* the
               <import> task.
             - customize it to your needs.
         - Customize the whole content of build.xml
             - copy/paste the content of the rules files (minus the top node)
               into this file, replacing the <import> task.
             - customize to your needs.

         ***********************
         ****** IMPORTANT ******
         ***********************
         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
         in order to avoid having your file be overridden by tools such as "android update project"
    -->
	<!-- version-tag: custom -->

	<import file="${sdk.dir}/tools/ant/build.xml" />

</project>


================================================
FILE: com.example.plugin1.ifs/proguard-project.txt
================================================
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}


================================================
FILE: com.example.plugin1.ifs/project.properties
================================================
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

android.library=true
# Project target.
target=android-17


================================================
FILE: com.example.plugin1.ifs/res/layout/main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Hello World, ACTIVITY_ENTRY_NAME"
    />
</LinearLayout>



================================================
FILE: com.example.plugin1.ifs/res/values/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">ACTIVITY_ENTRY_NAME</string>
</resources>


================================================
FILE: com.example.plugin1.ifs/src/com/example/plugin1/ifs/ExampleApfService.java
================================================
package com.example.plugin1.ifs;

/**
 * Example APF Plugin interface. Declar the interface methods here and implement
 * the interface in project .com.example.plugin1
 * 
 * @author lucas
 * 
 */
public interface ExampleApfService {
	public int add(int a, int b);

	public int minus(int a, int b);

	public int multiply(int a, int b);

	public int divide(int a, int b);
}
Download .txt
gitextract_wi3u2aqj/

├── .gitignore
├── README.md
├── apf-framework.jar
├── apf-plugin-build/
│   ├── ant.properties.example
│   ├── apf-create-plugin.sh
│   ├── build.xml.plugin.example
│   ├── build.xml.plugin.ifs.example
│   └── debug.keystore
├── com.example.host/
│   ├── .settings/
│   │   └── org.eclipse.core.resources.prefs
│   ├── AndroidManifest.xml
│   ├── libs/
│   │   └── apf-framework.jar
│   ├── proguard.cfg
│   ├── project.properties
│   ├── res/
│   │   ├── layout/
│   │   │   ├── main.xml
│   │   │   └── second.xml
│   │   └── values/
│   │       └── strings.xml
│   └── src/
│       └── com/
│           └── example/
│               └── host/
│                   └── MainActivity.java
├── com.example.plugin1/
│   ├── AndroidManifest.xml
│   ├── ant.properties
│   ├── build.xml
│   ├── proguard-project.txt
│   ├── project.properties
│   ├── res/
│   │   ├── layout/
│   │   │   └── main.xml
│   │   └── values/
│   │       └── strings.xml
│   └── src/
│       └── com/
│           └── example/
│               └── plugin1/
│                   ├── ExampleApfServiceImpl.java
│                   └── PluginActivity.java
└── com.example.plugin1.ifs/
    ├── AndroidManifest.xml
    ├── ant.properties
    ├── build.xml
    ├── proguard-project.txt
    ├── project.properties
    ├── res/
    │   ├── layout/
    │   │   └── main.xml
    │   └── values/
    │       └── strings.xml
    └── src/
        └── com/
            └── example/
                └── plugin1/
                    └── ifs/
                        └── ExampleApfService.java
Download .txt
SYMBOL INDEX (16 symbols across 4 files)

FILE: com.example.host/src/com/example/host/MainActivity.java
  class MainActivity (line 15) | public class MainActivity extends Activity {
    method onCreate (line 24) | @Override
    method onPause (line 109) | @Override
    method onResume (line 115) | @Override

FILE: com.example.plugin1.ifs/src/com/example/plugin1/ifs/ExampleApfService.java
  type ExampleApfService (line 10) | public interface ExampleApfService {
    method add (line 11) | public int add(int a, int b);
    method minus (line 13) | public int minus(int a, int b);
    method multiply (line 15) | public int multiply(int a, int b);
    method divide (line 17) | public int divide(int a, int b);

FILE: com.example.plugin1/src/com/example/plugin1/ExampleApfServiceImpl.java
  class ExampleApfServiceImpl (line 12) | public class ExampleApfServiceImpl implements
    method add (line 19) | @Override
    method minus (line 25) | @Override
    method multiply (line 34) | @Override
    method divide (line 43) | @Override

FILE: com.example.plugin1/src/com/example/plugin1/PluginActivity.java
  class PluginActivity (line 6) | public class PluginActivity extends Activity
    method onCreate (line 9) | @Override
Condensed preview — 34 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (49K chars).
[
  {
    "path": ".gitignore",
    "chars": 231,
    "preview": "# built application files\n*.apk\n*.ap_\n\n# files for the dex VM\n*.dex\n\n# Java class files\n*.class\n\n# generated files\nbin/\n"
  },
  {
    "path": "README.md",
    "chars": 7048,
    "preview": "# Android Plugin Framework\n> This project is pre-mature and may be changed very frequently.\n\n## Introduction\n\nAndroid Pl"
  },
  {
    "path": "apf-plugin-build/ant.properties.example",
    "chars": 125,
    "preview": "key.store=../apf-plugin-build/debug.keystore\nkey.store.password=android\nkey.alias=androiddebugkey\nkey.alias.password=and"
  },
  {
    "path": "apf-plugin-build/apf-create-plugin.sh",
    "chars": 315,
    "preview": "#!bin/sh\n# input: name of interface: com.example.plugin.ifs \n# create android lib project. \nandroid create lib-project $"
  },
  {
    "path": "apf-plugin-build/build.xml.plugin.example",
    "chars": 4881,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project name=\"com.umeng.analytics\" default=\"help\">\n\n\t<!-- START: Customized buil"
  },
  {
    "path": "apf-plugin-build/build.xml.plugin.ifs.example",
    "chars": 4791,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project name=\"com.umeng.analytics.ifs\" default=\"help\">\n\n\t<!--\n         The local"
  },
  {
    "path": "com.example.host/.settings/org.eclipse.core.resources.prefs",
    "chars": 88,
    "preview": "#Fri Jul 20 17:17:22 CST 2012\r\neclipse.preferences.version=1\r\nencoding/<project>=UTF-8\r\n"
  },
  {
    "path": "com.example.host/AndroidManifest.xml",
    "chars": 1858,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    packag"
  },
  {
    "path": "com.example.host/proguard.cfg",
    "chars": 1248,
    "preview": "-optimizationpasses 5\n-dontusemixedcaseclassnames\n-dontskipnonpubliclibraryclasses\n-dontpreverify\n-verbose\n-optimization"
  },
  {
    "path": "com.example.host/project.properties",
    "chars": 416,
    "preview": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# T"
  },
  {
    "path": "com.example.host/res/layout/main.xml",
    "chars": 1550,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    an"
  },
  {
    "path": "com.example.host/res/layout/second.xml",
    "chars": 388,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    an"
  },
  {
    "path": "com.example.host/res/values/strings.xml",
    "chars": 270,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n\r\n    <string name=\"hello\">Hello World, TestUmengSdkActivity!</stri"
  },
  {
    "path": "com.example.host/src/com/example/host/MainActivity.java",
    "chars": 2965,
    "preview": "package com.example.host;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.util.Log;\nimport androi"
  },
  {
    "path": "com.example.plugin1/AndroidManifest.xml",
    "chars": 649,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      packag"
  },
  {
    "path": "com.example.plugin1/ant.properties",
    "chars": 823,
    "preview": "# This file is used to override default values used by the Ant build system.\n#\n# This file must be checked into Version "
  },
  {
    "path": "com.example.plugin1/build.xml",
    "chars": 4881,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project name=\"com.example.plugin1\" default=\"help\">\n\n\t<!-- START: Customized buil"
  },
  {
    "path": "com.example.plugin1/proguard-project.txt",
    "chars": 781,
    "preview": "# To enable ProGuard in your project, edit project.properties\n# to define the proguard.config property as described in t"
  },
  {
    "path": "com.example.plugin1/project.properties",
    "chars": 618,
    "preview": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# T"
  },
  {
    "path": "com.example.plugin1/res/layout/main.xml",
    "chars": 393,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "com.example.plugin1/res/values/strings.xml",
    "chars": 116,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">PluginActivity</string>\n</resources>\n"
  },
  {
    "path": "com.example.plugin1/src/com/example/plugin1/ExampleApfServiceImpl.java",
    "chars": 994,
    "preview": "package com.example.plugin1;\n\nimport android.util.Log;\n\n/**\n * Implementation of plugin interface\n * {@link com.example."
  },
  {
    "path": "com.example.plugin1/src/com/example/plugin1/PluginActivity.java",
    "chars": 350,
    "preview": "package com.example.plugin1;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\npublic class PluginActivity extend"
  },
  {
    "path": "com.example.plugin1.ifs/AndroidManifest.xml",
    "chars": 658,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      packag"
  },
  {
    "path": "com.example.plugin1.ifs/ant.properties",
    "chars": 823,
    "preview": "# This file is used to override default values used by the Ant build system.\n#\n# This file must be checked into Version "
  },
  {
    "path": "com.example.plugin1.ifs/build.xml",
    "chars": 4791,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project name=\"com.example.plugin1.ifs\" default=\"help\">\n\n\t<!--\n         The local"
  },
  {
    "path": "com.example.plugin1.ifs/proguard-project.txt",
    "chars": 781,
    "preview": "# To enable ProGuard in your project, edit project.properties\n# to define the proguard.config property as described in t"
  },
  {
    "path": "com.example.plugin1.ifs/project.properties",
    "chars": 584,
    "preview": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# T"
  },
  {
    "path": "com.example.plugin1.ifs/res/layout/main.xml",
    "chars": 398,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "com.example.plugin1.ifs/res/values/strings.xml",
    "chars": 121,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">ACTIVITY_ENTRY_NAME</string>\n</resources>"
  },
  {
    "path": "com.example.plugin1.ifs/src/com/example/plugin1/ifs/ExampleApfService.java",
    "chars": 373,
    "preview": "package com.example.plugin1.ifs;\n\n/**\n * Example APF Plugin interface. Declar the interface methods here and implement\n "
  }
]

// ... and 3 more files (download for full content)

About this extraction

This page contains the full source code of the umeng/apf GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 34 files (43.3 KB), approximately 11.4k tokens, and a symbol index with 16 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!