Android应用开发Android.mk内置第三方APK和资源文件的方法
白羽 2019-04-15 来源 :网络 阅读 4820 评论 0

摘要:本文将带你了解Android应用开发Android.mk内置第三方APK和资源文件的方法,希望本文对大家学Android有所帮助。

    本文将带你了解Android应用开发Android.mk内置第三方APK和资源文件的方法,希望本文对大家学Android有所帮助。


Android应用开发Android.mk内置第三方APK和资源文件的方法



    Android.mk内置第三方APK和资源文件的方法。Android应用开发项目中,经常会遇到系统预置第三方apk,或者资源文件的需求。
   
    一、内置APK
    1.apk不含so文件
    将APK放入文件夹内,改名为:yourModuleName.apk(mk文件
   
    中的yourModuleName)。Android.mk文件与apk文件同级。
   
    Android.mk内容如下:
   
   
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    # Module name should match apk name to be installed
    LOCAL_MODULE := 'yourModuleName'
    LOCAL_MODULE_TAGS := optional
    LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
    LOCAL_MODULE_CLASS := APPS
    LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
    LOCAL_CERTIFICATE := PRESIGNED
    LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app
    include $(BUILD_PREBUILT)

    LOCAL_MODULE_SUFFIX 是指文件后缀.apk
   
    LOCAL_CERTIFICATE指apk的签名,可以有:
   
    testkey
   
    media
   
    platform
   
    shared
   
    如果文件已经签过名,则使用PRESIGNED。
   
    LOCAL_MODULE_PATH 指你要安装的apk的路径。
   
    $(TARGET_OUT)/priv-app这个路径下,apk不可卸载。
   
    $(TARGET_OUT_DATA_APPS)这个路径下apk卸载后不再恢复
   
    $(TARGET_OUT)/vendor/operator/app这个路径下apk卸载后恢
   
    复出厂设置可以恢复apk
   
    2.apk含有so文件
    这时候就要考虑系统image的位数,包括32位和64位。因此包含在
   
    apk内的so文件也应该对应位数编入apk,否则无法安装。这里有
   
    两个解决办法:
   
    1、提供两个apk,arm(32),arm64(64),根据系统位数编
   
    入相应的apk,这样可以节省系统内存空间(so文件只需放入一
   
    个);
   
    2、提供一个同时包含32位和64位so文件的apk,这样就可以不担
   
    心系统位数,虽然方便,但是apk编入系统后会多占用一个so大小
   
    的内存空间。
   
    因此,这里介绍第一种方法:
   
    a. 首先用Android studio生成这两个apk
   
    libs中添加armeabi-v7a arm64-v8a,分别放入32位和64位so文
   
    件,并在build.gradle的android{}中添加如下代码块:
   

    productFlavors{
     
            arm{
                ndk{
                    abiFilters   armeabi-v7a
                }
            }
            arm_64{
                ndk{
                    abiFilters   arm64-v8a
                }
            }
        }

    点开最左边一栏的Build Variants,选择要编译apk类型的的选项,
   
    其中有arm-debug,arm-release,arm64-debug,arm64-
   
    release。编译结束后,build的out目录下就可以看到生成的两个
   
    apk。
   
    b.mk编入apk
   
    同样,文件夹内放入两个apk:
   
    32位apk命名位:(yourModuleName)_arm.apk;
   
    64位apk命名位(yourModuleName)_arm64.apk
   
    同级目录放入Android.mk文件。
   
    Android.mk文件内容:
 
    LOCAL_PATH := $(call my-dir)
    my_archs := arm arm64
    my_src_arch := $(call get-prebuilt-src-arch, $(my_archs))
     
    include $(CLEAR_VARS)
    LOCAL_MODULE := yourMoudleName
    LOCAL_MODULE_CLASS := APPS
    LOCAL_MODULE_TAGS := optional
    LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
    LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app
     
    LOCAL_CERTIFICATE := platform
    LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk
    LOCAL_MODULE_TARGET_ARCH := $(my_src_arch)
    LOCAL_MULTILIB := both
    include $(BUILD_PREBUILT)

    以上两行来获取当前系统是arm还是arm64,再去选择内置哪个
   
    apk:

    my_archs := arm arm64
    my_src_arch := $(call get-prebuilt-src-arch, $(my_archs))
    LOCAL_SRC_FILES := $(LOCAL_MODULE)_$(my_src_arch).apk

    这样系统就可以根据自身位数来内置正确的apk了。
   
    二、系统内置资源文件
    有时候我们需要预先放置一些程序必要的资源文件,或者是第三方
   
    apk的下载资源文件在系统中,项目代码中从预置资源文件的路径
   
    中读取资源文件。
   
    1、放置资源文件到某编译目录
   
    譬如在vendor/customer/thirdapp目录下新建一个your_assets
   
    文件夹放入资源文件。这样你的资源文件目录就是
   
    vendor/customer/thirdapp/your_assets
   
    2、拷贝资源文件到系统image中
   
    将资源文件(假设为my.so文件)从1中放置的目录拷贝到image
   
    out目录中,假定你需要放置的目录为:

    out/target/product/customer/system/***
   

    那么项目代码读取资源文件的路径为:
   

    system/***
   

    Android.mk文件拷贝代码为:
   
    a.创建文件夹:
   

    $(shell mkdir -p out/target/product/customer/system/***)
   

    b.拷贝文件:
 
    $(shell cp   vendor/customer/thirdapp/your_assets/my.so    out/target/product/customer/system/***)
    注意:
   
    1、文件拷贝写法写法如上,若是文件夹拷贝则需加-r:
   

    $(shell cp   vendor/customer/thirdapp/your_assets/* -r    out/target/product/customer/system/***)
    2、拷贝的目的目录不能是data目录。Android默认是无法直接操作
   
    Data根目录和相关的目录,我们想直接读写/data是做不到的。
   
        

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 2 不喜欢 | 0
看完这篇文章有何感觉?已经有2人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程