Skip to content

Commit

Permalink
Create android d2d pipeline #1366
Browse files Browse the repository at this point in the history
    * Create function to call jadx

Signed-off-by: Jono Yang <[email protected]>
  • Loading branch information
JonoYang committed Sep 9, 2024
1 parent c6379fc commit 84b1b2e
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 0 deletions.
71 changes: 71 additions & 0 deletions scanpipe/pipelines/android_d2d.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# SPDX-License-Identifier: Apache-2.0
#
# http://nexb.com and https://github.com/aboutcode-org/scancode.io
# The ScanCode.io software is licensed under the Apache License version 2.0.
# Data generated with ScanCode.io is provided as-is without warranties.
# ScanCode is a trademark of nexB Inc.
#
# You may not use this software except in compliance with the License.
# You may obtain a copy of the License at: http://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.
#
# Data Generated with ScanCode.io is provided on an "AS IS" BASIS, WITHOUT WARRANTIES
# OR CONDITIONS OF ANY KIND, either express or implied. No content created from
# ScanCode.io should be considered or used as legal advice. Consult an Attorney
# for any legal advice.
#
# ScanCode.io is a free software code scanning tool from nexB Inc. and others.
# Visit https://github.com/aboutcode-org/scancode.io for support and download.

from aboutcode.pipeline import group
from scanpipe import pipes
from scanpipe.pipelines.deploy_to_develop import DeployToDevelop
from scanpipe.pipes import d2d


class AndroidAPKDeployToDevelop(DeployToDevelop):
"""
Establish relationships between two code trees: deployment and development for Android APKs.
This pipeline requires a minimum of two archive files, each properly tagged with:
- **from** for archives containing the development source code.
- **to** for archives containing the deployment compiled code.
When using download URLs as inputs, the "from" and "to" tags can be
provided by adding a "#from" or "#to" fragment at the end of the download URLs.
When uploading local files:
- **User Interface:** Use the "Edit flag" link in the "Inputs" panel of the Project
details view.
- **REST API:** Utilize the "upload_file_tag" field in addition to the
"upload_file".
- **Command Line Interface:** Tag uploaded files using the "filename:tag" syntax,
for example, ``--input-file path/filename:tag``.
"""

@classmethod
def steps(cls):
return (
cls.get_inputs,
cls.extract_inputs_to_codebase_directory,
cls.extract_archives,
cls.collect_and_create_codebase_resources,
cls.convert_dex_to_java
cls.map_checksum,
# substring matching step
cls.find_java_packages,
cls.map_java_to_class,
cls.map_jar_to_source,
cls.flag_mapped_resources_archives_and_ignored_directories,
cls.remove_packages_without_resources,
cls.flag_deployed_from_resources_with_missing_license,
cls.create_local_files_packages,
)

def convert_dex_to_java(self):
d2d.convert_dex_to_java(self.project)
36 changes: 36 additions & 0 deletions scanpipe/pipes/d2d.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@
from django.db.models.functions import Concat
from django.template.defaultfilters import pluralize

from commoncode.fileutils import file_name
from commoncode import command
from commoncode.paths import common_prefix
from elf_inspector.dwarf import get_dwarf_paths
from extractcode import EXTRACT_SUFFIX
Expand Down Expand Up @@ -1886,3 +1888,37 @@ def map_go_paths(project, logger=None):
map_types=["go_file_paths"],
logger=logger,
)


def convert_dex_to_java(project, logger=None):
"""
Convert dex files to Java source files using jadx
"""
project_files = project.codebaseresources.files().no_status()
to_resources = project_files.to_codebase().filter(extension=".dex")

resource_count = to_resources.count()
if logger:
logger(f"Running jadx on {resource_count:,d} .dex resources")

for resource in to_resources.iterator(chunk_size=2000):
run_jadx(resource.location)


def run_jadx(location):
"""
Run the program `jadx` on the classes.dex file at `location`
This will decompile the classes.dex file into Java source files.
"""
rc, result, err = command.execute(
cmd_loc="jadx",
args=[
"-d",
location,
],
to_files=False,
)

if rc != 0:
raise Exception(err)

0 comments on commit 84b1b2e

Please sign in to comment.