• Android预置Apk方法


    这一套8.0过时了 需要修改pms代码 否则apk会被pms删除掉

    因为工作需要,经常要开发和合入系统App,所以在此开篇作为收集和记录Android合入系统应用的方法,以备日后查阅。

    一、预置apk方法

    Case 1:如何将带源码的APK预置进系统

    1. 在 packages/apps 下面以需要预置的 APK的 名字创建一个新文件夹,以预置一个名为Test的APK 为例
    2. 将 Test APK的Source code 拷贝到 Test 文件夹下,删除 /bin 和 /gen 目录
    3. 在 Test 目录下创建一个名为 Android.mk的文件,内容如下:
    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    
    LOCAL_MODULE_TAGS := optional
    LOCAL_SRC_FILES := $(call all-subdir-java-files)
    
    LOCAL_PACKAGE_NAME := Test
    include $(BUILD_PACKAGE)
    
    1. 打开文件 devicemediatekcommondevice.mk,将 Test 添加到 PRODUCT_PACKAGES 里面。
    PRODUCT_PACKAGES += Test
    
    1. 重新 build 整个工程

    Case 2:如何将无源码的 APK 预置进系统?

    1. 在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例
    2. 将 Test.apk 放到 packages/apps/Test 下面
    3. 在 packages/apps/Test 下面创建文件 Android.mk,文件内容如下:
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    # Module name should match apk name to be installed
    LOCAL_MODULE := Test
    LOCAL_MODULE_TAGS := optional
    
    LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
    LOCAL_MODULE_CLASS := APPS
    LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
    
    LOCAL_PREBUILT_JNI_LIBS:= 
    @lib/armeabi/libtest.so 
    @lib/armeabi/libtest2.so
    
    LOCAL_CERTIFICATE := PRESIGNED
    include $(BUILD_PREBUILT)
    

    若无so,删除LOCAL_PREBUILT_JNI_LIBS
    若有so,使用LOCAL_PREBUILT_JNI_LIBS列出所有so的路径,不要忘记使用@。@标识符会将apk中的so抽离出来build进apk同级目录下的lib文件夹中

    若apk支持不同cpu类型的so,针对so的部分的处理:

    Ifeq ($(TARGET_ARCH),arm)
    LOCAL_PREBUILT_JNI_LIBS := 
    @lib/armeabi-v7a/xxx.so
    @ lib/armeabi-v7a/xxxx.so
    else ifeq ($(TARGET_ARCH),x86)
    LOCAL_PREBUILT_JNI_LIBS := 
    @lib/x86/xxx.so
    else ifeq ($(TARGET_ARCH),arm64)
    LOCAL_PREBUILT_JNI_LIBS := 
    @lib/armeabi-v8a/xxx.so
    …
    

    即将和TARGET_ARCH对应的so抽离出来

    1. 打开文件 devicemediatekcommondevice.mk
      将 Test 添加到 PRODUCT_PACKAGES 里面。
      PRODUCT_PACKAGES += Test
    2. 重新 build 整个工程

    tip
    如果App使用System Level的permission,需要預置到/system/priv-app底下 (原在/system/app)。
    修改Android.mk,增加LOCAL_PRIVILEGED_MODULE := true,以声明app需要放在/system/priv-app下。

    Case 3:如何预置APK使得用户可以卸载,恢复出厂设置时不能恢复?

    1. 在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例
    2. 将 Test.apk 放到 packages/apps/Test 下面
    3. 在 packages/apps/Test 下面创建文件 Android.mk,文件内容如下:
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    
    # Module name should match apk name to be installed
    LOCAL_MODULE := Test
    LOCAL_MODULE_TAGS := optional
    
    LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
    LOCAL_MODULE_CLASS := APPS
    LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
    # LOCAL_PRIVILEGED_MODULE := true
    LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
    
    LOCAL_CERTIFICATE := PRESIGNED
    include $(BUILD_PREBUILT)
    
    1. 打开文件 devicemediatekcommondevice.mk
      将 Test 添加到 PRODUCT_PACKAGES 里面。
    PRODUCT_PACKAGES += Test
    
    1. 重新 build 整个工程
      注意:这个比不能卸载的多了一句
    LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
    

    Case 4:如何预置APK使得用户可以卸载,并且恢复出厂设置时能够恢复?

    1. 在 vendormediatekproprietaryinary3rd-partyfree下面以需要预置的 APK 名字创建文件夹,以预置一个名为Test的APK为例
    2. 将Test.apk 放入vendormediatekproprietaryinary3rd-partyfreeTest下面
    3. 在vendormediatekproprietaryinary3rd-partyfreeTest 下面创建文件 Android.mk,文件内容如下:
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    
    # Module name should match apk name to be installed
    LOCAL_MODULE := Test
    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)/vendor/operator/app
    include $(BUILD_PREBUILT)
    
    1. 打开文件devicemediatekcommondevice.mk
      将 Test 添加到 PRODUCT_PACKAGES 里面。
    PRODUCT_PACKAGES += Test
    
    1. 然后重新build整个工程

    若需要apk作为32bit的apk运行,则需要在Android.mk中定义

    LOCAL_MULTILIB :=32
    

    二、Android.mk文件参数说明

    LOCAL_MODULE_TAGS := optionaloptional,指该模块在所有版本下都编译
    LOCAL_SRC_FILES := $(LOCAL_MODULE).apk 获取目录下的java文件
    LOCAL_PACKAGE_NAME := Test 包名
    LOCAL_CERTIFICATE := platform 签名,PRESIGNED表示保留apk文件之前的签名,platform是对apk重新进行签名
    LOCAL_PROGUARD_ENABLED := disabled 不要使用代码混淆的工具进行混淆


    作者:烟雨随风
    链接:https://www.jianshu.com/p/9af0a34d3eed
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    面向对象之绑定方法与非绑定方法
    Django-admin源码解析
    单例模式
    Django-admin管理工具
    Django-CBV
    叠加装饰器,三元表达,生成,调用,递归
    迭代器与生成器
    有参装饰器
    储备知识与装饰器
    文件修改
  • 原文地址:https://www.cnblogs.com/codeking100/p/10382833.html
Copyright © 2020-2023  润新知