1.如何用android:sharedUserId属性生成带有系统权限的apk?
2.å¦ä½å¯å¨ä¸ä¸ªè¢«homeçandroidåºç¨ç¨åº
3.移ä¸å¹³å线(MMA)
4.三星手机knox软件是什么
如何用android:sharedUserId属性生成带有系统权限的apk?
如何用android:sharedUserId属性生成带有系统权限的apk?
通过源码编译apk获取系统权限,主要有两种方法:使用Android系统源码的环境下用make命令编译,或者使用eclipse源码编译,无需使用make命令。
方法1:Android源码环境下的thinkphp源码分享make命令编译。首先在android源码根目录下执行以下命令:
- build/envsetup.sh 设置编译环境
- lunch 选择编译目标
- make 编译整个系统
Android平台提供常用命令如:
- make 编译整个系统或单个模块
- mmm 编译指定目录下的caffe 源码模块
- mm 编译当前目录下的模块
- mma 编译当前目录及其依赖模块
- mms 编译指定目录及其依赖模块
- make sdk 编译SDK
- make snod 生成系统映像,速度较快但不稳定
方法2:使用eclipse源码编译。在signapk.java代码目录下执行命令:
- javac signapk.java 获取SignApk$SignatureOutputStream.class和SignApk.class
- 将两个class文件放入目录下并生成signapk.jar文件
- 复制platform.pk8和platform.x.pem文件至signapk.jar和SignApk.mf所在的目录
- 使用java -jar signapk.jar签名apk文件
在加入android:sharedUserId="android.uid.system"属性后,程序运行在系统进程中,拥有系统权限。但还需使用platform.pk8和platform.x.pem两个文件签名apk,确保在系统中安装和运行。生成的分站源码程序仅在原始Android系统或自己编译的系统中可用。
系统中使用不同共享UID的APK具有不同的权限和用途。遵循上述方法,你可以尝试编译带有sharedUserId权限的apk,并将其放置在开发版的caffe源码/system/priv-app/目录下,以实现静默ota升级。
本文章总结了使用android:sharedUserId属性生成带有系统权限的apk的方法和注意事项,希望对开发者有所帮助。后续将介绍ota升级的源码域名理论、实践和原理等内容。欢迎关注知乎主页以获取更多Android开发知识。sunst -- :
å¦ä½å¯å¨ä¸ä¸ªè¢«homeçandroidåºç¨ç¨åº
ããAndroidç³»ç»çHomeåºç¨ç¨åºLauncheræ¯ç±ActivityManagerServiceå¯å¨çï¼èActivityManagerServiceåPackageManagerServiceä¸æ ·ï¼é½æ¯å¨å¼æºæ¶ç±SystemServerç»ä»¶å¯å¨çï¼SystemServerç»ä»¶é¦å æ¯å¯å¨ePackageManagerServicï¼ç±å®æ¥è´è´£å®è£ ç³»ç»çåºç¨ç¨åºï¼å ·ä½å¯ä»¥åèåé¢ä¸ç¯æç« Androidåºç¨ç¨åºå®è£ è¿ç¨æºä»£ç åæï¼ç³»ç»ä¸çåºç¨ç¨åºå®è£ 好äºä»¥åï¼SystemServerç»ä»¶æ¥ä¸æ¥å°±è¦éè¿ActivityManagerServiceæ¥å¯å¨Homeåºç¨ç¨åºLauncheräºï¼Launcherå¨å¯å¨çæ¶å便ä¼éè¿PackageManagerServicæç³»ç»ä¸å·²ç»å®è£ 好çåºç¨ç¨åºä»¥å¿«æ·å¾æ çå½¢å¼å±ç¤ºå¨æ¡é¢ä¸ï¼è¿æ ·ç¨æ·å°±å¯ä»¥ä½¿ç¨è¿äºåºç¨ç¨åºäºï¼æ´ä¸ªè¿ç¨å¦ä¸å¾æ示ï¼ä¸é¢è¯¦ç»åææ¯ä¸ä¸ªæ¥éª¤ã
Step 1. SystemServer.main
è¿ä¸ªå½æ°å®ä¹å¨frameworks/base/services/java/com/android/server/SystemServer.javaæ件ä¸ï¼å ·ä½å¯ä»¥åèåé¢ä¸ç¯æç« Androidåºç¨ç¨åºå®è£ è¿ç¨æºä»£ç åæçStep 1ã
Step 2. SystemServer.init1
è¿ä¸ªå½æ°æ¯ä¸ä¸ªJNIæ¹æ³ï¼å®ç°å¨ frameworks/base/services/jni/com_android_server_SystemServer.cppæ件ä¸ï¼å ·ä½å¯ä»¥åèåé¢ä¸ç¯æç« Androidåºç¨ç¨åºå®è£ è¿ç¨æºä»£ç åæçStep 2ã
Step 3. libsystem_server.system_init
å½æ°system_initå®ç°å¨libsystem_serveråºä¸ï¼æºä»£ç ä½äºframeworks/base/cmds/system_server/library/system_init.cppæ件ä¸ï¼å ·ä½å¯ä»¥åèåé¢ä¸ç¯æç« Androidåºç¨ç¨åºå®è£ è¿ç¨æºä»£ç åæçStep 3ã
Step 4. AndroidRuntime.callStatic
è¿ä¸ªå½æ°å®ä¹å¨frameworks/base/core/jni/AndroidRuntime.cppæ件ä¸ï¼å ·ä½å¯ä»¥åèåé¢ä¸ç¯æç« Androidåºç¨ç¨åºå®è£ è¿ç¨æºä»£ç åæçStep 4ã
Step 5. SystemServer.init2
è¿ä¸ªå½æ°å®ä¹å¨frameworks/base/services/java/com/android/server/SystemServer.javaæ件ä¸ï¼å ·ä½å¯ä»¥åèåé¢ä¸ç¯æç« Androidåºç¨ç¨åºå®è£ è¿ç¨æºä»£ç åæçStep 5ã
Step 6. ServerThread.run
è¿ä¸ªå½æ°å®ä¹å¨frameworks/base/services/java/com/android/server/SystemServer.javaæ件ä¸ï¼å ·ä½å¯ä»¥åèåé¢ä¸ç¯æç« Androidåºç¨ç¨åºå®è£ è¿ç¨æºä»£ç åæçStep 6ã
Step 7. ActivityManagerService.main
è¿ä¸ªå½æ°å®ä¹å¨frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.javaæ件ä¸ï¼
[java] view plaincopy
public final class ActivityManagerService extends ActivityManagerNative
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
......
public static final Context main(int factoryTest) {
AThread thr = new AThread();
thr.start();
synchronized (thr) {
while (thr.mService == null) {
try {
thr.wait();
} catch (InterruptedException e) {
}
}
}
ActivityManagerService m = thr.mService;
mSelf = m;
ActivityThread at = ActivityThread.systemMain();
mSystemThread = at;
Context context = at.getSystemContext();
m.mContext = context;
m.mFactoryTest = factoryTest;
m.mMainStack = new ActivityStack(m, context, true);
m.mBatteryStatsService.publish(context);
m.mUsageStatsService.publish(context);
synchronized (thr) {
thr.mReady = true;
thr.notifyAll();
}
m.startRunning(null, null, null, null);
return context;
}
......
}
è¿ä¸ªå½æ°é¦å éè¿AThread线ç¨å¯¹è±¡æ¥å é¨å建äºä¸ä¸ªActivityManagerServiceå®ä¾ï¼ç¶åå°è¿ä¸ªå®ä¾ä¿åå ¶æååémServiceä¸ï¼æ¥çåæè¿ä¸ªActivityManagerServiceå®ä¾ä¿åå¨ActivityManagerServiceç±»çéææååémSelfä¸ï¼æååå§åå ¶å®æååéï¼å°±ç»æäºã
Step 8. PackageManagerService.main
è¿ä¸ªå½æ°å®ä¹å¨frameworks/base/services/java/com/android/server/PackageManagerService.javaæ件ä¸ï¼å ·ä½å¯ä»¥åèåé¢ä¸ç¯æç« Androidåºç¨ç¨åºå®è£ è¿ç¨æºä»£ç åæçStep 7ãæ§è¡å®è¿ä¸æ¥ä¹åï¼ç³»ç»ä¸çåºç¨ç¨åºçææä¿¡æ¯é½ä¿åå¨PackageManagerServiceä¸äºï¼åé¢Homeåºç¨ç¨åºLauncherå¯å¨èµ·æ¥åï¼å°±ä¼æPackageManagerServiceä¸çåºç¨ç¨åºä¿¡æ¯ååºæ¥ï¼ç¶å以快æ·å¾æ çå½¢å¼å±ç¤ºå¨æ¡é¢ä¸ï¼åé¢æ们å°ä¼çå°è¿ä¸ªè¿ç¨ã
移ä¸å¹³å线(MMA)
移ä¸å线ä¹ç§»ä¸æºç ï¼
MA1:MA(CLOSE,);
REF(MA(CLOSE,),-(n+1)/2),colorred,linethick4;
åé¢ç-(n+1)/2天æ¯ä½¿ç¨äºæªæ¥å½æ°çï¼æ é使ç¨ï¼
ä½ å¯ä»¥ç¨å³é®å¨mmvææ ä¸æµè¯æªæ¥æ°æ®ï¼ç»æå¯ä»¥çå°æ¯ç¨äºæªæ¥å½æ°ç
é£çç移ä¸å线æºç
input:P1(,1,);
MA1:MA(CLOSE,P1);
B1:=BACKSET(ISLASTBAR,);
B2:=(BARSLAST((B1 > REF(B1,1))) + 1);
B3:=REFX(MA1,);
MA3:=MA(CLOSE,);
MA2:IF((B1 = 1),(MA3 - (((REF(MA3,B2) - B3) * ( - B2)) / )),B3),PRECISION2;
三星手机knox软件是什么
手机Knox功能的使用方法:1.近期上市的手机(如:S6、S7、Note5等)无内置Knox客户端,可以通过三星应用商店下载My Knox。使用方法如下:打开My Knox点击开始-仔细阅读使用条款和条件后选择同意点击下一步-添加注册电子邮箱地址后点击下一步-选择要复制到My Knox中的应用程序点击下一步-选择解锁方式点击下一步-等待My Knox创建完成即可。2.早期部分机器内置Knox:在待机桌面下-点击应用程序-(Samsung文件夹)-KNOX。首次打开Knox时,需要下载一个MB的数据包,下载完毕后系统会提示创建密码,开启Knox后,在此系统下仅可使用一些简单的功能(Samsung KNOX Apps/互联网/ S Note/ S日历/照相机/记录/联系人/手机/下载列表/电子邮件/相册/我的文件/个人主页)。这些内容除了联系人和记录外均不能对外共享,也不能通过蓝牙/USB等方式导出。