Search code examples
androidandroid-studioionic2cordova-plugins

Start Activity residing inside Cordova Plugin's aar's file in Ionic2 Project


What I am trying to achieve:

I have created Android Plugin Project (cclib-release.aar) which has a targeted Activity.

I want to invoke this Activity in ionic2 using Cordova Plugin which has cclib-release.aar added as dependency inside Cordova Plugin. aar file added in cordova plugin as per this link

Problem facing:

While invoking Activity, I am getting the following error

java.lang.NoClassDefFoundError: Failed resolution of: Lcompute/cclib/MainActivity;
Caused by: java.lang.ClassNotFoundException: Didn't find class "compute.cclib.MainActivity" on path: DexPathList[[zip file "/data/app/com.ionicframework.fragmentwithionic759798-2/base.apk"],nativeLibraryDirectories=[/data/app/com.ionicframework.fragmentwithionic759798-2/lib/arm, /vendor/lib, /system/lib]]

The issue is similar to SO Link in which the issue was resolved. But even after following similar step's I am getting the above mentioned error!

My Plugin Structure: (cclib-release.aar is my targeted library with Activity)

enter image description here

My Inject.java goes like this

    public class Inject extends CordovaPlugin {

    @Override
        public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {

       if (action.equals("coolMethod")) {
                String message = args.getString(0);
                this.coolMethod(message, callbackContext);
                return true;
            }
           return false;
      }

    private void coolMethod(String message, CallbackContext callbackContext) {

         if (message != null && message.length() > 0) {
                cordova.getActivity().runOnUiThread(new Runnable() {
                public void run() {
                    Intent intent = new Intent(cordova.getActivity().getApplicationContext(), 
                    compute.cclib.MainActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    cordova.getActivity().startActivity(intent);
                }
                });
                callbackContext.success(message);
            } else {
                callbackContext.error("Expected one non-empty string argument.");
            }
      }
    }

Added this plugin in ionic2 using

cordova plugin add PATH_TO_PLUGIN

As per above mentioned answer by SO, I have modified Ionic2 project's AndroidManifest.xml manually .Path =FragmentWithIonic\platforms\android to refer the Activity.

<activity android:label="@string/activity_name"  
android:launchMode="singleTop" android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
android:name="compute.cclib.MainActivity">
</activity>

I am invoking this in Ionic2 using below which works fine in other cases.

this.platform.ready().then(() => {
            window.plugins.Inject.coolMethod(message, "short", position);
        });

I tried to manually import compute.cclib.MainActivity in Inject.java. But invoking Activity is still giving run time error!

Below is the modified FragmentWithIonic\platforms\android\AndroidManifest.xml

<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" 
        android:versionCode="1" 
        android:versionName="0.0.1" 
        package="com.ionicframework.fragmentwithionic759798" 
        xmlns:android="http://schemas.android.com/apk/res/android">
    <supports-screens android:anyDensity="true" 
    android:largeScreens="true" 
    android:normalScreens="true" 
    android:resizeable="true" 
    android:smallScreens="true" 
    android:xlargeScreens="true" />
    <application android:hardwareAccelerated="true" 
        android:icon="@mipmap/icon" 
        android:label="@string/app_name" 
        android:supportsRtl="true">
        <activity 
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" 
            android:label="@string/activity_name" 
            android:launchMode="singleTop" 
            android:name="MainActivity" 
            android:theme="@android:style/Theme.DeviceDefault.NoActionBar" 
            android:windowSoftInputMode="adjustResize">
            <intent-filter android:label="@string/launcher_name">
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:label="@string/activity_name"
        android:launchMode="singleTop"
        android:theme="@android:style/Theme.DeviceDefault.NoActionBar"
        android:name="compute.cclib.MainActivity">
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="24" />
</manifest>

What modifications I need to do to invoke Activity in my plugin?


EDIT 1

After @gmmo suggested, I included reference libraries in my Plugin's gradle File (Inject.gradle)

   repositories{
   jcenter()
   maven { url "https://jitpack.io" }
   flatDir{
    dirs 'aar'
   }
   }
  dependencies {
    compile 'com.android.support:appcompat-v7:25.1.0'
    compile(name:'cclib-release', ext:'aar')
   }

 android {
    packagingOptions {
      exclude 'META-INF/NOTICE'
      exclude 'META-INF/LICENSE'
    }
 }

Now I am getting the following error while building my ionic2 project.

A problem occurred configuring root project 'android'.
> You have not accepted the license agreements of the following SDK components:
[Android Support Repository].
Before building your project, you need to accept the license agreements and complete the installation of the missing components using the Android Studio SDK Manager.
Alternatively, to learn how to transfer the license agreements from one workstation to another, go to http://d.android.com/r/studio-ui/export-licenses.html

enter image description here

I have already updated with all license agreements in SDK. I am pretty sure this is due to this lines in Inject.gradle

compile 'com.android.support:appcompat-v7:25.1.0'

Plugin might not able to find the corresponding dependencies


Solution

  • Okey finally I figure out the issue.

    Ionic2 project need to update SDK tools by the following command

    android update sdk --no-ui --filter extra
    

    Got this input from cordova-plugin-issues

    One more command was mentioned which I am not sure about which was the below one. If someone come across similar issue can try this out as well

    android update sdk --no-ui --all --filter
    

    A big Thanks to @gmmo , as he gave me the input to add all dependencies also along with plugin's Inject.gradle .

    As I was in an impression that why would this be required after all these dependencies was already covered in Android Plugin Project.