如何从android studio开发时在system / app中安装应用程序

时间:2015-02-03 15:38:05

标签: android android-studio

在Android Studio上进行开发时,有没有办法直接在system / app文件夹中安装应用程序(设备已植根)?

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

如果无法做到这一点,建议最方便的方法是构建和测试系统应用程序吗?

6 个答案:

答案 0 :(得分:31)

从AS

自动部署系统应用程序

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

1。创建脚本

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

+

2。使用AS Run

绑定它
  1. 转到“运行” - >编辑配置
  2. 常规标签(模块的)

    上进行以下更改
    • 安装选项 - > Deplay: Nothing
    • 启动选项 - >启动 Nothing
    • 发布前:Run External Tool,然后按adb reboot,选择您的脚本。
      • 在新对话框中:
        • 设置任何名称。
        • 在'工具设置' - >程序:导航到项目的目录,然后选择您的脚本
  3. 警告:

    首次安装

    首次安装应用时,设备需要重新启动(Run一次。之后,您只需按adb root即可自动完成所有操作。

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

    adb root问题

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

    使用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 变量和安装部分:

    InnerException = {"No connection could be made because the target machine actively refused it 127.0.0.1:54653"}
    

答案 1 :(得分:4)

感兴趣的人的Windows脚本:

以相同的方式存储此文件:在项目目录的根目录(installSysPrivApp.bat)

::WIN BATCH SCRIPT

:: CHANGE THESE
set app_package=com.example.package
set dir_app_name=app
set MAIN_ACTIVITY=MainActivity

set ADB="adb"
::ADB_SH="%ADB% shell" # this script assumes using `adb root`. for `adb su` 
see `Caveats`

set path_sysapp=/system/priv-app
set apk_host=.\Application\build\outputs\apk\Application-debug.apk
set apk_name=%dir_app_name%.apk
set apk_target_dir=%path_sysapp%/%dir_app_name%
set apk_target_sys=%apk_target_dir%/%apk_name%

:: Delete previous APK
del %apk_host%

:: Compile the APK: you can adapt this for production build, flavors, etc.
call gradlew assembleDebug

set 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
%ADB_SH% mkdir -p %apk_target_dir%
%ADB% push %apk_host% /sdcard/tmp/%apk_name% 
%ADB_SH% mv /sdcard/tmp/%apk_name% %apk_target_sys%
%ADB_SH% rmdir /sdcard/tmp

:: 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 :(得分:2)

在将系统重新安装为只读之前,在包管理器的帮助下绕过@paschalis应答重新安装应用程序的重启问题:

# Reinstall app
$ADB_SH "pm install -r $apk_target_sys"

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

包管理器将自行调用dex2oat。

答案 3 :(得分:0)

(Android Q >> Windows

::WIN BATCH SCRIPT
::setup emulator https://stackoverflow.com/a/64397712/13361987

:: CHANGE THESE 
set app_package=com.project.package
set dir_app_name=NewApkName
set MAIN_ACTIVITY=Package.MainActivity

set ADB="adb"

set path_sysapp=/system/priv-app
set apk_host=.\app\build\outputs\apk\debug\app-debug.apk
set apk_name=%dir_app_name%.apk
set apk_target_dir=%path_sysapp%/%dir_app_name%
set apk_target_sys=%apk_target_dir%/%apk_name%

:: Delete previous APK
del %apk_host%

::  Compile the APK: you can adapt this for production build, flavors, etc.
call gradlew assembleDebug

set ADB_SH=%ADB% shell su 0

:: Install APK: using adb su
%ADB_SH% mount -o remount,rw /system
%ADB_SH% chmod 777 /system/lib/
%ADB_SH% mkdir -p /sdcard/tmp
%ADB_SH% mkdir -p %apk_target_dir%
%ADB% push %apk_host% /sdcard/tmp/%apk_name%
%ADB_SH% mv /sdcard/tmp/%apk_name% %apk_target_sys%
%ADB_SH% rm -r /sdcard/tmp

:: 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




:: from >> https://stackoverflow.com/questions/28302833/how-to-install-an-app-in-system-app-while-developing-from-android-studio

答案 4 :(得分:0)

Mac 版

通过使用@Paschalis 的脚本,我首先遇到了 3 个问题,我无法从 adb 挂载系统,所以我只使用了 jack Palevich 的“android 终端模拟器”(需要一次)https://play.google.com/store/apps/details?id=jackpal.androidterm

mount -o rw,remount /system

第二个问题是 JRE 与 Android studio 不同。

所以我加了

 export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jre/jdk/Contents/Home/

拥有与android studio使用的相同版本的java(“ctrl + ;”在android studio中获取此路径)

最后一个问题是因为 adb root 无法在生产版本中运行,所以我用 magisk 刷了这个 zip

https://github.com/evdenis/adb_root

Android: adbd cannot run as root in production builds

但后来我的手机没有被检测到,所以我删除了 adb root,这次一切正常。

还尝试在终端中逐行手动运行脚本以调试此脚本android studio 不会给出所有错误。

答案 5 :(得分:-3)

我认为adb push *.apk /system/app/*.apk应该做得很好。

我不了解Android Studio,但如果您使用的是Linux,则可以尝试为

创建别名
adb install

指向该命令,它应该工作!