各位安卓手机开发流程软件都可以流程运行吗

安卓手机的程序后台没有运行会显示通知吗?_百度知道
安卓手机的程序后台没有运行会显示通知吗?
我有更好的答案
但V信的服务还在系统底层,只要有人聊天它就能唤醒。2、家族式启动,典型代表就是百度的软件,你如果装了百度安全卫士
百度云等大于俩个以上,关其中一个没用,只有一个健在。如果想彻底清除会的1、安卓有些程序有自动唤醒功能,比如微信,你关了V信,会唤醒所有
采纳率:56%
为您推荐:
其他类似问题
您可能关注的内容
安卓手机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&为什么我的安卓手机越用越卡,而苹果就不会?进来看看就知道
为什么我的安卓手机越用越卡,而苹果就不会?进来看看就知道
日11时59分来源:
很多使用过安卓手机的差友问过世超:为什么我的安卓手机会越用越卡,而苹果手机却不会?
今天世超就和大家聊聊这个问题以及解决方案。
关于这个问题,首先我们要从我国独特的上网环境说起,由于我大天朝的互联网一直被安全的守护着。甚至有时候去看看外面的世界也需要通过科学的上网方式才行。
虽然这么做确实帮我们屏蔽掉了很多所谓 “ 不良信息 ”,但是很多优秀的东西也被我们拒之门外比如说 —— Google Play 。
Google play 在 Android 系统里的地位就像是 iOS 里的 App Store一样,可惜在国内是使用不了的!
我们可以想象一下,如果 iOS 没有 App Store 会怎么样?
如果没有 App Store 这样强大的应用市场,帮我们优化筛选掉那些垃圾应用,手机多半会塞满各种盗版、流氓应用(请自行参考百度全家桶套餐)。。。
这就是差友们的安卓手机会越用越卡的原因——我们的手机被这些没有经过筛选的应用占用了太多没有必要的手机运行内存。
我们经常莫名其妙的就被塞了全家桶套餐,最典型的就是以 BAT (百度、阿里、腾讯)为首的许多 Android 版本 app。
其实抛开手机硬件不谈,如今的安卓系统经过这么多年的积累更新,已经和 iOS 同样流畅好用了,但因为国内应用市场对 App 的审核标准参差不齐,开发者比较乱来。
无良开发者会给自己的 app 添加多余的启动权限或后台服务,除了吃内存和耗电,对用户来讲没什么卵用。。。
那没有足够好的应用市场,我们该怎么办呢?
我们可能需要一些App的帮助。
了解过安卓Xposed 框架的差友们可能听说过黑域的前身,Xposed 框架模块——阻止运行。
顾名思义它的最大用处就是就是阻止某些流氓程序的运行,尤其是那些在我们后台偷偷运行的应用,它们消耗着我们大量没必要的电量和内存!
并且黑域是不需要 root 就可以管理系统内置应用,相比之前的Xposed 框架阻止运行相比极大的降低了使用门槛。
不过缺陷是黑域每次重启手机都需要用 USB 调试或者网络调试来开启黑域的阻止运行功能。
虽然我们没有的安卓没有Google Play 可以用,但只要灵活的使用它们。也能让开放的 Android 系统与封闭的 iOS 系统同样流程。
不过前提是你得花不少时间去学会用它。。。
最后还是希望Google Play 能早日进入国内市场吧,毕竟一个原生的应用市场是谁也替代不了的。
长按二维码下载
但是我给你们的Android App 都是来自Google Play安卓系统取消程序默认打开方式方法及步骤-木子学院
安卓系统取消程序默认打开方式方法及步骤
当前位置:>>
安卓系统取消程序默认打开方式方法及步骤
作者:木子绿茶
来源:木子软件
时间: 17:01
在个别时候打开网站或者图片的时候系统会让用户选择打开方式,然后有时候一不小心改为了默认打开方式,以后每次都是那次的打开方式。今天小编就使用三星的做试验机来教大家如何来取消默认的打开方式。
1、首先我们在打开设置,然后打开应用程序管理器。如图:
2、找到默认打开方式的软件,小编这里是QQ。所以能联想到是网址的默认打开方式。
3、继续。再看到下方红色方框内的清除默认值。
4、清除默认值以后再打开的时候就会有选择提示,下次如果是什么提示打开,就在哪个软件里清除默认值就行了。
木子学院 热门推荐安卓怎么刷机
安卓怎么刷机
(C)2017 列表网&琼ICP备号-12&增值电信业务经营许可证B2-&Android Camera 运行流程
Camera 运行流程
首先既然Camera是利用binder通信,它肯定要将它的service注册到ServiceManager里面,以备后续Client引用,那么这一步是在哪里进行的呢?细心的人会发现,在frameworks\base\media\mediaserver\Main_MediaServer.cpp下有个main函数,可以用来注册媒体服务。没错就是在这里,CameraService完成了服务的注册,相关代码如下:
int main(int argc, char** argv)
&&& sp&ProcessState& proc(ProcessState::self());
&&& sp&IServiceManager& sm = defaultServiceManager();
&&& LOGI(&ServiceManager: %p&, sm.get());
&&& AudioFlinger::instantiate();
&&& MediaPlayerService::instantiate();
&&& CameraService::instantiate();
&&& AudioPolicyService::instantiate();
&&& ProcessState::self()-&startThreadPool();
&&& IPCThreadState::self()-&joinThreadPool();
可是我们到CameraService文件里面却找不到instantiate()这个函数,它在哪?继续追到它的一个父类BinderService,
CameraService的定义在frameworks/base/services/camera/libcameraservice/CameraService.h中
class CameraService :
&&& public BinderService&CameraService&,
&&& public BnCameraService
&&& class C
&&& friend class BinderService&CameraService&;
&&& static char const* getServiceName() { return &media.camera&; }
从以上定义可以看出CameraService 继承于BinderService,所以CameraService::instantiate(); 其实是调用BinderService中的instantiate
BinderService的定义在frameworks/base/include/binder/BinderService.h中
// ---------------------------------------------------------------------------
namespace android {
template&typename SERVICE&
class BinderService
&&& static status_t publish() {
&&&&&&& sp&IServiceManager& sm(defaultServiceManager());
&&&&&&& return sm-&addService(String16(SERVICE::getServiceName()), new SERVICE());
&&& static void publishAndJoinThreadPool() {
&&&&&&& sp&ProcessState& proc(ProcessState::self());
&&&&&&& sp&IServiceManager& sm(defaultServiceManager());
&&&&&&& sm-&addService(String16(SERVICE::getServiceName()), new SERVICE());
&&&&&&& ProcessState::self()-&startThreadPool();
&&&&&&& IPCThreadState::self()-&joinThreadPool();
&&& static void instantiate() { publish(); }
&&& static status_t shutdown() {
&&&&&&& return NO_ERROR;
}; // namespace android
// ---------------------------------------------------------------------------
可以发现在publish()函数中,CameraService完成服务的注册 。这里面有个SERVICE,中有说明
template&typename SERVICE&
这表示SERVICE是个模板,这里是注册CameraService,所以可以用CameraService代替
return sm-&addService(String16(CameraService::getServiceName()), new CameraService());
好了这样,Camera就在ServiceManager完成服务注册,提供给client随时使用。
Main_MediaServer主函数由init.rc在启动是调用,所以在设备开机的时候Camera就会注册一个服务,用作binder通信。
Binder服务已注册,那接下来就看看client如何连上server端,并打开camera模块。咱们先从camera app的源码入手。在onCreate()函数中专门有一个open Camera的线程
camera app的源码文件在以下目录packages/apps/OMAPCamera/src/com/ti/omap4/android/camera/camera.java
&&& @Override
&&& public void onCreate(Bundle icicle) {
&&&&&&& super.onCreate(icicle);
&&&&&&& getPreferredCameraId();
&&&&&&& String[] defaultFocusModes = getResources().getStringArray(
&&&&&&&&&&&&&&& R.array.pref_camera_focusmode_default_array);
&&&&&&& mFocusManager = new FocusManager(mPreferences, defaultFocusModes);
&&&&&&& /*
&&&&&&&& * To reduce startup time, we start the camera open and preview threads.
&&&&&&&& * We make sure the preview is started at the end of onCreate.
&&&&&&&& */
&&&&&&& mCameraOpenThread.start();
&&&&&&& PreferenceInflater inflater = new PreferenceInflater(this);
&&&&&&& PreferenceGroup group =
&&&&&&&&&&&&&&& (PreferenceGroup) inflater.inflate(R.xml.camera_preferences);
&&&&&&& ListPreference gbce = group.findPreference(CameraSettings.KEY_GBCE);
&&&&&&& if (gbce != null) {
&&&&&&&&&&& mGBCEOff = gbce.findEntryValueByEntry(getString(R.string.pref_camera_gbce_entry_off));
&&&&&&&&&&& if (mGBCEOff == null) {
&&&&&&&&&&&&&&& mGBCEOff = &&;
&&&&&&&&&&& }
&&&&&&& ListPreference autoConvergencePreference = group.findPreference(CameraSettings.KEY_AUTO_CONVERGENCE);
&&&&&&& if (autoConvergencePreference != null) {
&&&&&&&&&&& mTouchConvergence = autoConvergencePreference.findEntryValueByEntry(getString(R.string.pref_camera_autoconvergence_entry_mode_touch));
&&&&&&&&&&& if (mTouchConvergence == null) {
&&&&&&&&&&&&&&& mTouchConvergence = &&;
&&&&&&&&&&& }
&&&&&&&&&&& mManualConvergence = autoConvergencePreference.findEntryValueByEntry(getString(R.string.pref_camera_autoconvergence_entry_mode_manual));
&&&&&&&&&&& if (mManualConvergence == null) {
&&&&&&&&&&&&&&& mManualConvergence = &&;
&&&&&&&&&&& }
&&&&&&& ListPreference exposure = group.findPreference(CameraSettings.KEY_EXPOSURE_MODE_MENU);
&&&&&&& if (exposure != null) {
&&&&&&&&&&& mManualExposure = exposure.findEntryValueByEntry(getString(R.string.pref_camera_exposuremode_entry_manual));
&&&&&&&&&&& if (mManualExposure == null) {
&&&&&&&&&&&&&&& mManualExposure = &&;
&&&&&&&&&&& }
&&&&&&& ListPreference temp = group.findPreference(CameraSettings.KEY_MODE_MENU);
&&&&&&& if (temp != null) {
&&&&&&&&&&& mTemporalBracketing = temp.findEntryValueByEntry(getString(R.string.pref_camera_mode_entry_temporal_bracketing));
&&&&&&&&&&& if (mTemporalBracketing == null) {
&&&&&&&&&&&&&&& mTemporalBracketing = &&;
&&&&&&&&&&& }
&&&&&&&&&&& mExposureBracketing = temp.findEntryValueByEntry(getString(R.string.pref_camera_mode_entry_exp_bracketing));
&&&&&&&&&&& if (mExposureBracketing == null) {
&&&&&&&&&&&&&&& mExposureBracketing = &&;
&&&&&&&&&&& }
&&&&&&&&&&& mZoomBracketing = temp.findEntryValueByEntry(getString(R.string.pref_camera_mode_entry_zoom_bracketing));
&&&&&&&&&&& if (mZoomBracketing == null) {
&&&&&&&&&&&&&&& mZoomBracketing = &&;
&&&&&&&&&&& }
&&&&&&&&&&& mHighPerformance = temp.findEntryValueByEntry(getString(R.string.pref_camera_mode_entry_hs));
&&&&&&&&&&& if (mHighPerformance == null) {
&&&&&&&&&&&&&&& mHighPerformance = &&;
&&&&&&&&&&& }
&&&&&&&&&&& mHighQuality = temp.findEntryValueByEntry(getString(R.string.pref_camera_mode_entry_hq));
&&&&&&&&&&& if (mHighQuality == null) {
&&&&&&&&&&&&&&& mHighQuality = &&;
&&&&&&&&&&& }
&&&&&&&&&&& mHighQualityZsl = temp.findEntryValueByEntry(getString(R.string.pref_camera_mode_entry_zsl));
&&&&&&&&&&& if (mHighQualityZsl == null) {
&&&&&&&&&&&&&&& mHighQualityZsl = &&;
&&&&&&&&&&& }
&&&&&&& getPreferredCameraId();
&&&&&&& mFocusManager = new FocusManager(mPreferences,
&&&&&&&&&&&&&&& defaultFocusModes);
&&&&&&& mTouchManager = new TouchManager();
&&&&&&& mIsImageCaptureIntent = isImageCaptureIntent();
&&&&&&& setContentView(R.layout.camera);
&&&&&&& if (mIsImageCaptureIntent) {
&&&&&&&&&&& mReviewDoneButton = (Rotatable) findViewById(R.id.btn_done);
&&&&&&&&&&& mReviewCancelButton = (Rotatable) findViewById(R.id.btn_cancel);
&&&&&&&&&&& findViewById(R.id.btn_cancel).setVisibility(View.VISIBLE);
&&&&&&& } else {
&&&&&&&&&&& mThumbnailView = (RotateImageView) findViewById(R.id.thumbnail);
&&&&&&&&&&& mThumbnailView.enableFilter(false);
&&&&&&&&&&& mThumbnailView.setVisibility(View.VISIBLE);
&&&&&&& mRotateDialog = new RotateDialogController(this, R.layout.rotate_dialog);
&&&&&&& mCaptureLayout = getString(R.string.pref_camera_capture_layout_default);
&&&&&&& mPreferences.setLocalId(this, mCameraId);
&&&&&&& CameraSettings.upgradeLocalPreferences(mPreferences.getLocal());
&&&&&&& mNumberOfCameras = CameraHolder.instance().getNumberOfCameras();
&&&&&&& mQuickCapture = getIntent().getBooleanExtra(EXTRA_QUICK_CAPTURE, false);
&&&&&&& // we need to reset exposure for the preview
&&&&&&& resetExposureCompensation();
&&&&&&& Util.enterLightsOutMode(getWindow());
&&&&&&& // don't set mSurfaceHolder here. We have it set ONLY within
&&&&&&& // surfaceChanged / surfaceDestroyed, other parts of the code
&&&&&&& // assume that when it is set, the surface is also set.
&&&&&&& SurfaceView preview = (SurfaceView) findViewById(R.id.camera_preview);
&&&&&&& SurfaceHolder holder = preview.getHolder();
&&&&&&& holder.addCallback(this);
&&&&&&& s3dView = new S3DViewWrapper(holder);
&&&&&&& holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
&&&&&&& // Make sure camera device is opened.
&&&&&&& try {
&&&&&&&&&&& mCameraOpenThread.join();
&&&&&&&&&&& mCameraOpenThread =
&&&&&&&&&&& if (mOpenCameraFail) {
&&&&&&&&&&&&&&& Util.showErrorAndFinish(this, R.string.cannot_connect_camera);
&&&&&&&&&&&&&&&
&&&&&&&&&&& } else if (mCameraDisabled) {
&&&&&&&&&&&&&&& Util.showErrorAndFinish(this, R.string.camera_disabled);
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&&&&&& } catch (InterruptedException ex) {
&&&&&&&&&&& // ignore
&&&&&&& mCameraPreviewThread.start();
&&&&&&& if (mIsImageCaptureIntent) {
&&&&&&&&&&& setupCaptureParams();
&&&&&&& } else {
&&&&&&&&&&& mModePicker = (ModePicker) findViewById(R.id.mode_picker);
&&&&&&&&&&& mModePicker.setVisibility(View.VISIBLE);
&&&&&&&&&&& mModePicker.setOnModeChangeListener(this);
&&&&&&&&&&& mModePicker.setCurrentMode(ModePicker.MODE_CAMERA);
&&&&&&& mZoomControl = (ZoomControl) findViewById(R.id.zoom_control);
&&&&&&& mOnScreenIndicators = (Rotatable) findViewById(R.id.on_screen_indicators);
&&&&&&& mLocationManager = new LocationManager(this, this);
&&&&&&& // Wait until the camera settings are retrieved.
&&&&&&& synchronized (mCameraPreviewThread) {
&&&&&&&&&&& try {
&&&&&&&&&&&&&&& mCameraPreviewThread.wait();
&&&&&&&&&&& } catch (InterruptedException ex) {
&&&&&&&&&&&&&&& // ignore
&&&&&&&&&&& }
&&&&&&& // Do this after starting preview because it depends on camera
&&&&&&& // parameters.
&&&&&&& initializeIndicatorControl();
&&&&&&& mCameraSound = new CameraSound();
&&&&&&& // Make sure preview is started.
&&&&&&& try {
&&&&&&&&&&& mCameraPreviewThread.join();
&&&&&&& } catch (InterruptedException ex) {
&&&&&&&&&&& // ignore
&&&&&&& mCameraPreviewThread =
再看看mCameraOpenThread
&&& Thread mCameraOpenThread = new Thread(new Runnable() {
&&&&&&& public void run() {
&&&&&&&&&&& try {
&&&&&&&&&&&&&&& mCameraDevice = Util.openCamera(Camera.this, mCameraId);
&&&&&&&&&&& } catch (CameraHardwareException e) {
&&&&&&&&&&&&&&& mOpenCameraFail =
&&&&&&&&&&& } catch (CameraDisabledException e) {
&&&&&&&&&&&&&&& mCameraDisabled =
&&&&&&&&&&& }
继续追Util.openCamera ,Util类的定义在以下目录:packages/apps/OMAPCamera/src/com/ti/omap4/android/camera/Util.java
&&& public static android.hardware.Camera openCamera(Activity activity, int cameraId)
&&&&&&&&&&& throws CameraHardwareException, CameraDisabledException {
&&&&&&& // Check if device policy has disabled the camera.
&&&&&&& DevicePolicyManager dpm = (DevicePolicyManager) activity.getSystemService(
&&&&&&&&&&&&&&& Context.DEVICE_POLICY_SERVICE);
&&&&&&& if (dpm.getCameraDisabled(null)) {
&&&&&&&&&&& throw new CameraDisabledException();
&&&&&&& try {
&&&&&&&&&&& return CameraHolder.instance().open(cameraId);
&&&&&&& } catch (CameraHardwareException e) {
&&&&&&&&&&& // In eng build, we throw the exception so that test tool
&&&&&&&&&&& // can detect it and report it
&&&&&&&&&&& if (&eng&.equals(Build.TYPE)) {
&&&&&&&&&&&&&&& throw new RuntimeException(&openCamera failed&, e);
&&&&&&&&&&& } else {
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
又来了个CameraHolder,该类用一个实例openCamera
CameraHolder的定义在以下目录:packages/apps/OMAPCamera/src/com/ti/omap4/android/camera/CameraHolder.java
&&& public synchronized android.hardware.Camera open(int cameraId)
&&&&&&&&&&& throws CameraHardwareException {
&&&&&&& Assert(mUsers == 0);
&&&&&&& if (mCameraDevice != null && mCameraId != cameraId) {
&&&&&&&&&&& mCameraDevice.release();
&&&&&&&&&&& mCameraDevice =
&&&&&&&&&&& mCameraId = -1;
&&&&&&& if (mCameraDevice == null) {
&&&&&&&&&&& try {
&&&&&&&&&&&&&&& Log.v(TAG, &open camera & + cameraId);
&&&&&&&&&&&&&&& mCameraDevice = android.hardware.Camera.open(cameraId);
&&&&&&&&&&&&&&& mCameraId = cameraId;
&&&&&&&&&&& } catch (RuntimeException e) {
&&&&&&&&&&&&&&& Log.e(TAG, &fail to connect Camera&, e);
&&&&&&&&&&&&&&& throw new CameraHardwareException(e);
&&&&&&&&&&& }
&&&&&&&&&&& mParameters = mCameraDevice.getParameters();
&&&&&&& } else {
&&&&&&&&&&& try {
&&&&&&&&&&&&&&& mCameraDevice.reconnect();
&&&&&&&&&&& } catch (IOException e) {
&&&&&&&&&&&&&&& Log.e(TAG, &reconnect failed.&);
&&&&&&&&&&&&&&& throw new CameraHardwareException(e);
&&&&&&&&&&& }
&&&&&&&&&&& mCameraDevice.setParameters(mParameters);
&&&&&&& ++mU
&&&&&&& mHandler.removeMessages(RELEASE_CAMERA);
&&&&&&& mKeepBeforeTime = 0;
&&&&&&& return mCameraD
在这里就开始进入framework层了,调用frameworks\base\core\java\android\hardware\Camera.java类的open方法 。
&&& public static Camera open(int cameraId) {
&&&&&&& return new Camera(cameraId);
这里调用了Camera的构造函数,在看看构造函数
&&& Camera(int cameraId) {
&&&&&&& mShutterCallback =
&&&&&&& mRawImageCallback =
&&&&&&& mJpegCallback =
&&&&&&& mPreviewCallback =
&&&&&&& mPostviewCallback =
&&&&&&& mZoomListener =
&&&&&&& if ((looper = Looper.myLooper()) != null) {
&&&&&&&&&&& mEventHandler = new EventHandler(this, looper);
&&&&&&& } else if ((looper = Looper.getMainLooper()) != null) {
&&&&&&&&&&& mEventHandler = new EventHandler(this, looper);
&&&&&&& } else {
&&&&&&&&&&& mEventHandler =
&&&&&&& native_setup(new WeakReference&Camera&(this), cameraId);
好,终于来到JNI了
继续看camera的JNI文件:frameworks/base/core/jni# gedit android_hardware_Camera.cpp
由于前面Camera的构造函数里调用了native_setup(new WeakReference&Camera&(this), cameraId);
那么native_setup()的定义在那里呢
通过我的查看,在frameworks/base/core/jni# gedit android_hardware_Camera.cpp中有这样一个定义,
我认为通过这个定义,使得native_setup和android_hardware_Camera_native_setup 关联起来
static JNINativeMethod camMethods[] = {
& { &getNumberOfCameras&,
&&& &()I&,
&&& (void *)android_hardware_Camera_getNumberOfCameras },
& { &getCameraInfo&,
&&& &(ILandroid/hardware/Camera$CameraI)V&,
&&& (void*)android_hardware_Camera_getCameraInfo },
& { &native_setup&,
&&& &(Ljava/lang/OI)V&,
&&& (void*)android_hardware_Camera_native_setup },
& { &native_release&,
&&& &()V&,
&&& (void*)android_hardware_Camera_release },
& { &setPreviewDisplay&,
&&& &(Landroid/view/S)V&,
&&& (void *)android_hardware_Camera_setPreviewDisplay },
& { &setPreviewTexture&,
&&& &(Landroid/graphics/SurfaceT)V&,
&&& (void *)android_hardware_Camera_setPreviewTexture },
& { &startPreview&,
&&& &()V&,
&&& (void *)android_hardware_Camera_startPreview },
& { &_stopPreview&,
&&& &()V&,
&&& (void *)android_hardware_Camera_stopPreview },
& { &previewEnabled&,
&&& &()Z&,
&&& (void *)android_hardware_Camera_previewEnabled },
& { &setHasPreviewCallback&,
&&& &(ZZ)V&,
&&& (void *)android_hardware_Camera_setHasPreviewCallback },
& { &_addCallbackBuffer&,
&&& &([BI)V&,
&&& (void *)android_hardware_Camera_addCallbackBuffer },
& { &native_autoFocus&,
&&& &()V&,
&&& (void *)android_hardware_Camera_autoFocus },
& { &native_cancelAutoFocus&,
&&& &()V&,
&&& (void *)android_hardware_Camera_cancelAutoFocus },
& { &native_takePicture&,
&&& &(I)V&,
&&& (void *)android_hardware_Camera_takePicture },
& { &native_setParameters&,
&&& &(Ljava/lang/S)V&,
&&& (void *)android_hardware_Camera_setParameters },
& { &native_getParameters&,
&&& &()Ljava/lang/S&,
&&& (void *)android_hardware_Camera_getParameters },
& { &reconnect&,
&&& &()V&,
&&& (void*)android_hardware_Camera_reconnect },
& { &lock&,
&&& &()V&,
&&& (void*)android_hardware_Camera_lock },
& { &unlock&,
&&& &()V&,
&&& (void*)android_hardware_Camera_unlock },
& { &startSmoothZoom&,
&&& &(I)V&,
&&& (void *)android_hardware_Camera_startSmoothZoom },
& { &stopSmoothZoom&,
&&& &()V&,
&&& (void *)android_hardware_Camera_stopSmoothZoom },
& { &setDisplayOrientation&,
&&& &(I)V&,
&&& (void *)android_hardware_Camera_setDisplayOrientation },
& { &_startFaceDetection&,
&&& &(I)V&,
&&& (void *)android_hardware_Camera_startFaceDetection },
& { &_stopFaceDetection&,
&&& &()V&,
&&& (void *)android_hardware_Camera_stopFaceDetection},
所以,native_setup(new WeakReference&Camera&(this), cameraId);这个调用即是对下面android_hardware_Camera_native_setup这个函数的调用
// connect to camera service
static void android_hardware_Camera_native_setup(JNIEnv *env, jobject thiz,
&&& jobject weak_this, jint cameraId)
&&& sp&Camera& camera = Camera::connect(cameraId);
&&& if (camera == NULL) {
&&&&&&& jniThrowRuntimeException(env, &Fail to connect to camera service&);
&&& // make sure camera hardware is alive
&&& if (camera-&getStatus() != NO_ERROR) {
&&&&&&& jniThrowRuntimeException(env, &Camera initialization failed&);
&&& jclass clazz = env-&GetObjectClass(thiz);
&&& if (clazz == NULL) {
&&&&&&& jniThrowRuntimeException(env, &Can't find android/hardware/Camera&);
&&& // We use a weak reference so the Camera object can be garbage collected.
&&& // The reference is only used as a proxy for callbacks.
&&& sp&JNICameraContext& context = new JNICameraContext(env, weak_this, clazz, camera);
&&& context-&incStrong(thiz);
&&& camera-&setListener(context);
&&& // save context in opaque field
&&& env-&SetIntField(thiz, fields.context, (int)context.get());
JNI函数里面,我们找到Camera C/S架构的客户端了,它调用connect函数向服务器发送连接请求。JNICameraContext这个类是一个监听类,用于处理底层Camera回调函数传来的数据和消息
看看客户端的connect函数有什么,connect定义在以下路径frameworks/base/libs/camera/camera.cpp
sp&Camera& Camera::connect(int cameraId)
&&& LOGV(&connect&);
&&& sp&Camera& c = new Camera();
&&& const sp&ICameraService&& cs = getCameraService();
&&& if (cs != 0) {
&&&&&&& c-&mCamera = cs-&connect(c, cameraId);
&&& if (c-&mCamera != 0) {
&&&&&&& c-&mCamera-&asBinder()-&linkToDeath(c);
&&&&&&& c-&mStatus = NO_ERROR;
&&& } else {
&&&&&&& c.clear();
const sp&ICameraService&& cs =getCameraService();获取CameraService实例。
进入getCameraService()中
// establish binder interface to camera service
const sp&ICameraService&& Camera::getCameraService()
&&& Mutex::Autolock _l(mLock);
&&& if (mCameraService.get() == 0) {
&&&&&&& sp&IServiceManager& sm = defaultServiceManager();
&&&&&&& sp&IBinder&
&&&&&&& do {
&&&&&&&&&&& binder = sm-&getService(String16(&media.camera&));
&&&&&&&&&&& if (binder != 0)
&&&&&&&&&&&&&&&
&&&&&&&&&&& LOGW(&CameraService not published, waiting...&);
&&&&&&&&&&& usleep(500000); // 0.5 s
&&&&&&& } while(true);
&&&&&&& if (mDeathNotifier == NULL) {
&&&&&&&&&&& mDeathNotifier = new DeathNotifier();
&&&&&&& binder-&linkToDeath(mDeathNotifier);
&&&&&&& mCameraService = interface_cast&ICameraService&(binder);
&&& LOGE_IF(mCameraService==0, &no CameraService!?&);
&&& return mCameraS
CameraService实例通过binder获取的,mCameraService即为CameraService的实例。
回到sp&Camera& Camera::connect(int cameraId)中
c-&mCamera = cs-&connect(c, cameraId);
即:执行server的connect()函数,并且返回ICamera对象,赋值给Camera的mCamera,服务端connect()返回的是他内部类的一个实例。
server的connect()函数定义在以下路径:frameworks/base/services/camera/libcameraservice/CameraService.cpp
sp&ICamera& CameraService::connect(
&&&&&&& const sp&ICameraClient&& cameraClient, int cameraId) {
&&& int callingPid = getCallingPid();
&&& sp&CameraHardwareInterface& hardware = NULL;
&&& LOG1(&CameraService::connect E (pid %d, id %d)&, callingPid, cameraId);
&&& if (!mModule) {
&&&&&&& LOGE(&Camera HAL module not loaded&);
&&&&&&& return NULL;
&&& sp&Client&
&&& if (cameraId & 0 || cameraId &= mNumberOfCameras) {
&&&&&&& LOGE(&CameraService::connect X (pid %d) rejected (invalid cameraId %d).&,
&&&&&&&&&&& callingPid, cameraId);
&&&&&&& return NULL;
&&& char value[PROPERTY_VALUE_MAX];
&&& property_get(&sys.secpolicy.camera.disabled&, value, &0&);
&&& if (strcmp(value, &1&) == 0) {
&&&&&&& // Camera is disabled by DevicePolicyManager.
&&&&&&& LOGI(&Camera is disabled. connect X (pid %d) rejected&, callingPid);
&&&&&&& return NULL;
&&& Mutex::Autolock lock(mServiceLock);
&&& if (mClient[cameraId] != 0) {
&&&&&&& client = mClient[cameraId].promote();
&&&&&&& if (client != 0) {
&&&&&&&&&&& if (cameraClient-&asBinder() == client-&getCameraClient()-&asBinder()) {
&&&&&&&&&&&&&&& LOG1(&CameraService::connect X (pid %d) (the same client)&,
&&&&&&&&&&&&&&&&&&& callingPid);
&&&&&&&&&&&&&&&
&&&&&&&&&&& } else {
&&&&&&&&&&&&&&& LOGW(&CameraService::connect X (pid %d) rejected (existing client).&,
&&&&&&&&&&&&&&&&&&& callingPid);
&&&&&&&&&&&&&&& return NULL;
&&&&&&&&&&& }
&&&&&&& mClient[cameraId].clear();
&&& if (mBusy[cameraId]) {
&&&&&&& LOGW(&CameraService::connect X (pid %d) rejected&
&&&&&&&&&&&& & (camera %d is still busy).&, callingPid, cameraId);
&&&&&&& return NULL;
&&& struct camera_
&&& if (mModule-&get_camera_info(cameraId, &info) != OK) {
&&&&&&& LOGE(&Invalid camera id %d&, cameraId);
&&&&&&& return NULL;
&&& char camera_device_name[10];
&&& snprintf(camera_device_name, sizeof(camera_device_name), &%d&, cameraId);
&&& hardware = new CameraHardwareInterface(camera_device_name);
&&& if (hardware-&initialize(&mModule-&common) != OK) {
&&&&&&& hardware.clear();
&&&&&&& return NULL;
&&& client = new Client(this, cameraClient, hardware, cameraId, info.facing, callingPid);
&&& mClient[cameraId] =
&&& LOG1(&CameraService::connect X&);
实例化Camera Hal接口 hardware,hardware调用initialize()进入HAL层打开Camear驱动。
CameraHardwareInterface中initialize()定义在以下路径:frameworks/base/services/camera/libcameraservice/CameraHardwareInterface.h
代码如下:
&&& status_t initialize(hw_module_t *module)
&&&&&&& LOGI(&Opening camera %s&, mName.string());
&&&&&&& int rc = module-&methods-&open(module, mName.string(),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (hw_device_t **)&mDevice);
&&&&&&& if (rc != OK) {
&&&&&&&&&&& LOGE(&Could not open camera %s: %d&, mName.string(), rc);
&&&&&&&&&&&
#ifdef OMAP_ENHANCEMENT_CPCAM
&&&&&&& initHalPreviewWindow(&mHalPreviewWindow);
&&&&&&& initHalPreviewWindow(&mHalTapin);
&&&&&&& initHalPreviewWindow(&mHalTapout);
&&&&&&& initHalPreviewWindow();
此处通过module-&method-&open()方法真正打开Camera设备,
其中module的定义在以下路径:
class CameraService :
&&& public BinderService&CameraService&,
&&& public BnCameraService
&&& class Client : public BnCamera
&&& public:
&&&&&&& ......
&&& private:
&&&&&&& .....
&&& camera_module_t *mM
此处还必须找到camera_module_t 的定义,以更好的理解整个运行流程,通过追根溯源找到了camera_module_t 定义,
camera_module_t的定义在以下路径:hardware/libhardware/include/hardware/camera.h中,定义如下
typedef struct camera_module {
&&& hw_module_
&&& int (*get_number_of_cameras)(void);
&&& int (*get_camera_info)(int camera_id, struct camera_info *info);
} camera_module_t;
其中包含get_number_of_cameras方法和get_camera_info方法用于获取camera info
另外hw_module_这个选项十分重要,此处应重点关注,因为是使用hw_module_t结构体中的open()方法打开设备文件的
继续找到hw_module_t 结构体的定义.在以下路径:hardware/libhardware/include/hardware/hardware.h,代码如下:
struct hw_module_t;
struct hw_module_methods_t;
struct hw_device_t;
&* Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
&* and the fields of this data structure must begin with hw_module_t
&* followed by module specific information.
typedef struct hw_module_t {
&&& /** tag must be initialized to HARDWARE_MODULE_TAG */
&&& uint32_
&&& /** major version number for the module */
&&& uint16_t version_
&&& /** minor version number of the module */
&&& uint16_t version_
&&& /** Identifier of module */
&&& const char *
&&& /** Name of this module */
&&& const char *
&&& /** Author/owner/implementor of the module */
&&& const char *
&&& /** Modules methods */
&&& struct hw_module_methods_t*
&&& /** module's dso */
&&& /** padding to 128 bytes, reserved for future use */
&&& uint32_t reserved[32-7];
} hw_module_t;
同样,找到hw_module_methods_t这个结构体的定义,代码如下:
typedef struct hw_module_methods_t {
&&& /** Open a specific device */
&&& int (*open)(const struct hw_module_t* module, const char* id,
&&&&&&&&&&& struct hw_device_t** device);
} hw_module_methods_t;
hw_module_methods_t 结构体中只有open()一个方法,用于打开camera driver,实现与硬件层的交互
到此为止,很容易看出:
Android中Camera的调用流程可分为以下几个层次:
Package-&Framework-&JNI-&Camera(cpp)--(binder)--&CameraService-&Camera HAL-&Camera Driver

我要回帖

更多关于 苹果手机运行安卓软件 的文章

 

随机推荐