精华内容
下载资源
问答
  • Android app 安装目录知识

    千次阅读 2021-06-02 17:36:52
    我们都知道android app有两个安装路径,一个是system/app目录,这个就是所谓的系统应用,只有获得root权限才能删除这个目录下的应用,另一个是data/app目录,用户安装的应用都在这个目录下。几个认知(1)同一个包名的...

    我们都知道android app有两个安装路径,一个是system/app目录,这个就是所谓的系统应用,只有获得root权限才能删除这个目录下的应用,另一个是data/app目录,用户安装的应用都在这个目录下。

    几个认知

    (1)同一个包名的应用可以同时存在system/app和data/app下,只要这两个包的签名一样。如果签名一样,如果在system/app应用有一个默认签名的app,我们用Eclipse还可以在data/app下安装一个同包名的app。用adb命令,需要用adb install -r 包名,这样的命令。

    我们都知道,手机买到都会预装一些app,这些app通常在system/app下,但是,后续这些app都会升级的,这个升级的安装包,是装到了data/app下,这其实就是一个同包名的app装到了两个目录下的情况。我们用户只能删掉升级包,没法删掉预装的。

    大家会有个疑问,两个同包名的app,系统怎么知道调起哪个?

    答案是系统知道调起data/app下。

    我们可以用 adb shell pm path 包名 命令来看一下安装包的路径,你会发现只能看到data/app路径,这就是为什么系统知道调起哪个app。

    (2)两个目录下的同包名app是共用同一个数据的。data/data/包名

    (3)adb shell pm clear 包名,会把data/data/包名 数据都会删除。

    展开全文
  • Android adb安装时强制应用App以32位或者64位运行前言如果只想看结论,请跳转到最后,如果想看看这其中的曲折历程那就按照正常的流程就好了。不要问我为什么会写这么奇葩的博客问题,因为我这是被客户的应用给揉捏的...

    Android adb安装时强制应用App以32位或者64位运行

    前言

    如果只想看结论,请跳转到最后,如果想看看这其中的曲折历程那就按照正常的流程就好了。

    不要问我为什么会写这么奇葩的博客问题,因为我这是被客户的应用给揉捏的啊。我们的终端是Android 64位的,然后客户提供了一个应用说怎么在我们的终端上运行不了!好吗,那就适配一下就好了吗,可是客户一口肯定的说适配了64位的so库,是我们提供的api接口有问题。尼玛,客户是上帝没有办法,只能拿出强硬的证据来说服对方了。

    一. 问题定位

    既然客户说适配了,我们也不反驳我们先强制应用以32位运行看看是否OK,如果以32位运行OK的话那么就是客户应用没有适配64的so库,而不是我们api的问题了。本来想着直接修改固件,然后以32位的方式安装的,但是无意间发现adb install已经支持以32位还是64位安装的了。好吗,Android的妈咪,谷歌为我们想得太周到了。

    1.1 应用以32位在64位终端环境下运行

    先上命令格式如下:

    adb install --abi armeabi-v7a

    将测试应用以如上命令安装成功以后,可以看到在64位终端上面是以32位运行,然后测试功能一切正常。

    130|XXX:/ # getprop ro.product.cpu.abilist

    arm64-v8a,armeabi-v7a,armeabi

    XXX:/ # ps | grep zygote

    root 816 1 2172512 83356 poll_sched 0000000000 S zygote64

    root 827 1 1599320 71068 poll_sched 0000000000 S zygote

    XXX:/ # ps -t | grep 827

    root 827 1 1599320 71068 poll_sched 0000000000 S zygote

    root 3332 827 1599320 71068 futex_wait 0000000000 S ReferenceQueueD

    root 3333 827 1599320 71068 futex_wait 0000000000 S FinalizerDaemon

    root 3334 827 1599320 71068 futex_wait 0000000000 S FinalizerWatchd

    root 3335 827 1599320 71068 futex_wait 0000000000 S HeapTaskDaemon

    system 1827 1686 2403208 152096 SyS_epoll_ 0000000000 S notification-sq

    u0_a30 2403 827 1019576 44328 SyS_epoll_ 0000000000 S com.xxx.pinyinime

    system 2501 827 1016016 37560 SyS_epoll_ 0000000000 S com.xxx.verify

    u0_a3 2827 2818 1591064 50172 futex_wait 0000000000 S FinalizerWatchd

    u0_a12 3207 827 1679792 39116 SyS_epoll_ 0000000000 S org.codeaurora.gallery

    u0_a39 3331 827 1790700 115468 SyS_epoll_ 0000000000 S com.dhc.sass.pos.tobacco

    XXX:/ #

    3faa1115240f304441abbea3ec949567.png

    1.2 应用以64位在64位终端环境下运行

    先上命令格式如下:

    adb install --abi arm64-v8a

    将测试应用以如上命令安装成功以后,可以看到在64位终端上面是以64位运行,然后测试so奔溃,证明了是客户的应用没有适配64的so库。

    127|XXX:/ # getprop ro.product.cpu.abilist

    arm64-v8a,armeabi-v7a,armeabi

    XXX:/ # ps -t | grep com.dhc.sass.pos.tobacco

    u0_a40 3512 816 2372700 154888 SyS_epoll_ 0000000000 S com.dhc.sass.pos.tobacco

    XXX:/ # ps -t | grep zygote64

    root 816 1 2172512 83364 poll_sched 0000000000 S zygote64

    XXX:/ #

    ee0d70de3ec3bbb1cbcaf52bb4295504.png

    二. 解决问题

    虽然定位了问题,但是客户依然强势的说,这个我们不会适配的,那么就只能是固件去适配客户的应用,强制安装的时候以32位进行安装了。至于应用的安装是PackageManagerService服务进行操作的,我们也是在这里修改了,具体的逻辑如下所示:

    diff --git a/sdm450/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java b/sdm450/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

    index 122c0cd..ceb4f08 100755

    --- a/sdm450/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

    +++ b/sdm450/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

    @@ -386,7 +386,7 @@ public class PackageManagerService extends IPackageManager.Stub {

    // user, but by default initialize to this.

    static final boolean DEBUG_DEXOPT = false;

    - private static final boolean DEBUG_ABI_SELECTION = false;

    + private static final boolean DEBUG_ABI_SELECTION = true;

    private static final boolean DEBUG_EPHEMERAL = Build.IS_DEBUGGABLE;

    private static final boolean DEBUG_TRIAGED_MISSING = false;

    private static final boolean DEBUG_APP_DATA = false;

    @@ -9513,8 +9513,18 @@ public class PackageManagerService extends IPackageManager.Stub {

    }

    } else {

    - String[] abiList = (cpuAbiOverride != null) ?

    + // xxx use 32bit abi for BCMZJYC

    + boolean use32bitAbi = SystemProperties.getBoolean("persist.sys.use32bitAbi", false) ||

    + "BCMZJYC".equals(SystemProperties.get("persist.sys.CRT.OWNER", ""));

    + String[] abiList = null;

    + if (use32bitAbi) {

    + Slog.w(TAG, "use32bitAbi");

    + abiList = (cpuAbiOverride != null) ?

    + new String[] { cpuAbiOverride } : Build.SUPPORTED_32_BIT_ABIS;

    + } else {

    + abiList = (cpuAbiOverride != null) ?

    new String[] { cpuAbiOverride } : Build.SUPPORTED_ABIS;

    + }

    // Enable gross and lame hacks for apps that are built with old

    // SDK tools. We must scan their APKs for renderscript bitcode and

    写在最后

    如上就是今天的全部内容了,主要是一篇实战的文章。没有很多理论的讲解的,但是其中也涉及了很多理论知识,这里就不做过多讲解。好了各位江湖见!

    最后还是总结下,adb安装时如何指定在ARM环境下以32位还是64位运行:

    要想指定应用在64位终端下以32位方式模式下运行,可以使用如下命令:

    adb install --abi armeabi-v7a

    要想指定应用在64位终端下以64位方式模式下运行,可以使用如下命令:

    adb install --abi arm64-v8a

    如果是其他的Android平台,譬如X86或者其它的,可以使用如下命令:

    adb install --abi

    本文分享 CSDN - IT先森。

    如有侵权,请联系 support@oschina.cn 删除。

    本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

    展开全文
  • 本文将带你了解Android应用开发之解决Android Studio 运行APP 提示卸载重新安装的错误,希望本文对大家学Android有所帮助。<解决AndroidStudio运行APP提示卸载重新安装的错误Installationfailedwithmessagenull....

    本文将带你了解Android应用开发之解决Android Studio 运行APP 提示卸载重新安装的错误,希望本文对大家学Android有所帮助。

    <

    解决Android Studio 运行APP 提示卸载重新安装的错误

    Installation failed with message null. It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing.

    WARNING: Uninstalling will remove the application data!

    Do you want to uninstall the existing application?

    上述提示是否见过?没见过还不够老司机啊。

    由于系统升级或者其他原因(未卸载干净等)或者其他未知原因,出现手机运行不起来的情况,经过长时间的挠头折腾,发现解决方法大致分为如下三种:

    1. 简单粗暴,恢复出厂设置,然而事实上并非所有手机都有效,并不推荐。

    2. 技术解决:手机root下,然后去data/data中把调试应用的目录删掉, 此方法最轻巧,如果能root,推荐,如果手机找不到root工具,请看第三种;

    3.打开开发者选项红的USB 安装,常见于小米手机升级等其他原因,现在小米手机还要注册账号、并且要有sim卡,真坑!!!,不过运行一次后把卡拔出来就行了

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

    展开全文
  • Android在一个app安装并卸载另一个appapp→src→main下新建文件夹asserts,将准备安装的apk文件放在asserts内 在app→src→main→res下新建文件夹xml,右击xml文件夹,选择new→XML Resource File,File name...

    Android在一个app中安装并卸载另一个app

    1. 在app→src→main下新建文件夹asserts,将准备安装的apk文件放在asserts内
    2. 在app→src→main→res下新建文件夹xml,右击xml文件夹,选择new→XML Resource File,File name为文件名,可随意,本文中为filepaths;Root element为资源类型,输入paths,确定并编辑以下代码:
    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path name="external_files" path="."/>
    </paths>
    
    1. 编辑AndroidManifest.xml
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.example.myapplication">
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:requestLegacyExternalStorage="true"
            android:theme="@style/Theme.MyApplication">
            <provider
                android:name="androidx.core.content.FileProvider"
                android:authorities="包名"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/filepaths步骤2中的文件"
                    />
            </provider>
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>
    
    1. MainActivity.java
    public class MainActivity extends AppCompatActivity {
        Context mContext;
        private Button bt,bt0;
        private TextView tx;
        public static boolean isGrantExternalRW(Activity activity) {
        //权限判定
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && activity.checkSelfPermission(
                    Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                activity.requestPermissions(new String[]{
                        Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE
                }, 1);
                return false;
            }
            return true;
        }
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mContext = this;
            tx=findViewById(R.id.text);
            bt=findViewById(R.id.button);//安装
            bt0=findViewById(R.id.button0);//卸载
    //        Toast.makeText(this, ""+Environment.getExternalStorageDirectory().getAbsolutePath(), 0).show();
           if(!this.isGrantExternalRW(MainActivity.this)){return;}//判断是否有权限修改,这很重要
           else{
            if(copyApkFromAssets(this, "app-debug.apk", Environment.getExternalStorageDirectory().getAbsolutePath()+"/app-debug.apk")){
                bt.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        new AlertDialog.Builder(mContext)
                                .setIcon(R.drawable.ic_launcher)
                                .setMessage("是否安装?")
                                .setPositiveButton("yes", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        Intent intent = new Intent(Intent.ACTION_VIEW);
                                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    //                                    intent.setDataAndType(Uri.parse("file://" + Environment.getExternalStorageDirectory().getAbsolutePath()+"/app-debug.apk"),
    //                                            "application/vnd.android.package-archive");
                                        File apkFile = new File(Environment.getExternalStorageDirectory()+"/app-debug.apk");
                                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                                            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                                            Uri uri = FileProvider.getUriForFile(MainActivity.this, "com.example.myapplication", apkFile);
                                            intent.setDataAndType(uri, "application/vnd.android.package-archive");
                                        } else {
                                            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
                                        }
                                        mContext.startActivity(intent);
    
                                    }
                                }).show();
                    }
                });
                bt0.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Uri packageURI = Uri.parse("package:com.example.a22");//package:+想要卸载的包名
                        Intent intent =new Intent(Intent.ACTION_DELETE);
                        intent.setData(packageURI);
                        mContext.startActivity(intent);
                    }
                });
            }
    
        }}
        public boolean copyApkFromAssets(Context context, String fileName, String path) {
        //将asserts中的apk文件复制到手机存储中
        //可以从手机存储划到最下面,是单独的文件,没有设置文件夹
            boolean copyIsFinish = false;
            try {
                InputStream is = context.getAssets().open(fileName);
                File file = new File(path);
                file.createNewFile();
                FileOutputStream fos = new FileOutputStream(file);
                int  length = is.available();
                byte[] temp = new byte[length];
                int i = 0;
                while ((i = is.read(temp)) > 0) {
                    fos.write(temp, 0, i);
                }
                fos.close();
                is.close();
    
                copyIsFinish = true;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return copyIsFinish;
        }
    }
    

    网络上的教程有很多自相矛盾,本人防止权限出错,把能加的权限都设置了一遍,有空可以选择测试一下,应该有的可以删掉

    展开全文
  • 2、之前安装过同类的软件,但是出现问题,导致安装发生问题。3、安装包下载的不完全或者有损坏,导致安装过程无法完成,可以换一个版本的安装包试试。安卓系统手机下软件,但是安装不上,怎么回事?怎么解决?手机...
  • 安装、卸载与升级更新测试
  • React更新 解决 不再支持Create React App的全局安装
  • 需要把现有的APP删除掉 所以会使用到adb 功能 首先把ADB下载回来.自己去网上找相关的程序下回来就行了. 然后把adb目录最好加入到系统环境中. 因为这样可以在任何位置都可以使用命令行 第一步 adb devices ...
  • 什么是appdata C盘appdata可以删除

    千次阅读 2021-07-01 19:57:49
    有不少网友发现在系统C盘下有一个appdata文件夹,而且体积挺大的,不知道能不能删除,针对此问题,U大侠小编就为大家介绍appdata文件夹的作用以及appdata可以删除吗的解决方法。什么是appdata很多用户发现在win7系统...
  • appcrash错误如何解决

    2021-07-27 08:29:20
    APPCRASH是Vista和Win7中特有的故障,导出APPCRASH问题的原因有很多,...近来很多小伙伴反映在打开office软件时出现APPCRASH问题事件,从来没遇到过APPCRASH这种问题,也不知从哪入手解决。今天,小编就将解决APPCR...
  • APP安装的功能测试点

    2021-01-10 16:53:02
    安装成功后,是否可以正常删除、卸载 安装是否支持取消安装功能,点击取消安装后是否能退出安装 安装过程中出现死机、断电、重启等意外情况,等待环境恢复后是否可以继续正常安装 有新版本需要更新时,是否自动提示...
  • npm install uview-ui -S 在项目根目录中的main.js中,引入并使用uView的JS库,注意这两行要放在import Vue之后。 // main.js import uView from "uview-ui";...**注意:**在App.vue中首行的位置引入,注意给style标.
  • 之前的IDEA版本有点旧了,决定重新安装一个新版本。安装之后发现新版本无法打开。打开命令行进入IDEA的bin目录,输入idea回车提示如下图: 解决方法: 打开这个路径C:\Users\Admin\AppData\Roaming\JetBrains\...
  • 在Mac电脑上登录app store,但是确给出了【未能登录,因为服务器发生错误,请再次尝试登录一次。】这样的提示。那么我们该如何解决这样的问题呢? 解决方法如下 1.查看你的“关于本机”–>“概览”–>“系统...
  • 那么,C盘Appdata文件可以删除吗?下面脚本之家小编就来为大家科普一下。电脑Q:AppData是什么文件夹?A:一般来说,Appdata文件位于系统盘(C盘)-> 用户 -> Default 目录下,里面还包含了Locallow、Local、...
  • 更新点击登录闪退,重新卸载安装就恢复正常 android和ios都是这样 排查过程 直接去git上看可能影响的的提交日志 初步推测· 1.服务端的问题 2.原生问题 3.通用源码 最后锁定问题是git上一次提交 修复...
  • create-react-app,是一个很好的脚手架。 react入门的最佳选择。
  • AppData是什么意思,Appdata文件夹可以删除吗?喜欢研究系统的朋友们一定发现了,在Win Vista、Win7以及Win8操作系统中有一个AppData文件夹,这个文件夹在本人的电脑里面,进然后1.29G大小,那么接下来问题就出现了,...
  • 修复无法连接到iPad的App Store

    千次阅读 2021-08-04 02:52:19
    检查苹果的系统页面如果遇到iPad中无法连接到App Store的问题,您应该做的第一件事就是在检查您的互联网连接好吧,尽管听起来很愚蠢,但有时候我们忘记打开互联网并尝试访问App Store。然后导致这个问题。因此,请...
  • TestFlight是苹果的一个测试软件,很多苹果手赚近期都使用TestFlight进行内存访问,但是包括小编在内发现很多软件打开的时候都会提示TestFlight不可用,或者说是该页无法显示,或者无法连接的这种错误,小编在网上找...
  • 我们知道iPhone手机iOS系统...今天小编带来了M1芯片mac电脑上安装任意iOS应用,App Store没有的也能安装安装APP 下载 Apple Configurator 2 Apple Configurator for mac(配置和部署) 立即下载 Apple Configurator
  • 本文以“蚂蚁市场”这个软件为例,告诉大家破解长虹电视不能安装u盘app的方法,快速安装第三方软件。 一、长虹电视安装U盘app ①先访问蚂蚁市场官网(www.mayiapk.com),把安装包下载到U盘(蚂蚁市场收录了很多...
  • 导致无法登陆的原因可能是因为以太网不是en0,通过解决这个问题即可修复App Store无法登陆的问题 1.删除/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist 2.在系统偏好设置/网络 删除所有网络连接...
  • 最近有的朋友在安装安装TestFlight时一直出现无法接入appstore connect问题,有些朋友则是打开会提示不可用。这种情况应该怎么解决呢?今天,小编为大家带来了TestFlight无法接入App Store Connect解决方法。感兴趣...
  • 本文以“蚂蚁市场”这个软件为例,教大家长虹电视解除第三方限制,不刷机就安装U盘app。一、长虹电视禁止安装怎么解除①先访问蚂蚁市场官网(www.mayiapk.com),把安装包下载到U盘(蚂蚁市场收录了很多纯净版软件)②把...
  • 安卓应用转换器app,把你手机上的第三方安装软件,转换为系统应用!让这些不是出厂或是刷机自带的软件也能和系统一样拥有更多的权限,并且不会受返回出场设置干扰!安卓应用转换器app介绍安卓应用转换器能够将普通...
  • 电脑在使用中会运行各种软件,在运行使用中难免会遇到各种错误问题,最近有用户在操作电脑中运行程序时出现APPCRASH错误提示,导程序件无法正常运行工作,出现这种程序错误问题该如何解决呢?下面,小编就来跟大家...
  • 如果父布局使用绝对定位,则无法触发onReachBottom事件 如: 这样则会导致无法触发onReachBottom事件 删除绝对定位即可
  • react16在安装脚手架的时候出了bug,显示如下: 看react的官网解释: 我的解决办法:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 627,452
精华内容 250,980
关键字:

删除过的app无法重新安装