• 所谓系统程序就是system/app目录中的程序,普通应用转换成系统程序后有稳定、减少内存(DATA)空间占用、恢复出厂设置后不会消失、修改系统时间、调用隐藏方法、系统关机重启、静默安装升级卸载应用等等等等优点,想...

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/53406933 文章出自:薛瑄的博客

    所谓系统程序就是system/app目录中的程序,普通应用转换成系统程序后有稳定、减少内存(DATA)空间占用、恢复出厂设置后不会消失、修改系统时间、调用隐藏方法、系统关机重启、静默安装升级卸载应用等等等等优点,想知道怎么操作?接下来我们介绍三种方法。

    第一种:使用ADB命令将app安装在system/app目录下

    参考:android 将自己的应用改为系统应用

    这种方法的原理就是:

    1、把apk文件移动到system/app目录,
    2、.so文件移动到system/lib目录。
    3、修改相应的权限

    操作步骤:

    1. 将你的手机数据线,插上,把你的设备设置为允许usb调试
    2. 打开命令终端cmd
    3. 输入命令 adb shell
    4. 确定能进入系统
    这里写图片描述

    5. 输入命令 mount
    这里写图片描述

    6. 因为system默认是只读文件夹,所以根据上面的提示输入下面命令,使其变为可读写
    mount -o remount /dev/block/nandd /system (图)
    这里写图片描述

    再出输入 mount 查看system和上面的不一样了,说明正确

    这里写图片描述

    7. 输入 exit 退出android系统终端

    8. 解压你的apk文件,进入查看lib/armeabi文件夹下有没有 .so文件,如果没有这种库文件的话,直接跳到第10步,(因为有些apk文件是要调用动态链接库的,你不拷贝的话,就没有办法运行!会报错)如果有的话, 将这些*.so文件都拷贝到/system/lib文件夹下:

    命令:adb push libiReader_txtparser.so system/lib
    这里写图片描述

    9、拷贝完了之后呢,要给这些库文件添加权限,看看别的库文件权限是几

    chmod   644  xxxxx.so

    这里写图片描述

    10. 将你的apk文件拷贝进入/system/app(该文件夹里存放着所以系统级别的apk),图中我是将iReader.apk拷贝过去的

    这里写图片描述

    11. 再次进入android终端 adb shell
    12. 进入system/app文件夹 cd system/app
    13. 查看其他apk的权限 ll 能看出区别

    这里写图片描述

    14. 修改iReader.apk权限使其和其他的一样 chmod 644 iReader.apk
    这里写图片描述

    15. 搞定这些之后,重启设备 reboot
    16. 看看系统里面是不是安装好了该应用,点击一下,看是否正常运行,可以的话,再检测是否无法卸载!

    第二种:借助工具把app转为系统应用(原理和方法一一样)

    转载:安卓进阶教程:怎样把应用转换成系统程序

    RE管理器转换和LINK2SD都可以实现,任选其一即可

    使用RE管理器转换

    1、首先我们把需要转换的程序在电脑上用压缩软件打开 ,看有没有lib这个目录。如果有,再把lib目录打开,直到出现以.so结尾的文件,把文件都拖出来备用。

    这里写图片描述这里写图片描述

    2、把需要转换的应用(apk文件)连同刚拖出的.so文件(如果有),放到手机内存卡,
    3、用RE管理器复制到system目录,把权限更改如图,
    4、把更改权限后的apk文件移动到system/app目录,.so文件移动到system/lib目录。
    5、完成后重启手机,应用就转换成系统程序了。

    使用LINK2SD转换

    这里写图片描述这里写图片描述

    如果感觉以上方法麻烦,也可借助工具来操作,LINK2SD、钛备份等软件都可以把普通程序转换为系统程序,以LINK2SD为例,打开LINK2SD,找到需要软件的程序,点击,再点操作,选择转换系统应用,接着会有个确认窗口,确认后,重启手机程序就转换好了。

    第三种:使用signapk打包成系统应用

    参考:
    android之使用signapk打包成系统应用,获取系统权限
    使用platform密钥来给apk文件签名的命令
    Android安全开发之通用签名风险
    关于android:sharedUserId=”android.uid.system”这个系统级权限
    安装APK 时, 提示” 共享用户权限不完整” , 不能安装成功, 如何解决?
    https://github.com/android/platform_build/tree/master/target/product/security

    为了更好地理解下面介绍的两种方法的原理,先来学习几个概念:

    Android应用签名机制

    Android系统要求安装的应用必须用数字证书进行签名后才能安装,并且签名证书的私钥由应用开发者保存。签名证书的生成也由开发者自己生成。在应用安装时会校验包名(package name)和签名,如果系统中已经存在了一个相同的包名和签名的应用,将会用新安装的应用替换旧的;如果包名相同但是签名不同,则会安装失败。

    为什么需要数字签名?

    数字签名是防止要保护的内容被篡改,用非对称加密算法。先对要保护的内容进行消息摘要,用私钥对消息摘要进行加密,生成数字签名,将数字签名和要保护的内容一起分发出去。 内容接收者用公钥对数字签名解密得到发送者给的消息摘要A,内容接收者对接收到的内容进行用相同的消息摘要算法处理得到消息摘要B,对比A和B是否相同,来判定传送的内容是否被篡改。 正常的APK文件是个ZIP压缩文件,除了应用的可执行文件、资源文件,还包括这些可执行文件、资源文件的摘要信息,数字证书的公钥信息等。并且通过这些签名信息可以确定APP和其开发者的关系。

    进行签名需要的工具有哪些?

    对apk进行签名需要用到签名证书和签名工具。Android系统要求对APP进行签名的数字证书可以由开发者自己生成。签名工具有jarsigner和signapk。jarsigner是Java本身自带的一个工具,他也可以对jar进行签名的;而signapk是专门为了Android应用程序apk进行签名的工具。二者的区别是:jarsigner工具签名时使用的是keystore签名文件,signapk工具签名时使用的是pk8,x509.pem文件。

    签名后的文件都有哪些?

    应用签名完后在应用的META-INF目录下会有三个文件:

    CERT.RSA、CERT.SF和MANIFEST.MF。

    MANIFEST.MF中保存了所有其他文件的SHA1摘要并base64编码后的值。

    CERT.SF文件 是对MANIFEST.MF文件中的每项中的每行加上“rn”后,再次SHA1摘要并base64编码后的值(这是为了防止通过篡改文件和其在MANIFEST.MF中对应的SHA1摘要值来篡改APK,要对MANIFEST的内容再进行一次数字摘要)。

    CERT.RSA 文件:包含了签名证书的公钥信息和发布机构信息。

    对安装包的校验过程在源码的frameworks/base/core/java/android/content/pm/PackageParser.java类中可以看到

    什么是通用签名?

    搭建好Android开发环境后(使用Eclipse或Android Studio),对APK签名的默认密钥存在debug.keystore文件中。在linux和Mac上debug.keystore文件位置是在~/.android路径下,在windows目录下文件位置是C:\user\用户名.android路径下。

    除了debug.keystore外,在AOSP发布的Android源码中,还有以下几个证书是公开的,任何人都可以获取,在源码的build/target/product/security目录中:

    这里写图片描述

    这几个证书的作用:

    testkey

    Generic default key for packages that do not otherwise specify a key.

    platform

    Test key for packages that are part of the core platform.

    shared

    Test key for things that are shared in the home/contacts process.

    media

    Test key for packages that are part of the media/download system.

    verity

    Test Key for verifiedboot system imagein Android Lollipop. Sign boot.img,sign verity metadata in system.img.

    通用签名风险:

    (1)如果攻击者的应用包名与目标应用相同,又使用了相同的密钥对应用进行签名,攻击者的应用就可以替换掉目标应用;

    (2)另外目标应用的自定义权限android:protectionlevel为“signature”或者“signatureOrSystem”时,保护就形同虚设;

    (3)如果设备使用的是第三方ROM,而第三方ROM的系统也是用AOSP默认的签名,那么使用如果使用系统级签名文件签名过的应用,权限就得到了提升。

    具体的实现方法:

    第一种是需要在Android系统源码的环境下用make来编译:

    1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId=”android.uid.system”这个属性。
    2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
    3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。

    第二种:

    下面着重介绍一个这个方法:

    1. 加入android:sharedUserId=”android.uid.system”这个属性。

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.jant.addview"
              android:sharedUserId="android.uid.system" >
        <application
           ...(省略若干代码)
        </application>
    
    </manifest>

    2. 使用自己的签名文件,生成apk

    3. 使用通用签名来重新给apk文件签名。

    3.1 .准备好platform.pk8、platform.x509.pem和签名工具signapk.jar(3个文件的下载地址),还有自己的apk,放在同一个文件夹下。

    3.2 在cmd下进入到该文件夹后,使用如下命令:
    这里写图片描述

    3.3 回车后我们的文件夹下已经多了一个new.apk文件了,这就将我们的应用打包成系统应用


    你也可以在github中去下载,但是下载的是SignApk.java,需要进行一些处理,如下

    1.1.进入\build\target\product\security,找到【platform.pk8】和【platform.x509.pem】系统密钥。
    1.2.进入\build\tools\signapk找到SignApk.java,运行 javac编译成SignApk.class
    1.3.执行命令java com.android.signapk.SignApk platform.x509.pem platform.pk8 input.apk output.apk

    最后解释一下原理

    首先加入android:sharedUserId=”android.uid.system”这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,也就是系统应用。

    只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。

    这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key来签名,程序在模拟器上运行OK,不过放到小米四上安装uibl,如下图,这样也是保护了系统的安全。

    这里写图片描述

    最后还说下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的。
    你在Manifest.xml里声明使用了shareuserid 或者一些特殊permission,比如你shareuserid到uid.system,就必须使用系统platform签名来签你的apk,否则是不能安装的,同理share到其他用户id或者其他process上也是得用跟那个process运行的apk一样的签名
    一般签名肯定是厂商私有的,你肯定是没办法了,除非机器烧的是开发版本(eng)

    检验app是否已经是系统应用

    查看应用的进程属性,如果是system用户组,说明已经是系统应用。

    这里写图片描述

    关注我的公众号,轻松了解和学习更多技术
    这里写图片描述

    展开全文
  • 首先开发Android程序需要有jdk开发环境,就像java开发要javaJDK开发环境一样,下面上一下今天安装环境踩得坑~ 首先下载Android的SDK:http://www.androiddevtools.cn/ 安装: 选择你下载的sd...

    突然间又接个大活,一个推广系统,竟然还需要开发APP我勒个去,本着活到老学到老的精神,开始着手学习这一方面的姿势······

    首先开发Android程序需要有jdk开发环境,就像java开发要javaJDK开发环境一样,下面上一下今天安装环境踩得坑~

    首先下载Android的SDK:http://www.androiddevtools.cn/

     安装:

     

     选择你下载的sdk解压文件路径,然后会出来一个神奇的东西,但是不要慌

    点击Open SDK Manager进去,选择一个要安装的版本就可以,然后按照步骤点下一步,finish,ok出来~

    然后就可以新建一个Android项目了,建好项目后项目会自动build,这时候可能会报个错:gradle project sync failed.basic functionality(e.g. editing, debugging) will not work properly,但是也不要慌······

    打开idea的setting选项卡,按图示路径做一下更改,默认路径只会到C:/Users/haha/.gradle,这样项目在build的时候找不到文件夹所以会报错,把路径改详细点,像图示那样,然后就成功了~

    成功建立项目后会出现如下界面~

    今天刚刚学的,来记录一下,有不对的地方请大家指正~小编要继续学习app开发的相关姿势去了~

    展开全文
  • 关于android 程序开发安装不了问题。提示:您的手机上未安装应用程序 app打包后,在android5.0以上的手机上可以安装运行,但是在4.4以下安装完成后打开引用程序直接提示:您的手机上未安装应用程序,打不开。 这个...

    关于android 程序开发安装不了问题。提示:您的手机上未安装应用程序

    app打包后,在android5.0以上的手机上可以安装运行,但是在4.4以下安装完成后打开引用程序直接提示:您的手机上未安装应用程序,打不开。

    这个问题很是纠结,人的第一反应是android版本原因,但是我把编译版本降低到4.1后打包,还是遇到同样的问题。

    网上搜索

    答案多半是: AndroidManifest.xml 文件中activity 写重复了。 我仔细检查我的文件,没有发现重复。

    后来我再仔细研究我的AndroidManifest.xml文件。

    发现一个android权限: android:permission="android.permission.ACCESS_COARSE_LOCATION"

    此权限描述:

    ACCESS_COARSE_LOCATION访问CellID或WiFi,只要当前设备可以接收到基站的服务信号,便可获得位置信息。(COARSE英文原意为:粗略的,可以理解为这种方式获得的位置信息是相对粗略的数据)。

    <application
            android:allowBackup="true"
            android:icon="@drawable/ico"
            android:label="@string/app_name"
            android:theme="@style/AppBaseTheme2" android:permission="android.permission.ACCESS_COARSE_LOCATION">
    修改为

    <application
            android:allowBackup="true"
            android:icon="@drawable/ico"
            android:label="@string/app_name"
            android:theme="@style/AppBaseTheme2" >
    成功在低版本手机安装运行。

    展开全文
  • PackageManagerService安装包的机制如下: ...2. android:installLocation = "auto",表示先查看手机内存是否足够,如果够就安装在手机内存上,不够就安装在 T 卡上; 3. android:installLocatio

     PackageManagerService安装包的机制如下:

    在 AdroidManifest.xml 里面定义安装位置可以有四种情况:
    1. 如果没有定义安装位置,表示安装在手机内存上;
    2. android:installLocation = "auto",表示先查看手机内存是否足够,如果够就安装在手机内存上,不够就安装在 T 卡上;
    3. android:installLocation = "internalOnly",表示安装在手机内存上;
    4. android:installLocation = "preferExternal" ,表示安装在 T 卡上;

    在 packages\apps\Settings\src\com\android\settings中ApplicationSettings.java

            // Is app default install location set?
            boolean userSetInstLocation = (Settings.System.getInt(getContentResolver(),
                    Settings.Secure.SET_INSTALL_LOCATION, 0) != 0);
            if (!userSetInstLocation) {
                getPreferenceScreen().removePreference(mInstallLocation);
            } else {
                mInstallLocation.setValue(getAppInstallLocation());
                mInstallLocation.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
                    public boolean onPreferenceChange(Preference preference, Object newValue) {
                        String value = (String) newValue;
                        handleUpdateAppInstallLocation(value);
                        return false;
                    }
                });
            }

    修改Settings.Secure.SET_INSTALL_LOCATION此值即可显示用户选择菜单

    可以按照如下方式更改,这样用户就能自己选择安装位置:

    打开 frameworks/base/packages/SettingsProvider/DatabaseHelper.java

    将loadSetting(stmt, Secure.SET_INSTALL_LOCATION, 0);改为 loadSetting(stmt, Secure.SET_INSTALL_LOCATION, 1);

     将loadSetting(stmt, Settings.Secure.SET_INSTALL_LOCATION, 0);改为 loadSetting(stmt, Settings.Secure.SET_INSTALL_LOCATION, 1);
    编译后,就能在  Settings --> Applications 里面能看到安装位置选项.

     

    如何设置安装位置默认为SD卡

      loadSetting(stmt, Secure.DEFAULT_INSTALL_LOCATION,PackageHelper.APP_INSTALL_AUTO);修改为

     loadSetting(stmt, Secure.DEFAULT_INSTALL_LOCATION,PackageHelper.APP_INSTALL_EXTERNAL);

    将  loadSetting(stmt, Settings.Secure.DEFAULT_INSTALL_LOCATION,PackageHelper.APP_INSTALL_AUTO);修改为

     loadSetting(stmt, Settings.Secure.DEFAULT_INSTALL_LOCATION,PackageHelper.APP_INSTALL_EXTERNAL);

    注意:这样更改过后有个限制,如果 apk 的 AndroidManifest.xml 里面定义 android:installLocation = "internalOnly",那么无论用户选择安装在什么地方,该apk 都会安装到手机上,这样做的好处是避免程序运行错误,因为定义android:installLocation = "internalOnly" 的 apk 一般要安装到手机内存上才能正常运行。
    展开全文
  • **我安装Android studio是2.3版本的,我用真机作为模拟器,第一个程序运行在手机上的时候并没有什么问题,但是运行第二应用程序的时候,会直接覆盖第一个应用程序。比如第一个程序名为Demo1,第二程序为Demo2,...
  • android系统安装不能使用的原因: Android安卓系统提示应用程序未... 一,很多人在Android2.2开启APP2SD之后如果安装程序时死机或者遇到其他情况,当再次安装程序会提示”应用程序安装”,从而安装程序失败。
    android系统安装不能使用的原因:



    Android安卓系统提示应用程序未安装的三种解决方法
      有时候,在给自己的安卓爱机安装软件或者打开某个软件的时候,手机会提示应用程序未安装,一般来说出现这种提示,有以下三个原因。


      一,很多人在Android2.2开启APP2SD之后如果安装程序时死机或者遇到其他情况,当再次安装程序会提示”应用程序未安装”,从而安装程序失败。


      解决方法:储存模式连接电脑找到SD卡目录下的.android_secure文件夹,里面应该会有一个smdl2tmp1.asec,也可能是其他名称,总之与正常程序命名格式明显不一样的文件,删除,再次安装软件,看看是不是好了。


      二,打开设置-管理应用程序


      用系统自带的程序管理查看SD卡上的程序时,有的程序是没有彩色图标的,原来就是这些没有图标的软件在作怪,这些没有图标的软件就是以前一些没有正确安装或者卸载不完全软件数据,如果你再次安装就会报错,现在我们用系统自带的软件管理把它们卸载干净,再次安装软件时就不会出错了.


      三,还有一部分因为软件签名更改了,所以不能覆盖安装,直接删除重新安装新的版本即可。 



    四,Android APK安装失败,共享用户不兼容 INSTALL_FAILED_SHARED_USER_INCOMPATIBLE那首先你看你的手机内存是不是已经满了,或者要安装的软件以前安装过没有卸载干净,如果排除这两个问题就要看看决方法格式化sd卡就可以了

    一般出现这个提示可以分别使用下面两种方法试一下(针对开发者和用户):


    1、APK没有使用签名,一般是开发人员的问题,在项目上点右键-Export signed appication package...(生成自己的签名然后)导入即可。这种适用于在调试时候可以使用,但是安装APK包的时候提示“应用程序未安装”的情况。


    2、储存模式连接电脑或者用Astro文件管理器找到SD卡目录下的.android_secure文件夹,里面应该会有一个smdl2tmp1.asec,也可能是其他名称,总之与正常程序命名格式明显不一样的文件,删除,再次安装软件,看看是不是好了。










    展开全文
  •  最近在做一个扫描Android系统内已安装程序列表的小功能,需要将已安装程序信息读出来,找出其图标,并保存到一个List>中。方法如下 private List> getInstalledApps() { List packages = getPackageManager()....
  • 百度了一番,看到博客上很多都说在 文件中添加android:installLocation=”auto”属性。然后我就兴冲冲的加上去了。问题也解决了。 原来看官网的不多,后来看了官网的api讲解,发现原来很多博客是误解。我翻译了一下...
  • Android Studio的安装

    2018-09-03 12:04:06
    Android Studio的安装 Android Studio是Google推出一个Android集成开发工具,基于IntelliJ IDEA,用于Android应用程序的开发和调试,熟悉IntelliJ的开发人员会很容易上手。(目前google已经停止对Eclipse ADT的支持...
  • launcher,也就是android的桌面应用程序。下图是我正在使用的魅族手机的launcher应用程序:  接下来我们要开发一个自己的launcher,使其替代系统的默认launcher。 怎样使我们的应用程序成为一个launcher?  ...
  • 虽说这种方式看上去不打搅用户,但是却存在着一个问题,因为Android系统会在安装界面当中把程序所声明的权限展示给用户看,用户来评估一下这些权限然后决定是否要安装程序,但如果使用了静默安装的方式,也就没有...
  • Android程序开发初级教程(一) 平台简介 令人激动的Google手机操作系统平台-Android在2007年11月13日正式发布了,这是一个开放源代码的操作系统,内核为Linux. 作为开发者,我们所关心的是这个平台的架构以及所...
  • 如何在Android studio中更改应用程序的图标和名称是很多初学者遇到的问题之一,今天我就来给大家讲一下简单的步骤 1. 更改图标   首先选中我们需要更改的工程,然后new --&gt;Image Asset     就...
  • 在Google提供的Eclipse集成开发环境adt-bundle下修改名称的总结: 1. 修改工程名(apk名称) 在弹出的对话框中输入新名称 该操作实际上是修改/.project下的节点。但由于某种原因,只修改该文件的话,在adt-bundle中...
  • Android系统的手机或者平板,需要添加一些程序,然后默认打开。例如:word类文档,可以指定用wps的Android版本打开。但是有的时候,由于我们新安装了例如手机百度,
  • 一、安装Android Studio 1.安装Java开发工具包 安装和配置的介绍:...安装Android Studio之后就可以自己创建工程编写程序了。 二、创建一个Android工程 1.打开Android,点
  • 如何修改Android应用程序的图标和名字
  • android studio的安装,史上最详细!!欢迎前来观看,感觉有用就点波关注吧!custom 欢迎前来观看,感觉有用就点波关注吧! 1、首先下载Android studio安装包,可以从 http://www.android-studio.org/ 下载最新...
  • ubuntu下安装AndroidStudio

    2016-03-14 22:42:09
    最近将电脑的操作系统换成了ubuntu,对于不习惯win8/win10的人来说ubuntu确实是一个不错的选择,基本的软件都ok了,至于QQ什么的,大家可以去找wine版的,或者直接下载一个叫CrossOver的软件进行wine安装.新的操作系统...
  • 1.修改应用程序包名时,需要注意的几个地方: 1)在配置文件AdroidManifest中修改直接修改package标签,或者右键项目名->Android Tools->rename application package 2)右键创建应用程序时src中自动添加的包名,即...
1 2 3 4 5 ... 20
收藏数 249,882
精华内容 99,952
关键字:

修改已安装android程序