aboutsummaryrefslogtreecommitdiff
path: root/en/devices/architecture/vndk/deftool.html
diff options
context:
space:
mode:
Diffstat (limited to 'en/devices/architecture/vndk/deftool.html')
-rw-r--r--en/devices/architecture/vndk/deftool.html433
1 files changed, 433 insertions, 0 deletions
diff --git a/en/devices/architecture/vndk/deftool.html b/en/devices/architecture/vndk/deftool.html
new file mode 100644
index 00000000..bfed22c4
--- /dev/null
+++ b/en/devices/architecture/vndk/deftool.html
@@ -0,0 +1,433 @@
+<html devsite>
+ <head>
+ <title>VNDK Definition Tool</title>
+ <meta name="project_path" value="/_project.yaml" />
+ <meta name="book_path" value="/_book.yaml" />
+ </head>
+ <body>
+ <!--
+ Copyright 2017 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.
+ -->
+
+
+<p>
+The VNDK definition tool helps vendors migrate their source tree to an Android O
+environment. This tool scans binary files in the system and vendor images then
+resolves dependencies. Based on the module dependency graph, the tool can also
+detect violations to VNDK concepts and provide insight/suggestions for moving
+modules between partitions. If an AOSP system image is specified, the VNDK
+definition tool can compare your system image with the AOSP system image and
+determine the extended libraries.
+</p>
+<p>
+This section covers three frequently used commands for the VNDK definition tool:
+</p>
+<ul>
+<li><code>vndk</code>. Compute VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES, and
+EXTRA_VENDOR_LIBRARIES for build system workaround in Android O.</li>
+<li><code>check-dep</code>. Check the violating module dependencies from vendor
+modules to non-eligible framework shared libraries.</li>
+<li><code>deps</code>. Print the dependencies between the shared libraries and
+executables.</li>
+</ul>
+
+<p>For more details on advanced command usage, refer to
+<a href="https://android.googlesource.com/platform/development/+/master/vndk/tools/definition-tool/README.md" class="external">README.md</a>
+file in the VNDK Definition Tool repository.</p>
+
+<h2 id="vndk">vndk</h2>
+<p>The <code>vndk</code> subcommand loads the shared libraries and executables
+from the system partition and vendor partitions, then resolves module
+dependencies to determine the libraries that must be copied to
+<code>/system/lib[64]/vndk-sp</code> and <code>/vendor/lib[64]</code>. Options
+for the <code>vndk</code> subcommand include:</p>
+
+<table>
+ <tr>
+ <th>Option</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td><code>--system</code>
+ </td>
+ <td>Point to a directory containing the files that will reside in the system
+partition.
+ </td>
+ </tr>
+ <tr>
+ <td><code>--vendor</code>
+ </td>
+ <td>Point to a directory containing the files that will reside in a vendor
+partition.
+ </td>
+ </tr>
+ <tr>
+ <td><code>--aosp-system</code>
+ </td>
+ <td>Point to a directory containing the files that will reside in the AOSP
+system image.
+ </td>
+ </tr>
+ <tr>
+ <td><code>--load-extra-deps</code>
+ </td>
+ <td>Point to a file that describes the implicit dependencies, such as
+<code>dlopen()</code>.
+ </td>
+ </tr>
+</table>
+
+<p>For example, to compute the VNDK library sets, run the following
+<code>vndk</code> subcommand:</p>
+
+<pre class="prettyprint">
+<code class="devsite-terminal">./vndk_definition_tool.py vndk \</code>
+ --system ${ANDROID_PRODUCT_OUT}/system \
+ --vendor ${ANDROID_PRODUCT_OUT}/vendor \
+ --aosp-system ${ANDROID_PRODUCT_OUT}/../generic_arm64_ab/system\
+ --load-extra-deps dlopen.dep
+</pre>
+
+<p>Specify extra dependencies with a simple file format. Each line represents a
+relationship, with the file before the colon depending on the file after the
+colon. For example:</p>
+
+<pre class="prettyprint">/system/lib/libart.so: /system/lib/libart-compiler.so</pre>
+
+<p>This line lets the VNDK definition tool know that <code>libart.so</code>
+depends on <code>libart-compiler.so</code>.
+</p>
+
+<h3 id="installation-destination">Installation destination</h3>
+<p>VNDK definition tool lists libraries and corresponding install directories
+for the following categories:</p>
+
+<table>
+ <tr>
+ <th>Category</th>
+ <th>Directory</th>
+ </tr>
+ <tr>
+ <td>vndk_sp
+ </td>
+ <td>Must install to <code>/system/lib[64]/vndk-sp</code>
+ </td>
+ </tr>
+ <tr>
+ <td>vndk_sp_ext
+ </td>
+ <td>Must install to <code>/vendor/lib[64]/vndk-sp</code>
+ </td>
+ </tr>
+ <tr>
+ <td>extra_vendor_libs
+ </td>
+ <td>Must install to <code>/vendor/lib[64]</code>
+ </td>
+ </tr>
+</table>
+
+<h3 id="build-system-templates">Build system templates</h3>
+<p>After gathering outputs from VNDK definition tool, a vendor can create an
+<code>Android.mk</code> and fill in <code>VNDK_SP_LIBRARIES</code>,
+<code>VNDK_SP_EXT_LIBRARIES</code> and <code>EXTRA_VENDOR_LIBRARIES</code> to
+automate the process to copy libraries to the designated installation
+destination.</p>
+
+<pre class="prettyprint">ifneq ($(filter $(YOUR_DEVICE_NAME),$(TARGET_DEVICE)),)
+VNDK_SP_LIBRARIES := ##_VNDK_SP_##
+VNDK_SP_EXT_LIBRARIES := ##_VNDK_SP_EXT_##
+EXTRA_VENDOR_LIBRARIES := ##_EXTRA_VENDOR_LIBS_##
+
+#-------------------------------------------------------------------------------
+# VNDK Modules
+#-------------------------------------------------------------------------------
+LOCAL_PATH := $(call my-dir)
+
+define define-vndk-lib
+include $$(CLEAR_VARS)
+LOCAL_MODULE := $1.$2
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_PREBUILT_MODULE_FILE := $$(TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so
+LOCAL_STRIP_MODULE := false
+LOCAL_MULTILIB := first
+LOCAL_MODULE_TAGS := optional
+LOCAL_INSTALLED_MODULE_STEM := $1.so
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_RELATIVE_PATH := $3
+LOCAL_VENDOR_MODULE := $4
+include $$(BUILD_PREBUILT)
+
+ifneq ($$(TARGET_2ND_ARCH),)
+ifneq ($$(TARGET_TRANSLATE_2ND_ARCH),true)
+include $$(CLEAR_VARS)
+LOCAL_MODULE := $1.$2
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_PREBUILT_MODULE_FILE := $$($$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so
+LOCAL_STRIP_MODULE := false
+LOCAL_MULTILIB := 32
+LOCAL_MODULE_TAGS := optional
+LOCAL_INSTALLED_MODULE_STEM := $1.so
+LOCAL_MODULE_SUFFIX := .so
+LOCAL_MODULE_RELATIVE_PATH := $3
+LOCAL_VENDOR_MODULE := $4
+include $$(BUILD_PREBUILT)
+endif # TARGET_TRANSLATE_2ND_ARCH is not true
+endif # TARGET_2ND_ARCH is not empty
+endef
+
+$(foreach lib,$(VNDK_SP_LIBRARIES),\
+ $(eval $(call define-vndk-lib,$(lib),vndk-sp-gen,vndk-sp,)))
+$(foreach lib,$(VNDK_SP_EXT_LIBRARIES),\
+ $(eval $(call define-vndk-lib,$(lib),vndk-sp-ext-gen,vndk-sp,true)))
+$(foreach lib,$(EXTRA_VENDOR_LIBRARIES),\
+ $(eval $(call define-vndk-lib,$(lib),vndk-ext-gen,,true)))
+
+
+#-------------------------------------------------------------------------------
+# Phony Package
+#-------------------------------------------------------------------------------
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := $(YOUR_DEVICE_NAME)-vndk
+LOCAL_MODULE_TAGS := optional
+LOCAL_REQUIRED_MODULES := \
+ $(addsuffix .vndk-sp-gen,$(VNDK_SP_LIBRARIES)) \
+ $(addsuffix .vndk-sp-ext-gen,$(VNDK_SP_EXT_LIBRARIES)) \
+ $(addsuffix .vndk-ext-gen,$(EXTRA_VENDOR_LIBRARIES))
+include $(BUILD_PHONY_PACKAGE)
+
+endif # ifneq ($(filter $(YOUR_DEVICE_NAME),$(TARGET_DEVICE)),)
+</pre>
+
+<h2 id="check-dep">check-dep</h2>
+<p>The <code>check-dep</code> subcommand scans vendor modules and checks their
+dependencies. If it detects violations, it prints the violating dependant
+library and symbol usages:</p>
+
+<pre class="prettyprint">
+<code class="devsite-terminal">./vndk_definition_tool.py check-dep \</code>
+ --system ${ANDROID_PRODUCT_OUT}/system \
+ --vendor ${ANDROID_PRODUCT_OUT}/vendor \
+ --tag-file eligible-list.csv \
+ --module-info ${ANDROID_PRODUCT_OUT}/module-info.json \
+ 1> check_dep.txt \
+ 2> check_dep_err.txt
+</pre>
+
+<p>For example, the following sample output shows a violating dependency from
+<code>libRS_internal.so</code> to <code>libmediandk.so</code>:</p>
+
+<pre class="prettyprint">
+/system/lib/libRS_internal.so
+ MODULE_PATH: frameworks/rs
+ /system/lib/libmediandk.so
+ AImageReader_acquireNextImage
+ AImageReader_delete
+ AImageReader_getWindow
+ AImageReader_new
+ AImageReader_setImageListener
+</pre>
+
+<p>Options for the <code>check-dep</code> subcommand include:</p>
+
+<table>
+ <tr>
+ <th style="width:25%">Option</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td><code>--tag-file</code>
+ </td>
+ <td>Must refer to an eligible library tag file (described below), which is a
+Google-provided spreadsheet that described categories of framework shared
+libraries.
+ </td>
+ </tr>
+ <tr>
+ <td><code>--module-info</code>
+ </td>
+ <td>Points to the <code>module-info.json</code> generated by Android build
+system. It helps the VNDK definition tool associate binary modules with source
+code.
+ </td>
+ </tr>
+</table>
+
+<h3 id="eligible-library-tag-file">Eligible library tag file</h3>
+<p>Google provides an eligible VNDK spreadsheet (e.g.
+<code>eligible-list.csv</code>) that tags the framework shared libraries that
+can be used by vendor modules:</p>
+
+<table>
+ <tr>
+ <th style="width:25%">Tag</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>LL-NDK</td>
+ <td>Low-level NDK libraries that can be used by both framework and vendor
+modules.</td>
+ </tr>
+ <tr>
+ <td>LL-NDK-Indirect</td>
+ <td>Private dependencies of LL-NDK libraries. Vendor modules must not access
+these libraries directly.</td>
+ </tr>
+ <tr>
+ <td>SP-NDK</td>
+ <td>Same-process NDK libraries that can be used by both framework and vendor
+modules.</td>
+ </tr>
+ <tr>
+ <td>SP-NDK-Indirect</td>
+ <td>Private dependencies of SP-NDK libraries. Vendor modules must not access
+these libraries directly.</td>
+ </tr>
+ <tr>
+ <td>VNDK-SP</td>
+ <td>SP-HAL framework shared libraries dependencies.</td>
+ </tr>
+ <tr>
+ <td>VNDK-SP-Indirect</td>
+ <td>VNDK-SP dependencies that are not directly accessible to SP-HAL, but can
+be accessed by other vendor modules (except SP-HAL and SP-HAL-Dep)</td>
+ </tr>
+ <tr>
+ <td>VNDK-SP-Indirect-Private</td>
+ <td>VNDK-SP dependencies that are not directly accessible to all vendor
+modules.</td>
+ </tr>
+ <tr>
+ <td>VNDK</td>
+ <td>Framework shared libraries that are available to vendor modules (except
+SP-HAL and SP-HAL-Dep).</td>
+ </tr>
+ <tr>
+ <td>FWK-ONLY</td>
+ <td>Framework-only shared libraries that must not be accessed by vendor
+modules (neither directly nor indirectly).</td>
+ </tr>
+ <tr>
+ <td>FWK-ONLY-RS</td>
+ <td>Framework-only shared libraries that must not be accessed by vendor
+modules (except for RS usages).</td>
+ </tr>
+</table>
+
+<p>The following table describes tags used for vendor shared libraries:</p>
+
+<table>
+ <tr>
+ <th style="width:25%">Tag</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>SP-HAL</td>
+ <td>Same-process HAL implementation shared libraries.</td>
+ </tr>
+ <tr>
+ <td>SP-HAL-Dep</td>
+ <td>SP-HAL vendor shared libraries dependencies (a.k.a. SP-HAL dependencies
+excluding LL-NDK, SP-NDK, and VNDK-SP)</td>
+ </tr>
+ <tr>
+ <td>VND-ONLY</td>
+ <td>Framework-invisible shared libraries that must not be accessed by
+framework modules. The copied extended VNDK libraries will be tagged as VND-ONLY
+as well.</td>
+ </tr>
+</table>
+
+<p>Relationships between tags:</p>
+
+<img src="../images/treble_vndk_design.png">
+<figcaption><strong>Figure 1.</strong> Relationships between tags.</figcaption>
+
+<h2 id="deps">deps</h2>
+<p>To debug the library dependencies, the <code>deps</code> subcommand prints
+the module dependencies:</p>
+
+<pre class="prettyprint">
+<code class="devsite-terminal">./vndk_definition_tool.py deps \</code>
+ --system ${ANDROID_PRODUCT_OUT}/system \
+ --vendor ${ANDROID_PRODUCT_OUT}/vendor
+</pre>
+
+<p>The output consists of multiple lines. The line without a tab character
+starts a new section. The line with a tab character depends on the preceding
+section. For example:</p>
+
+<pre class="prettyprint">
+/system/lib/ld-android.so
+/system/lib/libc.so
+ /system/lib/libdl.so
+</pre>
+
+<p>This output shows that <code>ld-android.so</code> does not have a dependency
+and <code>libc.so</code> depends on <code>libdl.so</code>.</p>
+
+<p>When specifying the <code>--revert</code> option, <code>deps</code>
+subcommand prints the <strong>usages of libraries</strong> (reversed
+dependencies):</p>
+
+<pre class="prettyprint">
+<code class="devsite-terminal">./vndk_definition_tool.py deps \</code>
+ --revert \
+ --system ${ANDROID_PRODUCT_OUT}/system \
+ --vendor ${ANDROID_PRODUCT_OUT}/vendor</pre>
+
+<p>For example:</p>
+
+<pre class="prettyprint">
+/system/lib/ld-android.so
+ /system/lib/libdl.so
+ </pre>
+
+<p>This output shows that <code>ld-android.so</code> is used by
+<code>libdl.so</code>, or in other words, <code>libdl.so</code> depends on
+<code>ld-android.so</code>. In addition, this output shows that
+<code>libdl.so</code> is the sole user of <code>ld-android.so</code>.</p>
+
+<p>When specifying the <code>--symbol</code> option, the <code>deps</code>
+subcommand prints the symbols being used:</p>
+
+<pre class="prettyprint">
+<code class="devsite-terminal">./vndk_definition_tool.py deps \</code>
+ --symbol \
+ --system ${ANDROID_PRODUCT_OUT}/system \
+ --vendor ${ANDROID_PRODUCT_OUT}/vendor
+ </pre>
+
+<p>For example:</p>
+
+<pre class="prettyprint">
+/system/lib/libc.so
+ /system/lib/libdl.so
+ android_get_application_target_sdk_version
+ dl_unwind_find_exidx
+ dlclose
+ dlerror
+ dlopen
+ dlsym
+</pre>
+
+<p>This output shows that <code>libc.so</code> depends on 6 functions exported
+from <code>libdl.so</code>. If both the <code>--symbol</code> option and
+<code>--revert</code> option are specified, the symbols used by the user
+will be printed.</p>
+
+ </body>
+</html>