系统源码预制APK检测是否可以进行ODEX抽取

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/ChaoLi_Chen/article/details/102754588

odex抽取会导致增加内存,开机时间变短,公司公司的要求是增加内存可以接受.增加开始时间不能接受.

公司每次打包的时候都会遇到预制公司内部apk的时候,进行源码编译进行报错,导致编译失败的问题.

如果是预制纯正的第三方apk不能进行odex抽取,那只能进行在对应的Android.mk关闭odex抽取

LOCAL_DEX_PREOPT := false

要是预制的大部分是自己公司开发的APK还进行odex抽取就需要应用开发修改,那么公司想要知道在编译之前有那些apk可以进行抽取,公司内部的那些apk不能进行抽取.

可以避免因为预制APK而导致的错误,节省了人力物力和时间成本.

前期调研的时候发现odex抽取可以使用 dex2oat 工具进行抽离.但是odex 命令抽取,但是odex 命令太长,而且容易导致错误,最终抛弃,有兴趣的同学可以去看看Odex命令

第二种方式是相对好一点的方式,但是环境 依赖于源码

将如下脚本和检测apk可以放到 源码根目录运行,实现本地检测

#!/bin/bash
echo -n "请输入需要验证的apk:"
read apk_name

#删除上次编译之后的文件夹
cd packages/apps/
for file in $(ls)
do
  if [ -d "$apk_name" ]  
  then rm -rf $apk_name
  fi
done

cd ../../../

#创建预制编译文件夹
app_file_path="packages/apps/${apk_name}"
mkdir -p "$app_file_path"
cp $apk_name\.apk "$app_file_path"

#创建Android.mk
app_mk_path="$app_file_path/Android.mk"
echo $app_mk_path

echo "LOCAL_PATH := \$(call my-dir)" >> "$app_mk_path"
echo "include \$(CLEAR_VARS)" >> "$app_mk_path"
echo "LOCAL_MODULE := ${apk_name}" >> "$app_mk_path"
echo "LOCAL_DEX_PREOPT := true" >> "$app_mk_path"
echo "LOCAL_MODULE_TAGS := optional" >> "$app_mk_path"
echo "LOCAL_SRC_FILES := ${apk_name}.apk" >> "$app_mk_path"
echo "LOCAL_MODULE_CLASS := APPS" >> "$app_mk_path"
echo "LOCAL_MODULE_SUFFIX := \$(COMMON_ANDROID_PACKAGE_SUFFIX)" >> "$app_mk_path"
echo "LOCAL_CERTIFICATE := platform" >> "$app_mk_path"
echo "include \$(BUILD_PREBUILT)" >> "$app_mk_path"

# mm命令实现快速编译
source build/envsetup.sh
lunch "31"
cd $app_file_path
mm

cd ../../../out/target/product/msm8953_64/obj/APPS/
for file in $(ls)
do
  if [ -d "${apk_name}_intermediates" ]  
  then rm -rf "${apk_name}_intermediates"
  fi
done

我们的解决方式是在 jenkins 放一套编译好的源码 让应用同事上传apk到 jenkins 上面 每次进行检测 ,每个应用的检测时间应该是 30秒左右,这样大大降低了公司的人力财力和时间成本.并且每个应用在提供给系统编译之前先进行检测.

具体的jenkins 构建脚本编写如下(比这本地略作修改):

#设置编译JDK环境
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH


apk_name="MyOdexAPP"
#删除上次编译之后的文件夹
cd ${WORKSPACE}/source/packages/apps/
for file in $(ls)
do
  if [ -d "$apk_name" ]  
  then rm -rf $apk_name
  fi
done


cd ${WORKSPACE}/source/

#创建预制编译文件夹
app_file_path="packages/apps/${apk_name}"
mkdir -p "$app_file_path"
mv ../$apk_name\.apk "$app_file_path"

#创建Android.mk
app_mk_path="$app_file_path/Android.mk"
echo $app_mk_path

echo "LOCAL_PATH := \$(call my-dir)" >> "$app_mk_path"
echo "include \$(CLEAR_VARS)" >> "$app_mk_path"
echo "LOCAL_MODULE := ${apk_name}" >> "$app_mk_path"
echo "LOCAL_DEX_PREOPT := true" >> "$app_mk_path"
echo "LOCAL_MODULE_TAGS := optional" >> "$app_mk_path"
echo "LOCAL_SRC_FILES := ${apk_name}.apk" >> "$app_mk_path"
echo "LOCAL_MODULE_CLASS := APPS" >> "$app_mk_path"
echo "LOCAL_MODULE_SUFFIX := \$(COMMON_ANDROID_PACKAGE_SUFFIX)" >> "$app_mk_path"
echo "LOCAL_CERTIFICATE := platform" >> "$app_mk_path"
echo "include \$(BUILD_PREBUILT)" >> "$app_mk_path"

# mm命令实现快速编译
source build/envsetup.sh
lunch "31"
cd $app_file_path
mm

cd ${WORKSPACE}/source/out/target/product/msm8953_64/obj/APPS/
for file in $(ls)
do
  if [ -d "${apk_name}_intermediates" ]  
  then rm -rf "${apk_name}_intermediates"
  fi
done

cd ${WORKSPACE}
for file in $(ls)
do
  if [ $apk_name = $file ]
  then rm $apk_name
  fi
done

猜你喜欢

转载自blog.csdn.net/ChaoLi_Chen/article/details/102754588
今日推荐