Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 61211385 authored by Chong Zhang's avatar Chong Zhang
Browse files

Notify media.swcodec to load updated codes

This is done similarly to how we update the extractors.
media.swcodec will start a service "media.codec.update"
to get notified of the update apk location, then updated
version of the components will be loaded.

Bug: 111407413
Bug: 117290290

Change-Id: I4972aaf2df06c12eebd9b30fcd7261117267e6da
parent dbc63bff
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -207,7 +207,7 @@ HPLandroid/hardware/weaver/V1_0/IWeaver;->read(ILjava/util/ArrayList;Landroid/ha
HPLandroid/hardware/weaver/V1_0/IWeaver;->setHALInstrumentation()V
HPLandroid/hardware/weaver/V1_0/IWeaver;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z
HPLandroid/hardware/weaver/V1_0/IWeaver;->write(ILjava/util/ArrayList;Ljava/util/ArrayList;)I
HPLandroid/media/IMediaExtractorUpdateService;->loadPlugins(Ljava/lang/String;)V
HPLandroid/media/IMediaUpdateService;->loadPlugins(Ljava/lang/String;)V
HPLandroid/net/apf/ApfGenerator$Instruction;-><init>(Landroid/net/apf/ApfGenerator;Landroid/net/apf/ApfGenerator$Opcodes;Landroid/net/apf/ApfGenerator$Register;)V
HPLandroid/net/apf/ApfGenerator$Instruction;->calculateImmSize(IZ)B
HPLandroid/net/apf/ApfGenerator$Instruction;->calculateTargetLabelOffset()I
@@ -3977,9 +3977,9 @@ PLandroid/hardware/weaver/V1_0/WeaverConfig;->readFromParcel(Landroid/os/HwParce
PLandroid/hardware/weaver/V1_0/WeaverReadResponse;-><init>()V
PLandroid/hardware/weaver/V1_0/WeaverReadResponse;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V
PLandroid/hardware/weaver/V1_0/WeaverReadResponse;->readFromParcel(Landroid/os/HwParcel;)V
PLandroid/media/IMediaExtractorUpdateService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
PLandroid/media/IMediaExtractorUpdateService$Stub$Proxy;->loadPlugins(Ljava/lang/String;)V
PLandroid/media/IMediaExtractorUpdateService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaExtractorUpdateService;
PLandroid/media/IMediaUpdateService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
PLandroid/media/IMediaUpdateService$Stub$Proxy;->loadPlugins(Ljava/lang/String;)V
PLandroid/media/IMediaUpdateService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaExtractorUpdateService;
PLandroid/net/apf/-$$Lambda$ApfFilter$UV1wDVoVlbcxpr8zevj_aMFtUGw;-><init>()V
PLandroid/net/apf/-$$Lambda$ApfFilter$UV1wDVoVlbcxpr8zevj_aMFtUGw;->applyAsInt(Ljava/lang/Object;)I
PLandroid/net/apf/ApfCapabilities;-><init>(III)V
+40 −25
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.media.IMediaExtractorUpdateService;
import android.media.IMediaUpdateService;
import android.os.Build;
import android.os.IBinder;
import android.os.Handler;
@@ -34,6 +34,7 @@ import android.text.TextUtils;
import android.util.Log;
import android.util.Slog;
import com.android.server.SystemService;
import java.util.HashMap;

/** This class provides a system service that manages media framework updates. */
public class MediaUpdateService extends SystemService {
@@ -42,34 +43,40 @@ public class MediaUpdateService extends SystemService {
    private static final String MEDIA_UPDATE_PACKAGE_NAME =
            SystemProperties.get("ro.mediacomponents.package");
    private static final String EXTRACTOR_UPDATE_SERVICE_NAME = "media.extractor.update";

    private IMediaExtractorUpdateService mMediaExtractorUpdateService;
    final Handler mHandler;
    private static final String CODEC_UPDATE_SERVICE_NAME = "media.codec.update";
    private static final String[] UPDATE_SERVICE_NAME_ARRAY = {
            EXTRACTOR_UPDATE_SERVICE_NAME, CODEC_UPDATE_SERVICE_NAME,
    };
    private final HashMap<String, IMediaUpdateService> mUpdateServiceMap = new HashMap<>();
    private final Handler mHandler = new Handler();

    public MediaUpdateService(Context context) {
        super(context);
        mHandler = new Handler();
    }

    @Override
    public void onStart() {
        if (("userdebug".equals(android.os.Build.TYPE) || "eng".equals(android.os.Build.TYPE))
                && !TextUtils.isEmpty(MEDIA_UPDATE_PACKAGE_NAME)) {
            connect();
            for (String serviceName : UPDATE_SERVICE_NAME_ARRAY) {
                connect(serviceName);
            }
            registerBroadcastReceiver();
        }
    }

    private void connect() {
        IBinder binder = ServiceManager.getService(EXTRACTOR_UPDATE_SERVICE_NAME);
    private void connect(final String serviceName) {
        IBinder binder = ServiceManager.getService(serviceName);
        if (binder != null) {
            try {
                binder.linkToDeath(new IBinder.DeathRecipient() {
                    @Override
                    public void binderDied() {
                        Slog.w(TAG, "mediaextractor died; reconnecting");
                        mMediaExtractorUpdateService = null;
                        connect();
                        Slog.w(TAG, "service " + serviceName + " died; reconnecting");
                        synchronized (mUpdateServiceMap) {
                            mUpdateServiceMap.remove(serviceName);
                        }
                        connect(serviceName);
                    }
                }, 0);
            } catch (Exception e) {
@@ -77,15 +84,18 @@ public class MediaUpdateService extends SystemService {
            }
        }
        if (binder != null) {
            mMediaExtractorUpdateService = IMediaExtractorUpdateService.Stub.asInterface(binder);
            synchronized (mUpdateServiceMap) {
                mUpdateServiceMap.put(serviceName,
                        IMediaUpdateService.Stub.asInterface(binder));
            }
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    packageStateChanged();
                    packageStateChanged(serviceName);
                }
            });
        } else {
            Slog.w(TAG, EXTRACTOR_UPDATE_SERVICE_NAME + " not found.");
            Slog.w(TAG, serviceName + " not found.");
        }
    }

@@ -106,13 +116,12 @@ public class MediaUpdateService extends SystemService {
                                // following ACTION_PACKAGE_ADDED case.
                                return;
                            }
                            packageStateChanged();
                            break;
                            // fall-thru
                        case Intent.ACTION_PACKAGE_CHANGED:
                            packageStateChanged();
                            break;
                        case Intent.ACTION_PACKAGE_ADDED:
                            packageStateChanged();
                            for (String serviceName : UPDATE_SERVICE_NAME_ARRAY) {
                                packageStateChanged(serviceName);
                            }
                            break;
                    }
                }
@@ -128,7 +137,7 @@ public class MediaUpdateService extends SystemService {
                null /* broadcast permission */, null /* handler */);
    }

    private void packageStateChanged() {
    private void packageStateChanged(String serviceName) {
        ApplicationInfo packageInfo = null;
        boolean pluginsAvailable = false;
        try {
@@ -144,17 +153,23 @@ public class MediaUpdateService extends SystemService {
                    + " targetSdk:" + packageInfo.targetSdkVersion);
            pluginsAvailable = false;
        }
        loadExtractorPlugins(
        loadPlugins(serviceName,
                (packageInfo != null && pluginsAvailable) ? packageInfo.sourceDir : "");
    }

    private void loadExtractorPlugins(String apkPath) {
    private void loadPlugins(String serviceName, String apkPath) {
        try {
            if (mMediaExtractorUpdateService != null) {
                mMediaExtractorUpdateService.loadPlugins(apkPath);
            IMediaUpdateService service = null;
            synchronized (serviceName) {
                service = mUpdateServiceMap.get(serviceName);
            }
            if (service != null) {
                service.loadPlugins(apkPath);
            } else {
                Slog.w(TAG, "service " + serviceName + " passed away");
            }
        } catch (Exception e) {
            Slog.w(TAG, "Error in loadPlugins", e);
            Slog.w(TAG, "Error in loadPlugins for " + serviceName, e);
        }
    }
}