/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

syntax = "proto3";

package apex.proto;

option java_package = "com.android.apex";
option java_outer_classname = "Protos";

message ApexManifest {

  // Package Name
  string name = 1;

  // Version Number
  int64 version = 2;

  // Pre Install Hook
  string preInstallHook = 3;

  // Post Install Hook
  // This feature is not supported.
  string postInstallHook = 4 [ deprecated = true ];

  // Version Name
  string versionName = 5;

  // Signals whenever this APEX doesn't contain any executable code.
  // If this field is set to true, then apexd will mount this apex
  // with MS_NOEXEC flag.
  bool noCode = 6;

  // List of native libs which can be used by other apexes or system.
  repeated string provideNativeLibs = 7;

  // List of native libs which this apex uses from other apexes or system.
  repeated string requireNativeLibs = 8;

  // List of JNI libs.
  // linkerconfig/libnativeloader use this field so that java libraries can
  // load JNI libraries in the same apex.
  // This is supposed to be filled by the build system with libraries which are
  // marked as "is_jni: true" from the list of "native_shared_libs".
  repeated string jniLibs = 9;

  // List of libs required that are located in a shared libraries APEX.  The
  // Android platform only checks whether this list is non-empty, and by default
  // the Android build system never sets this. This field can be used when
  // producing or processing an APEX using libraries in /apex/sharedlibs (see
  // `provideSharedApexLibs` field) to store some information about the
  // libraries.
  repeated string requireSharedApexLibs = 10;

  // Whether this APEX provides libraries to be shared with other APEXs. This
  // causes libraries contained in the APEX to be made available under
  // /apex/sharedlibs .
  bool provideSharedApexLibs = 11;

  message CompressedApexMetadata {

    // Valid only for compressed APEX. This field contains the root digest of
    // the original_apex contained inside CAPEX.
    string originalApexDigest = 1;
  }

  // Exists only for compressed APEX
  CompressedApexMetadata capexMetadata = 12;

  // Indicates that this APEX can be updated without rebooting device.
  bool supportsRebootlessUpdate = 13;
}

