android - 从android studio开发时如何在系统/应用程序中安装应用程序

标签 android android-studio

在 Android Studio 上开发时,有没有办法让应用直接安装在 system/app 文件夹中(设备已root)?

意思是,当我按下“运行应用程序”按钮时,我希望将 apk 放置在系统/应用程序中。

如果无法做到这一点,推荐最便捷的方式来构建和测试系统应用程序?

最佳答案

从 AS 自动部署系统应用

您可以创建一个脚本来完成这项工作,并在您每次在 AS 中运行时自动运行它。

1。创建脚本

您可以调整我根据需要创建的脚本。放在:project_directory/installSystem.sh

#!/bin/bash

# CHANGE THESE FOR YOUR APP
app_package="com.example"
dir_app_name="MySysApp"
MAIN_ACTIVITY="SysAppMainActivity"

ADB="adb" # how you execute adb
ADB_SH="$ADB shell" # this script assumes using `adb root`. for `adb su` see `Caveats`

path_sysapp="/system/priv-app" # assuming the app is priviledged
apk_host="./app/build/outputs/apk/app-debug.apk"
apk_name=$dir_app_name".apk"
apk_target_dir="$path_sysapp/$dir_app_name"
apk_target_sys="$apk_target_dir/$apk_name"

# Delete previous APK
rm -f $apk_host

# Compile the APK: you can adapt this for production build, flavors, etc.
./gradlew assembleDebug || exit -1 # exit on failure

# Install APK: using adb root
$ADB root 2> /dev/null
$ADB remount # mount system
$ADB push $apk_host $apk_target_sys

# Give permissions
$ADB_SH "chmod 755 $apk_target_dir"
$ADB_SH "chmod 644 $apk_target_sys"

#Unmount system
$ADB_SH "mount -o remount,ro /"

# Stop the app
$ADB shell "am force-stop $app_package"

# Re execute the app
$ADB shell "am start -n \"$app_package/$app_package.$MAIN_ACTIVITY\" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER"

2。用 AS Run 绑定(bind)它

  1. 转到运行 -> 编辑配置
  2. 在(您的模块的)常规标签上进行以下更改

    • 安装选项->延迟:没有
    • 启动选项->启动:没有
    • 启动前:+,然后按Run External Tool,选择您的脚本。
      • 在新对话框中:
        • 设置任何名称。
        • 在“工具设置”->程序:导航到项目的目录,然后选择您的脚本

注意事项:

首次安装

在第一次安装您的应用时,需要重新启动设备(adb reboot)一次。之后,您只需按Run,一切都会自动发生。

这是因为主机编译器 (dex2oat) 不会自动调用。不知何故,操作系统还没有收到这个新系统应用程序的通知。手动调用 dex2oat 应该可以解决这个问题,但我没有运气。如果有人解决了,请分享。

adb root 问题

有时(通常是重新启动后的初始执行)对 adb root 的调用找不到设备。您可以简单地从 AStudio 重新播放,或在成功 adb root 后重新播放一秒钟的 sleep

使用 su 代替 adb root

adb push 将无法工作,尽管已安装系统并授予权限。要使其正常工作,请将 ADB_SH 变量和脚本的安装部分替换为以下内容:

..
ADB_SH="$ADB shell su -c"
..
# Install APK: using adb su
$ADB_SH "mount -o rw,remount /system"
$ADB_SH "chmod 777 /system/lib/"
$ADB_SH "mkdir -p /sdcard/tmp" 2> /dev/null
$ADB_SH "mkdir -p $apk_target_dir" 2> /dev/null
$ADB push $apk_host /sdcard/tmp/$apk_name 2> /dev/null
$ADB_SH "mv /sdcard/tmp/$apk_name $apk_target_sys"
$ADB_SH "rmdir /sdcard/tmp" 2> /dev/null

关于android - 从android studio开发时如何在系统/应用程序中安装应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28302833/

相关文章:

android - 错误:任务 ':app:ndkBuild'的执行失败

c# - MasterDetailPage 母版页不会打开 IsGestureEnabled 设置为 false Xamarin.Forms Android

android - animateLayoutChanges 是否适用于 ListView?

android - Android Moto G 手机上的 Kivy QPython 应用程序 - 无日志输出

java - Volley : MultipartRequest. getBody:IOException 写入 ByteArrayOutputStream

android - 无法将 Studio Designer 与自定义 RelativeLayout 派生类一起使用

android-studio - 无法在Ubuntu 14.04 64位.android/repositories.cfg中安装Android Studio

java - Jsoup 在第一个元素之后选择元素

java - getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH) 返回 false

android - 如何离线使用所有 Android gradle 依赖项(maven 文件结构)